Foros del Web » Programando para Internet » Python »

Consulta botón salir

Estas en el tema de Consulta botón salir en el foro de Python en Foros del Web. Hola de nuevo. Quería preguntarles porque en el siguiente fragmento de código al intentar salir del programa con el botón Cancelar, delete_event devuelve False pero ...
  #1 (permalink)  
Antiguo 29/12/2010, 12:45
 
Fecha de Ingreso: marzo-2009
Mensajes: 79
Antigüedad: 15 años, 1 mes
Puntos: 0
Consulta botón salir

Hola de nuevo. Quería preguntarles porque en el siguiente fragmento de código al intentar salir del programa con el botón Cancelar, delete_event devuelve False pero destroy no es invocado. Saludos.

Código Python:
Ver original
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import gtk
  5.  
  6. class Programa:
  7.     def __init__(self):
  8.         self.ventana = gtk.Window(gtk.WINDOW_TOPLEVEL)
  9.         self.ventana.connect('delete_event', self.delete_event)
  10.         self.ventana.connect('destroy', self.destroy)
  11.  
  12.         self.ventana.set_title('Título de la ventana')
  13.         self.ventana.set_default_size(440, 250)
  14.         self.ventana.set_border_width(50)
  15.  
  16.         self.caja_v = gtk.VBox(True, 0)
  17.         self.etiqueta = gtk.Label('Bienvenido:')
  18.         self.entrada = gtk.Entry(20)
  19.         self.botonera_h = gtk.HButtonBox()
  20.         self.boton_aplicar = gtk.Button(stock=gtk.STOCK_APPLY)
  21.         self.boton_aplicar.connect('clicked', self.clicked, 'Botón Aplicar')
  22.         self.boton_cancelar = gtk.Button(stock=gtk.STOCK_CANCEL)
  23.         self.boton_cancelar.connect('clicked', self.clicked, 'Botón Cancelar')
  24.         self.boton_cancelar.connect("clicked", self.delete_event)
  25.  
  26.         self.ventana.add(self.caja_v)
  27.         self.caja_v.pack_start(self.etiqueta, True, True, 0)
  28.         self.caja_v.pack_start(self.entrada, True, True, 0)
  29.         self.caja_v.pack_start(self.botonera_h, True, True, 0)
  30.         self.botonera_h.add(self.boton_aplicar)
  31.         self.botonera_h.add(self.boton_cancelar)
  32.  
  33.     def main(self):
  34.         gtk.main()
  35.  
  36.     def show(self):
  37.         self.ventana.show_all()
  38.  
  39.     def delete_event(self, widget, data=None):
  40.         print 'delete_event'
  41.         return False
  42.  
  43.     def destroy(self, widget, data=None):
  44.         print 'destroy'
  45.         gtk.main_quit()
  46.  
  47.     def clicked(self, widget, data=None):
  48.         print data
  49.  
  50. if __name__ == '__main__':
  51.     programa = Programa()
  52.     programa.show()
  53.     programa.main()
  #2 (permalink)  
Antiguo 29/12/2010, 13:05
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 botón salir

No invoca a destroy, por que el evento es clicked, si el evento fuera delete entonces manda a llamar a destroy.

Mismo código pero corregido:
Código Python:
Ver original
  1. #coding: utf-8
  2. import gtk
  3.  
  4. class Programa:
  5.     def __init__(self):
  6.         self.ventana = gtk.Window(gtk.WINDOW_TOPLEVEL)
  7.         self.ventana.connect('delete_event', self.delete_event)
  8.         self.ventana.connect('destroy', self.destroy)
  9.  
  10.         self.ventana.set_title('T�tulo de la ventana')
  11.         self.ventana.set_default_size(440, 250)
  12.         self.ventana.set_border_width(50)
  13.  
  14.         self.caja_v = gtk.VBox(True, 0)
  15.         self.etiqueta = gtk.Label('Bienvenido:')
  16.         self.entrada = gtk.Entry(20)
  17.         self.botonera_h = gtk.HButtonBox()
  18.         self.boton_aplicar = gtk.Button(stock=gtk.STOCK_APPLY)
  19.         self.boton_aplicar.connect('clicked', self.clicked, 'Bot�n Aplicar')
  20.         self.boton_cancelar = gtk.Button(stock=gtk.STOCK_CANCEL)
  21.         self.boton_cancelar.connect('clicked', self.clicked, 'Bot�n Cancelar')
  22.         self.boton_cancelar.connect("clicked", self.OnCancel)
  23.  
  24.         self.ventana.add(self.caja_v)
  25.         self.caja_v.pack_start(self.etiqueta, True, True, 0)
  26.         self.caja_v.pack_start(self.entrada, True, True, 0)
  27.         self.caja_v.pack_start(self.botonera_h, True, True, 0)
  28.         self.botonera_h.add(self.boton_aplicar)
  29.         self.botonera_h.add(self.boton_cancelar)
  30.  
  31.     def main(self):
  32.         gtk.main()
  33.  
  34.     def show(self):
  35.         self.ventana.show_all()
  36.  
  37.     def delete_event(self, widget, data=None):
  38.         print 'delete_event'
  39.         return False
  40.  
  41.     def destroy(self, widget, data=None):
  42.         print 'destroy'
  43.         gtk.main_quit()
  44.  
  45.     def clicked(self, widget, data=None):
  46.         print data
  47.    
  48.     def OnCancel(self, widget, data=None):
  49.         print "Saliendo manualmente"
  50.         gtk.main_quit()
  51.  
  52. if __name__ == '__main__':
  53.     programa = Programa()
  54.     programa.show()
  55.     programa.main()
  #3 (permalink)  
Antiguo 29/12/2010, 20:27
 
