Можно ли создавать новые сигналы в Python GTK+?
Я хотел бы пример скелетного кода, пожалуйста.
Можно ли создавать новые сигналы в Python GTK+?
Я хотел бы пример скелетного кода, пожалуйста.
Выдержка:
Создание собственных сигналов
Другая вещь, которую вы, вероятно, захотите использовать при создании подкласса 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)
Ответы, конечно, правильные, но использование библиотек менее подвержено боли:
import gobject
from pygtkhelpers.utils import gsignal
class Car(gobject.GObject):
gsignal('engine-started', float) # yeah baby