PySide QTextEdit或QPlainTextEdit更新速度更快?

时间:2015-04-22 13:25:38

标签: python sockets pyside qtextedit qplaintextedit

我现在正试图让我的PC上的GUI与每个插槽的服务器进行通信。

这是GUI代码的一部分:

def listenToServer(self):
    """ keep listening to the server until receiving 'All Contracts Finished' """
    self.feedbackWindow.appendPlainText('--Executing the Contracts, Listening to Server--')
    contentsListend = ''
    while contentsListend != 'All Contracts Finished':
        #keep listen from the socket
        contentsListend = self.skt.recv(1024)
        #make the GUI show the text
        self.feedbackWindow.appendPlainText(contentsListend)

在另一方面,服务器将逐个发送数据但有一些间隔。以下是模拟服务器的测试代码:

for i in range(7):
    print 'send back msg, round: ', i # this will be printed on the screen of the server, to let me know that the server works
    time.sleep(1) # make some interval
    # c is the connected socket, which can send messages
    # just send the current loop number
    c.send('send back msg' + str(i))
c.send('All Contracts Finished')
c.close()# Close the connection

现在,除了问题之外,一切都有效,GUI只会在服务器中的整个for循环之后显示收到的消息。 一旦我运行服务器和GUI。服务器端以正确的速度逐个打印消息到屏幕上,但GUI没有响应,它不会更新。直到程序结束,所有7行都在GUI端同时出现。我希望它们逐个出现,以便稍后我可以在我的PC上使用此GUI检查服务器的状态。

任何人都可以帮忙,非常感谢!

1 个答案:

答案 0 :(得分:0)

这与" fast"无关。或者"慢"。

GUI运行在与listenToServer方法相同的线程上 - 因此只要它在GUI线程上不会发生任何操作。您注意到在等待套接字输入时,您无法移动,调整大小或点击GUI中的任何内容。

您必须在与GUI分离的线程上运行listenToServer方法。正确的方法是实现一个Worker对象,该对象从套接字接收数据,并通过Signal-> Slot连接通知您textEdit,该数据已准备好接收。

我回答了一个类似的问题,这可能有所帮助 https://stackoverflow.com/a/24821300/2319400

真正快速而肮脏的替代方案是在您添加新数据时处理所有排队的事件,通过:

QApplication.processEvents()

这给了Qt时间,例如用新文本重新绘制屏幕上的GUI。 但是,当python等待来自套接字的数据时,你的GUI不会响应任何事件!