2011-10-25 5 views
1

Nous utilisions Python2.3 et wxPython V2.4.2.4 dans notre projet. Et ça fonctionnait bien. Maintenant, nous le mettons à jour vers Python2.7 et wxPython2.8.12.1. Notre projet est compilé avec une nouvelle version. Mais dans notre projet à un stade dans le code, nous détruisons la fenêtre en cours, puis créer & ouvrir une nouvelle fenêtre à nouveau. Et j'ai remarqué que notre code après avoir créé une nouvelle fenêtre ne s'exécute pas. Alors que dans l'ancienne version, il était en cours d'exécution.Ne sort pas de MainLoop()

Dans le code suivant. Il affiche le message "doRead 1" puis ouvre la fenêtre. Mais il n'affiche pas le message "doRead 2". Alors que dans l'ancienne version de Python, il affichait le message "do Read 2", cela signifiait qu'il exécutait le code après cela.

J'ai trouvé que, il ne sort pas de la ligne "self.MainLoop()" dans la fonction OnInit (...) dans le nouveau projet. Mais il sortait et exécutait ainsi la ligne suivante dans le vieux projet.

----------------------------------------- 
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() 

Répondre

1

votre problème (pour autant que je peux dire) est que vous avez votre MainLoop à l'intérieur de votre fonction OnInit, qui est votre flux de l'arrêt de programme. Je ne peux pas parler de comment cela a fonctionné comme ça avant, pour être honnête, parce que vous ne devriez pas être en mesure d'entrer dans le MainLoop pour une App jusqu'à ce que c'est OnInit a retourné True. L'OnInit peut renvoyer False auquel cas l'application n'a pas été entièrement initialisée (ce qui est courant si vous utilisez des applications à instance unique avec un fichier de verrouillage, par exemple). Une approche plus commune (pseudo-code) ressemblerait à ceci:

app = wx.PySimpleApp() 

f = Frame(None, -1, "Some Title For This Frame") 
f.Show() 

app.MainLoop() 

# Down here more code can follow. 

Il n'exécutera plus de code jusqu'à ce que tous les niveau supérieur de Windows sont fermés de l'instance App avant, ou quelque chose d'autre appelle wx.GetApp().ExitMainLoop().

+0

Merci pour la réponse. Votre réponse m'a aidé à atteindre la cause. En fait dans le vieux projet à l'endroit où nous détruisons la fenêtre actuelle et créons une nouvelle fenêtre, nous n'avions pas écrit app.MainLoop(). Qui a fonctionné pour Python2.3. Pendant qu'il était en Python2.7, il s'est écrasé. Ainsi, nous avons ajouté self.MainLoop() dans la fonction onInit(), qui a arrêté le problème de plantage mais qui ne vient pas de MainLoop(), n'exécute donc pas le code après cette ligne. Maintenant, j'ai ajouté l'app.MainLoop() comme vous l'avez mentionné et cela fonctionne très bien. Merci beaucoup pour votre aide. – user977601

Questions connexes