wxPython:程序退出但是在调用sys.exit后窗口仍未响应

时间:2013-09-20 13:45:49

标签: python wxpython

我正在编写一个程序,在当前目录中显示特定的图片。在创建wx.Image对象之前,它会检查图片是否存在。如果图片不存在,它会弹出一个消息对话框,上面写着“无法打开图片'Tsukuyo.jpg'。”然后程序将自动退出。

然而,当我运行它时,它确实退出了(根据交互式shell)但仍然没有响应的窗口。那是为什么?这是代码。

class MyFrame(wx.Frame):
"""Frame class."""

    def  __init__(self, parent=None, id=-1,
                  pos=wx.DefaultPosition,
                  title='Hello, Tsukuyo!', size=(200,100)):
        """Create a Frame instanc."""
        wx.Frame.__init__(self, parent, id, title, pos, size)

class MyApp(wx.App):
"""Application class."""

    def OnInit(self):
        return True

def main():
    app = MyApp()
    try:
        with open('Tsukuyo.jpg'): pass
    except IOError:
        frame = MyFrame()
        frame.Show()
        dlg = wx.MessageDialog(frame, "Can not open image 'Tsukuyo.jpg'.",
                               "Error", wx.OK)
        dlg.ShowModal()
        dlg.Destroy()
        wx.Frame.Close(frame, True)
        app.ExitMainLoop()
        sys.exit(0)

    ## Nothing goes wrong? Show the picture.
    ## blah blah blah

1 个答案:

答案 0 :(得分:1)

这是一段非常奇怪的格式代码。我怀疑wx.Frame.Close(frame,True)没有达到预期的效果。我当然从来没有见过有人这样的框架。通常使用框架实例本身关闭框架,在这种情况下看起来像这样:

frame.Close()

这就是通常所需的一切。我从未见过有人使用ExitMainLoop()。 sys.exit(0)过度。一旦wx完成破坏其所有小部件,它将退出。我怀疑其中一个是出乎意料的事情。或者有可能wx获得了kill命令,并且当它试图破坏自己时,Python试图退出并且它会挂起。

所以我重新编写代码以遵循退出wx应用程序的正常方式:

import wx

class MyFrame(wx.Frame):
    """Frame class."""

    def  __init__(self, parent=None, id=-1,
                  pos=wx.DefaultPosition,
                  title='Hello, Tsukuyo!', size=(200,100)):
        """Create a Frame instanc."""
        wx.Frame.__init__(self, parent, id, title, pos, size)

        try:
            with open('Tsukuyo.jpg') as fh:
                data = fh.read()
        except IOError:
            dlg = wx.MessageDialog(self, "Can not open image 'Tsukuyo.jpg'.",
                                   "Error", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()

            self.Close()

class MyApp(wx.App):
    """Application class."""

    def OnInit(self):
        frame = MyFrame()
        frame.Show()
        return True

def main():
    app = MyApp()

if __name__ == "__main__":
    main()