2016-12-11 14 views
2

我想在我的主程序中調用方法ExecuteM,其中在while循環中,Qt創建者完成的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) 

,但它不工作的文本在每次迭代不更新,爲什麼?

回答

2

如果你在主線程中執行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可能會更好。

+0

謝謝,我想我開始理解這個想法。但是,當我嘗試你的短期解決方案時,我得到:'QApplication.processEvents() NameError:全局名稱'QApplication'未定義... ...? – Dadep

+0

@Dadep。你需要導入它 - 或者可以使用'QtGui.QApplication'(或者PyQt5的'QtWidgets.QApplication')。 – ekhumoro

+0

這是PyQt4.QtCore導入*中的一個問題,來自PyQt4.QtGui導入*'......啊,是的! (我在同一時間寫評論)謝謝 – Dadep