在Python GTK+中创建新信号是否可能?
请给出示例代码。
摘录:
创建自定义信号
当你在子类化 GObject 时,可能需要用到的另一件事就是定义自定义信号。你可以创建自己的信号,这些信号可以被发射,因此你的类的用户可以连接到它们。
当信号被发射时,一组闭包将被执行。闭包是回调概念的一个抽象。闭包本身是回调(函数指针)、用户数据(它将是回调的最后一个参数)和另一个用于清理问题的函数,本文档不会讨论它。
为了本文的目的,你不需要真正了解回调和闭包之间的区别,因此两个术语都将被使用。但请注意,这并不完全正确。
正如我们之前所说,当一个信号被发射时,一组闭包将被执行。其中一个闭包对于该类的所有实例都是相同的,因此它的名称是类闭包,其他的则是自定义用户回调。请注意,并非所有信号都需要具有类闭包,因为它是可选的。
来自http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm,希望这能帮到你。该网站上有示例代码和此处的片段:
import pygtk
pygtk.require('2.0')
import gobject
class Car(gobject.GObject):
__gproperties__ = {
'fuel' : (gobject.TYPE_FLOAT, 'fuel of the car',
'amount of fuel that remains in the tank',
0, 60, 50, gobject.PARAM_READWRITE)
}
__gsignals__ = {
'engine-started' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE,
(gobject.TYPE_FLOAT,))
}
def __init__(self):
gobject.GObject.__init__(self)
self.fuel = 50
def do_get_property(self, property):
if property.name == 'fuel':
return self.fuel
else:
raise AttributeError, 'unknown property %s' % property.name
def do_set_property(self, property, value):
if property.name == 'fuel':
self.fuel = value
else:
raise AttributeError, 'unknown property %s' % property.name
def do_engine_started(self, remaining_fuel):
print '***** Beginning of class closure *****'
print 'The engine is ready and we still have %f of fuel' % self.fuel
print '***** End of class closure *****'
def start(self):
self.emit('engine-started', self.get_property('fuel'))
gobject.type_register(Car)
import gobject
from pygtkhelpers.utils import gsignal
class Car(gobject.GObject):
gsignal('engine-started', float) # yeah baby