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的使用/多线程更新/按钮美化/图片编码/开机自启动
根据从导入包中打印的标准输出更新 PyQt 进度条(PyQt5)