#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(), как вы упомянули, и он работает нормально. Большое спасибо за вашу помощь.