【发布时间】:2016-05-26 14:59:38
【问题描述】:
我正在开发一个使用 wxPython (3.0.2.0) 的项目,但是由于 wx 试图在关闭 GUI 后立即更新 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 调用)仍然尝试更新 GUI 元素,从而导致 <class 'wx._core.PyDeadObjectError'> PyDeadObjectError('The C++ part of the ArtworkPanel object has been deleted, attribute access no longer allowed.',) 崩溃。
有没有办法清除这个 CallLater 队列?我查看了stopping the entire EventLoop 并可能重新启动它,但我什至不确定这是否有效,是否存在更好的方法来做到这一点,也许使用DeletePendingEvents?
有没有办法取消 wx 中的所有待处理任务,这样当您退出应用程序时,没有(延迟的)函数会使应用程序崩溃?
【问题讨论】:
-
可以修改传递给
CallLater的函数吗?是否可以让它意识到它有时会在对象销毁后运行并适当地处理这种情况? -
@g.d.d.c 不幸的是,已经进行了检查。该函数位于一个面板对象中,如果 self 和 self.list(面板包含一个列表)不是 none,则在该对象中进行检查。在删除 C++ 部分时,python 对象似乎仍然存在。将其包装在尝试中,但可以,但这绝不是解决此问题的方法,最终会在另一个(wx)对象中显示出来。
标签: python python-2.7 wxpython wxwidgets