持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第21天,点击查看活动详情
前言
- 对于PyQt的GUI程序来说,当遇到计算密集型的操作时,需要单独创建一个线程处理密集计算的操作,否则,在进行计算操作时,UI界面会出现假死现象,带来不佳的用户体验。
- PyQT多线程开发:对于PyQt开发,创建一个线程的方法是:创建一个以QThread为基类的类,然后在run()方法中编写相应的计算操作。之后就可以实例化一个线程对象,调用start()方法启动线程。
PyQt进度条更新显示方法
QThread计算线程+pyqtSignal+主线程更新进度(线程信号与主线程的槽函数绑定)
若不采用QThread创建一个单独的线程执行运算,进度条(窗口)在计算过程中会出现卡顿。直到计算完成,进度100%时才更新窗口的进度。
Demo代码
下面将以一个最简单的进度条更新示例演示QThread与GUI主进程交互的过程。
from PyQt5.QtWidgets import QWidget, QApplication, QProgressBar
from PyQt5.QtCore import QThread, pyqtSignal
import sys
import time
class CalculatorThread(QThread):
signal_progress_update = pyqtSignal(list) # 自定义信号,可通过emit()方法向GUI主进程发送进度信息,主进程根据接收到的进度信息更新进度条的值
def __init__(self):
super(CalculatorThread, self).__init__()
self.total = 100
self.i = 0
def run(self):
while True:
self.i += 1
self.signal_progress_update.emit([self.i, self.total])
time.sleep(0.02)
if self.i > self.total:
break
class MyWidget(QWidget):
def __init__(self):
super(MyWidget, self).__init__()
self.resize(250, 100)
self.progressBar = QProgressBar(self)
self.progressBar.setValue(0)
self.progressBar.setFixedWidth(200)
self.progressBar.move(20, 20)
self.progressBar.setMaximum(100)
self.thread = CalculatorThread() # 线程要声明为成员变量(加上self)
self.thread.signal_progress_update.connect(self.update_progress)
# thread.run() # 串行执行(非多线程方法)【DeBug时候使用】
self.thread.start() # 线程执行(调用run方法)
def update_progress(self, values):
'''
更新进度条的槽函数
'''
self.progressBar.setValue(int(values[0] / values[1] * 100))
if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyWidget()
myWin.show()
sys.exit(app.exec_())
=