gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:16:04 29 4
gpt4 key购买 nike

当我用 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com