2017-10-14 13 views
0

QPushButtonウィジェットとQTextEditウィジェットを作成しました。ボタンをクリックすると、システムは外部プログラムを実行し、ログを出力しますQText編集ウィジェット。pyqtスロットでリアルタイムにログを出力できません

問題は、ログをQTextEditウィジェットに継続的に送ることができないことです。外部プログラムが完了した後、すぐにすべて送信されます。どうして?

これは私のコードです:

class Window(Qwidget): 
    def __init__(self, parent=None): 
     ... 
     self.button.clicked.connect(self.onStart) 
     ... 
    def onStart(self): 
     # keep sending log in this solt, similar to my external program 
     for i in range(10000): 
      self.logger.debug(str(i)) 

そして、私はすでにスレッドでQTextEditウィジェットにsys.stdoutにself.logger.debug()をリダイレクトし、出力ログしています。

class myThread(QThread): 
    printText = pyqtSignal(str) 

    def __init__(self, parent=None): 
     super(myThread,self).__init__(parent) 

    def write(self, output): 
     self.printText.emit(output) 

    def flush(self): 
     pass 

    def run(self): 
     while True: 
      time.sleep(.1) 

私はボタンをクリックすると、PyQtは、ループfor i in range(10000)と表示何で立ち往生。数秒後、すべての出力ログが一度に表示され、代わりにリアルタイムで表示されます。

+0

コード例では、別のスレッドで実行されるものはありません。すべてがメインスレッドで実行されるため、メインイベントループがブロックされます。 – ekhumoro

答えて

0

ekhumoroの提案として、私はスレッドにループを置く:

def onStart(self): 
    _thread.start_new_thread(self.myLoop,()) 
def myLoop(self): 
    for i in range(10000): 
     self.logger.debug(i) 

_threadモジュールは、私の機能要件を満たしており、ここでうまく動作します。 myLoop()の他のスレッドと通信する必要がある場合は、threadingqueueがより強力です。