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