我正在尝试调试此代码,按下'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()
答案 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条目不是很有用。