Vous êtes à peu près ici : Accueil  »   tutoriel PyGTK  »   PyGTK : sommaire

9.4. La barre de progression

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)

Note

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 :

Figure 9.4. Exemple de barre de progression

exemple barre de progression

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