Python+PyQt5 QThread(1)

本篇主要介绍使用多线程模块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中的常用方法:

  1. start():启动线程。
  2. sleep():强制当前线程睡眠多少秒。
  3. wait():阻止线程,直到满足如下条件之一。
  • 与此QThread对象关联的线程已完成执行(即从run返回时),如果线程完成执行,此函数返回True,如果线程尚未启动,也返回True。
  • 等待时间的单位是毫秒,如果时间是ULONG_MAX(默认值·),则等待,永远不会超时(线程必须从run返回),如果等待超时,此函数将会返回False。

QThread中的常用信号:

  1. started():在开始执行run函数之前,从相关线程发射此信号。
  2. 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)

主界面程序:

  1. self.thread1 = RunThread():实例化自建的线程类。
  2. self.thread1.start():线程启动。
原文链接:,转发请注明来源!