python - WxPython - 清除事件队列和未决任务

标签 python python-2.7 wxpython wxwidgets

我正在做一个项目,其中 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/

相关文章:

python - 为什么我的文本在 wxPython 中没有正确对齐?

python - 如何将新列作为字符串分配给 Pandas 分配

python pyodbc SQL Server Native Client 11.0 无法返回几何列

python - 调用 read() 时 OpenCV (Python) 不更新帧

python-2.7 - 具有自定义颜色的离散值的 matplotlib 热图

python - wxPython 获取事件 ID

python - 数据框列值组合?

python - Paramiko scp 从远程机器正则表达式复制

mysql - Python 2.7、MySQL、JSON 和 DateTime - 如何删除时间戳字段中日期和时间之间的 T?

python - 在 wxPython 中展开的 FoldPanelBar 上没有出现滚动条