如何干净地退出wxPython应用程序?

时间:2018-03-23 16:49:47

标签: python wxpython

软件包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

这似乎是终止应用程序的坏方法。有没有更好的方法不会生成运行时错误消息?

2 个答案:

答案 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()