Как интроспективно подключить обработчики к сигналам? - PullRequest
3 голосов
/ 27 июня 2011

gtk.Builder способен идентифицировать все сигналы, которые может излучать GUI (описанный в файле XML), и с помощью метода connect_signals () автоматически сопоставляет сигналы и обработчики.Пример:

class Gui(gobject.GObject):

    def __init__(self):
        self.gui_file = "../data/gui.xml"
        builder = gtk.Builder()
        builder.add_from_file(self.gui_file)
        builder.connect_signals(self)

    def on_whatever_gui_event(self, widget, data=None):
        ...

В моем приложении у меня есть другие сигналы, которые генерируются объектами не-GUI (это моя Модель [как в шаблоне MVC], которая испускает сигнал, когда его внутреннее состояние изменяется), но этодолжен обрабатываться GUI.

Я пытаюсь найти метод, который позволил бы мне автоматически подключаться к экземпляру Gui также мои пользовательские сигналы. InДругими словами, я пытаюсь не вручную подключать каждый сигнал к его обработчику.В идеале окончательный код должен выглядеть следующим образом:

class Gui(gobject.GObject):

    def __init__(self, model_instance):
        self.gui_file = "../data/gui.xml"
        builder = gtk.Builder()
        builder.add_from_file(self.gui_file)
        builder.add_signals_from_my_object(model_instance)
        builder.connect_signals(self)

    def on_whatever_gui_event(self, widget, data=None):
        ...

    def on_whatever_model_event(self, widget, data=None):
        ...

Существует ли стандартный способ [py] GTK для достижения этого или мне нужно написать собственный дочерний класс gtk.Builder?

Заранее спасибо за ваше время!

1 Ответ

2 голосов
/ 13 июля 2011

GtkBuilder берет имена для подключения из XML, он не ищет методы, начинающиеся с 'on'.Это означает, что ваша модель должна быть представлена ​​в XML, нет способа передать GtkBuilder виджет, который вы создали в коде.Glade имеет документацию по пользовательским виджетам .

...