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

6 投票
2 回答
5857 浏览
提问于 2025-04-15 17:59

在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)

撰写回答