Я создаю приложение 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, должны были создать собственный сигнальный механизм, насколько я понимаю их оформите документ правильно. Поиск здесь, на 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. Это тот вид связи, которого я хочу избежать.