gtk.Builder, подкласс контейнера и привязка дочерних виджетов
-
03-07-2019 - |
Вопрос
Я пытаюсь использовать пользовательские виджеты контейнеров в файлах определений 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)
Но это кажется довольно неловким.Кто-нибудь уже решил это или имеет лучшее представление о том, как это сделать?
Спасибо,
Решение
Хорошо, думаю, я ответил на свой вопрос.
Один из способов сделать вышеперечисленное — переопределить функцию 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 уже реализует сборку. интерфейс.