On emploie la barre de progression pour montrer l'état d'avancement d'une opération. Son utilisation est très facile, comme vous pourrez le constater plus bas avec le code source de notre exemple. Mais commençons par découvrir son appel de création :
barreprogression = gtk.ProgressBar(adjustment=None)
L'argument adjustment indique un ajustement à utiliser avec la barre de progression. Si aucun n'est spécifié, il en sera créé un automatiquement. À présent que notre barre de progression existe, nous pouvons l'utiliser.
barreprogression.set_fraction(fraction)
L'objet barreprogression est la barre de progression sur laquelle l'on souhaite agir, et l'argument fraction la proportion "effectuée", c'est-à-dire le pourcentage de remplissage de la barre de progression. Cette indication est donnée à la méthode sous la forme d'un réel compris entre 0 et 1.
L'orientation de la barre de progression peut être définie avec la méthode :
barreprogression.set_orientation(orientation)
L'argument orientation peut prendre les valeurs suivantes, qui indiquent le sens de progression de la barre :
PROGRESS_LEFT_TO_RIGHT # de gauche à droite PROGRESS_RIGHT_TO_LEFT # de droite à gauche PROGRESS_BOTTOM_TO_TOP # de bas en haut PROGRESS_TOP_TO_BOTTOM # de haut en bas
On peut configurerla barre de progression pour que, plutôt que de donner l'état d'avancement de l'opération, elle indique juste un état d'activité. Cela peut servir dans des situations où l'état d'avancement ne peut pas être représenté dans un intervalle de valeurs. La fonction suivante indique que l'opération a avancé dans une certaine mesure.
barreprogression.pulse()
Le pas de déplacement de l'indicateur d'activité se définit avec la méthode suivante, où fraction est compris entre 0.0 et 1.0.
barreprogression.set_pulse_step(fraction)
Lorsqu'elle n'est pas en mode "activité", la barre de progression peut également afficher une chaine de texte configurable dans sa coulisse. On utilise alors la méthode suivante :
barreprogression.set_text(text)
Notez que set_text() ne prend pas en charge le formattage de type printf() des barre de progression de GTK+ 1.2.
Pour désactiver l'affichage de la chaine de caractères, on appelle set_text() à nouveau, mais sans argument.
Le texte présent dans une barre de progression peut se récupérer à l'aide de la méthode suivante :
text = barreprogression.get_text()
Les barres de progression sont généralement utilisées avec des temporisations ou d'autres fonctions de ce genre (cf. Chapitre 19. Temporisations, Entrées/Sorties et fonctions d'inactivité) pour donner une illusion de mode multitâche. Dans tous les cas, les fonctions set_fraction() ou pulse() sont employées de la même manière.
Le programme barreprogression.py offre un exemple de barre de progression actualisée par l'intermédiaire de temporisations. Ce code vous montre en outre comment réinitialiser la barre de progression. La Figure 9.4 montre la fenêtre que l'on obtient :
Voici le code source de barreprogression.py :
1 #!/usr/bin/env python
2
3 # exemple barreprogression.py
4
5 import pygtk
6 pygtk.require('2.0')
7 import gtk
8
9 # Fonction qui actualise la valeur de la barre de progression
10 # pour qu'on ait un petit peu de mouvement
11 def tempo_progression(objetbarre):
12 if objetbarre.case_activite.get_active():
13 objetbarre.barreprogression.pulse()
14 else:
15 # On calcule la valeur de la barre de progression en prenant
16 # en compte l'intervalle defini dans l'ajustement
17 nouv_val = objetbarre.barreprogression.get_fraction() + 0.01
18 if nouv_val > 1.0:
19 nouv_val = 0.0
20 # On fixe la nouvelle valeur
21 objetbarre.barreprogression.set_fraction(nouv_val)
22
23 # Cette fonction etant une fonction de temporisation, on
24 # renvoie TRUE afin qu'elle puisse encore etre appelee
25 return True
26
27 class BarreProgression:
28 # Fonction de rappel qui active ou desactive l'affichage du texte
29 # dans la coulisse de la barre de progression
30 def modif_affich_texte(self, widget, data=None):
31 if widget.get_active():
32 self.barreprogression.set_text("exemple de texte")
33 else:
34 self.barreprogression.set_text("")
35
36 # Fonction de rappel qui active ou desactive le mode "activite" de
37 # la barre de progression
38 def modif_mode(self, widget, data=None):
39 if widget.get_active():
40 self.barreprogression.pulse()
41 else:
42 self.barreprogression.set_fraction(0.0)
43
44 # Fonction de rappel qui modifie l'orientation de la barre de progression
45 def modif_orientation(self, widget, data=None):
46 if self.barreprogression.get_orientation() == gtk.PROGRESS_LEFT_TO_RIGHT:
47 self.barreprogression.set_orientation(gtk.PROGRESS_RIGHT_TO_LEFT)
48 elif self.barreprogression.get_orientation() == gtk.PROGRESS_RIGHT_TO_LEFT:
49 self.barreprogression.set_orientation(gtk.PROGRESS_LEFT_TO_RIGHT)
50
51 # Liberation de la memoire reservee et retrait de la temporisation
52 def sortie(self, widget, data=None):
53 gtk.timeout_remove(self.tempo)
54 self.tempo = 0
55 gtk.main_quit()
56
57 def __init__(self):
58 self.fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL)
59 self.fenetre.set_resizable(True)
60
61 self.fenetre.connect("destroy", self.sortie)
62 self.fenetre.set_title("Barre de progression")
63 self.fenetre.set_border_width(0)
64
65 boite_v = gtk.VBox(False, 5)
66 boite_v.set_border_width(10)
67 self.fenetre.add(boite_v)
68 boite_v.show()
69
70 # Creation d'un objet alignement au centre
71 align = gtk.Alignment(0.5, 0.5, 0, 0)
72 boite_v.pack_start(align, False, False, 5)
73 align.show()
74
75 # Creation de la barre de progression en utilisant l'ajustement
76 self.barreprogression = gtk.ProgressBar()
77
78 align.add(self.barreprogression)
79 self.barreprogression.show()
80
81 # On ajoute une fonction de rappel temporisee, qui actualisera
82 # la valeur de la barre de progression
83 self.tempo = gtk.timeout_add (100, tempo_progression, self)
84
85 separateur = gtk.HSeparator()
86 boite_v.pack_start(separateur, False, False, 0)
87 separateur.show()
88
89 # lignes, colonnes, homogene
90 tableau = gtk.Table(2, 2, False)
91 boite_v.pack_start(tableau, False, True, 0)
92 tableau.show()
93
94 # Ajout d'une case a cocher pour l'affichage du texte dans la coulisse
95 case = gtk.CheckButton("Afficher le texte")
96 tableau.attach(case, 0, 1, 0, 1,
97 gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
98 5, 5)
99 case.connect("clicked", self.modif_affich_texte)
100 case.show()
101
102 # Ajout d'une case a cocher pour activer ou desactiver le mode "activite"
103 self.case_activite = case = gtk.CheckButton("Mode activite")
104 tableau.attach(case, 0, 1, 1, 2,
105 gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
106 5, 5)
107 case.connect("clicked", self.modif_mode)
108 case.show()
109
110 # Ajout d'une case a cocher pour modifier l'orientation
111 case = gtk.CheckButton("De droite a gauche")
112 tableau.attach(case, 0, 1, 2, 3,
113 gtk.EXPAND | gtk.FILL, gtk.EXPAND | gtk.FILL,
114 5, 5)
115 case.connect("clicked", self.modif_orientation)
116 case.show()
117
118 # Ajout d'un bouton pour quitter le programme
119 bouton = gtk.Button("Fermer")
120 bouton.connect("clicked", self.sortie)
121 boite_v.pack_start(bouton, False, False, 0)
122
123 # Ceci fait en sorte que le bouton puisse etre le widget par defaut
124 bouton.set_flags(gtk.CAN_DEFAULT)
125
126 # Ceci fait du bouton le bouton par defaut. Le simple fait d'appuyer
127 # sur la touche "Enter" l'activera
128 bouton.grab_default ()
129 bouton.show()
130
131 self.fenetre.show()
132
133 def main():
134 gtk.main()
135 return 0
136
137 if __name__ == "__main__":
138 BarreProgression()
139 main()