【问题标题】:Interact with a wxPython frame in both directions from another thread从另一个线程双向与 wxPython 框架交互
【发布时间】: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


【解决方案1】:

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

您还应该看看 wx.lib.delayedresult 模块。它与上述类似,但功能更强大,更健壮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2017-02-26
    • 1970-01-01
    相关资源
    最近更新 更多