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

6

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

请给出示例代码。


1
谢谢您的接受,这打破了我的10k壁垒,这个奇怪的原因一直困扰着我整晚。 - Aiden Bell
@Aiden: 我很愿意帮助你:抱歉,我今天没有剩余的赞同票(配额提前达到)。 - jldupont
没关系,让我进入“k”领域已经足够感谢了! - Aiden Bell
2个回答

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)

1
哦,我在搜索时怎么会错过这个了...谢谢! - jldupont
非常感谢您的回复,说实话我也很高兴能帮助你突破10K障碍。期待再次与您交流。 - jldupont

4
答案当然是正确的,但使用会更少出现问题:
import gobject

from pygtkhelpers.utils import gsignal

class Car(gobject.GObject):

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接