pyqt使用线程更新进度条

Posted

技术标签:

【中文标题】pyqt使用线程更新进度条【英文标题】:pyqt updating progress bar using thread 【发布时间】:2019-12-12 17:32:25 【问题描述】:

我想使用线程方法从我的 main.py 更新进度条。

if __name__ == "__main__":

       app = QApplication(sys.argv)
       uiplot = gui.Ui_MainWindow()

       Update_Progressbar_thread = QThread() 
       Update_Progressbar_thread.started.connect(Update_Progressbar)


       def Update_Progressbar():
              progressbar_value = progressbar_value + 1
              while (progressbar_value < 100):
                     uiplot.PSprogressbar.setValue(progressbar_value)
                     time.sleep(0.1)
      uiplot.PSStart_btn.clicked.connect(Update_Progressbar_thread.start) 

问题是这种方法堵塞了我的 GUI,我无法点击任何按钮等。

或者,我怎样才能使它工作? 谢谢

【问题讨论】:

【参考方案1】:

说明:

根据您的逻辑,您正在调用“Update_Progressbar”以在 QThread 启动时运行,但“Update_Progressbar”将在哪里运行?好吧,在主线程中阻塞了 GUI。

解决方案:

您的目标不是在 QThread 启动时运行“Update_Progressbar”,而是在处理 QThread 的线程中运行。所以在这种情况下,你可以创建一个 Worker,它存在于 QThread 处理的线程中

class Worker(QObject):
    progressChanged = pyqtSignal(int)

    def work(self):
        progressbar_value = 0
        while progressbar_value < 100:
            self.progressChanged.emit(progressbar_value)
            time.sleep(0.1)


if __name__ == "__main__":

    app = QApplication(sys.argv)
    uiplot = gui.Ui_MainWindow()

    thread = QThread()
    thread.start()

    worker = Worker()
    worker.moveToThread(thread)
    worker.progressChanged.connect(uiplot.PSprogressbar.setValue)
    uiplot.PSStart_btn.clicked.connect(worker.work)

    # ...

【讨论】:

以上是关于pyqt使用线程更新进度条的主要内容,如果未能解决你的问题,请参考以下文章

Pyqt5进度条QProgressBar的使用/多线程更新/按钮美化/图片编码/开机自启动

带有多线程的Python pyqt脉冲进度条

pyqt 是不是支持具有两个值的堆叠进度条?

根据从导入包中打印的标准输出更新 PyQt 进度条(PyQt5)

Python 3.5,单独窗口中的 pyqt5 进度条 gui

Android 中ProgressDialog进度条对话框的使用(使用子线程模拟更新进度)