Tk::TList kann alles, was die normale Tk::Listbox auch kann, also eine Liste von Objekten anzeigen.
Allerdings ist die Tk::TList der Lisbox in vielen Punkten überlegen.
So kann die TList beispielsweise eine Liste zweidimensional anzeigen. Dadurch können mehr Einträge gleichzeitig angezeigt werden. Benutzer können die gesuchten Objekte in der zweidimensionalen Liste ggf. schneller finden. Die Listenansicht des Windows-Explorers verwendet diese Art der Darstellung ebenfalls.
Außerdem kann die TList im Gegensatz zur Listbox auch etwas anderes als nur Text anzeigen.
Mögliche Inhalte sind: Text, Bilder und Widgets.
Ferner ist es möglich den Stil der einzelnen Elemente anzupassen. Jedes Element kann einen eigenen Stil (Schrift, Farbe) haben.
#!perl
use strict;
use warnings;
use Tk;
use Tk::TList;
my $mw = Tk::MainWindow->new();
my $tlist = $mw->Scrolled('TList',
-scrollbars => 'os',
-orient => 'vertical',
)->pack(-fill => 'both');
foreach my $item ( 1 .. 50 ) {
$tlist->insert('end',
-itemtype => 'text',
-text => "Item $item",
);
}
$mw->MainLoop();
exit(0);
Text und Bild können kombiniert werden. Dadurch ist eine Ansicht wie im Windows-Dateiexplorer möglich, wo Icons für Ordner oder Dateien neben deren Bezeichnung stehen:
$tlist->insert('end',
-itemtype => 'imagetext', # Text + Bild anzeigen
-image => $picture, # Tk::Photo-Objekt
-text => "Ordner", # Text neben dem Bild
);
Ein einfaches Beispiel für die Anzeige eines Ordner-Bildes (folder.png
) sieht wie folgt aus:
#!perl
use strict;
use warnings;
use Tk;
use Tk::TList;
use Tk::PNG;
my $mw = Tk::MainWindow->new();
my $tlist = $mw->Scrolled('TList',
-scrollbars => 'os',
-orient => 'vertical',
)->pack(-fill => 'both');
my $picture = $mw->Photo(-file => 'folder.png');
foreach my $item ( 1 .. 50 ) {
$tlist->insert('end',
-itemtype => 'imagetext',
-image => $picture,
-text => "Item $item",
);
}
$mw->MainLoop();
Das folgende Beispiel zeigt ein etwas sinnvolleres Szenario, in dem ein Ordner ausgeselen und die Inahlte entsprechend dargestellt werden:
#!perl
use strict;
use warnings;
use FindBin qw/$Bin/;
use Tk;
use Tk::TList;
use Tk::PNG;
use File::Spec;
use File::Basename;
use File::Find::Rule;
my @subdirs = File::Find::Rule->directory->in( $Bin );
my @files = File::Find::Rule->file->in( $Bin );
my $mw = Tk::MainWindow->new();
my $tlist = $mw->Scrolled('TList',
-scrollbars => 'os',
-orient => 'vertical',
)->pack(-fill => 'both');
my $folder = $mw->Photo(-file => File::Spec->catfile($Bin, 'img', 'folder.png'));
my $file = $mw->Photo(-file => File::Spec->catfile($Bin, 'img', 'file.png'));
foreach my $fullname ( @subdirs, @files ) {
my ($name,undef,undef) = fileparse($fullname);
$tlist->insert('end',
-itemtype => 'imagetext',
-image => (-d $fullname ? $folder : $file),
-text => "$name",
);
}
$mw->MainLoop();
exit(0);
Die Reihenfolge, in der die zweidimensionale Liste aufgebaut werden kann, wird mit der Option -orient
festgelegt. Oben zu sehen ist die Option vertical
und unten horizontal
.
Für die, die es gerne etwas abstrakter mögen: