2011-10-25 55 views
1

我们在我们的项目中使用Python2.3和wxPython V2.4.2.4。它工作正常。现在我们将它升级到Python2.7和wxPython2.8.12.1。我们的项目使用新版本进行编译。但是在我们的代码中的一个阶段的项目中,我们销毁当前窗口,然后再次创建打开新窗口&。我注意到我们的代码在创建新窗口后没有执行。在旧版本中它正在执行。无法从MainLoop()

在下面的代码中。它显示消息“doRead 1”,然后打开窗口。但它不显示消息“doRead 2”。在旧的Python版本中,它显示消息“do Read 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

你的问题(据我所知)是你的MainLoop在你的OnInit函数中,它正在停止你的程序流。老实说,我不能说这是怎么回事,因为在OnInit已经返回True之前,你不能为应用程序输入MainLoop。 OnInit可能会返回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()

+0

感谢您的回复。你的回答帮助我达到了原因。实际上,在我们销毁当前窗口并创建一个新窗口的旧项目中,我们没有编写app.MainLoop()。哪些适用于Python2.3。在Python2.7中,它崩溃了。因此,我们在onInit()函数中添加了self.MainLoop(),该函数停止了崩溃问题,但不会从MainLoop()中出来,因此不会在该行之后执行代码。 现在我已经添加app.MainLoop(),正如你所说,它工作正常。 非常感谢您的帮助。 – user977601