Python GTK +:创建自定义信号?

时间:2010-01-13 15:40:53

标签: python pygtk gtk

是否可以在Python GTK +中创建新信号?

我想要一个骨架代码示例。

2 个答案:

答案 0 :(得分:6)

摘录:

  

创建自己的信号

     

你可能想要的另一件事   在定义子类GObject时使用   自定义信号。你可以创建你的   自己发出的信号   您班级的用户可以连接到   它们。

     

当发出一组信号时   闭包将被执行。关闭   是回调的抽象   概念。闭包是回调   本身(一个函数指针),用户   数据(它将是最后一个参数   回调)和另一个函数   清理问题,这不会   在本文件中讨论过。

     

为了本文的缘故,你没有   真的需要知道差异   回调和闭包之间如此   这两个术语都将被使用。但是   建议这不完全   正确的。

     

正如我们之前所说,当信号是   发出一套封闭物   执行。其中一个是同一个   对于这个类的所有实例   因此它的名字:类封闭,   而其他的是自定义用户   回调。请注意,并非所有   信号需要有一个类闭包   因为它是可选的。

From,http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm,希望有所帮助。网站上有示例代码和here,代码段:

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)

答案 1 :(得分:3)

答案当然是正确的,但使用libraries不太容易出现问题:

import gobject

from pygtkhelpers.utils import gsignal

class Car(gobject.GObject):

    gsignal('engine-started', float) # yeah baby