HTML hat es, und Perl/Tk hat auch eine Checkbox. Das Modul Tk::Checkbox (nicht zu verwechseln mit Tk::CheckBox oder Tk::Checkbutton) stellt die Funktionalität dafür bereit. Über den Parameter -variable
kann eine Variable an die Checkbox gebunden werden. Sie enthält dann immer den aktuellen Wert der Checkbox. Welchen Wert die Checkbox hat, wenn sie angewählt oder abgewählt ist, wird über die Parameter -onvalue
bzw. -offvalue
gesteuert.
Ein klares Manko an diesem Widget ist das Fehlen der dritten Option: partiell angewählt.
Dieses Beispiel zeigt eine einfache Checkbox. Wenn man sie anklickt, wird in der Konsole ausgegeben, welchen Wert die Checkbox gerade hat. Wird die Checkbox angeklickt, so ändert sich nicht nur der Wert, sondern es wird auch die Sub ausgeführt, die mittels -command
spezifiziert wurde.
#!perl
use strict;
use warnings;
use Tk;
use Tk::Checkbox;
my $var = 'An';
my $mw = MainWindow->new();
my $cb1 = $mw->Checkbox (
-variable => \$var,
-command => \&fire_event,
-onvalue => 'An',
-offvalue => 'Aus',
-noinitialcallback => 1,
-size => 11,
)->pack;
$mw->MainLoop();
sub fire_event{
print "Checkbox wurde aufgerufen mit dem Wert [@_], \$var = >$var<\n";
} # /fire_event
Dieses Beispiel zeigt, wie durch die Sub die grafische Benutzeroberfläche verändert wird. Die Option -noinitialcallback
mit dem Wert 0 sorgt dafür, dass der Callback (die Sub) direkt zu Beginn ausgeführt wird, wenn das Widget erstellt wird. Zu diesem Zeitpunkt wird $var
ausgewertet.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
use Tk::Checkbox;
my $var = 'ghostwhite';
my $mw = MainWindow->new(-width => 200, -height => 200);
$mw->packPropagate(0);
my $label = $mw->Label(
-text => 'Hintergrundfarbe ändern',
)->pack(-side => 'left', -anchor => 'nw');
my $cb1 = $mw->Checkbox (
-variable => \$var,
-command => \&fire_event,
-onvalue => 'ghostwhite',
-offvalue => 'darkgreen',
-noinitialcallback => 0,
-size => 11,
)->pack();
$mw->MainLoop();
sub fire_event{
$mw->configure(-bg => $var);
} # /fire_event
Möchte man wissen, ob die Checkbox mit einem Haken versehen ist, dann muss man prüfen, ob sie den Wert aus -onvalue
hat. Der aktuelle Wert der Checkbox ist in -variable
gespeichert. Das Attribut ist auch dann gesetzt, wenn man es nicht beim Erstellen der Checkbox angibt. Achtung: der Wert von -variable
ist eine Skalar-Referenz und muss ggf. dereferenziert werden.
Gleiches gilt übrigens, wenn man den Wert einfach nur auslesen möchte. Das geht mit: my $wert = ${$checkbox->cget('-variable');}
.
#!perl
use strict;
use warnings;
use utf8;
use Tk;
use Tk::Checkbox;
my $mw = tkinit();
my $cb = $mw->Checkbox(
-onvalue => 'Wert',
-offvalue => 'nix',
)->pack();
$cb->configure(
-command => sub{ check_for_checked_checkbox($cb); },
);
$mw->MainLoop();
exit(0);
sub check_for_checked_checkbox {
my $checkbox = shift;
# Die Option -variable ist eine Referenz und
# muss erst dereferenziert werden (mittels ${...}).
my $value = ${$checkbox->cget('-variable')};
printf("Wert der Checkbox: %s\n", $value);
if ( $value eq $checkbox->cget('-onvalue') ) {
print "Die Checkbox wurde angehakt.\n";
}else{
print "Die Checkbox ist nicht angehakt.\n";
}
return;
} # /check_for_checked_checkbox