2011-09-08 6 views
5

Ho creato un'applicazione wxPython che mostra alcuni messaggi in una finestra di dialogo. La finestra di dialogo è necessaria per essere forzata dall'applicazione prima di fare clic sulla finestra di dialogo OK. Ho usato wx.lib.delayedresult per effettuare la chiamata destroy.Come posso distruggere in modo sicuro una finestra di dialogo di un'applicazione wxPython?

Il mio codice è:

import wx 
dlg=wx.MessageDialog(somewindow,'somemessage') 
from wx.lib.delayedresult import startWorker 
def _c(d): 
    dlg.EndModal(0) 
    dlg.Destroy() 
def _w(): 
    import time 
    time.sleep(1.0) 
startWorker(_c,_w) 
dlg.ShowModal() 

Questo può fare ciò che desidero fare, mentre ho ricevuto un messaggio di errore:

(python: 15150): Gtk-CRITICO **: gtk_widget_destroy : asserzione `GTK_IS_WIDGET (widget) 'non riuscita

Come si può" distruggere "in modo sicuro una finestra di dialogo senza fare clic sul pulsante di dialogo?

risposta

0

È passato un po 'di tempo da quando ho usato wxWidgets ma penso che il tuo dlg.Destroy() potrebbe essere nel posto sbagliato. Prova a spostarlo nel thread principale.

import wx 
dlg=wx.MessageDialog(somewindow,'somemessage') 
from wx.lib.delayedresult import startWorker 
def _c(d): 
    dlg.EndModal(0) 
def _w(): 
    import time 
    time.sleep(1.0) 
startWorker(_c,_w) 
dlg.ShowModal() 
dlg.Destroy() 
+0

Grazie per la risposta! Ho già provato questo e ho scoperto che la finestra di dialogo non scompare. – Akira

0

avrei usato un wx.Timer()

import wx 

######################################################################## 
class MyDialog(wx.Dialog): 
    """""" 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     """Constructor""" 
     wx.Dialog.__init__(self, None, title="Test") 

     timer = wx.Timer(self) 
     self.Bind(wx.EVT_TIMER, self.onTimer, timer) 
     timer.Start(5000) 

     self.ShowModal() 

    #---------------------------------------------------------------------- 
    def onTimer(self, event): 
     """""" 
     print "in onTimer" 
     self.Destroy() 

if __name__ == "__main__": 
    app = wx.App(False) 
    dlg = MyDialog() 
    app.MainLoop() 

Vedi anche http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

0

Il mio problema con dlg.Destroy() è che non sta uscendo il prompt. ho fatto in seguito per uscire dal prompt:

def OnCloseWindow(self, e):  
    dial = wx.MessageDialog(None, 'Are you sure to quit?', 'Question', 
          wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION) 
    ret = dial.ShowModal() 
    if ret == wx.ID_YES: 
     self.Destroy() 
     sys.exit(0) 

sys.exit(0) sarà uscire dal prompt e passare alla riga successiva.

Problemi correlati