2010-01-13 7 views
5

Est-il possible de créer de nouveaux signaux dans Python GTK +?Python GTK +: créer des signaux personnalisés?

Je voudrais un exemple de code squelette, s'il vous plaît.

+0

Merci pour l'accepter, il m'a cassé Barrière 10k qui a tenu toute la soirée pour une raison étrange. –

+0

@Aiden: mon plaisir: désolé, je n'ai plus de upvotes aujourd'hui (quota atteint au début). – jldupont

+0

Pas de soucis, me pousser dans le territoire 'k' c'est assez merci! –

Répondre

6

Un extrait:

Créer vos propres signaux

L'autre chose que vous voulez probablement utiliser lorsque le sous-classement est GObject définir signaux personnalisés. Vous pouvez créer vos propres signaux qui peuvent être émis pour les utilisateurs de votre classe peuvent se connecter à eux.

Lorsqu'un signal est émis, un ensemble de fermetures sera exécuté. Une fermeture est une abstraction du concept de rappel . Une fermeture est le rappel lui-même (un pointeur de fonction), l'utilisateur données (ce sera le dernier paramètre à le rappel) et une autre fonction pour les problèmes de nettoyage , qui ne sera pas discuté dans ce document.

Pour les besoins de cet article, vous n'avez pas vraiment besoin de connaître la différence entre un rappel et une fermeture si les deux termes seront utilisés. Mais être informé que ce n'est pas complètement correct. Comme nous l'avons déjà dit, lorsqu'un signal est émis, un ensemble de fermetures sera exécuté. L'un d'entre eux est le même pour toutes les instances de cette classe et donc son nom: la fermeture de classe, et les autres sont des rappels personnalisés de l'utilisateur . Notez que tous les signaux ne doivent pas avoir une fermeture de classe parce que c'est facultatif.

De, http://www.pygtk.org/articles/subclassing-gobject/sub-classing-gobject-in-python.htm, espérons que cela aide. Il y a exemple de code sur le site et here, un extrait:

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 ... comment l'ai-je manqué lors de ma session googling ... merci! – jldupont

+0

Pas de soucis;) ... –

+0

Tout le plaisir est à moi: votre barrière 10K. À un de ces quatre. – jldupont

3

Les réponses sont correctes bien sûr, mais en utilisant libraries est moins sujette à des douleurs:

import gobject 

from pygtkhelpers.utils import gsignal 

class Car(gobject.GObject): 

    gsignal('engine-started', float) # yeah baby 
Questions connexes