Не выходит из MainLoop ()

#python #wxpython

#python #wxpython

Вопрос:

Мы использовали Python2.3 и wxPython V2.4.2.4 в нашем проекте. И он работал нормально. Сейчас мы обновляем его до Python2.7 и wxPython2.8.12.1. Наш проект отлично скомпилирован с новой версией. Но в нашем проекте на одном этапе кода мы уничтожаем текущее окно, а затем снова создаем и открываем новое окно. И я заметил, что наш код после создания нового окна не выполняется. В то время как в старой версии он выполнялся.

В следующем коде. Он отображает сообщение «doRead 1», затем откройте окно. Но он не отображает сообщение «doRead 2». Хотя в старой версии Python отображалось сообщение «do Read 2», это означает, что после этого он выполнял код.

Я обнаружил, что он не выходит из строки «self.MainLoop()» в функции OnInit(…) в новом проекте. Но он выходил и, таким образом, выполнял следующую строку в старом проекте.

 -----------------------------------------
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, которая останавливает поток вашей программы. Честно говоря, я не могу говорить о том, как это работало раньше, потому что вы не сможете войти в MainLoop для приложения, пока оно не вернется OnInit True . 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() .

Комментарии:

1. Спасибо за ответ. Ваш ответ помог мне разобраться в причине. На самом деле в старом проекте в том месте, где мы уничтожаем текущее окно и создаем новое окно, мы не написали app.MainLoop() . Который работал для Python2.3. В то время как в Python2.7 произошел сбой. Таким образом, мы добавили self . MainLoop() в функции OnInit(), которая остановила проблему сбоя, но не выходит из MainLoop(), поэтому не выполняет код после этой строки. Теперь я добавил app.MainLoop(), как вы упомянули, и он работает нормально. Большое спасибо за вашу помощь.