python - QThread 不使用事件更新 View

标签 python multithreading pyqt pyqt5 qthread

在菜单上我可以触发:

def on_git_update(self):
    update_widget = UpdateView()
    self.gui.setCentralWidget(update_widget)
    updateGit = UpdateGit()
    updateGit.progress.connect(update_widget.on_progress)
    updateGit.start()

然后我有:

class UpdateView(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        vbox = QVBoxLayout()
        self.pbar = QProgressBar()
        vbox.addWidget(self.pbar)
        vbox.addStretch(1)
        self.setLayout(vbox)

    def on_progress(self, value):
        self.pbar.setValue(int(value * 100))


class UpdateGit(QThread):
    progress = pyqtSignal(float)

    def __del__(self):
        self.wait()

    def run(self):
        for i in range(10):
            self.progress.emit(i / 10)
            sleep(.5)

应用程序在处理过程中卡住,据我所知,它应该像在使用信号的线程中一样工作。 此外,当我通过 pycharm 在 Debug模式下运行应用程序时,它会按预期工作,更新每个步骤。 我的线程设置为何不正确?

最佳答案

在函数中创建的变量仅在该函数存在之前存在,这就是 updateGit 发生的情况,在 update_widget 的情况下,当它设置为centralwidget时具有更大的范围,因为 Qt 可以处理它。解决方案是通过使其成为类的成员来扩展线程的范围。

def on_git_update(self):
    update_widget = UpdateView()
    self.gui.setCentralWidget(update_widget)
    self.updateGit = UpdateGit()
    self.updateGit.progress.connect(update_widget.on_progress)
    self.updateGit.start()

关于python - QThread 不使用事件更新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51489933/

相关文章:

python - 如何在 PyQt 上的窗口上加载位图

c++ - 如何使用 openMP 将顺序程序转换为并行程序?

java - 必须阅读有关 Java 线程的文章

c# - 当原始类超出范围时线程会发生什么

用于聚合 PyQt 信号的 Python 装饰器

python - 如何向 QTableWidget 的单元格添加右键单击操作(不是菜单)

python - Flask 与事件循环相结合

python - 为什么这些物体在屏幕上弹跳得这么快。我怎样才能减慢他们的速度

python - Popen.returncode 在 Python 中不起作用?

python - keras LSTM 获取隐藏状态(将句子序列转换为文档上下文向量)