软件包wxPython非常适合在Python中开发GUI界面应用程序,但到目前为止,我发现退出从Python命令行启动的wxPython中开发的应用程序的唯一方法总是会产生运行时错误。应用程序以编程方式关闭。例如,Frame.Destroy()方法生成错误:
Runtime error
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\PythonSamples\ArcGIS Examples\TIGER Data Loader.py", line 522, in
<module>
frame.Destroy()
RuntimeError: wrapped C/C++ object of type Frame has been deleted
如果调用Frame.Close(),则会生成类似的错误消息。我发现关闭由wxPython生成的应用程序窗口而不生成运行时错误的唯一方法是删除wx.App对象:
app=wx.App()
frame = wx.Frame(etc....)
.
.
.
在程序中要退出框架窗口的某个位置,您可以发出
del app
这似乎是终止应用程序的坏方法。有没有更好的方法不会生成运行时错误消息?
答案 0 :(得分:2)
在一个事件中调用frame.Destroy()
会删除该帧,但程序会返回到wx主循环。
当主循环发现框架已被破坏时,会发生错误。
相反(就像使用线程时一样),使用wx.CallAfter
所以wx它在主线程中执行,而wx
期望这样的更改。对你:
wx.CallAfter(frame.Destroy)
请注意,评论中建议做得更干净:
wx.CallAfter(frame.Close)
因为它为您的应用提供了调用一些清理代码的机会,与Destroy
答案 1 :(得分:1)
frame.Close()
怎么样? Docs are here
作为参考,以下代码不会在我的机器上吐出任何错误:
import wx
class MyFrame(wx.Frame):
def __init__(self):
super().__init__(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()