以下是关闭框架的常规方法:
import wx
########################################################################
class MyFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Close Me")
panel = wx.Panel(self)
closeBtn = wx.Button(panel, label="Close")
closeBtn.Bind(wx.EVT_BUTTON, self.onClose)
#----------------------------------------------------------------------
def onClose(self, event):
""""""
self.Close()
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame()
frame.Show()
app.MainLoop()
现在如果你有一个绑定到wx.EVT_CLOSE,那么你最终会遇到一个无限循环,直到你得到一个segfault.绑定到EVT_CLOSE的主要原因是您可以捕获关闭事件,并要求用户保存其信息.如果你想这样做,那么你需要使用self.Destroy而不是“self.Close”,所以你不会继续触发那个事件.
如已经提到的,在你的关闭处理程序中,你需要确保你结束线程,销毁任务栏图标,关闭打开的文件等,所以没有挂起.参见:http://wxpython.org/docs/api/wx.CloseEvent-class.html
OP的添加
我面临两个问题,我感谢所有三个答案帮助我找到他们:
首先,框架不响应self.Close()或self.Destroy(),因为它具有一个具有正在运行的线程的属性self.stuff.这个线程必须首先关闭.
第二,self.Close()在响应关闭事件的处理程序中,并在调用时导致无限递归.这导致运行时错误(分段错误,超出递归深度).解决方案是使用self.Destroy()来代替.