2016-12-11 6 views
2

私のメインプログラムでメソッドExecuteMを呼び出したいところです。while Qtで自分のインタフェースのテキストをループする(result)、Qtの作成者は更新されます各反復ごとに。 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 import *からPyQt4.QtGui import * 'の問題が発生しました。正確には! (私は同時にコメントを書いていた)ありがとう – Dadep

関連する問題