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