大家好,小编为大家解答python gui可视化操作界面制作的问题。很多人还不知道python可视化界面开发工具,现在让我们一起来看看吧!
0 建议学时
4学时,在机房进行
1 开发环境安装及配置
1.1 编程环境
安装PyCharm 2023.1 (Community Edition)
安装PyQt6
pip install PyQt6
pip install pyqt6-tools
1.2 环境配置
选择“Tools/External Tools”选项,单击添加“+”按钮,即可弹出外部工具配置窗口:
在弹出的外部工具配置窗口中,输入外部工具名称,这里用QtDesigner表示,接着输入Anaconda安装环境中的PyQt界面设计师可执行文件完整路径以及工作路径配置参数:
设置完后“Tools/ExternalTools”栏中增加了QtDesigner。
与上一节中配置QtDesigner外部工具操作一致,在“Tools/ExternalTools”中继续单击添加“+”按钮,命名为PyUCI
2 PyQT的基础
常用模块:
- QtWidgets:包含了一整套UI元素控件,用于建立符合系统风格的界面;
- QtGui:涵盖了多种基本图形功能的类(字体, 图形,图标,颜色);
- QtCore:涵盖了包的核心的非GUI功能(时间,文件,目录,数据类型,文本流,链接,线程进程);
2.1 窗口显示
import sys # 系统内置类
from PyQt5.Qt import * # 主要包含了我们常用的一些类,汇总到了一块
if __name__ == '__main__':
# 创建一个应用程序对象
app = QApplication(sys.argv)
# 创建一个空白控件(窗口)
window = QWidget()
# 设置窗口标题
window.setWindowTitle("计时器")
# 设置窗口尺寸
window.resize(500, 500)
# 移动窗口位置
window.move(200, 200)
# 创建label控件
label = QLabel(window)
# 为控件设置文本
label.setText("hello")
# 移动控件的位置
label.move(160, 160)
# 显示窗口
window.show()
# 进入程序的主循环,并通过exit函数确保主循环安全结束
sys.exit(app.exec_())
2.2 PyQt5程序结构分析
- 导入需要的包和模块
from PyQt5.Qt import *
import sys
- 创建一个应用程序对象
# 创建一个应用程序对象
app = QApplication(sys.argv)
- 控件的操作:创建控件,设置控件(大小,位置,样式),事件,信号的处理
- 创建控件
当我们创建一个控件之后,如果这个控件没有父控件,则把它当作顶层控件(窗口),系统会自动的给窗口添加一些装饰(标题栏),窗口控件具备一些特性(设置标题,图标);
# 创建一个空白控件(窗口)
window = QWidget()
# 设置窗口标题
window.setWindowTitle("计时器")
# 设置窗口尺寸
window.resize(500, 500)
# 移动窗口位置
window.move(200, 200)
- 设置控件
控件也可以作为一个容器(承载其他的控件);
# 创建label控件
label = QLabel(window)
# 为控件设置文本
label.setText("hello")
# 移动控件的位置
label.move(160, 160)
- 展示控件
🔰刚创建好一个控件之后,(这个控件没有什么父控件),默认情况况下不会被显示,只有手动的调用show(0才可以显示;
🔰如果这个控件有父控件,那么一般情况下,父控件展示后,子控件会自动展示;
# 显示窗口
window.show()
- 应用程序的执行,进入到消息循环
🔰让整个程序开始执行,并且进入到消息循环(无限循环);
🔰检测整个程序所接受到的用户的交互信息;
# 进入程序的主循环,并通过exit函数确保主循环安全结束
sys.exit(app.exec_())
2.3 窗口属性设置
属性 | 描述 |
---|---|
window.serGeometry(300, 300, 300, 200) | 前两个参数定义了move;后两个参数定义了resize |
window.move(400, 300) | 设置窗口左上顶端的坐标 |
window.resize(500, 500) | 设置窗口的宽度,高度 |
window.setWindowTitle(‘计算器’) | 设置窗口标题 |
window.setWindowIcon(QIcon(‘t1.jpg’)) | 设置窗口logo |
3 界面设计
在项目文件夹的Pycharm开发环境中,打开前面配置的外部工具QtDesigner:
右键ui界面文件,选择“Tools/ExternalTools/PyUCI”(前面配置的外部工具),即可自动生成Python程序代码:
类与对象:
class Y:
def __init__(self):
self.a = 0
self.b = 0
def value(self, t):
return self.a + self.b + t
y = Y() #创建实例(对象)
y.a=1
y.b=2
v = y.value(2) #计算函数值
界面代码:
from PyQt6 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(591, 125)
self.centralwidget = QtWidgets.QWidget(MainWindow) #QWidget 是用户界面的原子
self.centralwidget.setObjectName("centralwidget")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(430, 20, 131, 41))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(10)
...
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
4 程序逻辑编写
新建文件ff.py:
import sys
from mygui import * #界面生成的python文件名
from PyQt6.QtWidgets import QApplication, QMainWindow
class MyMainWindow(QMainWindow, Ui_MainWindow): #界面生成的python文件中类名
def __init__(self, parent=None):
super(MyMainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.pushButtonClicked) #指定按键代码
def pushButtonClicked(self): #按键后执行的代码
data1 = float(self.textEdit.toPlainText())
data2 = float(self.textEdit_2.toPlainText())
self.textEdit_3.setText(str(data1+data2))
if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyMainWindow() #新建一个窗口实例
myWin.show() #显示窗口
sys.exit(app.exec())
运行程序:
【例1】加法器
self.pushButton.clicked.connect(self.pushButtonClicked)
def pushButtonClicked(self):
data1 = float(self.textEdit.toPlainText())
data2 = float(self.textEdit_2.toPlainText())
self.textEdit_3.setText(str(data1+data2))
【例2】计算器
self.pushButton_0.clicked.connect(self.pushButton0Clicked)
def pushButton0Clicked(self):
self.textEdit.setText(str(self.textEdit.toPlainText() + "0"))
self.pushButton_add.clicked.connect(self.pushButtonAddClicked)
def pushButtonAddClicked(self):
self.textEdit.setText(str(self.textEdit.toPlainText() + "+"))
def pushButtonEqualClicked(self):
try:
self.textEdit.setText(str(eval(self.textEdit.toPlainText())))
except:
QMessageBox.critical(self, "Question", "表达式不正确!",QMessageBox.Ok, QMessageBox.Ok)
【例3】图片处理
from PyQt6.QtWidgets import QApplication, QMainWindow,QFileDialog
from PIL import Image
from PIL import ImageFilter
self.path = ""
self.pushButton_Open.clicked.connect(self.openimage)
self.pushButton_GetBorder.clicked.connect(self.FindBorder)
def openimage(self):
imgName, imgIType = QFileDialog.getOpenFileName(None,"导入图片","", "*.jpg;;*.png;;All Files(*)")
jpg = QtGui.QPixmap(imgName).scaled(self.label.width(), self.label.height())
self.label.setPixmap(jpg)
self.path = imgName
# self.textEdit.setText('')
def FindBorder(self):
if self.path!="" :
im=Image.open(self.path)
om=im.filter(ImageFilter.CONTOUR)
om.save("1.jpg")
jpg = QtGui.QPixmap("1.jpg").scaled(self.label_out.width(), self.label_out.height())
self.label_out.setPixmap(jpg)
【例4】蒙特卡罗求定积分
self.pushButton_cal.clicked.connect(self.Calculate)
def MCint_area(self,f, a, b, n, fmax):
below = 0
for i in range(n):
x = np.random.uniform(a, b)
y = np.random.uniform(0, fmax)
if 0 <= y <= f(x):
below += 1
area = below / n * (b - a) * fmax
return area
def f1(self,x):
y=0
y=eval(self.textEdit_f.toPlainText())
return y
def Calculate(self):
a=int(self.textEdit_a.toPlainText())
b = int(self.textEdit_b.toPlainText())
n=int(self.textEdit_Count.toPlainText())
fmax = int(self.textEdit_fmax.toPlainText())
area=0
try:
area=self.MCint_area(self.f1, a, b, n, fmax)
except:
QMessageBox.critical(self, "Question", "表达式不正确,无法计算!")
self.textEdit_result.setText(str(area))
5 生成EXE
安装pyinstaller包
使用pip install安装命令即可pyinstaller编译包,
也可以在Anaconda Prompt下实现安装python简单代码案例。
pip install PyInstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
编译不成功在项目文件夹下也会产生一个与项目名称相同的.spec文件
可用pycharm打开,查看问题
6 作业
制作一个与本专业有关的有界面程序,在窗口上写上姓名与学号。