La barre d'état (gtk.Statusbar) est un widget assez simple qui sert à afficher un message textuel. Elle tient à jour une pile des messages qu'on lui a donnés, de sorte que le fait de dépiler le message courant entraine le ré-affichage du précédent.
Afin de permettre l'utilisation de la même barre d'état par différentes parties d'une application, le widget gtk.Statusbar distribue des "identifiants contextuels" qui serviront à identifier différents "utilisateurs". Le message affiché est celui qui se trouve au sommet de la pile, peu importe son contexte. Les messages sont empilés suivant le schéma dernier-entré-premier-sorti, et non suivant leur identifiant contextuel.
On crée une barre d'état avec un appel à :
barredetat = gtk.Statusbar()
On obtient un nouvel identifiant contextuel en invoquant la méthode suivante avec une courte description textuelle du contexte (context_description) :
context_id = barredetat.get_context_id(context_description)
Trois autres méthodes agissent sur les barres d'état :
message_id = barredetat.push(context_id, text) barredetat.pop(context_id) barredetat.remove(context_id, message_id)
La première, push() (empiler), sert à ajouter un nouveau message à barredetat. Elle renvoie un identifiant de message (message_id). Ce dernier, accompagné du context_id approprié peut être transmis plus tard à la méthode remove() (retirer) afin de retirer le message de la pile de barredetat.
La méthode pop() retire le message, ayant le context_id spécifié, qui se trouve le plus haut placé dans la pile.
Le programme d'exemple barredetat.py crée une barre d'état ainsi que deux boutons : un pour empiler des éléments dans la barre d'état, et un autre pour dépiler le dernier élément affiché. La Figure 9.9 montre le résultat :
Voici le code source de barredetat.py :
1 #!/usr/bin/env python
2
3 # exemple barredetat.py
4
5 import pygtk
6 pygtk.require('2.0')
7 import gtk
8
9 class ExempleBarreEtat:
10 def empiler(self, widget, donnees):
11 tampon = " Element %d" % self.compteur
12 self.compteur = self.compteur + 1
13 self.barredetat.push(donnees, tampon)
14 return
15
16 def depiler(self, widget, donnees):
17 self.barredetat.pop(donnees)
18 return
19
20 def __init__(self):
21 self.compteur = 1
22 # Creation d'une fenetre
23 fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
24 fenetre.set_size_request(200, 100)
25 fenetre.set_title("Exemple de barre d'etat PyGTK")
26 fenetre.connect("delete_event", gtk.main_quit)
27
28 boite_v = gtk.VBox(False, 1)
29 fenetre.add(boite_v)
30 boite_v.show()
31
32 self.barredetat = gtk.Statusbar()
33 boite_v.pack_start(self.barredetat, True, True, 0)
34 self.barredetat.show()
35
36 context_id = self.barredetat.get_context_id("Exemple barredetat")
37
38 bouton = gtk.Button("empiler un element")
39 bouton.connect("clicked", self.empiler, context_id)
40 boite_v.pack_start(bouton, True, True, 2)
41 bouton.show()
42
43 bouton = gtk.Button("depiler le dernier element")
44 bouton.connect("clicked", self.depiler, context_id)
45 boite_v.pack_start(bouton, True, True, 2)
46 bouton.show()
47
48 # On affichera toujours la fenetre a la derniere etape, de sorte que
49 # tout apparaisse a l'ecran en un bloc.
50 fenetre.show()
51
52 def main():
53 gtk.main()
54 return 0
55
56 if __name__ == "__main__":
57 ExempleBarreEtat()
58 main()