Soll in einer Perl/Tk-GUI ein Datum eingegeben werden, so kann man an Stelle eines einfachen Entry-Widgets auch spezifischere Widgets verwenden. Diese erlauben es z.B. direkt das eingegebene Datum auf Gültigkeit zu prüfen oder sie verhindern direkt, dass ein ungültiges Datum ausgewählt wird. Gerne verwendet wird z.B. ein Pop-Up-Kalender, der wie ein jQuery-Datepicker aussieht. Also ein kleiner Kalender, in dem der Nutzer den Monat per Button wechseln und einen Tag auswählen kann.
Es gibt einige gute und einige weniger gute Widgets, die durch Perl/Tk verfügbar gemacht wurden. Weniger gut in dem Sinne, dass sie beispielsweise vom Funktionsumfang her eingeschränkt sind. Einschränkungen können das Datumformat, die Zeitspanne möglicher Daten oder den Benutzerkomfort betreffen. Dennoch sollen auch die nicht-so-tollen Widgets hier aufgeführt werden, damit man sie mal gesehen hat und sich bewusst dagegen entscheiden kann.
Folgende Widgets werden betrachtet:
#!perl
use strict;
use warnings;
use Tk;
use Tk::MiniCalendar;
my $mw = Tk::MainWindow->new();
my $frm1 = $mw->Frame->pack; # Frame to place MiniCalendar in
my $minical = $frm1->MiniCalendar->pack;
my $frm2 = $mw->Frame->pack; # Frame for Ok Button
my $b_ok = $frm2->Button(
-text => "Ok",
-command => sub {
my ($year, $month, $day) = $minical->date();
print "Selected date: $year/$month/$day\n";
exit;
},
)->pack();
$mw->MainLoop();
#!perl
use strict;
use warnings;
use Tk;
use Tk::DateEntry;
my $mw = tkinit;
my $dateentry = $mw->DateEntry(
-weekstart => 1,
-daynames => [qw/So Mo Di Mi Do Fr Sa/],
-parsecmd => sub {
my ($d,$m,$y) = ($_[0] =~ m/(\d*)\/(\d*)-(\d*)/);
return ($y,$m,$d);
},
-dateformat => 4,
)->pack;
$mw->MainLoop;
exit(0);
MM/TT/JJJJ
, JJJJ/MM/TT
oder TT/MM/JJJJ
.#!perl
use strict;
use warnings;
use Tk;
use Tk::ChooseDate;
my $mw = tkinit;
my $date = undef;
$mw->ChooseDate(
-textvariable => \$date,
-command => sub{print "$date\n"},
-language => 'German',
)->pack(-fill => 'x');
$mw->MainLoop;
exit(0);
#!perl
use strict;
use warnings;
use Tk;
use Tk::Month;
my $mw = Tk::MainWindow->new(-title => "Tk::Month v$Tk::Month::VERSION");
my $parent = $mw->Frame()->pack(
-fill => 'both',
-expand => 1,
);
#If you want your code to be portable, your format ("fmt")
#argument should use only the conversion specifiers defined by
#the ANSI C standard (C89, to play safe). These are
#"aAbBcdHIjmMpSUwWxXyYZ%".
my $m = $parent->Month(
-month => 'July',
-year => '2013',
-dayformat => '%d',
-printformat => '%d %B %Y %a',
-title => "%Y-%m-%d",
-navigation => 1,
-includeall => 0,
-showall => 0,
-first => 1,
)->pack();
$mw->MainLoop();
exit(0);
Tk::DatePick ist kein Aufklapp-Kalender, sondern eine Kombination aus Entry-Widget und Buttons. Es gibt je ein Button-Paar zum ändern des Jahres, des Monats und des Tages. Der Vorteil besteht darin, dass keine ungültige Datumseingabe erfolgen kann. Nachteilig ist jedoch, dass es sehr lange dauern kann, bis man sich sein Datum zurecht geklickt hat.
dd/mm/yyyy
oder mm/dd/yyyy
.#!perl
use strict;
use warnings;
use Tk;
use Tk::DatePick;
my $mw = tkinit;
my $datepick = $mw->DatePick()->pack();
my $currentdate = $datepick->cget('-text');
$mw->MainLoop;
exit(0);
#!perl
use strict;
use warnings;
use utf8;
use Tk;
use Tk::Date;
my $mw = tkinit(-title => 'Tk::Date');
my $date_widget = $mw->Date(
-datefmt => '%2d.%2m.%4y',
-fields => 'date',
-value => 'now',
)->pack();
$mw->MainLoop();
exit(0);