GUI mit Perl/Tk

Perl/Tk-Tutorial

Kapitel 9: Steuerelemente - Scrollbar und Listbox

Sie haben ja bereits kurz gesehen wie Sie Listboxen einsetzen können. Richtig funktional werden diese aber erst mit Hilfe einer Möglichkeit zum Scrollen, einer Scrollbar. Sehen wir uns also ein Beispiel an, wie Sie durch eine Liste scrollen können:

scroll_listbox1.pl

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Tk;

my $main   = MainWindow->new();

my $box    = $main->Listbox(
    -height => 5
)->pack(
    -side   => 'left',
    -fill   => 'both',
    -expand => 1,
);
my @zahlen = (qw(Eins Zwei Drei Vier Fünf Sechs Sieben Acht Neun Zehn));
$box->insert('end', $_) for @zahlen;

my $scroll = $main->Scrollbar(-command => [ 'yview', $box ]);

$box->configure(-yscrollcommand => [ 'set', $scroll ]);

$scroll->pack(
    -side => 'right',
    -fill => 'y',
);

$main->MainLoop();

So sieht das Ergebnis aus:

Listbox mit Scrollbalken

Entscheidend sind die beiden Zeilen ...

my $scroll = $main->Scrollbar(-command => [ 'yview', $box ]);
$box->configure(-yscrollcommand => [ 'set', $scroll ]);

Das Kommando ['yview', $box] in der Scrollbar bedeutet soviel das Sie den "Scrollbutton" in y-Richtung, also auf-und abbewegen können. Der Inhalt, der dabei mitbewegt wird, ist die Referenz auf die Listbox $box. Wenn Sie beispielsweise schreiben würden ['xview', $box] würde sich die Scrollbar nicht mehr bewegen lassen, da die x-Richtung aktiviert haben. Die Listbox müssen Sie auch noch mit -yscrollcommand => ['set', $scroll] auf die y-Richtung einstellen und mit der Scrollbar verbinden.

Die Methode configure werden Sie auch noch häufiger sehen. Damit ist es möglich, Widgets-Optionen (nachträglich) zu ändern.

Übrigens: An dieser Stelle kommt man um die Verwendung von configure() auch nicht herum, denn man hat eigentlich eine zyklische Abhängigkeit: Zur vollständigen Definition der Listbox benötigt man das Scrollbar-Element und zur vollständigen Definition des Scrollbar-Elementes benötigt man die Listbox. Um dieses Dilemma aufzuheben, wird im Beispiel die Box nachträglich per configure um die Option -yscrollcommand erweitert.


Es gibt aber noch eine andere Möglichkeit, "normale" Scrollbars zu erzeugen, nämlich mit dem Fensterelement Scrolled. Dies ist ein Pseudo-Element, dem als erstes Argument die Bezeichnung des eigentlich zu erzeugenden Fensterelements bekommt (im Beispiel Listbox).

Mit der Option -scrollbars => 'oe' gibt man an, dass eine optionale "östliche" (also auf der rechten Seite des anzulegenden Elements zu platzierende) Scrollbar erzeugt werden soll (diese wird nur angezeigt, wenn mehr Elemente in der Listbox eingetragen sind als angezeigt werden können.

scroll_listbox2.pl

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Tk;

my $main   = MainWindow->new();
my $box    = $main->Scrolled('Listbox',
    -scrollbars => 'oe',
    -height     => 5,
)->pack(
    -side        => 'left',
    -fill        => 'both',
    -expand      => 1,
);

my @zahlen = (qw(Eins Zwei Drei Vier Fünf Sechs Sieben Acht Neun Zehn));
$box->insert('end', $_) for @zahlen;

$main->MainLoop();

Das erzeugte Programm funktioniert genauso wie die erste Variante. Aber man kann sich eine Menge Schreibarbeit sparen. Die direkte Verwendung des Elements Scrollbar ist eigentlich nur noch für Besonderheiten nötig, wie etwa das Scrollen zweier Elemente mit einer Scrollbar oder ähnliches.


Weitere Einzelheiten finden Sie auf der Widget-Seite zum Scrollbar.

Top