2010-05-18 5 views
1

mon problème provient de l'utilisation de wxApp autant que je peux dire.wxPython: MainLoop() semble se bloquer

À l'intérieur d'un petit sous-programme, j'appelle un wx.MessageDialog pour demander un oui ou un non. Je récupère la réponse à un processus de certaines choses. Mon code exemple ci-dessous fonctionne réellement (bien qu'il pourrait être laid), sauf que la boîte de dialogue reste ouverte après avoir heurté un des boutons ...

import wx 
from os import path 
def HasFile(filename): 
    if path.isfile(filename): 
     app = wx.App() 
     dial = wx.MessageDialog(None, 
           'Die Datei "'+filename+'" wurde gefunden.\nSoll sie eingelesen werden?', 
           'Bitte antworten', 
           wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) 
     result = dial.ShowModal() 
     dial.EndModal(retCode=0) 
     dial.Destroy() 
     app.MainLoop() 
     return result == wx.ID_YES 
    else: 
     return False 

Ainsi, alors que le reste du programme ne devrait tout, la boîte est juste là. Il semble aussi que mes appels à matplotlib plus tard produisent des erreurs (une erreur Tkinter pour être précis), peut-être à cause des trucs wx?

Modifier: J'ai essayé de mettre fin à l'application avec un appel à app.Destroy(). Cela ne change pas le fait que la boîte est toujours là. Quand je lance un app.IsActive() après tout le programme se termine (presque comme un sys.exit())! Comment venir?

Edit 2: Ajout d'un wxApp comme ce n'est pas une bonne idée puisque les autres scripts sont affectés. Les commandes de traçage suivantes ne s'affichent pas et je ne sais pas comment résoudre ce problème. J'ai donc décidé de retirer le DialogBox ensemble. Appelant votre fonction avec EndModal supprimé, cela fonctionne bien et me renvoie à la console après avoir choisi oui/non.

Répondre

2

La sélection d'un de ces appels essentiellement EndModal, et vous appeler comme ça a été manuellement lancer une exception

Traceback (most recent call last): 
    File "blah.py", line 19, in <module> 
    HasFile("C:\tbzrcommand_args.txt") 
    File "blah.py", line 12, in HasFile 
    dial.EndModal(retCode=0) 
    File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_windows.py", line 715, in EndModal 
    return _windows_.Dialog_EndModal(*args, **kwargs) 
wx._core.PyAssertionError: C++ assertion "IsModal()" failed at ..\..\src\msw\dialog.cpp(361) in wxDialog::EndModal(): EndModal() called for non modal dialog 

fix:

import wx 
from os import path 
def HasFile(filename): 
    if path.isfile(filename): 
     print 'gfd' 
     app = wx.App(redirect=False) 
     dial = wx.MessageDialog(None, 
           'Die Datei "'+filename+'" wurde gefunden.\nSoll sie eingelesen werden?', 
           'Bitte antworten', 
           wx.YES_NO | wx.YES_DEFAULT | wx.ICON_QUESTION) 
     result = dial.ShowModal() 
     dial.Destroy() 
     app.MainLoop() 
     return result == wx.ID_YES 
    else: 
     return False 
Questions connexes