- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我用 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/
我最近从 wxPython 切换到 PyQT,但找不到 CallAfter 的等效项。由于一些导入,我需要使用 pubsub ,并且使用 wx 我刚刚使用 CallAfter 发送消息 - 有没有办法
当我用 wx.CallAfter 执行一个函数时,在它里面设置了一个变量。我希望能够在下一行获取该变量的值,但是 CallAfter 似乎稍后执行了很多函数。我认为它会将它插入某个稍后处理的队列或其他
编辑:这不是如何在 setTimeout 中传递参数的副本。实际上,我想知道如何编写一个像 setTimeout API 一样作为预定义函数的方法调用的函数。 那么,我如何为函数“callAfter”
我正在尝试销毁一个 wxWindow 派生对象,该对象可能已从其容器对象之一受到 Bind() 的影响。根据我的阅读(以及之前处理奇怪错误的一些经验),我相信我需要将对 Destroy() 的调用延迟
我使用:import wx.grid as gridlib然后我在继承wx.Panel的类中执行此操作: self.grid = gridlib.Grid(self) self.grid.Create
我最近收到一道面试题,但我没能正确回答。就这样: Write an implementation of a function callAfter that enables ANY function t
我正在用C++开发一个使用wxWidget的小型桌面应用程序,它是关于可视化不同类型的排序的。为了在排序和绘制屏幕时保持图形用户界面的响应性,我试图在不同的线程上做一些工作,但我知道图形用户界面更新必
我正在用C++开发一个使用wxWidget的小型桌面应用程序,它是关于可视化不同类型的排序的。为了在排序和绘制屏幕时保持图形用户界面的响应性,我试图在不同的线程上做一些工作,但我知道图形用户界面更新必
我正在用C++开发一个使用wxWidget的小型桌面应用程序,它是关于可视化不同类型的排序的。为了在排序和绘制屏幕时保持图形用户界面的响应性,我试图在不同的线程上做一些工作,但我知道图形用户界面更新必
我正在 Windows 7 操作系统上使用 python v2.7 和 wxPython v3.0。在下面的代码片段中,我实现了发布者-订阅者机制来更新我的 GUI。我正在使用 wx.CallAfte
我是一名优秀的程序员,十分优秀!