python - wxPython wx.CallAfter - 如何让它立即执行?

标签 python events wxpython

当我使用 wx.CallAfter 执行函数时,其中会设置一个变量。我希望能够在下一行获取该变量的值,但是 CallAfter 似乎稍后会执行该函数很多次。我认为它将它推送到某个队列中,稍后再处理或其他什么...有没有办法让该队列立即处理?

这是wx.CallAfter的代码:

def CallAfter(callableObj, *args, **kw):
    """
    Call the specified function after the current and pending event
    handlers have been completed.  This is also good for making GUI
    method calls from non-GUI threads.  Any extra positional or
    keyword args are passed on to the callable when it is called.

    :see: `wx.CallLater`
    """
    assert callable(callableObj), "callableObj is not callable"
    app = wx.GetApp()
    assert app is not None, 'No wx.App created yet'

    if not hasattr(app, "_CallAfterId"):
        app._CallAfterId = wx.NewEventType()
        app.Connect(-1, -1, app._CallAfterId,
                    lambda event: event.callable(*event.args, **event.kw) )
    evt = wx.PyEvent()
    evt.SetEventType(app._CallAfterId)
    evt.callable = callableObj
    evt.args = args
    evt.kw = kw
    wx.PostEvent(app, evt)

我的假设是 wx.PostEvent 将“evt”放入“app”中的某个内部容器中,并且在某个时刻该容器被迭代并且所有元素都执行了“可调用”或其他什么?所以基本上我需要立即发生这种情况,但我找不到任何看起来像“wx.ForceEventProcessing()”或“wx.FlushEventsQueue”的东西

我尝试在定义方法的面板中调用 self.Update(),但这只是阻止了应用程序并且停止响应。

最佳答案

正如你所猜测的,wx.CallAfter 将调用信息添加到队列(待处理事件队列,下次事件队列清空时在 GUI 线程中处理),然后返回立即地。换句话说,它旨在成为“即发即忘”的函数调用。

如果您需要获取被调用函数的结果,可以采取几种方法。一种是延迟结果模式,基本上您会得到一个结果对象,该对象将在调用函数调用后接收函数调用的结果,并且调用代码可以在发生这种情况时收到通知。 wx.lib.delayedresult 中有此模式的实现,并且可能可以在不同的地方找到此模式的其他实现。这种方法的好处是调用线程不必停止并等待结果,并且可以根据需要继续处理其他事情。

我认为另一个相当不错的方法是wxAnyThread,可以在 https://pypi.python.org/pypi/wxAnyThread/ 找到它。 。该模块提供了一个装饰器,允许像普通函数调用一样从任何线程调用方法,但是当从 GUI 线程以外的其他线程调用时,它将使用类似于 wx.CallAfter 的处理来获得该函数在UI线程中调用,然后等待结果,收到后返回给调用者。因此,尽管在处理 UI 事件和调用函数时调用线程会被阻塞,但使用起来要简单得多,并降低了调用方的复杂性。

关于python - wxPython wx.CallAfter - 如何让它立即执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615002/

相关文章:

python - 检查列表是否由其他列表组成

python - 我如何检测我的窗口何时被 wxPython 最小化?

javascript - 如何检测 "search"HTML5 输入的清除?

c# - 当类中发生变化时触发事件

仅订阅和触发自定义事件的 JavaScript 框架?

python - 为什么 WxPython 的运动检测这么慢?

python - 使用哪些 gui 元素?

python - 从 2 元组列表生成最大数量的 3 元组

python - 将视频帧与另一个图像python进行比较?

python - 在 Travis CI 中,我可以在所有构建矩阵成功后运行脚本吗?