2010-01-13 10 views
5

¿Es posible crear nuevas señales en Python GTK +?Python GTK +: ¿crea señales personalizadas?

Me gustaría un ejemplo de código de esqueleto, por favor.

+0

Gracias por la acepta, se me rompió 10k barrera que ha estado resistiendo toda la noche por alguna razón extraña. –

+0

@Aiden: mi placer: lo siento, no me quedan votaciones para este día (la cuota se alcanzó antes). – jldupont

+0

¡Sin preocupaciones, empujándome al territorio 'k' es gracias suficiente! –

Respuesta

6

un extracto:

Creación de sus propias señales

La otra cosa es probable que desee su uso cuando la subclasificación GObject es definir señales personalizados. Puede crear sus propias señales que se pueden emitir para que los usuarios de su clase puedan conectarse a ellos.

Cuando se emite una señal, se ejecutará un conjunto de cierres. Un cierre es una abstracción del concepto de devolución de llamada . Un cierre es la devolución de llamada sí mismo (un puntero de función), los datos de usuario (será el último parámetro a la devolución de llamada) y otra función para temas de la limpieza, que no se describen en este documento.

Por el bien de este artículo no lo hace realmente necesita saber la diferencia entre una devolución de llamada y un cierre por lo se utilizan ambos términos. Pero sea aconsejó que esto no es totalmente correcto.

Como dijimos antes, cuando se emita una señal , se ejecutará un conjunto de cierres . Uno de ellos es el mismo para todas las instancias de esta clase y de ahí su nombre: el cierre de clase, y los otros son callbacks de usuario personalizado . Tenga en cuenta que no todas las señales deben tener un cierre de clase porque es opcional.

De, http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm, espero que ayude. No hay código de ejemplo en el sitio y here, un fragmento:

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 ... ¿cómo me perdí esto durante mi sesión de google ... gracias! – jldupont

+0

No se preocupe;) ... –

+0

El placer es todo mío: su barrera de 10K. Nos vemos. – jldupont

3

Las respuestas son correctas, por supuesto, pero utilizando libraries es menos propenso a dolores:

import gobject 

from pygtkhelpers.utils import gsignal 

class Car(gobject.GObject): 

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