我正在做一个项目,其中 wxPython
使用 (3.0.2.0),但是一些单元测试有时会失败,因为 wx 试图在它关闭后立即更新 GUI。
在关闭一切的函数中,一个wx.SafeYield(onlyIfNeeded=True)
首先放置以确保事件队列为空。然后一些线程被杀死并运行以下循环:
for item in wx.GetTopLevelWindows():
if item != self:
if isinstance(item, wx.Dialog):
if item.IsModal():
item.EndModal(wx.ID_CANCEL)
else:
item.Destroy()
else:
item.Close()
self.Destroy()
然而,在这个循环之后,显然延迟的 wx 调用(可能用 wx.CallLater 调用)仍然试图更新导致 <class 'wx._core.PyDeadObjectError'> PyDeadObjectError('The C++ part of the ArtworkPanel object has been deleted, attribute access no longer allowed.',)
的 GUI 元素。崩溃。
有没有办法清除这个 CallLater 队列?我看了一下 stopping the entire EventLoop也许重新启动它,但我什至不确定这是否有效,是否有更好的方法来做到这一点,也许使用 DeletePendingEvents ?
有没有办法取消 wx 中所有待处理的任务,这样当您退出应用程序时,没有(延迟的)函数会使应用程序崩溃?
最佳答案
嗯,我没有太多信息而且这完全未经测试,但正如您所建议的,DeletePendingEvents
似乎可以解决问题。在强制结束/销毁对话框/窗口的循环中,您可以调用 item.DeletePendingEvents()
。文档似乎有些乐观,但是 callLater
会被订阅为队列事件吗?我不能确定。
关于python - WxPython - 清除事件队列和未决任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35413798/