He creado una aplicación PyGTK que muestra un cuadro de diálogo cuando el usuario presiona un botón. El diálogo se carga en mi método __init__
con:¿Cómo mostrar repetidamente un cuadro de diálogo con PyGTK/Gtkbuilder?
builder = gtk.Builder()
builder.add_from_file("filename")
builder.connect_signals(self)
self.myDialog = builder.get_object("dialog_name")
En el controlador de eventos, el cuadro de diálogo se muestra con el comando self.myDialog.run()
, pero esto sólo funciona una vez, porque después de run()
el cuadro de diálogo se destruye automáticamente. Si hago clic en el botón por segunda vez, la aplicación se bloquea.
leí que hay una manera de utilizar show()
en lugar de run()
donde el diálogo no se destruye, pero siento que este no es el camino correcto para mí, porque me gustaría que el diálogo que se comporten de forma modal y para devolver el control a el código solo después de que el usuario lo haya cerrado.
¿Hay una manera simple de mostrar un diálogo repetidamente usando el método run()
usando gtkbuilder? Intenté volver a cargar todo el cuadro de diálogo usando gtkbuilder, pero eso no parecía funcionar, al diálogo le faltaban todos los elementos secundarios (y preferiría tener que usar el generador solo una vez, al comienzo del programa).
[Solución] (editado)
Como ha señalado que la respuesta a continuación, utilizando hide()
hace el truco. Primero pensé que aún necesitabas atrapar el "evento de eliminación", pero esto de hecho no es necesario. Un ejemplo sencillo que funciona es:
import pygtk
import gtk
class DialogTest:
def rundialog(self, widget, data=None):
self.dia.show_all()
result = self.dia.run()
self.dia.hide()
def destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", self.destroy)
self.dia = gtk.Dialog('TEST DIALOG', self.window,
gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT)
self.dia.vbox.pack_start(gtk.Label('This is just a Test'))
self.button = gtk.Button("Run Dialog")
self.button.connect("clicked", self.rundialog, None)
self.window.add(self.button)
self.button.show()
self.window.show()
if __name__ == "__main__":
testApp = DialogTest()
gtk.main()
Bueno, la documentación no es muy clara aquí. Parece que el método "ejecutar" en sí no destruye el diálogo, pero si lo cierra presionando el control "cerrado" proporcionado por el administrador de ventanas (generalmente una pequeña "X" en la parte superior derecha de la ventana ", el el diálogo se destruye si no detecta el "evento de eliminación" – Julian
@Julian, es al revés: consulte el segundo párrafo de la documentación. El diálogo no se destruirá aunque cierre la ventana. – ptomato
Sí, lo leí pero estoy un poco confundido: si en el ejemplo que publiqué arriba, comente la línea 'self.dia.connect (" delete-event ", self.closedialog)' Recibo una falla de segmentación la segunda vez que hago clic en el botón.Entonces ALGO ha sido destruido sin que yo lo haya hecho, ¿verdad? Gracias por sus aclaraciones por cierto. – Julian