Python GTK+: 创建自定义信号?
在Python的GTK+中,能不能创建新的信号呢?
我想要一个简单的代码示例,谢谢。
2 个回答
4
这些回答当然是正确的,但使用库会更少遇到麻烦:
import gobject
from pygtkhelpers.utils import gsignal
class Car(gobject.GObject):
gsignal('engine-started', float) # yeah baby
8
摘录:
创建你自己的信号
当你在使用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)