【发布时间】:2014-07-07 16:07:09
【问题描述】:
当我使用 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 永远不需要。
-
@user2963623 关于在我传递给 wx.CallAfter 的函数中调用 wx 后可能导致应用程序完全挂起的任何想法?它不会引发异常,也不会输出任何警告,并且在它之后也不会遇到断点。它只是挂断了应用程序。
-
这是指您之前使用
msvcrt.getch()注册按键的问题吗? -
msvcrt.getch()似乎没有与 PyDev 一起工作:bugs.eclipse.org/bugs/show_bug.cgi?id=375172,但是我目前正在做的事情过去常常工作(在移动到另一个线程并使用wx.CallAfter()之前)。但是是的,它以与msvcrt.getch()相同的方式挂断,并且在控制台或异常中没有留下警告或错误消息。 -
hmm 我注意到在我停止调试后,PyDev 告诉我调用
wx.CallAfter()的线程的退出代码是-1