IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Apprendre à utiliser le module Python PyGTK 2.0


précédentsommairesuivant

XX. Chapitre 20. Gestion avancée des événements et signaux

XX-A. Méthodes des signaux

Les méthodes des signaux sont des méthodes de gobject.GObject qui sont héritées par le gtk.Object inclus dans tous les widgets GTK+.

XX-A-1. Connecter et déconnecter les gestionnaires de signaux

 
Sélectionnez
1.
2.
3.
4.
5.
6.
7.
8.
9.
  id_gestionnaire = objet.connect(nom, rappel, args_rappel)
  
  id_gestionnaire = objet.connect_after(nom, rappel, args_rappel)
  
  id_gestionnaire = objet.connect_object(nom, rappel, slot_object, args_rappel)
  
  id_gestionnaire = objet.connect_object_after(nom, rappel, connecteur_objet, args_rappel)
  
  objet.disconnect(id_gestionnaire)

Les quatre premières méthodes connectent un gestionnaire de signal (rappel) à un gtk.Object (objet) pour le signal spécifié par nom et retournent une valeur id_gestionnaire qui identifie la connexion. Le paramètre args_rappel consiste en zéro ou plusieurs arguments qui sont transmis dans l'ordre à rappel. Les méthodes connect_after() et connect_object_after() voient leurs gestionnaires de signal appelés après les autres gestionnaires (y compris les gestionnaires implicites) connectés au même objet et même signal. Chaque gestionnaire de signal d'objet possède son propre ensemble d'arguments auquel il s'attend. Il faut se référer à la documentation GTK+ pour trouver quels arguments sont nécessaires pour un gestionnaire de signal, bien que l'information pour les widgets courants soit disponible dans l'Annexe A, Les signaux GTKAnnexe A - Les signaux GTK. Le gestionnaire de signal classique ressemble à :

 
Sélectionnez
  def gest_signal(objet, ...., args_rappel):

Les gestionnaires de signaux qui appartiennent à une classe Python (indiqués dans les méthodes connect() comme self.rappel) possèdent un argument supplémentaire en première position - l'instance d'objet self :

 
Sélectionnez
  gest_signal(self, objet, ...., args_rappel)

Les méthodes connect_object() et connect_object_after() appellent le gestionnaire de signal avec, en premier argument, le paramètre connecteur_objet au lieu de objet :

 
Sélectionnez
1.
2.
3.
  def gest_signal(connecteur_objet, ...., args_fonc):

  def gest_signal(self, connecteur_objet, ...., args_fonc):

La méthode disconnect() supprime la connexion entre un gestionnaire de signal et un signal d'objet. Le paramètre id_gestionnaire indique quelle connexion supprimer.

XX-A-2. Bloquer et libérer les gestionnaires de signaux

Les méthodes suivantes :

 
Sélectionnez
1.
2.
3.
  objet.handler_block(id_gestionnaire)

  objet.handler_unblock(id_gestionnaire)

bloquent et débloquent le gestionnaire de signal indiqué par id_gestionnaire. Lorsqu'un gestionnaire de signal est bloqué, il ne peut être appelé lorsque le signal se produit.

XX-A-3. Émettre et stopper les signaux

Les méthodes suivantes :

 
Sélectionnez
1.
2.
3.
  objet.emit(nom, ...)

  objet.emit_stop_by_name(nom)

émettent et stoppent le signal nom. Émettre le signal provoque l'exécution du gestionnaire implicite et des gestionnaires définis par l'utilisateur. La méthode emit_stop_by_name() fait avorter l'émission actuelle du signal de ce nom.

XX-B. Émission et propagation du signal

L'émission du signal est le processus par lequel GTK+ exécute tous les gestionnaires d'un objet et signal spécifiques.

Tout d'abord, il faut noter que la valeur de retour d'une émission de signal est la valeur de retour du dernier gestionnaire exécuté. Comme les signaux d'événements sont tous du type RUN_LAST, ce sera celle du gestionnaire implicite (fourni par GTK+), sauf si on utilise la méthode connect_after().

Voici la manière dont un événement (par exemple, "button_press_event") est géré :

  • démarrer avec le widget où survient l'événement ;
  • émettre le signal générique "event". Si le gestionnaire de signal renvoie la valeur TRUE, arrêter le traitement ;
  • autrement, émettre un signal spécifique "button_press_event". S'il renvoie la valeur TRUE, arrêter le traitement ;
  • autrement, aller au parent du widget et répéter les deux étapes précédentes ;
  • continuer jusqu'à ce qu'un des gestionnaires de signal renvoie TRUE, ou jusqu'à ce qu'on ait atteint le widget de plus haut niveau.

Quelques conséquences de ce qui précède :

  • la valeur de retour de notre gestionnaire peut n'avoir aucun effet s'il existe un gestionnaire implicite à moins de le connecter avec connect_after() ;
  • pour empêcher le gestionnaire implicite d'être exécuté, il faut se connecter avec connect() et utiliser la méthode emit_stop_by_name() - la valeur de retour n'affecte que si le signal est propagé, pas l'émission en cours.

précédentsommairesuivant

Copyright © 2005 John Finlay. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.