Vous êtes à peu près ici : Accueil  »   tutoriel PyGTK  »   PyGTK : sommaire

2.2. Le principe des signaux et des rappels

Note

Nous n'entrerons pas dans le détail des différences entre les extensions du système de signaux de GLib 2.0 par rapport à celui de GTK 1.2. Les utilisateurs de PyGTK ne devraient pas remarquer de différence.

Avant de nous lancer dans une observation détaillée de helloworld.py, il nous faut expliquer les concepts de signal et de fonction de rappel. GTK est une boite à outils évènementielle, ce qui signifie qu'elle restera inactive dans gtk.main() jusqu'à ce qu'un évènement survienne et que le relais soit passé à la fonction appropriée.

Ce passage de relais s'effectue par l'intermédiaire d'un « signal » (notez que ces signaux n'ont rien à voir avec les signaux système Unix, et ne sont pas implémentés en les utilisant, quoique la terminologie soit semblable). Lorsqu'un évènement survient, comme un clic de souris, le signal correspondant est « émis » par le widget sur lequel on clique. C'est de cette façon que GTK réalise la plupart de son travail. Il y a des signaux dont tous les widgets héritent, comme "destroy", tandis que d'autres sont spécifiques à un widget, comme le "toggled" des boutons interrupteurs.

Pour qu'un bouton effectue une action, on définit un gestionnaire de signal qui sera chargé de capter ces signaux et d'appeler la fonction appropriée. On utilise alors une méthode de GtkWidget (de la classe GObject) comme ceci :

  gestionnaire_id = objet.connect(nom, fonction, donnees_fct)

... où objet est l'instance de GtkWidget qui doit émettre le signal. Le premier argument, nom, est une chaine de caractères donnant le nom du signal que l'on veut intercepter. Le deuxième argument, fonction, est la fonction qui devra être appelée une fois le signal intercepté. Enfin, donnees_fct représente les données que l'on souhaite passer à cette fonction. La méthode renvoie un identifiant de gestionnaire gestionnaire_id, que l'on pourra utiliser pour déconnecter ou bloquer le gestionnaire.

La fonction indiquée en deuxième argument est une «fonction de rappel», et devrait généralement avoir la forme :

  def fct_rappel(widget, donnees_fct):

... où le premier argument est un pointeur vers le widget qui a émis le signal, et le second (donnees_fct) un pointeur vers les données fournies en dernier argument à la méthode connect() ci-dessus.

Si la fonction de rappel est une méhode d'objet, elle aura généralement la forme suivante :

  def meth_rappel(self, widget, donnees_meth):

... où self est l'instance d'objet invoquant la méthode. C'est la forme utilisée dans le programme exemple helloworld.py.

Note

La forme indiquée ci-dessus pour une déclaration de fonction de rappel n'est qu'un modèle général. Certains signaux spécifiques à un widget engendrent des paramètres d'appel différents.

Dans l'exemple helloworld.py, on trouve aussi un appel de la forme :

  handler_id = object.connect_object(name, func, slot_object)
  gestionnaire_id = objet.connect_object(nom, fonction, objet)

connect_object()est semblable à connect() à ceci près que la fonction de rappel ne nécessite qu'un seul argument et deux arguments pour la méthode :

  def fct_rappel(objet)
  def meth_rappel(self, objet)

... où objet est habituellement un widget. connect_object() permet aux méthodes de widget PyGTK qui ne prennent qu'un seul argument (self) d'être utilisées comme gestionnaires de signaux.