2011-10-25 4 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

귀하의 문제는 (지금까지 내가 말할 수있는)를 사용하여 프로그램의 흐름을 중단 귀하의하는 OnInit 함수의 내부에 주회 돌이를 가지고있다. OnLit이 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()을 작성하지 않았습니다. 파이썬 2.3에서 작동했습니다. Python2.7에서는 충돌이 발생했습니다. 따라서 우리는 onInit() 함수에서 self.MainLoop()을 추가했습니다.이 함수는 충돌 문제를 중단했지만 MainLoop()에서 나오지 않으므로 해당 행 다음에 코드를 실행하지 않습니다. 이제 app.MainLoop()을 추가했는데 제대로 작동합니다. 도움을 주셔서 감사합니다. – user977601