WxTimer不会让wxFrame关闭

时间:2014-05-29 12:07:24

标签: python user-interface wxpython

我正在尝试调试此代码,按下'x'按钮时Frame不会关闭,但是当我注释掉wxTimer时我能够关闭它。在谷歌上搜索我发现 - http://wiki.wxpython.org/Timer我试图将事件绑定到顶级窗口,但是按下'x'按钮时从不调用onClose函数。

有什么建议吗?

class matplotsink(wx.Panel):

    def __init__(self, parent, title, queue):
        # wx.Frame.__init__(self, parent, -1, title)
        wx.Panel.__init__(self, parent, wx.SIMPLE_BORDER)

        #self.datagen = DataGen()
        #self.data = self.datagen.next()

        self.data = []

        self.parent = parent
        self.title = title
        self.queue = queue

        self.paused = False

        #self.create_menu()
        #self.create_status_bar()

        self.toplevelcontainer = wx.GetApp().GetTopWindow()
        self.toplevelcontainer.CreateStatusBar()


        print 'Hey'
        # menuBar = wx.MenuBar()
        # fileMenu = wx.Menu()
        # fileMenu.Append(wx.ID_NEW, '&New')
        # fileMenu.Append(wx.ID_OPEN, '&Open')
        # fileMenu.Append(wx.ID_SAVE, '&Save')
        # menuBar.Append(fileMenu, '&File')
        # self.toplevelcontainer.SetMenuBar(menuBar)  


        self.toplevelcontainer.Bind(wx.EVT_CLOSE, self.onCloseFrame)
        self.create_main_panel()

        self.redraw_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.draw_callback, self.redraw_timer)

        self.redraw_timer.Start(100)

    def onCloseFrame(self,event):
        print 'Hey1'
        self.redraw_timer.Stop()
        self.toplevelcontainer.Destroy()
        self.toplevelcontainer.Close()

1 个答案:

答案 0 :(得分:3)

我看不到onCLoseFrame()没有被调用。恰恰相反,self.toplevelcontainer.Destroy()重新触发EVT_CLOSE无限,直到达到最大递归深度。这就是self.toplevelcontainer永远不会被关闭的原因。

不要试图自己销毁顶级窗口,而是让事件处理程序在完成清理后跳过它来完成它的工作:

    def onCloseFrame(self, event):
        # ...
        self.redraw_timer.Stop() #cleanup, important!
        event.Skip()

您可以查看this stackoverflow answer(答案中的链接)以获取解释。正如我所见,wx.Timer的特定wxPython-wiki条目不是很有用。