我有一个基于PyQt5的GUI程序,它不断地接收消息。GUI有一个QLabel,显示接收到的消息数,还有一个QThread尝试在run()中的无限循环中接收消息和更新计数器。代码如下:
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已经收到10000条消息,并在sock.RECV消息(),QLabel仍然显示“500”,直到我手动调整GUI的大小,导致GUI重新呈现。在
我尝试了这个线程的建议pyqt QtGraphicsView does not get updated within loop,并添加了QApplication.processEvents()进入循环,但仍然不起作用。在
那么,从另一个线程直接更新GUI是否合适?PyQt - Modify GUI from another thread建议发出信号。由于我不熟悉signal&slot,应该使用QLabel的预定义信号,还是可以根据需要定义任何信号,只要相应的slot使用setText()更新QLabel的文本。在
只有主GUI线程可以更新GUI。您不应该在主线程之外直接与GUI对象交互。如果要从工作线程与主线程通信,则需要使用}
Signals
和{相关问题 更多 >
编程相关推荐