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 :-)