Fecha de Ingreso: marzo-2009
Mensajes: 79
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta botón salir

Ok. Una última consulta. Es posible asignarle delete_event a la señal clicked de un botón como función de retrollamada y que allí devuelva False para llamar a destroy o es necesario asignarle directamente destroy o gtk.main_quit como en tu método OnCancel.

Código Python:
Ver original
  1. self.boton_cancelar.connect("clicked", self.delete_event)
  2.  
  3. self.boton_cancelar.connect("clicked", self.OnCancel)

¿Sólamente puedo devolver False para llamar a destroy en una función de retrollamada si capturo delete_event?

Código Python:
Ver original
  1. self.ventana.connect('delete_event', self.delete_event)

Las preguntas son porque intente adaptar el código del enlace con un método destroy pero no pude.

Última edición por abcdefg; 29/12/2010 a las 20:32
  #4 (permalink)  
Antiguo 30/12/2010, 02:29
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 botón salir

Cita:
Iniciado por abcdefg
Ok. Una última consulta. Es posible asignarle delete_event a la señal clicked de un botón como función de retrollamada y que allí devuelva False para llamar a destroy o es necesario asignarle directamente destroy o gtk.main_quit como en tu método OnCancel.
La verdad no se si es posible hacer eso. Por lo que he investigado y no he encontrado nada.
Y esto se debe en parte por que la mayoría confunde delete_event con destroy. Y por otra parte si quieres un botón de salir es mas fácil hacer un simple.
Código Python:
Ver original
  1. boton.connect("clicked", gtk.main_quit)

Cita:
Iniciado por abcdefg
¿Sólamente puedo devolver False para llamar a destroy en una función de retrollamada si capturo delete_event?
Si, preferentemente solo regresa False. Nada de valores raros xD


Cita:
Iniciado por abcdefg
Las preguntas son porque intente adaptar el código del enlace con un método destroy pero no pude.
Si te fijas el autor confunde delete-event y destroy. De hecho yo no veo ningún método destroy.
Delete-event sirve mas que nada para hacer ejecutar diálogos de confirmación.
Mientras que destroy libera los recursos del widget.
  #5 (permalink)  
Antiguo 30/12/2010, 10:13
 
Fecha de Ingreso: marzo-2009
Mensajes: 79
Antigüedad: 15 años, 1 mes
Puntos: 0
Respuesta: Consulta botón salir

Ok. Gracias de nuevo. Saludos.
  #6 (permalink)  
Antiguo 06/01/2011, 08:55
Avatar de CapacProg  
Fecha de Ingreso: marzo-2010
Ubicación: Lima - Perú
Mensajes: 324
Antigüedad: 14 años, 1 mes
Puntos: 71
Pregunta Respuesta: Consulta botón salir

Hola:

He copiado y pegado el código que mencionas haz corregido, pero al hacer click en el boton salir el programa se cuelga. He trabajado en el idle de python 2.7 y tengo todo lo necesario para trabajar con pygtk y gtk+.

He tenido este mismo problema con otras implementaciones, no entiendo porque no corre o si mi función de retrollamda es incorrecta (la función es la misma que tu usas).

Su pudieras darme algún alacance más te agradecería.



Cita:
Iniciado por razpeitia Ver Mensaje
No invoca a destroy, por que el evento es clicked, si el evento fuera delete entonces manda a llamar a destroy.

Mismo código pero corregido:
Código Python:
Ver original
  1. #coding: utf-8
  2. import gtk
  3.  
  4. class Programa:
  5. def __init__(self):
  6. self.ventana = gtk.Window(gtk.WINDOW_TOPLEVEL)
  7. self.ventana.connect('delete_event', self.delete_event)
  8. self.ventana.connect('destroy', self.destroy)
  9.  
  10. self.ventana.set_title('T�tulo de la ventana')
  11. self.ventana.set_default_size(440, 250)
  12. self.ventana.set_border_width(50)
  13.  
  14. self.caja_v = gtk.VBox(True, 0)
  15. self.etiqueta = gtk.Label('Bienvenido:')
  16. self.entrada = gtk.Entry(20)
  17. self.botonera_h = gtk.HButtonBox()
  18. self.boton_aplicar = gtk.Button(stock=gtk.STOCK_APPLY)
  19. self.boton_aplicar.connect('clicked', self.clicked, 'Bot�n Aplicar')
  20. self.boton_cancelar = gtk.Button(stock=gtk.STOCK_CANCEL)
  21. self.boton_cancelar.connect('clicked', self.clicked, 'Bot�n Cancelar')
  22. self.boton_cancelar.connect("clicked", self.OnCancel)
  23.  
  24. self.ventana.add(self.caja_v)
  25. self.caja_v.pack_start(self.etiqueta, True, True, 0)
  26. self.caja_v.pack_start(self.entrada, True, True, 0)
  27. self.caja_v.pack_start(self.botonera_h, True, True, 0)
  28. self.botonera_h.add(self.boton_aplicar)
  29. self.botonera_h.add(self.boton_cancelar)
  30.  
  31. def main(self):
  32. gtk.main()
  33.  
  34. def show(self):
  35. self.ventana.show_all()
  36.  
  37. def delete_event(self, widget, data=None):
  38. print 'delete_event'
  39. return False
  40.  
  41. def destroy(self, widget, data=None):
  42. print 'destroy'
  43. gtk.main_quit()
  44.  
  45. def clicked(self, widget, data=None):
  46. print data
  47.  
  48. def OnCancel(self, widget, data=None):
  49. print "Saliendo manualmente"
  50. gtk.main_quit()
  51.  
  52. if __name__ == '__main__':
  53. programa = Programa()
  54. programa.show()
  55. programa.main()

Etiquetas: salir
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 08:23.