本篇主要介绍使用多线程模块QThread解决PyQt界面程序执行耗时操作时,程序卡顿出现的无响应的问题,当主界面执行一个比较耗时间的操作时候,比如载入一个很大的excel文件,界面会出现卡顿而退出情况。
不使用QThread线程
一个按钮触发lcdNumber显示1-50数字。
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.displayNum)
def displayNum(self):
for i in range(50):
time.sleep(1)
self.lcdNumber.display(i)
QThread
QThread中的常用方法:
- start():启动线程。
- sleep():强制当前线程睡眠多少秒。
- wait():阻止线程,直到满足如下条件之一。
- 与此QThread对象关联的线程已完成执行(即从run返回时),如果线程完成执行,此函数返回True,如果线程尚未启动,也返回True。
- 等待时间的单位是毫秒,如果时间是ULONG_MAX(默认值·),则等待,永远不会超时(线程必须从run返回),如果等待超时,此函数将会返回False。
QThread中的常用信号:
- started():在开始执行run函数之前,从相关线程发射此信号。
- finished():当程序完成业务逻辑时,从相关线程发射此信号。
添加线程
新建一个线程类继承QThread。重写其run方法。定义一个信号,抛出数值i。
class RunThread(QThread):
trigger = pyqtSignal(int)
def __init__(self):
super(RunThread, self).__init__()
def run(self):
for i in range(50):
time.sleep(1)
self.trigger.emit(i)
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
self.thread1 = RunThread()
self.pushButton.clicked.connect(self.execute)
def execute(self):
self.thread1.start()
self.thread1.trigger.connect(self.displayNum)
def displayNum(self, number):
self.lcdNumber.display(number)
主界面程序:
- self.thread1 = RunThread():实例化自建的线程类。
- self.thread1.start():线程启动。