Tk::Checkbox - Eine schicke Checkbox

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.


Minimalbeispiel

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

Tk::Checkbox-Beispiel mit Label und Sub

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

Prüfen, ob Checkbox aktiv ist

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
Top