【问题标题】:update text in a Qt interface from method not in main script从不在主脚本中的方法更新 Qt 界面中的文本
【发布时间】:2017-04-26 18:31:47
【问题描述】:

我想在我的主程序中调用一个方法ExecuteM,其中在while 循环中我的Qt 界面中的文本(调用result),使用Qt 创建者完成,每次迭代都会更新。

class Machine():
    def __init__(self, result):
        self.result=result

    def ExecuteM(self, Var1, Var2):
        while Var1 != 'stop':
            Var2 = Var2 + 3
            self.result.setText(newResult())
            sleep(0.5)

然后在我的主脚本中:

def main(self):
    self.TM=Machine(self.result)
    self.TM.ExecuteM(var1, var2)

但它不起作用文本不会在每次迭代时更新,为什么?

【问题讨论】:

    标签: python while-loop pyqt qtextedit


    【解决方案1】:

    如果你在主线程中执行一个while循环,它会阻塞gui。所有事件都将排队,直到 while 循环终止并且控制可以返回到事件循环。因此,您要么必须将阻塞的 while 循环移动到单独的线程中,要么定期强制事件循环处理未决事件。在您的示例中,应该可以像这样实现后者:

        def ExecuteM(self, Var1, Var2):
            while Var1 != 'stop':
                Var2 = Var2 + 3
                self.result.setText(newResult())
                QApplication.processEvents()
                sleep(0.5)
    

    但这只是一个短期的解决方案。 use a worker thread and send a custom signal back to the main thread 可能会更好。

    【讨论】:

    • 谢谢,我想我开始理解这个想法了。但是当我尝试您的短期解决方案时,我得到:QApplication.processEvents() NameError: global name 'QApplication' is not defined ...?
    • @Dadep。您需要导入它 - 或者可能使用 QtGui.QApplication(或 QtWidgets.QApplication 用于 PyQt5)。
    • 这是from PyQt4.QtCore import *, from PyQt4.QtGui import * 的问题……啊,没错! (我同时在写评论)谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2017-11-03
    • 2023-03-25
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多