[Python-es] Problemas con el Diseñador de interfaces Glade y PyGTK

Manuel Alejandro Cerón Estrada ceronman en gmail.com
Dom Ene 24 23:23:23 CET 2010


Hola:

El día 24 de enero de 2010 16:31, Andreina Mejia
<andreinamejia en gmail.com> escribió:
> Buenas tardes, mi nombre es Andreina Mejía. Estoy realizando una aplicación
> con interfaz hecha en Glade 3.6.7 y PyGTK.  Para exponer mi problema,
> realicé dos pruebas pequeñas que les muestro a continuación:
>
>  Hice una interfaz realmente sencilla en formato Libglade, una ventana con
> un botón insertado dentro de una tabla como se puede apreciar en
> http://www.flickr.com/photos/22491163@N06/sets/72157623276353544/detail/
>
> El botón Aceptar muestra la ventana de diálogo con textview. Todo funciona
> bien, excepto el destroy de la ventana de diálogo, porque cuando le doy
> click por segunda vez a la ‘X’ sale en la consola: “Fallo de segmentación”
>
> El archivo .py es el siguiente:
>
> #!/usr/bin/env python
>
> # -*- coding: utf-8 -*-
>
> #Importacion de modulos
>
> import pygtk
>
> pygtk.require('2.0')
>
> import gtk, gtk.glade, inspect, sys
>
>
>
> class Ventana:
>
>     def __init__(self):
>
>
>
>       self.w_tree = gtk.glade.XML('Prueba.glade')
>
>       self.Ventana = self.w_tree.get_widget('Ventana')
>
>       self.Aceptar = self.w_tree.get_widget('Aceptar')
>
>
>
>       #Ventana que se muestra al pulsar el boton Aceptar de la ventana
> principal
>
>       self.Dialogo = self.w_tree.get_widget('Dialogo')
>
>       self.Acepta = self.w_tree.get_widget('Acepta')
>
>       self.Cancelar = self.w_tree.get_widget('Cancelar')
>
>       self.texto = self.w_tree.get_widget('texto')
>
>
>
>       #Se hacen todas las conexiones con las señales
>
>       self.w_tree.signal_autoconnect(dict(inspect.getmembers(self)))
>
>
>
>     def on_Ventana_destroy(self,*args):
>
>       gtk.main_quit()
>
>
>
>     def on_Aceptar_clicked(self,*args):
>
>       self.Dialogo.show()
>
>
>
>     def on_Dialogo_close(self,*args):
>
>       self.Dialogo.hide()
>
>
>
>     def on_Cancelar_clicked(self,*args):
>
>       self.Dialogo.hide()
>
>
>
>     def on_Acepta_clicked(self,*args):
>
>       self.Dialogo.hide()
>
>
>
>     def main(self,*args):
>
>       self.Ventana.show()
>
>       gtk.main()
>
>
>
> if __name__=="__main__":
>
>     app = Ventana()
>
>     app.main()
>
>
>
> Inicialmente probé con radiobuttons insertados en una caja horizontal en la
> ventana de diálogo, pero da el mismo problema, por eso en el ejemplo cambié
> de contenedor y de widget a ver qué pasaba, pero sigue dando el mismo error.
> Hablé con un amigo y me dijo que a lo mejor podía ser un problema con
> Libglade y que mejor intentara con GtkBuilder.
>
> Hice exactamente la misma interfaz y lo corrí, doy click por segunda vez a
> la ‘X’ de la ventana de diálogo y aparece la ventana vacía que se ve en el
> enlace de flirck.
>
> No hay ningún otro fallo en la corrida.
>
> El archivo .py es el siguiente:
>
> #!/usr/bin/env python
>
> # -*- coding: utf-8 -*-
>
> #Importacion de modulos
>
> import pygtk
>
> pygtk.require('2.0')
>
> import gtk, gtk.glade, inspect, sys
>
>
>
> class Ventana:
>
>     def __init__(self):
>
>
>
>       self.glade_file = "Prueba_gb.glade"
>
>         self.glade = gtk.Builder()
>
>         self.glade.add_from_file(self.glade_file)
>
>       self.Ventana = self.glade.get_object('Ventana')
>
>       self.Aceptar = self.glade.get_object('Aceptar')
>
>
>
>       #Ventana que se muestra al pulsar el boton Aceptar de la ventana
> principal
>
>       self.Dialogo = self.glade.get_object('Dialogo')
>
>       self.Acepta = self.glade.get_object('Acepta')
>
>       self.Cancelar = self.glade.get_object('Cancelar')
>
>       self.texto = self.glade.get_object('texto')
>
>
>
>       #Se hacen todas las conexiones con las señales
>
>       self.Ventana.connect("destroy",self.__on_Ventana_destroy)
>
>       self.Aceptar.connect("clicked",self.__on_Aceptar_clicked)
>
>       self.Dialogo.connect("close",self.__on_Dialogo_close)
>
>       self.Cancelar.connect("clicked",self.__on_Cancelar_clicked)
>
>       self.Acepta.connect("clicked",self.__on_Acepta_clicked)
>
>
>
>       #Muestra todos los widgets
>
>       self.Ventana.show_all()
>
>
>
>     def __on_Ventana_destroy(self,*args):
>
>       gtk.main_quit()
>
>
>
>     def __on_Aceptar_clicked(self,*args):
>
>       self.Dialogo.show()
>
>
>
>     def __on_Dialogo_close(self,*args):
>
>       self.Dialogo.hide()
>
>
>
>     def __on_Cancelar_clicked(self,*args):
>
>       self.Dialogo.hide()
>
>
>
>     def __on_Acepta_clicked(self,*args):
>
>       self.Dialogo.hide()
>
>
>
>     def main(self,*args):
>
>       #self.Ventana.show()
>
>       gtk.main()
>
>
>
> if __name__=="__main__":
>
>     app = Ventana()
>
>     app.main()
>
>
>
> La verdad no sé qué está pasando, pero cada vez que en Glade hago una
> ventana que “llama” a otra ventana pasa lo mismo. Tengo apenas unos meses
> trabajando en esta herramienta y programando en PyGTK. Agradezco de
> antemando su receptividad. Muchas gracias!

Yo creo que el problema puede ser que estas usando la señal "destroy"
para implementar lo que pasa la presionar el botón X (cerrar) de la
ventana. Intenta usando "delete-event" en lugar de "destroy" que es la
señal que se manda cuando se intenta cerrar una ventana.

Manuel.



Más información sobre la lista de distribución Python-es