PySide QTextEdit 或 QPlainTextEdit 更新得更快?
PySide QTextEdit or QPlainTextEdit update faster?
我现在正尝试在我的 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 检查服务器的状态。
谁能帮忙,非常感谢!
这与"fast"或"slow"无关。
GUI 运行 与您的 listenToServer
方法在同一个线程上 - 所以只要它 运行ning 在 GUI 线程上就不会发生任何事情。您会注意到在等待套接字输入时无法移动、调整大小或单击 GUI 中的任何内容。
您必须 运行 在与 GUI 分开的线程上使用您的 listenToServer 方法。正确的方法是实现一个 Worker
对象,该对象从套接字接收数据并通过 Signal->Slot 连接通知您 textEdit 有数据准备接收。
前阵子我回答过类似的问题,这可能会有所帮助
一个真正快速而肮脏的替代方法是在您附加新数据时处理所有排队的事件,通过:
QApplication.processEvents()
这给了 Qt 时间,例如用新文本在屏幕上重新绘制 GUI。
但是,当 python 正在等待来自套接字的数据时,您的 GUI 将不会响应任何事件!
我现在正尝试在我的 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 检查服务器的状态。
谁能帮忙,非常感谢!
这与"fast"或"slow"无关。
GUI 运行 与您的 listenToServer
方法在同一个线程上 - 所以只要它 运行ning 在 GUI 线程上就不会发生任何事情。您会注意到在等待套接字输入时无法移动、调整大小或单击 GUI 中的任何内容。
您必须 运行 在与 GUI 分开的线程上使用您的 listenToServer 方法。正确的方法是实现一个 Worker
对象,该对象从套接字接收数据并通过 Signal->Slot 连接通知您 textEdit 有数据准备接收。
前阵子我回答过类似的问题,这可能会有所帮助
一个真正快速而肮脏的替代方法是在您附加新数据时处理所有排队的事件,通过:
QApplication.processEvents()
这给了 Qt 时间,例如用新文本在屏幕上重新绘制 GUI。 但是,当 python 正在等待来自套接字的数据时,您的 GUI 将不会响应任何事件!