Object +-- Widget +-- Progress +-- ProgressBar
Les barres de progression sont utilisées pour montrer l'état d'avancement d'une opération. Elles sont plutôt faciles à utiliser, comme vous le verrez dans le programme ci-dessous. Mais, tout d'abord voyons comment créer une nouvelle barre de progression.
Il existe deux manières de les créer, une simple qui ne demande aucun argument et une qui demande un objet Adjustment comme argument. Si vous utilisez la première, la barre de progression créera son propre objet Adjustment.
$progress = new Gtk::ProgressBar(); $progress = new Gtk::ProgressBar( $adjustment );
La seconde méthode a l'avantage de vous permettre d'utiliser l'objet adjustment pour spécifier votre propre échelle de paramètres pour la barre de progression.
Le réglage de l'objet progress peut être changé dynamiquement par :
$progress->set_adjustment( $adjustment );
Maintenant que votre barre de progression est créée vous pouvez utiliser :
$progress->update( $percentage );
L'argument est la quantité ``réalisée'', ce qui signifie que la barre sera remplie d'une quantité variant de 0 à 100%. Cette quantité est passée à la fonction à l'aide d'un nombre réel compris entre 0.0 et 1.0.
Le sens de remplissage de la barre de progression peut être indiqué par :
$progress->set_orientation( $orientation );
L'argument $orientation qui peut prendre les valeur suivantes :
'left_to_right' : de gauche à droite 'right_to_left' : de droite à gauche 'bottom_to_top' : de bas en haut 'top_to_bottom' : de haut en bas
Quand elle est utilisée pour montrer le degré d'avancement d'un processus, on peut choisir d'afficher la valeur de la barre de progression soit sous le mode continu soit discret. En mode continu, la barre de progression est mise à jour pour chaque valeur. En mode discret, la barre de progression est mise à jour en un certain nombre de blocs discrets. Le nombre de block est également configurable.
Le style de la barre de progression est déclaré à l'aide de la fonction :
$progress->set_bar_style( $style );
Le paramètre $style peut correspondre à l'une des deux valeurs : 'continuous'
ou 'discrete'.
Le nombre de blocs discrets peut être indiqué par :
$progress->set_discrete_blocks( $blocks );
En plus de vous indiquer le degré d'avancement d'un processus, la barre de progression peut être déclarée juste pour montrer qu'il y a de l'activité. Cela peut être utile si la progression ne peut pas être mesurée par une valeur échelle. Le mode activité n'est pas affecté par le style de la barre de progression qui est décrit ci-dessus et ne s'en accomode pas. Le mode est soit vrai soit faux et est sélectionné par la fonction :
$progress->set_activity_mode( $activity_mode );
La taille de chaque pas de l'indicateur d'activité et le nombre de blocks sont déclarés avec les fonctions suivantes :
$progress->set_activity_step( $step ); $progress->set_activity_blocks( $blocks );
En mode continu, la barre de progression peut aussi afficher une chaîne de texte configurable à l'intérieur de la glissière avec la fonction :
$progress->set_format_string( $format );
L'argument $format est le même que ceci utilisé par un printf.
Les directives suivantes peut être utilisées à l'intérieur de la chaîne format.
%p - pourcentage%v - valeur
%l - valeur la plus basse de l'indicateur
%u - valeur la plus haute de l'indicateur
On peut afficher ou enlever ce texte à l'aide de la fonction :
$progress->set_show_text( $show_text );
L'argument $show_text est une valeur vraie ou fausse. L'apparence du
texte peut être modifiée par :
$progress->set_text_alignment( $x_align, $y_align );
Les arguments $x_align et $y_align prennent des valeurs comprises
entre 0.0 et 1.0. Leurs valeurs indiquent la position du texte dans la glissière.
Des valeurs nulles pour les deux placent le texte en haut à gauche, les valeurs
de 0.5 centrent le texte (valeurs par défaut) et les valeurs 1.0 le placent
en bas à droite.
Le texte courant de l'objet progress peut être retrouvé pour l'ajustement courant ou pour un ajustement spécifique à l'aide des deux fonctions suivantes. Ces fonctions retournent la chaîne formatée qui serait affichée dans la glissière.
$progress->get_current_text(); $progress->get_text_from_value( $value );
Il y a également un autre moyen de changer les valeurs et la longueur de l'intervalle d'une barre de progression avec :
$progress->configure( $value, $min, $max );
Cette fonction fournit une simple interface à la longueur de l'intervalle et à la valeur d'une barre de progression.
Les fonctions restantes peuvent être utilisées pour obtenir ou déclarer la valeur courante de la barre de progression en fonction des différents formats :
$progress->set_percentage( $percentage ); $progress->set_value( $value ); $progress->get_value(); $progress->get_current_percentage(); $progress->get_percentage_from_value( $adjustment );
Ces fonctions se passent de commentaires. La dernière utilise l'ajustement spécifique de la barre de progression pour déterminer le pourcentage par rapport à la valeur de la longueur de l'intervalle.
Les barres de progression sont généralement utilisées avec des temps morts et
d'autres fonctions de ce genre pour donner l'impression du multitâche. Toutes
emploieront la fonction update() de la même manière.
Voici un exemple de barre de progression mise à jour avec des temps morts. Ce programme vous montrera également comment réinitialiser une barre de progression.
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $window;
my $pbar;
my $timer;
my $align;
my $separator;
my $table;
my $adj;
my $button;
my $check1;
my $check2;
my $vbox;
$window = new Gtk::Window( "toplevel" );
$window->set_policy( $false, $false, $true );
$window->signal_connect( "destroy", sub { Gtk->exit( 0 ); } );
$window->set_title( "Progress Bar" );
$window->border_width( 0 );
$vbox = new Gtk::VBox( $false, 5 );
$vbox->border_width( 10 );
$window->add( $vbox );
$vbox->show();
# Centre les objets
$align = new Gtk::Alignment( 0.5, 0.5, 0, 0 );
$vbox->pack_start( $align, $false, $false, 5 );
$align->show();
# Crée un objet adjustement pour l'utiliser dans la barre de progression
$adj = new Gtk::Adjustment( 0, 1, 150, 0, 0, 0 );
# Crée la barre de progression qui utilise cet ajustement
$pbar = new_with_adjustment Gtk::ProgressBar( $adj );
# Déclare le format de la chaîne qui doit être affiché dans la glissière
# %p - pourcentage
# %v - valeur
# %l - borne inférieure de l'intervalle
# %u - borne supérieur de l'intervalle
$pbar->set_format_string( "%v from [%l-%u] (=%p%%)" );
$align->add( $pbar );
$pbar->show();
# Ajoute une routine timer pour mettre à jour la barre de progression
$timer = Gtk->timeout_add( 100, \&progress_timeout );
$separator = new Gtk::HSeparator();
$vbox->pack_start( $separator, $false, $false, 0 );
$separator->show();
# rows, columns, homogeneous
$table = new Gtk::Table( 2, 3, $false );
$vbox->pack_start( $table, $false, $true, 0 );
$table->show();
# Ajoute une case à cocher pour sélectionner l'affichage ou non du texte
# dans la glissière
$check1 = new Gtk::CheckButton( "Show text" );
$table->attach( $check1, 0, 1, 0, 1, [ 'expand', 'fill' ], ['expand', 'fill' ], 5, 5 );
$check1->signal_connect( "clicked", sub { $pbar->set_show_text( $check1->active ); } );
$check1->show();
# Ajoute un bouton toggle pour choisir ou non le mode activité
$check2 = new Gtk::CheckButton( "Activity mode" );
$table->attach( $check2, 0, 1, 1, 2, [ 'expand', 'fill' ], [ 'expand', 'fill' ], 5, 5 );
$check2->signal_connect( "clicked", sub { $pbar->set_activity_mode( $check2->active ); } );
$check2->show();
$separator = new Gtk::VSeparator();
$table->attach( $separator, 1, 2, 0, 2, [ 'expand', 'fill' ], [ 'expand', 'fill' ], 5, 5 );
$separator->show();
# Ajoute un bouton radio pour le choix du mode d'affichage continu
$button = new Gtk::RadioButton( "Continuous" );
$table->attach( $button, 2, 3, 0, 1, [ 'expand', 'fill' ], [ 'expand', 'fill' ], 5, 5 );
$button->signal_connect( "clicked", sub { $pbar->set_bar_style( 'continuous' ); } );
$button->show();
# Ajoute un bouton radio pour sélectionner l'affichage en mode discret
$button = new Gtk::RadioButton( "Discrete", $button );
$table->attach( $button, 2, 3, 1, 2, [ 'expand', 'fill' ], [ 'expand', 'fill' ], 5, 5 );
$button->signal_connect( "clicked", sub { $pbar->set_bar_style( 'discrete' ); } );
$button->show();
$separator = new Gtk::HSeparator();
$vbox->pack_start( $separator, $false, $false, 0 );
$separator->show();
# Ajoute un bouton pour sortir du programme
$button = new Gtk::Button( "Close" );
$button->signal_connect( "clicked", sub { Gtk->exit( 0 ); } );
$vbox->pack_start( $button, $false, $false, 0 );
# Ceci en fait le bouton par défaut.
$button->can_default( $true );
# Ce permet au bouton d'être le bouton concerné par les évènemnts
# Appuyer juste sur la touche ``Entrée'' et le bouton sera activé
$button->grab_default();
$button->show();
$window->show();
main Gtk;
exit( 0 );
### Subroutines
sub progress_timeout { my ( $widget ) = @_; my $new_val; my $adj; # Calcule la valeur de la barre de progression en utilisant # l'intervalle de valeur déclaré par l'objet ajustement $new_val = $pbar->get_value() + 1; $adj = $pbar->adjustment; $new_val = $adj->lower if ( $new_val > $adj->upper ); # Déclare la nouvelle valeur $pbar->set_value( $new_val ); # Comme c'est une fonction temps mort, retournez VRAI # pour continuer à être appelée return ( $true ); }