Eine Tk::Listbox entspricht in etwa einer Multi-Selekt-Box in HTML. Mehrere String können dargestellt werden, aus denen ein oder mehrere ausgewählt werden.
#!perl
use strict;
use warnings;
use Tk;
use Tk::Listbox;
# Create a scrollable listbox containing color names. When a color is
# double-clicked, the label on the bottom will change to show the
# selected color name and will also change the background color
my $mw = Tk::MainWindow->new();
my @werte = qw(
gray60 gray70 gray80 gray85 gray90 gray95
snow1 snow2 snow3 snow4 seashell1 seashell2
seashell3 seashell4 AntiqueWhite1 AntiqueWhite2 AntiqueWhite3
DarkSlateGray1 DarkSlateGray2 DarkSlateGray3
aquamarine4 DarkSeaGreen1 DarkSeaGreen2 DarkSeaGreen3
PaleGreen1 PaleGreen2 PaleGreen3 PaleGreen4 SpringGreen1
green3 green4 chartreuse1 chartreuse2 chartreuse3
chartreuse4 OliveDrab1 OliveDrab2 OliveDrab3 OliveDrab4
coral2 coral3 coral4 tomato1 tomato2 tomato3 tomato4
red4 DeepPink1 DeepPink2 DeepPink3 DeepPink4 HotPink1
HotPink2 HotPink3 HotPink4 pink1 pink2 pink3 pink4
PaleVioletRed2 PaleVioletRed3 PaleVioletRed4 maroon1
VioletRed4 magenta1 magenta2 magenta3 magenta4 orchid1
orchid2 orchid3 orchid4 plum1 plum2 plum3 plum4
DarkOrchid1 DarkOrchid2 DarkOrchid3 DarkOrchid4 purple1
MediumPurple3 MediumPurple4 thistle1 thistle2 thistle3
);
my $listbox = $mw->Scrolled('Listbox',
-scrollbars => 'e',
-height => 15,
-listvariable => \@werte,
)->pack(-fill => 'x',);
my $label = $mw->Label(-text => 'click a listbox-value', -bg => 'green',)->pack(-fill => 'x',);
$listbox->bind('<<ListboxSelect>>', sub{
$label->configure(
-text => $listbox->get($listbox->curselection()),
-background => $listbox->get($listbox->curselection()),
);
});
$mw->MainLoop();
Den ausgewählten Eintrag einer Listbox kann man über die Methode curselection
herausfinden. Da in einer Listbox auch mehrere Werte selektiert werden können (z.B. im Falle des Selektmodus multiple
), gibt curselection
ein Array mit den Positionen der selektierten Einträge aus. Ein solcher Index kann dann der Methode get
übergeben werden, um an den Wert des ausgewählten Eintrags zu gelangen. Das nachfolgende Skript liefert dafür ein Beispiel.
#!perl
use strict;
use warnings;
use Tk;
use Tk::Listbox;
use Tk::DialogBox;
use Tk::Table;
# selektierten Listbox-Eintrag anzeigen
my $mw = Tk::MainWindow->new();
my @werte = qw(
gray60 gray70 gray80 gray85 gray90 gray95
snow1 snow2 snow3 snow4 seashell1 seashell2
);
my $listbox = $mw->Scrolled('Listbox',
-scrollbars => 'e',
-height => 15,
-listvariable => \@werte,
-selectmode => 'multiple',
)->pack(-fill => 'x',);
$mw->Button(
-text => 'Zeige selektierte Einträge der Listbox',
-command => sub{
# curselection liefert ein Array mit den numerischen Indizies
# der Elemente, die gerade in der Listbox selektiert sind.
# Wenn nichts selektiert ist, dann kommt ein leerer String zurück.
my $d = $mw->DialogBox(
-title => "Listbox-Einträge",
-buttons => ["OK"],
);
my @selected = $listbox->curselection();
if ( @selected ) {
my $table = $d->add('Table', -columns => 3,
-fixedrows => 1,
-scrollbars => '',
)->pack;
# Titelzeilen erstellen
$table->put(0,0, 'ID');
$table->put(0,1, 'Wert');
for my $i ( 0 .. $#selected ) {
$table->put($i+1,0, $selected[$i]);
$table->put($i+1,1, $listbox->get($selected[$i]));
}
}else{
$d->add('Label', -text => 'Keine Einträge in der Listbox selektiert')->pack;
}
$d->Show;
},
)->pack(-fill => 'x');
$mw->MainLoop();