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

Andreina Mejia andreinamejia en gmail.com
Dom Ene 24 22:31:29 CET 2010


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!

P.D: Disculpen lo extenso del correo…
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20100124/a05944b1/attachment.html>


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