PyQt笔记:QProgress进度条demo

1,214 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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_())
=

效果图

请添加图片描述