Foros del Web » Programando para Internet » Python »

Consulta diálogo de confirmación

Estas en el tema de Consulta diálogo de confirmación en el foro de Python en Foros del Web. Hola a todos. Estoy intentando escribir una aplicación con PyGTK en la cual al hacer click en el botón de cerrar abra una ventana de ...
  #1 (permalink)  
Antiguo 27/12/2010, 19:53
 
Fecha de Ingreso: marzo-2009
Mensajes: 79
Antigüedad: 15 años, 1 mes
Puntos: 0
Pregunta Consulta diálogo de confirmación

Hola a todos. Estoy intentando escribir una aplicación con PyGTK en la cual al hacer click en el botón de cerrar abra una ventana de diálogo preguntando si realmente desea salir. Me han surgido un par de dudas: ¿En la función de retrollamada delete_event al devolver False que ocurre? ¿destroy es llamado? ¿Qué pasa en realidad cuando devolvemos False en delete_event?

He escrito un boceto del programa pero por esa duda no puedo cerrar la aplicación como verdaderamente me gustaría.

Les dejo unos enlaces de guía:
http://blog.etxea.net/index.php/2010...ion-al-usuario
http://python.org.ar/pyar/GtkConfirmClose
http://ubuntuforums.org/showthread.php?t=1358116
  #2 (permalink)  
Antiguo 27/12/2010, 20:08
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Consulta diálogo de confirmación

En el tutorial de PyGTK, en la parte del "hello word" te explica que pasa si regresas true o false.
Código Python:
Ver original
  1. # If you return FALSE in the "delete_event" signal handler,
  2. # GTK will emit the "destroy" signal. Returning TRUE means
  3. # you don't want the window to be destroyed.
  4. # This is useful for popping up 'are you sure you want to quit?'
  5. # type dialogs.
  #3 (permalink)  
Antiguo 28/12/2010, 08:39
 
Fecha de Ingreso: marzo-2009
Mensajes: 79
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta diálogo de confirmación

Exacto. Pero quería preguntarte porque el siguiente programa requiere la línea 34(gtk.main_quit()) para que la aplicación se cierre al responder Sí en el díalogo. ¿Si ya hemos devuelto False no tendría que llamar a destroy y cerrarse?.

Código Python:
Ver original
  1. import pygtk
  2. pygtk.require("2.0")
  3. import gtk
  4.  
  5. class UI(object):
  6.     def __init__(self):
  7.         self.label = gtk.Label("Hello world!")
  8.         self.window = self.make_window()
  9.         self.window.show_all()
  10.  
  11.     def make_window(self):
  12.         window = gtk.Window()
  13.         window.set_title("Hi!")
  14.         window.set_default_size(200, 100)
  15.  
  16.         window.connect("delete-event", self.win_close, None)
  17.  
  18.         window.add(self.label)
  19.  
  20.         return window
  21.  
  22.     def start(self):
  23.         gtk.main()
  24.  
  25.     def win_close(self, widget, event, data):
  26.         dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL,
  27.                                    gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO,
  28.                                    "Quit?")
  29.         dialog.set_title(":(")
  30.  
  31.         response = dialog.run()
  32.         dialog.destroy()
  33.         if response == gtk.RESPONSE_YES:
  34.             gtk.main_quit()
  35.             return False # returning False makes "destroy-event" be signalled
  36.                          # for the window.
  37.         else:
  38.             return True # returning True avoids it to signal "destroy-event"
  39.        
  40. def main():
  41.     myUI = UI()
  42.     myUI.start()
  43.  
  44.     print "Now we're outside the UI, but still in the program"
  45.  
  46. main()
  #4 (permalink)  
Antiguo 28/12/2010, 09:01
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Consulta diálogo de confirmación

Es por que por un lado tienes el evento delete y por otro lado tienes el destroy.
Como puedes ver en el hello word
Código Python:
Ver original
  1. # Here we connect the "destroy" event to a signal handler.  
  2. # This event occurs when we call gtk_widget_destroy() on the window,
  3. # or if we return FALSE in the "delete_event" callback.

En el programa de arriba si te das cuenta no tiene un evento destroy, por eso es que lo pone en el evento delete.
Modifique el programa y hace exactamente lo mismo. Pero como puedes ver ahora tiene un evento destroy. Que en caso anterior no tenia.
Código Python:
Ver original
  1. import pygtk
  2. pygtk.require("2.0")
  3. import gtk
  4.  
  5. class UI(object):
  6.     def __init__(self):
  7.         self.label = gtk.Label("Hello world!")
  8.         self.window = self.make_window()
  9.         self.window.show_all()
  10.  
  11.     def make_window(self):
  12.         window = gtk.Window()
  13.         window.set_title("Hi!")
  14.         window.set_default_size(200, 100)
  15.  
  16.         window.connect("destroy", gtk.main_quit)
  17.         window.connect("delete-event", self.win_close, None)
  18.  
  19.         window.add(self.label)
  20.  
  21.         return window
  22.  
  23.     def start(self):
  24.         gtk.main()
  25.  
  26.     def win_close(self, widget, event, data):
  27.         dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL,
  28.                                    gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO,
  29.                                    "Quit?")
  30.         dialog.set_title(":(")
  31.  
  32.         response = dialog.run()
  33.         dialog.destroy()
  34.         if response == gtk.RESPONSE_YES:
  35.             return False # returning False makes "destroy-event" be signalled
  36.                          # for the window.
  37.         else:
  38.             return True # returning True avoids it to signal "destroy-event"
  39.        
  40. def main():
  41.     myUI = UI()
  42.     myUI.start()
  43.  
  44.     print "Now we're outside the UI, but still in the program"
  45.  
  46. main()
  #5 (permalink)  
Antiguo 28/12/2010, 10:08
 
Fecha de Ingreso: marzo-2009
Mensajes: 79
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta diálogo de confirmación

Gracias. Ya pude entender como trabajar correctamente con ambas señales. Saludos.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:09.