2010-01-13 2 views
5

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

Я бы хотел использовать пример кода скелета.

+0

Спасибо за акцепт, он сломал мой 10k барьер, который держал весь вечер по какой-то странной причине. –

+0

@ Эйден: мое удовольствие: извините, у меня нет остатков сегодня (квота дошла до конца). – jldupont

+0

Не беспокойтесь, толкая меня на территорию «k», достаточно спасибо! –

ответ

6

Отрывок:

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

Другая вещь, которую вы, вероятно, хотите использования при подклассов GObject это определить пользовательские сигналы. Вы можете создать свои собственные сигналы, которые могут быть испущены, так что пользователи вашего класса могут подключиться к .

При испускании сигнала будет выполнен набор замыканий . Закрытие - это абстракция обратного вызова . Закрытие - это обратный вызов сам (указатель функции), пользовательские данные (это будет последний параметр для обратного вызова) и еще одна функция для проблем очистки , которая не будет , обсуждаемой в этом документе.

Ради этой статьи вы не действительно нужно знать разницу между обратным вызовом и закрытием так будет использоваться оба термина. Но будьте сообщили, что это не совсем правильно.

Как мы уже говорили, когда выдается сигнал , набор замыканий будет выполнен . Один из них один и тот же для всех экземпляров этого класса и, следовательно, его название: закрытие класса, , а другие - пользовательские обратные вызовы. Обратите внимание, что не все сигналы должны иметь замыкание класса , поскольку оно является необязательным.

От, 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) 
+0

hmmm ... как я пропустил это во время моей сессии по поиску в Google ... спасибо! – jldupont

+0

Не стоит беспокоиться;) ... –

+0

Удовольствие - это все мое re: ваш барьер 10K. Увидимся. – jldupont

3

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

import gobject 

from pygtkhelpers.utils import gsignal 

class Car(gobject.GObject): 

    gsignal('engine-started', float) # yeah baby 
Смежные вопросы