Perl/Tk Tutorial - Create GUI with Perl's Tk Module

Widgets 4 : Listbox

de Binny, traduit par alain Adelmar
aadelmar@numericable.fr beuuh c est quoi ca

Un listbox est un widget qui affiche une liste de chaines de caractères, une par ligne. A sa création, une nouvelle listbox (zone de liste) n'a pas d'éléments. Les éléments peuvent  être ajoutées ou supprimées en utilisant des commandes widget ci-dessous.


Listbox

  Les Options
-selectmode => MODE
Spécifie l'une des plusieurs styles pour manipuler la sélection. Le MODE peut être arbitraire, mais les liaisons par défaut s'attendent à ce que ce soit single, browse, multiple, ou extended, la valeur par défaut est browse.


Les Commandes
Syntaxe Déscription Example
$widget -> curselection(); Retourne une liste contenant les indices numériques de l'ensemble des éléments de la listebox qui est actuellement sélectionnés. S'il n'y a aucun élément sélectionné dans la liste alors une chaîne vide est retournée.
$sel = $lst -> curselection();
$widget -> delete(first,?last?); Supprime un ou plusieurs éléments de la listbox. Premier et le dernier sont des indices précisant les éléments premier et le dernier dans la plage à supprimer. Si last n'est pas spécifié il prend par défaut le premièr, à savoir un seul élément est supprimé.
$lst -> delete(5);
$widget -> get(first,?last?); Si last est omis, retourne le contenu de l'élément de la listbox indiqué en premier, ou une chaîne vide si la première se réfère à un élément non-existant. Si last est spécifié, la commande retourne une liste dont les éléments sont tous des éléments de la listbox contenus entre la première et la dernière, inclusivement.
$lst -> get(5,end);
$widget -> index(index); Retourne la valeur de l'indice qui correspond à l'index (un entier). Si l'index est fin, la valeur retournée est le nombre d'éléments dans la listbox (pas l'indice du dernier élément).
$lst -> index(5);
$widget -> insert(index,?element element ...?);
Insere zéro ou plusieurs nouveaux éléments dans la liste, juste avant l'élément donné par index. Si l'indice est spécifié en tant que fin alors les nouveaux éléments sont ajoutés à la fin de la liste. Retourne une chaîne vide.
$lst -> insert('end',"me");
$widget -> size();
Retourne une chaîne décimale indiquant le nombre total d'éléments dans la listbox.
$count = $lst -> size();


Example

#!/usr/local/bin/perl
use Tk;

# Variables
Global
my $age = 10;
my $occupied = 1;
my $gender = "Male";

# Main Window(fenêtre principale)
my $mw = new MainWindow;

#Aire de construction d'interface utilisateur graphique(GUI Building Area)
my $frm_name = $mw -> Frame();
my $lab = $frm_name -> Label(-text=>"Name:");
my $ent = $frm_name -> Entry();
#Age
my $scl = $mw -> Scale(-label=>"Age :",
-orient=>'v', -digit=>1,
-from=>10, -to=>50,
-variable=>\$age, -tickinterval=>10);

#Traveaux (Jobs)
my $frm_job = $mw -> Frame();
my $chk = $frm_job -> Checkbutton(-text=>"Occupied",
-variable=>\$occupied);
$chk -> deselect();
my $lst = $frm_job -> Listbox(-selectmode=>'single');

#Adding jobs
$lst -> insert('end',"Student","Teacher","Clerk","Business Man",
"Militry Personal","Computer Expert","Others");


#Genre
my $frm_gender = $mw -> Frame();
my $lbl_gender = $frm_gender -> Label(-text=>"Sex ");
my $rdb_m = $frm_gender -> Radiobutton(-text=>"Male",
-value=>"Male", -variable=>\$gender);
my $rdb_f = $frm_gender -> Radiobutton(-text=>"Female",
-value=>"Female",-variable=>\$gender);

my $but = $mw -> Button(-text=>"Push Me", -command =>\&push_button);

#Aire Text
my $textarea = $mw -> Frame();
my $txt = $textarea -> Text(-width=>40, -height=>10);
my $srl_y = $textarea -> Scrollbar(-orient=>'v',-command=>[yview => $txt]);
my $srl_x = $textarea -> Scrollbar(-orient=>'h',-command=>[xview => $txt]);
$txt -> configure(-yscrollcommand=>['set', $srl_y],
-xscrollcommand=>['set',$srl_x]);

#Geometry Management
$lab -> grid(-row=>1,-column=>1);
$ent -> grid(-row=>1,-column=>2);
$scl -> grid(-row=>2,-column=>1);
$frm_name -> grid(-row=>1,-column=>1,-columnspan=>2);

$chk -> grid(-row=>1,-column=>1,-sticky=>'w');
$lst -> grid(-row=>2,-column=>1);
$frm_job -> grid(-row=>2,-column=>2);

$lbl_gender -> grid(-row=>1,-column=>1);
$rdb_m -> grid(-row=>1,-column=>2);
$rdb_f -> grid(-row=>1,-column=>3);
$frm_gender -> grid(-row=>3,-column=>1,-columnspan=>2);

$but -> grid(-row=>4,-column=>1,-columnspan=>2);

$txt -> grid(-row=>1,-column=>1);
$srl_y -> grid(-row=>1,-column=>2,-sticky=>"ns");
$srl_x -> grid(-row=>2,-column=>1,-sticky=>"ew");
$textarea -> grid(-row=>5,-column=>1,-columnspan=>2);

MainLoop;

## Functions
#This function will be executed when the button is pushed
sub push_button {
my $name = $ent -> get();
$txt -> insert('end',"$name\($gender\) is $age years old and is ");

my $job = "";
#See whether he is employed
if ( $occupied == 1 ) {
my $job_id = $lst -> curselection(); #Get the no of selected jobs
if ( $job_id eq "" ) { #If there is no job
$job = "a Non worker.";
}
else {
$job = $lst -> get($job_id) ;#Get the name of the job
$txt -> insert('end',"a $job.");
}

}
else {
$txt -> insert('end',"unemployed.");
}
}

Wow! Notre "petit " exemple est un grand (et totalement inutile) programme dès maintenant. Je vais m'arrêter 'exampling' partir de maintenant.
C'est assez compliqué n'est-ce pas? Pourquoi ne vous lancez le script et de voir ce qu'est une belle écriture nous avons faits. Copiez le script ci-dessus et collez-le dans un fichier appelé "info.pl" et double-cliquez le fichier. Voila! Nous sommes Perl / Tk programmeurs