gtk.Builder, контейнерный подкласс и связывание дочерних виджетов - PullRequest
4 голосов
/ 05 января 2009

Я пытаюсь использовать пользовательские контейнерные виджеты в файлах определения gtk.Builder. Что касается создания этих виджетов, то они прекрасно работают:

#!/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()

Теперь вопрос в том, что у меня есть диалоговое окно с виджетом gtk.TreeView. Я пытаюсь выяснить, как связать этот виджет с переменной экземпляра MyDialog.

Одна дешевая альтернатива, о которой я могу подумать, это вызвать дополнительный метод после получения диалогового виджета следующим образом:

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

Но это кажется довольно неловким. Кто-нибудь уже решил это или имеет лучшее представление о том, как это сделать?

Спасибо

1 Ответ

5 голосов
/ 05 января 2009

Хорошо, наверное, я ответил на свой вопрос.

Один из способов сделать это - переопределить функцию parser_finished () gtk.Buildable, которая предоставляет доступ к объекту компоновщика, который создал сам экземпляр класса. Метод вызывается после загрузки всего XML-файла, поэтому все дополнительные виджеты, которые мы можем захотеть получить, уже присутствуют и инициализируются:

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

Следует отметить, что по какой-то причине (по крайней мере, для меня, в pygtk 2.12), если я не наследую явно от gtk.Buildable, метод переопределения не вызывается, даже если подумал, что gtk.Dialog уже реализует расширяемый интерфейс.

...