Widgets gtk.Builder, subclase de contenedor y enlace hijo
-
03-07-2019 - |
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,
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.