Tk::Label - Perl/Tk-Widget für Text

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.


Die wichtigsten Optionen für Label

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

Beispiel für Label-Optionen

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

anchor vs. justify

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.

Erläuterung zum Unterschied zwischen den Label-Optionen justify und anchor

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);

Inhalt von Label verändern

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:

Tk::Label mit Inhalt per textvariable Tk::Label mit Zahl als Inhalt

Bild in Label anzeigen

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.

Tk::Label mit PNG-Grafik als Bild

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