2013-02-01 13 views
0

我已经看过 http://wiki.wxpython.org/LongRunningTasks http://wiki.wxpython.org/CallAfter 并在谷歌搜索了很多,但没有找到答案,我的问题。因为在我看来,这将是很多代码,这是一个理论问题,我希望没有代码就可以。与互动在两个方向上的wxPython帧从另一个线程

我想要做一个例子:我有一个网格(wx.grid)与主线​​程中的复选框。然后,我开始一个新的线程(thread.start_new_thread),在其中遍历所有行(每行1秒),并检查复选框是否已设置。如果确定了,则完成一些工作。

这是工作,如果我读出所有行之前我开始线程。但我需要读出线程正在运行,因为用户应该有能力取消选中或检查另一个复选框!但是,如果我在新线程中读出它,有时会出现“NonType Object is callable”错误。我认为,因为wx.CallAfter应该用于与其他线程中的网格进行交互。但CallAfter我无法获得返回值。

我不知道如何解决这个问题。也许一些有更多线程经验的人有一些想法?如果您需要其他数据,请询问,但我认为我的示例包含所有必要的信息。

+0

我想绑定复选框更改事件到一个处理程序,将做“一些工作”是不可能的,因为“一些工作”是太长了吗? – Fenikso

+0

是的,没错。在工作中,我会做一些事情,比如telnet请求等。因此,事件会使软件无响应。现在,它解决了没有事件发生的方式,并且当用户选中所有复选框时,他使用按钮启动过程。 – timmornYE

+0

嗯,我有你的问题的解决方案,但我不知道如何阅读网格中的复选框值。你有最小的可运行的例子来证明你的问题吗? – Fenikso

回答

1

这种类型的事情的一种常见方法是使用Queue.Queue对象将命令传递给一个或多个工作线程。工作线程将等待队列中的拉,直到队列中的项目已准备好被拉出。命令对象的一部分可能是GUI线程中的一个目标,用于在命令完成时发送消息(以线程安全的方式,如使用wx.CallAfter)。

您还应该看看wx.lib.delayedresult模块。它与上面类似,但更强大一点。

+0

谢谢,我认为这将解决我的问题。 – timmornYE