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.
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.