Pregunta

Estoy intentando usar widgets de contenedor personalizados en los archivos de definición de gtk.Builder. En cuanto a la creación de instancias de esos widgets, funciona muy bien:

#!/usr/bin/env python

import sys 
import gtk 

class MyDialog(gtk.Dialog):
    __gtype_name__ = "MyDialog"


if __name__ == "__main__":
    builder = gtk.Builder()
    builder.add_from_file("mydialog.glade")

    dialog = builder.get_object("mydialog-instance")
    dialog.run()

Ahora la pregunta es que digamos que tengo un widget gtk.TreeView dentro de ese diálogo. Estoy tratando de averiguar cómo enlazar ese widget a una variable de instancia MyDialog.

Una alternativa barata en la que puedo pensar es llamar a un método adicional después de obtener el widget de diálogo como tal:

dialog = builder.get_object("mydialog-instance")
dialog.bind_widgets(builder)

Pero eso parece bastante incómodo. ¿Alguien ya resolvió esto o tiene una mejor idea de cómo hacerlo?

Gracias,

¿Fue útil?

Solución

Bien, supongo que respondí mi propia pregunta.

Una forma de hacer lo anterior es anular gtk.Buildable's parser_finished (), que da acceso al objeto generador que creó la instancia de la clase en sí. El método se llama después de que se haya cargado el archivo .xml completo, por lo que todos los widgets adicionales que podríamos adquirir ya están presentes e inicializados:

class MyDialog(gtk.Dialog, gtk.Buildable):
    __gtype_name__ = "MyDialog"

    def do_parser_finished(self, builder):
        self.treeview = builder.get_object("treeview1")
        # Do any other associated post-initialization

Una cosa a tener en cuenta es que, por alguna razón (al menos para mí, en pygtk 2.12), si no heredo explícitamente de gtk.Buildable, el método de anulación no se llama, incluso se pensó gtk.Dialog ya implementa la interfaz construible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top