Tk::Listbox - Auswahllisten

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-Quellcode

#!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();

Selektierten Listbox-Eintrag anzeigen

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.

Selektierte Einträge einer Tk::Listbox in einem Tk::Dialog

#!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();
Top