在接收数据(TCP)时写入wxPython的TextCtrl小部件

时间:2014-04-26 17:44:07

标签: wxpython

我面临一些问题,将接收数据从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来显示收到的数据。


  1. 如果我更改ChildFrame的标题(特定连接),例如window.SetTitle(“..”)一切正常。
  2. 如果我将文字追加到某些TextCtrl - >在这个问题中,我的应用程序的ChildFrame的TextCtrl挂起。
  3. 正如您所看到的,wx.PostEvent(...)工作正常,它将所有数据打印到一个TextCtrl。但是这个TextCtrl是在创建MainFrame实例时创建的,而不是像另一个那样动态创建。
  4. 我试图在接收数据的while循环中使用wx.CallAfter,但它没有帮助 有人遇到过这个问题吗? 谢谢!

    笔记:
    我修改了示例:pychatroom - server.py

    从我写入TextCtrl的类是ClientThread

1 个答案:

答案 0 :(得分:1)

WorkerThread中的文本对象(self.text)及其所有相关代码应该移动到它自己的框架对象。

部分问题是WorkerThread是一个线程类而不是wx.Window类,因此它不支持显示和更新文本控件的功能。

一些背景知识...一般框架是你将为每个子窗口创建一个新的WorkerThread,并且在创建新子窗口时,您将创建一个新线程并将新线程的事件绑定到新窗口。 PostEvent方法将数据从接收线程传递到子窗口。从不将wx GUI方法调用与线程对象混合在一起是一种很好的做法。

这种方法的原因是将通信线程与主GUI线程分开,这会阻止您的应用程序界面“挂起”#34;并保持所有内容重新粉刷和更新。