无法退出MainLoop()

1 投票
1 回答
1380 浏览
提问于 2025-04-17 04:56

我们之前在项目中使用的是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()

撰写回答