另一个线程更新其tex时未呈现pyqt QLabel

2024-09-28 13:06:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基于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的文本。在


Tags: therunself消息initisdef计数器
1条回答
网友
1楼 · 发布于 2024-09-28 13:06:03

只有主GUI线程可以更新GUI。您不应该在主线程之外直接与GUI对象交互。如果要从工作线程与主线程通信,则需要使用Signals和{}

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))

相关问题 更多 >

    热门问题