Perl Tk :: Date - 按周切换

时间:2013-11-08 13:17:53

标签: perl date user-interface tk perltk

我正在编写一个GUI,用于监控是否每周进行各种测量。我已经编写了各种其他GUI,用于每天将测量结果更新到数据库中。这些GUI使用Tk :: Date datewidget,允许我按天切换

my $datewidget = $f_filter->Date(-choices=>'today', -datefmt=>'%2d %2m %4y', 
                 -fields=>'date', -varfmt=>'datehash',
                 -monthmenu=>1, -allarrows=>1,
                 -value=>'now', -command=>\&populate)->pack(-side=>'left');

这让我可以使用向上和向下箭头来增加/减少天数,更改月份和年份。 enter image description here

我想在每周GUI中做的事情是有一个向上和向下箭头,只能按周切换。例如本周将是“11月4日星期一 - 11月8日星期五”,下周“11月11日星期一至11月15日星期五”

我希望能够前进和后退几年。

在perl-Tk :: Date或Date :: Entry中有一种简单的方法吗?

1 个答案:

答案 0 :(得分:2)

Tk::DateTk::DateEntry无法开箱即用。使用Tk::Date,我可以提出以下方法:

  • 使用-varfmt => 'unixtime'代替datehash,因为后者在稍后使用的->configure(-value => ...)调用中效果不佳
  • 设置-editable=>0以删除Tk::Date
  • 创建的所有箭头按钮
  • 自己创建inc / dec按钮
  • 并使用DateTime进行日期计算(请参阅此处的incweek子程序)

以下内容可能有效:

use strict;
use Tk;
use Tk::Date;
my $mw = tkinit;
my $datewidget = $mw->Date(-choices=>'today', -datefmt=>'%2d %2m %4y', 
                           -fields=>'date', -varfmt=>'unixtime',
                           -editable=>0,
                           -monthmenu=>1,
                           -value=>'now',
                           -command=>sub { warn "populate @_" })->pack(-side=>'left');
my $arrowframe = $mw->Frame->pack(-side => 'left');
{
    no warnings 'once'; # because of INCBITMAP/DECBITMAP
    $arrowframe->FireButton(-bitmap => $Tk::FireButton::INCBITMAP, -command => sub { incweek(+1) })->pack(-side => 'top');
    $arrowframe->FireButton(-bitmap => $Tk::FireButton::DECBITMAP, -command => sub { incweek(-1) })->pack(-side => 'top');
}
MainLoop;

sub incweek {
    my($inc) = @_;
    use DateTime;
    my $epoch = $datewidget->get;
    my $dt = DateTime->from_epoch(epoch => $epoch);
    $dt = $dt->add(weeks => $inc);
    $datewidget->configure(-value => $dt->epoch);
}

__END__

请注意,$datewidget->get现在返回了纪元时间,但使用DateTime您可以轻松将其转换为y / m / d值。