无法退出MainLoop()
我们之前在项目中使用的是Python2.3和wxPython V2.4.2.4,一切运行得很好。现在我们把它升级到了Python2.7和wxPython2.8.12.1。项目在新版本下编译得也没问题。但是在代码的某个阶段,我们会关闭当前窗口,然后再创建并打开一个新窗口。我发现,在创建新窗口后,代码没有继续执行,而在旧版本中是可以执行的。
在下面的代码中,它会先显示“doRead 1”,然后打开窗口。但它没有显示“doRead 2”。而在旧的Python版本中,它会显示“doRead 2”,这意味着后面的代码是执行的。
我发现,在新项目的OnInit(...)函数中,代码没有从“self.MainLoop()”这一行跳出来,而在旧项目中是可以跳出来并执行下一行的。
-----------------------------------------
Here is the code:
#Close existing window.
self.Destroy()
print 'doRead 1'
#create new window
app = App()
print 'doRead 2'
app.frame.saveContents()
------------------------------------
class App(wx.App):
"""Application class.
"""
def OnInit(self):
wx.InitAllImageHandlers()
resetOptions()
setOptions()
self.frame = pdtpFrame()
self.frame.SetTitle(std.getTitle())
self.frame.Show()
self.SetTopWindow(self.frame)
self.MainLoop()
return True
def main():
""" Start up the pdtp main window application.
"""
app = App()
if __name__ == '__main__':
main()
1 个回答
1
你的问题(就我所理解的)是你把主循环放在了初始化函数(OnInit)里面,这样会阻碍程序的正常运行。老实说,我不太清楚之前是怎么工作的,因为在初始化函数(OnInit)返回 True
之前,你的应用程序不应该进入主循环。初始化函数可能会返回 False
,这意味着应用程序没有完全初始化(比如你在做单实例应用时,可能会用到锁文件,这种情况很常见)。一种更常见的做法(伪代码)看起来会像这样:
app = wx.PySimpleApp()
f = Frame(None, -1, "Some Title For This Frame")
f.Show()
app.MainLoop()
# Down here more code can follow.
在所有顶层窗口关闭之前,程序不会执行更多的代码,或者直到其他地方调用 wx.GetApp().ExitMainLoop()
。