我们在项目中使用了Python2.3和wxPython V2.4.2.4。而且工作正常。现在,我们将其升级到Python2.7和wxPython2.8.12.1。我们的项目已使用新版本进行了很好的编译。但是在项目的代码阶段,我们销毁了当前窗口,然后再次创建并打开新窗口。而且我注意到创建新窗口后的代码无法执行。在旧版本中,它正在执行。

在下面的代码中。它显示消息“ 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()

最佳答案

您的麻烦(据我所知)是您将MainLoop放在OnInit函数中,这使程序流暂停。老实说,我不能说它以前是如何工作的,因为在OnInit返回True之前,您不应该输入App的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.


在从先前的App实例关闭所有顶级Windows或以其他方式调用wx.GetApp().ExitMainLoop()之后,它才会执行更多代码。

关于python - 不来自MainLoop(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7883948/

10-12 21:14