2011-09-08 11 views
5

Creé una aplicación wxPython que muestra algunos mensajes en una ventana de diálogo. La aplicación necesita que la ventana de diálogo sea destruida por la fuerza antes de hacer clic en el botón Aceptar del diálogo. Usé wx.lib.delayedresult para hacer la llamada de destrucción.¿Cómo puedo destruir de forma segura una ventana de diálogo de una aplicación wxPython?

Mi código es:

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

Esto puede hacer lo que deseo hacer mientras me dieron un mensaje de error a continuación:

(Python: 15150): Gtk-CRITICAL **: gtk_widget_destroy : la afirmación `GTK_IS_WIDGET (widget) 'falló

¿Cómo destruyo" de manera segura "un cuadro de diálogo sin hacer clic en el botón de diálogo?

Respuesta

0

Ha pasado un tiempo desde que utilicé wxWidgets pero creo que su dlg.Destroy() puede estar en el lugar equivocado. Intenta moverlo al hilo principal.

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

¡Gracias por responder! Ya lo intenté y descubrí que el diálogo no desaparecía. – Akira

0

me gustaría utilizar 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() 

Ver también http://www.blog.pythonlibrary.org/2009/08/25/wxpython-using-wx-timers/

0

Mi problema con dlg.Destroy() es que no está saliendo de la indicación. he hecho siguiente para salir del símbolo:

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) saldrá de la pronta y pasar a la siguiente línea.

Cuestiones relacionadas