Python GTK+: создавать собственные сигналы?

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

Я хотел бы пример скелетного кода, пожалуйста.


person jldupont    schedule 13.01.2010    source источник
comment
Спасибо за согласие, это преодолело мой барьер в 10 тысяч, который держался весь вечер по какой-то странной причине.   -  person Aiden Bell    schedule 13.01.2010
comment
@Aiden: с удовольствием: извините, сегодня у меня не осталось голосов (квота достигнута раньше).   -  person jldupont    schedule 13.01.2010
comment
Не беспокойтесь, подтолкнуть меня на территорию "k" уже достаточно, спасибо!   -  person Aiden Bell    schedule 13.01.2010


Ответы (2)


Выдержка:

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

Другая вещь, которую вы, вероятно, захотите использовать при создании подкласса 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)
person Aiden Bell    schedule 13.01.2010
comment
хммм... как я пропустил это во время гугления... спасибо! - person jldupont; 13.01.2010
comment
Удовольствие все мое re: ваш барьер 10K. Увидимся. - person jldupont; 13.01.2010

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

import gobject

from pygtkhelpers.utils import gsignal

class Car(gobject.GObject):

    gsignal('engine-started', float) # yeah baby
person Ali Afshar    schedule 29.01.2010