我面临一些问题,将接收数据从TCP连接写入TextCtrl(使用wxPython)
我有一个带有while循环的线程,它等待从用户收到的数据:
def run(self):
while 1:
try:
# receive
data = self.channel.recv(1024)
except socket.error, msg:
if 'timed out' in msg:
continue
if data:
wx.PostEvent(self._notify_window, ResultEvent('[' + self.username + ']>> ' + data + '\n'))
self.text.AppendText(data+"")
notify_window是我的主框架,每个连接都有一个MDIChildFrame,对于每个ChildFrame,我附加TextCtrl来显示收到的数据。
我试图在接收数据的while循环中使用wx.CallAfter,但它没有帮助
有人遇到过这个问题吗?
谢谢!
笔记:
我修改了示例:pychatroom - server.py
从我写入TextCtrl的类是ClientThread
答案 0 :(得分:1)
WorkerThread中的文本对象(self.text)及其所有相关代码应该移动到它自己的框架对象。
部分问题是WorkerThread是一个线程类而不是wx.Window类,因此它不支持显示和更新文本控件的功能。
一些背景知识...一般框架是你将为每个子窗口创建一个新的WorkerThread,并且在创建新子窗口时,您将创建一个新线程并将新线程的事件绑定到新窗口。 PostEvent方法将数据从接收线程传递到子窗口。从不将wx GUI方法调用与线程对象混合在一起是一种很好的做法。
这种方法的原因是将通信线程与主GUI线程分开,这会阻止您的应用程序界面“挂起”#34;并保持所有内容重新粉刷和更新。