Python GTK +: создавать собственные сигналы? - PullRequest
6 голосов
/ 13 января 2010

Возможно ли создавать новые сигналы в Python GTK +?

Мне нужен пример кода скелета, пожалуйста.

Ответы [ 2 ]

6 голосов
/ 13 января 2010

Выдержка:

Создание собственных сигналов

Другая вещь, которую вы, вероятно, хотите использовать при определении подкласса 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)
3 голосов
/ 29 января 2010

Ответы, конечно, верны, но использование библиотек менее подвержено болям:

import gobject

from pygtkhelpers.utils import gsignal

class Car(gobject.GObject):

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