【问题标题】:Writing to TextCtrl widget of wxPython while recieving data ( TCP )在接收数据时写入 wxPython 的 TextCtrl 小部件( TCP )
【发布时间】:2014-04-26 17:44:06
【问题描述】:

我在将接收到的数据从 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 实例时创建的,而不是像另一个动态一样。

我尝试在接收数据的 while 循环中使用 wx.CallAfter,但它没有帮助。
有人遇到过这个问题吗?
谢谢!

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

我写给 TextCtrl 的 Class 是 ClientThread


【问题讨论】:

    标签: wxpython


    【解决方案1】:

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

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

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

    采用这种方法的原因是将通信线程与主 GUI 线程分开,这样可以防止您的应用程序界面“挂起”,并保持一切重新绘制和正确更新。

    【讨论】:

    • 我添加了完整的代码。如果您需要一些客户端版本,请访问我添加的链接 client.py。让我知道它是否适合你。
    • 你能给我举个例子,我可以创建子框架并从大型机向他发送事件吗?
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2010-11-17
    • 2014-11-12
    相关资源
    最近更新 更多