Я создаю приложение PyGTK с несколькими виджетами, которые при изменении должны уведомлять другие виджеты об изменении .Я хотел бы избежать кода, подобного этому:
def on_entry_color_updated(self, widget):
self.paint_tools_panel.current_color_pane.update_color()
self.main_window.status_bar.update_color()
self.current_tool.get_brush().update_color()
И вместо этого сделать что-то подобное:
def on_entry_color_updated(self, widget):
self.update_notify('color-changed')
Строка состояния, текущая панель цветов и текущий инструмент подписались бы на это событие уведомленияи действовать соответственно.Из того, что я могу сказать, механизм сигнализации GObject позволяет мне регистрировать обратный вызов только для определенного виджета, поэтому каждый объект, который хочет получить уведомление, должен знать об этом виджете.
Имеет ли GTKпредоставить такую систему или я должен сам ее создать? Разработчики Shotwell, приложения для организации фотографий для GNOME, должны были создать свой собственный механизм сигнализации, если я правильно понимаю их design doc .Поиск здесь на SO не дал никаких окончательных ответов.
Редактировать:
Разъяснение, почему я думаю, что передача сигналов GObject не то, что мне нужно (или просто часть того, что мне нужно).С GObject мне нужно явно подключить объект к другому объекту, например, так:
emitter.connect('custom-event', receiver.event_handler)
Так что в моем приложении я должен сделать это:
class ColorPane(gtk.Something):
def __init__(self, application):
# init stuff goes here...
application.color_pallette.connect('color-changed', self.update_color)
def update_color(self, widget):
"""Show the new color."""
pass
class StatusBar(gtk.Something):
def __init__(self, application):
# init stuff goes here...
application.color_pallette.connect('color-changed', self.update_color)
def update_color(self, widget):
"""Show the new color name."""
pass
class Brush(gtk.Something):
def __init__(self, application):
# init stuff goes here...
application.color_pallette.connect('color-changed', self.update_color)
def update_color(self, widget):
"""Draw with new color."""
pass
Другими словамиЯ должен передать объект приложения или какой-либо другой объект, который знает о color_pallete, другим объектам в моем приложении, чтобы они подключались к сигналам color_pallette.Это тот тип соединения, которого я хочу избежать.