Les infobulles sont les petites chaines de texte qui apparaissent lorsque le pointeur de la souris est maintenu quelques secondes au-dessus d'un bouton ou de tout autre widget (à l'exception de ceux qui ne reçoivent pas d'évènements — qui ne disposent pas de leur propre fenêtre).
Dans un premier temps, on utilise l'appel qui suit pour créer une infobulle. Il suffit de le faire une fois pour un groupe d'infobulles donné, car l'objet gtk.Tooltips renvoyé peut être utilisé pour en créer de nouvelles.
infobulles = gtk.Tooltips()
Une fois créés l'infobulle ainsi que le widget auquel on souhaite la rattacher, on utilisera simplement l'appel suivant pour appliquer la première au second :
infobulles.set_tip(widget, tip_text, tip_private=None)
L'objet infobulles est l'infobulle que l'on a créée auparavant. Le premier argument (widget) est le widget pour lequel elle doit apparaitre, et le second (tip_text) le texte qu'elle doit afficher. Le dernier argument (tip_private) est une chaine de caractères pouvant servir d'identifiant.
Le programme exemple infobulles.py modifie le programme fleches.py en ajoutant une infobulle à chaque bouton. La Figure 9.3 montre la fenêtre qu'il génère ainsi que l'infobulle du deuxième bouton :
Voici le code source de infobulles.py :
1 #!/usr/bin/env python 2 3 # exemple infobulles.py 4 5 import pygtk 6 pygtk.require('2.0') 7 import gtk 8 9 # On cree une fleche avec les parametres specifies 10 # et on la place dans un bouton 11 def cree_fleche_bouton(type, ombre): 12 bouton = gtk.Button(); 13 fleche = gtk.Arrow(type, ombre); 14 bouton.add(fleche) 15 bouton.show() 16 fleche.show() 17 return bouton 18 19 class Infobulles: 20 def __init__(self): 21 # Creation d'une fenetre 22 fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL) 23 24 fenetre.set_title("Infobulles") 25 26 # C'est une bonne idee de faire ceci pour chaque fenetre 27 fenetre.connect("destroy", gtk.main_quit) 28 29 # On fixe la largeur des bordures de la fenetre 30 fenetre.set_border_width(10) 31 32 # On cree une boite pour contenir les boutons/fleches 33 boite = gtk.HBox(False, 0) 34 boite.set_border_width(2) 35 fenetre.add(boite) 36 37 # Creation d'un objet Tooltips 38 self.infobulles = gtk.Tooltips() 39 40 # On place et on affiche tous nos widgets 41 boite.show() 42 43 bouton = cree_fleche_bouton(gtk.ARROW_UP, gtk.SHADOW_IN) 44 boite.pack_start(bouton, False, False, 3) 45 self.infobulles.set_tip(bouton, "SHADOW_IN") 46 47 bouton = cree_fleche_bouton(gtk.ARROW_DOWN, gtk.SHADOW_OUT) 48 boite.pack_start(bouton, False, False, 3) 49 self.infobulles.set_tip(bouton, "SHADOW_OUT") 50 51 bouton = cree_fleche_bouton(gtk.ARROW_LEFT, gtk.SHADOW_ETCHED_IN) 52 boite.pack_start(bouton, False, False, 3) 53 self.infobulles.set_tip(bouton, "SHADOW_ETCHED_IN") 54 55 bouton = cree_fleche_bouton(gtk.ARROW_RIGHT, gtk.SHADOW_ETCHED_OUT) 56 boite.pack_start(bouton, False, False, 3) 57 self.infobulles.set_tip(bouton, "SHADOW_ETCHED_OUT") 58 59 fenetre.show() 60 61 def main(): 62 gtk.main() 63 return 0 64 65 if __name__ == "__main__": 66 infob = Infobulles() 67 main()
Il existe d'autres méthodes utilisables avec les infobulles. En voici une liste, accompagnée d'une brève description pour chacune :
infobulles.enable()
Active un groupe d'infobulles désactivé.
infobulles.disable()
Désactive une groupe d'infobulles activé.
infobulles.set_delay(delay)
Fixe le nombre de millisecondes que le pointeur de la souris doit rester au-dessus du widget avant que l'infobulle apparaisse. La valeur par défaut est 500 millisecondes (une demi-seconde).
Et voilà. C'est déjà plus qu'il n'en faut :-)