【问题标题】:How to update QProgressbar from another module?如何从另一个模块更新 QProgressbar?
【发布时间】:2020-08-09 06:44:53
【问题描述】:

我想从另一个模块更新我的主 gui 类中的进度条。由于必须在 gui 仍在其主事件循环中运行时更新进度条值,因此我为它创建了一个线程。我无法从线程更新进度值。

这只是我真正想做的简单代码,但它会产生同样的错误。

progress.py

from time import sleep
from PyQt5.QtCore import QObject, pyqtSignal


class ProgressUpdate(QObject):

progress_signal = pyqtSignal(int)

def __init__(self):
    super().__init__()
    self.progress_update()

def progress_update(self):
    for i in range(0, 101):
        self.progress_signal.emit(i)
        sleep(0.01)

main.py

from PyQt5.QtWidgets import QVBoxLayout, QApplication, QProgressBar, QWidget
from PyQt5 import QtCore
import sys
from progress import ProgressUpdate


class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):

        self.progress_bar = QProgressBar(self)
        self.vbox = QVBoxLayout(self)
        self.vbox.addWidget(self.progress_bar)
        self.setLayout(self.vbox)
        self.setWindowTitle('Progress')
        self.p_thread = ProgressThread()
        self.p_thread.start()
        self.show()

    def update_progress(self, val):
        self.progress_bar.setValue(val)


class ProgressThread(QtCore.QThread):

    def __init__(self):
        super().__init__()

    def run(self):
        self.obj = ProgressUpdate()
        self.obj.progress_signal.connect(Example.update_progress)
    

def main():
    app = QApplication(sys.argv)
    p = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

当我运行这个时,进度条出现了,但它停留在 0,它没有更新。

【问题讨论】:

    标签: python-3.x pyqt5 progress-bar signals-slots


    【解决方案1】:

    您不需要单独的 QObject 和线程,这使得正确连接信号和插槽变得更加困难。 progress.py 文件可以包含带有循环的 QThread,以在每个间隔发出值。

    class ProgressThread(QtCore.QThread):
    
        progress_signal = pyqtSignal(int)
    
        def __init__(self):
            super().__init__()
    
        def run(self):
            for i in range(0, 101):
                self.progress_signal.emit(i)
                sleep(0.01)
    

    并且在main.py中,将来自线程的信号连接到类中的槽。

    class Example(QWidget):
    
        def __init__(self):
            super().__init__()
            self.init_ui()
    
        def init_ui(self):
    
            self.progress_bar = QProgressBar(self)
            self.vbox = QVBoxLayout(self)
            self.vbox.addWidget(self.progress_bar)
            self.setLayout(self.vbox)
            self.setWindowTitle('Progress')
            self.p_thread = ProgressThread()
            self.p_thread.progress_signal.connect(self.update_progress)
            self.p_thread.start()
            self.show()
    
        def update_progress(self, val):
            self.progress_bar.setValue(val)
    
        
    def main():
        app = QApplication(sys.argv)
        p = Example()
        sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2017-07-25
      • 2016-09-30
      • 1970-01-01
      相关资源
      最近更新 更多