Object +-- Widget +-- Container +-- Bin +-- Button
Il y a deux manières de créer des boutons. Vous pouvez créer un bouton vide et ajouter un enfant après, ou vous créez un bouton avec un label pour enfant. La seconde forme est fournie pour le confort d'utilisation. Les fonctions suivantes créent un bouton :
$button = new Gtk::Button(); $button = new Gtk::Button( $label ); $button = new_with_label Gtk::Button( $label );
La première des fonctions ci-dessus crée un bouton vide. Les deux dernières créent un bouton avec un label. La seconde est en fait une forme raccourcie de la troisième.
Si vous créez un bouton avec un label, vous pouvez utiliser $button->child
pour accéder au widget enfant. Par exemple, pour changer le texte d'un label,
vous pourrez utiliser :
$button->child->set( "new label" );
Si vous ne créez pas un bouton avec label, vous pouvez également prendre un widget et le placer dans le bouton. Par exemple, les trois sections de code suivantes sont équivalentes :
# crée un bouton avec label $button = new Gtk::Button( "text" ); # même que précédemment, mais avec une fonction new() différente $button = new_with_label Gtk::Button( "text" ); # crée un label séparé du bouton, et l'ajoute à la main $button = new Gtk::Button(); $label = new Gtk::Label( "text" ); $button->add( $label );
Les boutons possèdent les signaux suivants :
pressed : émis quand on presse le bouton de la souris alors que le pointeur
est à l'intérieur du bouton ou quand la fonction $button->pressed()
est appelée.
released : émias quand on relâche le bouton de la souris alors que le
pointeur est à l'intérieur du bouton ou quand la fonction $button->released()
est appelée.
clicked : émis quand le bouton de la souris est pressé puis relâché à
l'intérieur du bouton ou quand la fonction $button->clicked() est appelée.
enter : émis quand le pointeur de la souris entre sur le bouton ou quand
la fonction $button->enter() est appelée.
leave : émis quand le pointeur de la souris sort du bouton ou quand la
fonction $button->leave() est appelée.
Les styles de relief des boutons peuvent être : 'normal' , 'half'
, 'none' . Il est évident que le style par défaut est : 'normal' .
Pour obtenir ou déclarer le style de relief, vous devrez utiliser les fonctions
suivantes ;
$button->set_relief( $relief_style ); $button->get_relief();
Dans le programme suivant, je crée d'abord un bouton avec label auquel j'attache un gestionnaire, et plus tard, j'enlève ce bouton, le remplace par un créé sans label puis lui ajoute un label. Vous devriez être capable de comprendre à la fois ce qui concerne les boutons et ce qui concerne les signaux pour aller plus loin.
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $window = new Gtk::Window( "toplevel" );
my $button = new Gtk::Button( "Button created with label" );
my $label;
my $id;
my $numclicked = 0;
# enregistrement des rappels
$window->signal_connect( "delete_event", \&CloseWindowEvent );
$button->signal_connect( "clicked", \&ClickedButtonEvent );
# attribut du bouton
$button->show();
# attributs de la fenêtre
$window->border_width( 15 );
$window->add( $button );
$window->show();
# boucle d'évènement Gtk
main Gtk;
exit( 0 );
### Routines
# fonction appelée quand le bouton est clické
sub ClickedButtonEvent { if ( $numclicked == 0 ) { $button->child->set( "Changed Button Label" ); $numclicked++; } elsif ( $numclicked == 1 ) { $window->remove( $button ); $button = new Gtk::Button(); $label = new Gtk::Label( "Label added to a button" ); $button->add( $label ); $label->show(); $button->show(); $window->add( $button ); $id = $button->signal_connect( "clicked", \&ClickedButtonEvent ); $numclicked++; } elsif ( $numclicked == 2 ) { $label->set( "Now Click to Close Window" ); $numclicked++; } else { Gtk->exit( 0 ); } }
# fonction appelée quand on demande à la fenêtre de fermer
sub CloseWindowEvent { # Si vous retourner une valeur fausse au gestionnaire de signal ``delete_event'' # GTK émettre le signal ``delete_event''. # Retourner une valeur vraie signifie que vous ne voulez pas que la # fenêtre soit détruite. return $true; }
Object +-- Widget +-- Container +-- Bin +-- Button +-- ToggleButton
Les boutons toggle sont dérivés des boutons normaux et sont très similaires sauf qu'ils n'ont que deux états possibles et qui change à l'aide d'un clic. Ils peuvent être remontés et quand vous cliquez, ils redescendent. Vous recliquez et ils remontent.
Les boutons toggle servent de base aux cases à cocher et aux boutons radios, au point que ces derniers héritent de beaucoup des appels utilisés pour les boutons toggle. Nous vous indiquerons lesquels quand nous les rencontreront.
new Gtk::ToggleButton();new Gtk::ToggleButton( $label );
Comme vous pouvez l'imaginer, cela fonctionne exactement comme pour les boutons normaux. La première crée un bouton toggle vierge et la seconde un bouton toggle avec label.
Pour retrouver l'état d'un widget toggle, incluant les boutons radios et les
cases à cocher, nous utilisons une construction illustrée dans l'exemple ci-dessous.
Cela teste l'état du toggle en accédant au domaine actif de la structure
du widget toggle. Le signal qui nous intéresse émis par un bouton toggle ( les
boutons toggle, radio et les cases à cocher) est le signal toggled. Pour
contrôler l'état de ces boutons, déclarez un gestionnaire de signal pour attraper
les signal toggled et accéder à la structure afin de déterminer son état.
Le rappel ressemblera à
sub toggle_button_callback
{
$togglebutton = $_[0];
if ( $togglebutton->active )
{
# Si le contrôle arrive là, le bouton est baissé
}
else
{
# Si le contrôle arrive là, le bouton est levé
}
}
Pour forcer l'état d'un bouton toggle, et ses enfants, les boutons radios et les cases à cocher, utilisez :
$togglebutton->set_active( $state );
Passer une valeur vraie ou fausse comme argument précise s'il doit être en bas ( pressé ) ou en haut ( relâché ). Le défaut est en haut ou faux.
Notez que si vous utilisez la fonction set_active() et que l'état est
en fait changé, cela déclenchera l'émission du signal ``cliqué'' par le bouton
( et non ``toggled'' comme beaucoup de personnes le pensent ).
Pour obtenir l'état d'un bouton, vous pouvez utiliser :
$togglebutton->get_active();
Plutôt que de changer la valeur d'un bouton toggle en contrôlant son état actif et en déclarant la valeur opposée, utiliser tout simplement la fonction :
$togglebutton->toggled();
Cette fonction émettra aussi le signal ``toggled''.
Object +-- Widget +-- Container +-- Bin +-- Button +-- ToggleButton +-- CheckButton
Les cases à cocher héritent de beaucoup de propriétés et de fonctions des boutons toggle, mais ils ont une allure différente. Plutôt que d'être des boutons avec du texte à l'intérieur, ce sont des petites cases avec le texte à leur droite. Elles sont souvent utilisées pour choisir des options oui ou non dans une application.
Les deux fonctions de création sont les mêmes que pour un bouton normal.
new Gtk::CheckButton(); new Gtk::CheckButton( $label );
Passer une chaîne en argument crée une case à cocher avec un label à son côté. Le contrôle de l'état de la case se fait de la même manière que pour le bouton toggle.
Object +-- Widget +-- Container +-- Bin +-- Button +-- ToggleButton +-- CheckButton +-- RadioButton
Les boutons radio sont similaires aux cases à cocher sauf qu'ils sont regroupés de sorte qu'un seul puisse être sélectionné. Ils sont très utiles dans les programmes ou l'on doit choisir dans une liste d'options.
On crée un nouveau bouton radio avec l'une des fonctions suivantes :
new Gtk::RadioButton( $label ); new Gtk::RadioButton( $label, $button );
Vous noterez la présence d'un second argument dans la seconde fonction. Les
boutons radio doivent appartenir à un groupe pour accomplir leur devoir proprement.
Le premier appel new Gtk::RadioButton() devrait avoir le label comme
unique argument. Alors, vous ajoutez les autres boutons radio au groupe en utilisant
l'un des boutons déjà présent dans le groupe comme second argument. Le bout
de code suivant devrait vous éclaircir les idées :
# crée le premier bouton et l'ajoute dans une boîte. $radio1 = new Gtk::RadioButton( "button 1" ); $box->add( $radio1 ); # crée le second bouton et l'ajoute dans une boîte. $radio2 = new Gtk::RadioButton( "button 2", $radio1 ); $box->add( $radio2 ); # crée le troisième bouton et l'ajoute dans une boîte. # notez que le premier bouton créé sert de second argument $radio3 = new Gtk::RadioButton( "button 3", $radio1 ); $box->add( $radio3 ); # crée le premier bouton et l'ajoute dans une boîte. # notez que le troisième bouton créé sert de second argument $radio4 = new Gtk::RadioButton( "button 4", $radio3 ); $box->add( $radio4 );
Déclarer quel doit être le bouton pressé est souvent une bonne idée :
$togglebutton->set_active( $state );
Cela fonctionne comme décrit dans la section sur les boutons toggle. Une fois que les boutons radios sont regroupés seul un peut être actif. Si l'utilisateur clique sur un bouton puis sur l'autre, le premier émettra en premier le signal ``toggled'' signifiant qu'il est devenu inactif puis le second émettra le signal ``toggled'' pour dire qu'il devient actif.
Si vous voulez obtenir une liste de tous les boutons appartenant à un groupe, vous pouvez utiliser la fonction :
@group = $radiobutton->button_group();
Si vous voulez ajouter un bouton radio à un groupe après qu'il ait été créé, utilisez :
$radiobutton->button_set_group( @group );
L'argument @group est une liste des boutons radio, qui appartiennent
au même groupe. On l'obtient habituellement de la fonction button_group().
L'exemple suivant crée un groupe de quatre boutons radio.
#!/usr/bin/perl -wuse Gtk;
use strict;
init Gtk;
my $false = 0;
my $true = 1;
my $window;
my $box1;
my $box2;
my $button;
my $separator;
$window = new Gtk::Window( "toplevel" );
$window->signal_connect( "delete_event", sub { Gtk->exit( 0 ); } );
$window->set_title( "Radio Buttons" );
$window->border_width( 0 );
$box1 = new Gtk::VBox( $false, 0 );
$box1->show();
$box2 = new Gtk::VBox( $false, 10 );
$box2->border_width( 10 );
$box1->pack_start( $box2, $false, $false, 0 );
$box2->show();
$window->add( $box1 );
$button = new Gtk::RadioButton( "button 1" );
$box2->pack_start( $button, $false, $false, 0 );
$button->show();
$button = new Gtk::RadioButton( "button 2", $button );
$button->set_active( $true );
$box2->pack_start( $button, $true, $true, 0 );
$button->show();
$button = new Gtk::RadioButton( "button 3", $button );
$box2->pack_start( $button, $true, $true, 0 );
$button->show();
$button = new Gtk::RadioButton( "button 4", $button );
$box2->pack_start( $button, $true, $true, 0 );
$button->show();
$separator = new Gtk::HSeparator();
$box1->pack_start( $separator, $false, $false, 0 );
$separator->show();
$box2 = new Gtk::VBox( $false, 10 );
$box2->border_width( 10 );
$box1->pack_start( $box2, $false, $true, 0 );
$box2->show();
$button = new Gtk::Button( "Close" );
$button->signal_connect( "clicked", sub { Gtk->exit( 0 ); } );
$box2->pack_start( $button, $true, $true, 0 );
$button->can_default( $true );
$button->grab_default();
$button->show();
$window->show();
main Gtk;
exit( 0 );