2009-05-17 8 views
0

Je suis désolé pour la description verbale. J'ai une application wxPython dans un fichier appelé applicationwindow.py qui réside dans un package appelé garlicsimwx. Lorsque je lance l'application en lançant le fichier susmentionné, tout fonctionne bien. Toutefois, j'ai créé un fichier rundemo.py dans un dossier qui contient le package garlicsimwx, qui exécute également l'application. Lorsque j'utilise rundemo.py, l'application se lance, cependant, lorsque le wx.Frame principal importe un sous-package de garlicsimwx, à savoir simulations.life, pour une raison quelconque, une nouvelle instance de mon application est créée (c'est-à-dire qu'une nouvelle fenêtre identique apparaît.)wxPython lance mon application deux fois lors de l'importation d'un sous-paquet

J'ai essayé de parcourir les commandes une à une, et bien que le bogue se produise seulement après l'importation du sous-paquet, l'instruction import ne le cause pas directement. Ce n'est que lorsque le contrôle revient à PyApp.MainLoop que la deuxième fenêtre s'ouvre.

Comment l'arrêter?

Répondre

4

Je pense que vous avez du code dans un de vos modules qui ressemble à ceci:

import wx 

class MyFrame(wx.Frame): 
    def __init__(...): 
     ... 

frame = MyFrame(...) 

Le cadre sera créé lorsque ce module est d'abord importé. Pour éviter cela, utilisez l'idiome Python commun:

import wx 

class MyFrame(wx.Frame): 
    def __init__(...): 
     ... 

if __name__ == '__main__': 
    frame = MyFrame(...) 

Ai-je deviné correctement?

+0

Une estimation juste Frank, mais non; J'ai le bit 'if __name __ == '__ main __'', qui appelle ma fonction 'main()'. En fait, ce bug survient même si je commente ces deux lignes, et j'appelle 'main()' de 'rundemo.py'. –

+0

@ cool-RR: Vous pouvez avoir le if __name__ == "__main__", mais vous avez aussi un appel de fonction qui se produit au moment de l'importation. Vous devez passer par votre script et assurez-vous que ce soit ENTIÈREMENT la classe et la classe et rien d'autre. –

+0

@Frank: Je suis désolé, mais Python n'exécute-t-il pas un module seulement la première fois qu'il est importé? – Joril

0

Vous pouvez créer une variable booléenne globale telle que g_window_was_drawn et la vérifier dans la fonction qui permet de créer une fenêtre. La valeur serait false au début du programme et passerait à True lors de la première création d'une fenêtre. La fonction qui crée la fenêtre vérifiera si le g_window_was_drawn est déjà vrai, et si c'est le cas, il lèvera une exception. Ensuite, vous aurez une belle pile qui vous indiquera qui est responsable de l'exécution de cette fonction.

J'espère que cela vous aide à le trouver. Je suis désolé pour la solution verbale;)

+0

N'a pas aidé - il s'est avéré que c'était un processus séparé. –

+0

Mais le manque de stacktrace vous a donné la réponse, n'est-ce pas? Dans les deux cas, il était exécuté, g_window_was_drawn était faux, donc c'était des processus séparés –

+0

En fait oui, cela m'a conduit à cette réponse. Donc merci. –

0

Got it: Il n'y avait pas

if __name__=='__main__': 

dans mon dossier rundemo. C'était en fait un problème multiprocessing: La nouvelle fenêtre a été ouverte dans un processus séparé.

Questions connexes