2016-06-12 3 views
0

私はPyQt5上にGUIプログラムを構築しています。 GUIには、受信したメッセージの数とrun()の無限ループでメッセージを受信して​​カウンタを更新しようとするQThreadを示すQLabelがあります。ここでは、コードは次のようになります。pyqt他のスレッドがそのテキストを更新している間にQLabelがレンダリングされない

class ReceiveThread(QtCore.QThread): 
    def __init__(self, parent, dialog, config): 
     super(BufRecvThread, self).__init__(parent) 
     #here dialog is the QDialog which contains the QLabel showing the message counter 
     self.dialog=dialog    
     self.toStop=False 

    def run(self): 
     bufRecvCnt=0 
     while not self.toStop: 
      recv_buff=sock.recvMessage() 
      bufRecvCnt=bufRecvCnt+1 
      #self.dialog.lbBufRecvCnt is the QLabel showing the message counter 
      self.dialog.lbBufRecvCnt.setText(str(bufRecvCnt)) 
      QApplication.processEvents() #this statement has no effect 

しかし、ほとんどの時間は、私はGUIでQLabelが適切にカウンターをレンダリングしていないことが判明、たとえば、ReceiveThread)は(sock.recvMessageで10000のメッセージやブロックを受信しましたQLabelは手動でGUIのサイズを変更してGUIを再レンダリングするまでは「500」と表示されます。

このスレッドpyqt QtGraphicsView does not get updated within loopの提案を試して、QApplication.processEvents()をループに追加しましたが、それでも動作しません。

は、のGUIを別のスレッドから直接更新するのが適切ですか? PyQt - Modify GUI from another threadはシグナルを放出することを示唆しています。信号&スロットに慣れていないので、QLabelの定義済み信号を使用するか、対応するスロットがsetText()でQLabelのテキストを更新する限り、必要な信号を定義してください。

答えて

1

メインGUIスレッドのみがGUIを更新できます。メインスレッド外のGUIオブジェクトと直接対話するべきではありません。あなたはワーカースレッドからメインスレッドと通信したい場合は、使用する必要がSignalsSlots

class Dialog(QtGui.QDialog): 

    def __init__(self, parent): 
     super(Dialog, self).__init__(parent) 
     ... 

     self.thread = ReceiveThread(self) 
     self.thread.message_received.connect(self.handle_message) 

    @QtCore.pyqtSlot(str) 
    def handle_message(self, message): 
     self.lbBufRecvCnt.setText(message) 


class ReceiveThread(QtCore.QThread): 

    message_received = QtCore.pyqtSignal(str) 

    def __init__(self, parent, config): 
     super(ReceiveThread, self).__init__(parent)   
     self.toStop = False 

    def run(self): 
     bufRecvCnt=0 
     while not self.toStop: 
      recv_buff = sock.recvMessage() 
      bufRecvCnt = bufRecvCnt + 1 
      self.message_received.emit(str(bufRecvCnt)) 
関連する問題