【发布时间】:2013-02-01 11:27:48
【问题描述】:
我已经读过了 http://wiki.wxpython.org/LongRunningTasks http://wiki.wxpython.org/CallAfter 并在谷歌搜索了很多,但没有找到我的问题的答案。因为在我看来这会是很多代码,而且更多的是一个理论问题,我希望没有代码也可以。
我想用一个例子做什么:我在主线程中有一个带有复选框的网格(wx.grid)。然后我启动一个新线程(thread.start_new_thread),在其中遍历所有行(每行 1 秒)并检查复选框是否已设置。如果已设置,则某些工作已完成。
这是有效的,如果我在启动线程之前读出所有行。但我需要在线程运行时读出它,因为用户应该能够取消选中或选中另一个复选框!但是,如果我在新线程中读出它,有时会引发“NonType Object is not callable”错误。我认为因为 wx.CallAfter 应该用于与其他线程中的网格进行交互。但是CallAfter我不能用来获取返回值。
我不知道如何解决这个问题。也许一些有更多线程经验的人有一些想法?如果您需要更多数据,请询问,但我认为我的示例包含所有必要信息。
【问题讨论】:
-
我猜想将复选框更改事件绑定到可以执行“某些工作”的处理程序是不可能的,因为“某些工作”太长了?
-
是的,没错。在工作中,我会做一些事情,比如 telnet 请求等。所以该事件会使软件无法反应。现在它解决了没有事件发生的方式,当用户选中所有复选框时,他使用按钮启动该过程。
-
好吧,我有解决您问题的方法,但我不知道如何读取网格中的复选框值。您是否有可以证明您的问题的最小可运行示例?
-
使用
wx.Timer定期检查您的复选框值,并在选中正确的复选框配置时仅为“某些作业”创建一个新线程。 -
问题是,对于一个最小的例子来说它会很复杂。不,我不能这样。用户交互应该是这样的: 1. 用户检查应该处理的所有行 2. 单击按钮后开始处理,从上到下处理每个检查的行。当前正在处理的行用彩色表示 3. 在此过程继续进行时,用户应该能够选中新行或取消选中已选中的行。
标签: python multithreading wxpython