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