gpt4 book ai didi

python - GTK 是否有通用更新通知/发布子系统?

转载 作者:行者123 更新时间:2023-12-01 06:06:18 27 4
gpt4 key购买 nike

我正在构建一个包含多个小部件的 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')

状态栏、当前颜色 Pane 和当前工具将订阅该通知事件并采取相应行动。据我所知,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 信号。这是我想要避免的耦合。

最佳答案

首先,您可以创建 GObject 的自定义子类,它提供了一些 custom signals 。以下示例是链接文章中给出的示例的略微改编版本:

import pygtk
pygtk.require('2.0')
import gobject

class Car(gobject.GObject):

__gsignals__ = {
'engine-started': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
'engine-stopped': (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, ()),
}

def __init__(self):
gobject.GObject.__init__(self)
self._state = 0

def start(self):
if not self._state:
self._state = 1
self.emit('engine-started')

def stop(self):
if self._state:
self._state = 0
self.emit('engine-stopped')


gobject.type_register(Car)

def kill_switch(c):
def callback(*unused, **ignored):
c.stop()
return callback

def on_start(*unused, **ignored):
print "Started..."

def on_stop(*unused, **ignored):
print "Stopped..."

some_car = Car()
some_car.connect('engine-started', on_start)
some_car.connect('engine-started', kill_switch(some_car))
some_car.connect('engine-stopped', on_stop)
some_car.start()

另一种方法是利用 PyPI 上已有的众多事件/信号包之一,例如:

关于python - GTK 是否有通用更新通知/发布子系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7838241/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com