私は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のテキストを更新する限り、必要な信号を定義してください。