如何在 unittest 中销毁 wxPython 框架

How to destroy a wxPython frame in unittest

我正在 运行 我的 wxPython GUI 上进行单元测试。测试大致按预期工作,除了我创建的帧不会消失。到我的测试结束时,我有 30 个或更多的顶级 windows。这是我的设置和拆卸代码:

def setUp(self):
    self.app = wx.App()
    self.frame = MyGridFrame()

def tearDown(self):
    self.frame.Destroy()
    for wind in wx.GetTopLevelWindows():
        wind.Destroy()
    self.app.Destroy()

我尝试了您在我的 tearDown 函数中看到的四行的几种不同组合,但它们都具有相同的(没有任何)效果。

这是文档中的一个可以正常工作的 tearDown 函数: https://github.com/wxWidgets/Phoenix/blob/master/unittests/wtc.py

def tearDown(self):
    def _cleanup():
        for tlw in wx.GetTopLevelWindows():
            if tlw:
                tlw.Destroy()
        wx.WakeUpIdle()
        #self.app.ExitMainLoop()   
    wx.CallLater(50, _cleanup)
    self.app.MainLoop()
    del self.app

推测事件循环必须运行实际捕捉并处理通过调用window.Destroy()产生的关闭事件。这是有道理的,但我花了一段时间才弄明白。