0

我正在编写一个在当前目录中显示特定图片的程序。在创建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
4

1 回答 1

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()
于 2013-09-20T14:18:25.790 回答