0%

PyQt

前言

我也是小白一个,晚些还要高中复读,所以就东搞搞西搞搞,昨天突然想着给我的Python程序写一个GUI界面,然后就现学PYQT5套用了一些代码并踩了一些坑,有些地方还不理解但解决了问题,所以在此记录一下。

正文

前期准备:

  • Pyqt5
  • Pyqt5-tools
  • windows10
    可以通过 pip 安装
    1
    2
    3
    pip install PyQt5

    pip install pyqt5-tools

如果 pip 下载很慢 可以使用清华源加速 清华源

1
2
3
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package #临时使用

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple #设为默认

UI相关

找到pyqt5-tools的安装目录 如:

1
C:\Users\XXX\AppData\Local\Programs\Python\Python37\Lib\site-packages\pyqt5_tools

使用该目录下的 designer.exe 可执行文件设置UI即可。(各控件作用可以右转GOOGLE)

直接加载 *.UI

我还没有实践,所以只讲下面的那个

.UI 转化 .py

如果先前配置过Python的环境,在cmd中直接运行

1
pyuic5 *.ui

然后代码就会被打印在终端里

也可

1
pyuic5 -o destination.py source.ui

这样会直接生产 .py 文件

实例化

添加如下代码实例化

1
2
3
4
5
6
7
8
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv) # 创建一个QApplication,也就是你要开发的软件app
MainWindow = QtWidgets.QMainWindow() # 创建一个QMainWindow,用来装载你需要的各种组件、控件
ui = Ui_MainWindow() # ui是Ui_MainWindow()类的实例化对象
ui.setupUi(MainWindow) # 执行类中的setupUi方法,方法的参数是第二步中创建的QMainWindow
MainWindow.show() # 执行QMainWindow的show()方法,显示这个QMainWindow
sys.exit(app.exec_()) # 使用exit()或者点击关闭按钮退出QApplication

添加功能

在讲之前,我先提个建议,建议UI和逻辑分离。
然后提几个需要注意的地方

多线程

信号发送/接收 槽函数
UI&UI逻辑分离
我们先讲一下UI和逻辑分离:
很简单只需要再建一个脚本 我这里名叫:mainwindow.py

1
2
3
4
5
6
7
from PyQt5 import QtCore, QtGui, QtWidgets
from ui import Ui_MainWindow
from PyQt5.QtCore import *
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)

然后你还需要一个 main.py 用来启动

1
2
3
4
5
6
7
8
from PyQt5 import QtCore, QtGui, QtWidgets
from mainwindow import MainWindow
import sys
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
mainWindow = MainWindow() # 实例化
mainWindow.show()
sys.exit(app.exec_())

UI的逻辑,只需写在mainwindow.py里面的 MainWindow类中,这样就不用担心添加新的UI控件时要重写逻辑了

UI逻辑实现

说到UI逻辑的实现就要说到槽函数

槽函数即实现的方法
比如:一个BUTTON被按下,接着发送一个信号,然后执行会执行绑定函数,那这个函数叫槽函数。
一个槽函数可以绑定多个信号
一个信号也可以绑定多个槽函数

1
2
3
4
5
def setUpFunction(self):
self.pushButton.clicked.connect(self.button_clicked) #绑定槽函数
def button_clicked(self): #槽函数
#方法
pass

这个方法用时最好不要太长,太长的话会使得界面假死,我们可以利用Qthread来创建线程
多线程
我们需要在线程运行时向主程序发送数据以改变控件的参数,所以我们需要定义信号的发送

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from PyQt5.QtCore import *
from PyQt5 import QtCore

class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.setUpFunction() # 执行类中的setupFunction方法
def setUpFunction(self):
self.pushButton.clicked.connect(self.button_clicked) #绑定槽函数
def button_clicked(self):
self.thread = RunThread(), #线程实例化
self.thread.signal.connect(self.callback) #绑定槽函数
self.thread.start()
def callback():
#方法
pass


class RunThread(QtCore.QThread):
signal = pyqtSignal(str) # 可以使用但是IDE提示有问题 Undefined variable
# 定义信号的类型 str

def __init__(self):
super(RunThread, self).__init__()

def __del__(self):
self.wait()

def run(self):
#方法
self.signal.emit('12345')#发送信号
pass

如果你的方法是写在另一个脚本里,可以看看我的实现(可能不是很科学,也有可能在看屎山)