Labels sind Widgets, die Text enthalten können. Der Text, die Schriftart, die Farbe etc. können definiert werden. Ein Label interagiert standardmäßig nicht mit dem Nutzer, es zeigt einfach nur etwas an. Das kann aber über Bindings geändert werden.
Option | Beschreibung | Mögliche Werte | Standardwert |
---|---|---|---|
-anchor | Bestimmt, wie Text innerhalb des Labels positioniert wird, wen das Label größer ist als der Text. Der Tet orientiert sich sozusagen an einer Richtung. | n, ne, e, se, s, sw, w, nw, center | center |
-justify | Bestimmt, ob der Text linksbündig, rechtsbündig oder zentriert dargestellt wird. Siehe Abschnitt anchor vs. justify. | left, center, right | center |
-font | Schriftart, die für die Textdarstellung verwendet wird | z.B. Times 24 | |
-bitmap | Erlaubt die Anzeige eines Bitmaps zusammen mit / anstelle von Text (s. -compound ) |
kein Bitmap | |
-image | Wie die Option -bitmap , nur dass ein Tk::Image (oder Tk::Photo) verwendet werden kann. |
keins | |
-compound | Gibt an, ob nur Text, nur ein Bild, oder beides angezeigt werden soll. Im Falle von beidem wird die Ausrichtung des Bildes relativ zum Text definiert. Im Falle von center wird der Text über dem Bild platziert. |
none, bottom, top, left, right, center | none |
Nachfolgendes Beispiel erzeugt drei Labels mit unterschiedlichen Optionen. In Label 3 wird die Schriftart geändert, Label 2 zeigt farbigen Text in einem Label und Label 1 zeigt, wie ein Label mit den Standard-Optionen aussieht.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
my $mw = Tk::MainWindow->new();
# Drei verschiedene Labels erstellen
my $label1 = $mw->Label(
-text => 'So sieht ein Standard-Label aus',
);
my $label2 = $mw->Label(
-text => 'Gelbe Schrift auf blauem Hintergrund',
-foreground => 'yellow',
# Hex-Code geht auch:
-background => '#0000FF',
);
my $label3 = $mw->Label(
-text => "Schriftart Times\nin 24 px Größe\nmit Umbruch",
-font => 'Times 24',
);
# Labels jeweils in einer Reihe anzeigen
$label1->grid( -row => 0, -column => 0, );
$label2->grid( -row => 1, -column => 0, );
$label3->grid( -row => 2, -column => 0, );
$mw->MainLoop();
Die Option -anchor
gibt die Himmelsrichtung an, an der sich der Text sozusagen orientiert.
Das muss der Text nur machen, wenn dem Label mehr Platz zugewiesen wird, als der Text eigentlich verbraucht.
Die Option -justify
hingegen gibt die Ausrichtung des Textes innerhalb des vom Text konsumierten Bereichs an.
Der vom Text konsumierte Bereich kann kleiner sein, als der Platz, der dem gesamten Label zur Verfügung steht.
Das nachstehende Bild zeigt einen bläulichen Bereich in der Größe von 136 x 246 Pixeln an. Das ist der Platz der dem Label zugewiesen wurde. Innerhalb des bläulichen Bereichs orientiert sich der Text südwestlich, d.h. der Text wurde soweit wie möglich in die rechte, untere Ecke gezogen.
Der Text ansich, also die Buchstaben der einzelnen Zeilen des Labels belegen nur 152 x 58 Pixel.
Das ist der rot hervorgehobene Bereich.
Innerhalb dieses Bereichs wird die Ausrichtung des Textes gesteuert, indem die Option -justify
verwendet wird.
Im Deutschen ist beides eine Ausrichtung. Die eine innerhalb des Platzes, der dem gesamten Label zur Verfügung steht, die andere innerhalb des Textblocks.
Im Zweifelsfall wird der Unterschied klar, wenn man das nachfolgende Programm ausführt und sich anschaut, wie sich die verschiedenen Optionen auswirken:
#!perl
use strict;
use warnings;
use utf8;
use Tk;
my $mw = tkinit();
$mw->geometry('640x480');
$mw->packPropagate(0);
my $ausrichtung = 'center';
my $justify = 'center';
my $label_frame = $mw->Frame(
-bg => 'yellow',
)->pack(-fill => 'both', -expand => 1,);
my $label1 = $label_frame->Label(
-text => "Das hier ist ausgerichteter Text\n"
. "der breiter als\n"
. "das Label ist und\n"
. "deshalb umgebrochen wird.",
-bg => '#87cefa',
-anchor => $ausrichtung,
-justify => $justify,
-width => 40,
-height => 10,
)->pack();
my $align_setting_f = $mw->Frame->pack(-fill => 'x');
$align_setting_f->Label(
-text => 'Anchor',
)->grid(-row => 0, -column => 0,);
$align_setting_f->Label(
-text => 'Justify',
)->grid(-row => 0, -column => 1,);
my @ausrichtungsmoeglichkeiten = (qw/
center n ne e se s sw w nw
/);
foreach my $i ( 0 .. $#ausrichtungsmoeglichkeiten ) {
my $anchor = $ausrichtungsmoeglichkeiten[$i];
$align_setting_f->Radiobutton(
-text => $anchor,
-value => $anchor,
-variable => \$ausrichtung,
-indicatoron => 0,
-command => sub{
$label1->configure(-anchor => $anchor);
},
)->grid(-row => $i+1, -column => 0, -sticky => 'we');
}
my @justifys = (qw/center left right/);
foreach my $i ( 0 .. $#justifys ) {
my $justification = $justifys[$i];
$align_setting_f->Radiobutton(
-text => $justification,
-value => $justification,
-variable => \$justify,
-indicatoron => 0,
-command => sub{
$label1->configure(-justify => $justify);
},
)->grid(-row => $i+1, -column => 1, -sticky => 'we');
}
$mw->MainLoop;
exit(0);
Der Inhalt eines Labels kann verändert werden, indem er beispielsweise mittels configure()
neu gesetzt wird.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
my $mw = Tk::tkinit(
-width => 144,
-height => 122,
);
# Fenstergröße nicht ändern,
# wenn Widgets mit pack() plaziert werden.
$mw->packPropagate(0);
my $label = $mw->Label(-text => 'inhalt')->pack();
$mw->Button(
-text => 'löschen',
-command => sub{
$label->configure(-text => '');
}
)->pack();
$mw->Button(
-text => 'random number einfügen',
-command => sub{
$label->configure(-text => 'random number');
}
)->pack();
$mw->MainLoop();
Alternativ kann auch eine Variablenreferenz angegeben werden, deren Wert automatisch im Label reflektiert wird. Die Option dazu ist -textvariable
.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
my $mw = tkinit(
-width => 144,
-height => 122,
);
# Fenstergröße nicht ändern,
# wenn Widgets mit pack() plaziert werden.
$mw->packPropagate(0);
my $variable = 'Initialer Text';
my $label = $mw->Label(-textvariable => \$variable)->pack();
$mw->Button(
-text => 'Zufallsgenerierte Zahl',
-command => sub{
$variable = rand(10);
}
)->pack();
$mw->MainLoop();
Das Ergebnis stellt sich wie folgt dar:
Wer Bilder in Perl/Tk anzeigen möchte, der kann das unter anderem mit Labels umsetzen. Im Label wird dann an Stelle eines Textes ein Bild angezeigt. Alternativ kann auch ein Text zusammen mit einem Bild angezeigt werden. Die Funktionsweise ist analog zum Tk::Button über die Optionen -image
und -compound
.
Das Bild stammt aus der Open Icon Library.
Das Beispiel zeigt eine PNG-Datei. Wer andere Bild-Formate laden möchte, der muss die entsprechenden Tk-Module dazu laden. Für JPG-Dateien wäre es beispielsweise Tk::JPEG
.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
use Tk::PNG;
my $mw = tkinit(
-width => 144,
-height => 122,
);
# Fenstergröße nicht ändern,
# wenn Widgets mit pack() plaziert werden.
$mw->packPropagate(0);
my $png_image_file = 'office-chart-pie.png';
my $pic = $mw->Photo(-file => $png_image_file);
my $label1 = $mw->Label(
-text => 'Bild (oben) mit Text',
-image => $pic,
-compound => 'top'
)->pack();
my $label2 = $mw->Label(
-image => $pic,
-compound => 'none'
)->pack();
$mw->MainLoop();