2010-01-13 16 views
5

È possibile creare nuovi segnali in Python GTK +?Python GTK +: crea segnali personalizzati?

Mi piacerebbe un esempio di codice scheletrico, per favore.

+0

Grazie per la accetta, si è rotto il mio 10k barriera che è stata tenuta tutta la sera per qualche strana ragione. –

+0

@Aiden: il mio piacere: scusate, non ho più avuto upvotes oggi (quota raggiunta in anticipo). – jldupont

+0

Nessun problema, spingermi nel territorio "k" è abbastanza! –

risposta

6

Un estratto:

Creare i propri segnali

L'altra cosa che probabilmente si desidera utilizzare quando sottoclasse GObject è definire segnali personalizzati. È possibile creare i propri segnali che possono essere emessi in modo che gli utenti della classe possano connettersi a .

Quando viene emesso un segnale, verrà eseguita una serie di chiusure . Una chiusura è un'astrazione del concetto di callback . Una chiusura è la callback (un puntatore di funzione), i dati utente (sarà l'ultimo parametro a la richiamata) e un'altra funzione per i problemi di pulizia , che non sarà discussa in questo documento.

Per il bene di questo articolo non si davvero bisogno di conoscere la differenza tra un callback e una chiusura in modo saranno utilizzati entrambi i termini. Ma essere avvisato che questo non è completamente corretto .

Come abbiamo detto prima, quando un segnale è emesso, un set di chiusure sarà eseguito. Uno di questi è lo stesso per tutte le istanze di questa classe e quindi il suo nome: la chiusura di classe, e gli altri sono callback utente personalizzato . Si noti che non tutti i segnali devono avere una chiusura di classe perché è opzionale.

Da, http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm, sperare che sia d'aiuto. Non v'è esempio di codice sul sito e here, un frammento:

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 ... come mi sono perso durante la mia sessione su google ... grazie! – jldupont

+0

Nessun problema;) ... –

+0

Il piacere è tutto mio: la tua barriera 10K. Ci vediamo in giro. – jldupont

3

Le risposte sono corrette, naturalmente, ma utilizzando libraries è meno soggetto a dolori:

import gobject 

from pygtkhelpers.utils import gsignal 

class Car(gobject.GObject): 

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