从不在主脚本中的方法更新 Qt 界面中的文本
update text in a Qt interface from method not in main script
我想在我的主程序中调用一个方法 ExecuteM
,其中 while
在我的 Qt 界面中循环文本(调用 result
),Qt creator 将完成为每次迭代更新。
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)
但它不起作用文本不会在每次迭代时更新,为什么?
如果在主线程执行while循环,会阻塞gui。所有事件都将排队,直到 while 循环终止并且控制可以 return 到事件循环。因此,您要么必须将阻塞的 while 循环移动到一个单独的线程中,要么定期强制事件循环处理未决事件。在您的示例中,应该可以像这样实现后者:
def ExecuteM(self, Var1, Var2):
while Var1 != 'stop':
Var2 = Var2 + 3
self.result.setText(newResult())
QApplication.processEvents()
sleep(0.5)
但这只是一个短期解决方案。 .
可能会更好
我想在我的主程序中调用一个方法 ExecuteM
,其中 while
在我的 Qt 界面中循环文本(调用 result
),Qt creator 将完成为每次迭代更新。
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)
但它不起作用文本不会在每次迭代时更新,为什么?
如果在主线程执行while循环,会阻塞gui。所有事件都将排队,直到 while 循环终止并且控制可以 return 到事件循环。因此,您要么必须将阻塞的 while 循环移动到一个单独的线程中,要么定期强制事件循环处理未决事件。在您的示例中,应该可以像这样实现后者:
def ExecuteM(self, Var1, Var2):
while Var1 != 'stop':
Var2 = Var2 + 3
self.result.setText(newResult())
QApplication.processEvents()
sleep(0.5)
但这只是一个短期解决方案。