我可以在哈希中存储带参数的子程序吗?

时间:2015-05-25 20:08:21

标签: perl tk

我正在perl / tk中构建一个项目,允许计时器开始跟踪项目工作。我已经停止了如何将按钮的命令存储为子程序但是带有参数。由于正在执行带参数的子程序,因此结果存储为命令。

如何在散列中存储带参数的子程序,使其仅在按下按钮时执行。

#create buttons but dont pack them on the frame yet
my $info    = $mw->Button( -text => "Good",   -command => \&info_popup );
my $warning = $mw->Button( -text => "Caution", -command => \&warning_popup );
my $error   = $mw->Button( -text => "Bad",   -command => \&error_popup );
my $close   = $mw->Button( -text => "Close",   -command => \&close );
my $project1 = $mw->Button( -text => "project1", -command => \&start_timer("project1"));
my $project2 = $mw->Button( -text => "project2", -command => \&start_timer("project2"));

sub start_timer {
    my $project = shift;
    print "starting the timer for: $project\n";
}

我怀疑我的尝试是不可能的,所以会对如何实现符合此条件的解决方案提供帮助,按下按钮会调用具有该按钮的特定参数的子程序。

1 个答案:

答案 0 :(得分:3)

使用TK时,oreilly口袋指南说

  

Perl / Tk回调回调是标量,可以是代码引用,也可以是   方法名称为字符串。这些样式中的任何一个都可以通过参数获取   传递数组引用,第一个元素是代码引用   或方法名称,以及后续元素子程序参数。   \& subroutine [\& subroutine?,args?] sub {...} [sub {...} ?, args?]   'methodName'['methodName'?, args?]注意绑定回调是   隐式传递绑定的widget引用作为第一个参数   参数列表。请参阅绑定和虚拟事件部分   相关信息。

我使用下面的代码测试了它,它按预期工作

#create buttons but dont pack them on the frame yet
my $info    = $mw->Button( -text => "Good",   -command => \&info_popup );
my $warning = $mw->Button( -text => "Caution", -command => \&warning_popup );
my $error   = $mw->Button( -text => "Bad",   -command => \&error_popup );
my $close   = $mw->Button( -text => "Close",   -command => \&close );
my $project1 = $mw->Button( -text => "project1", -command => [\&start_timer,"project1"]);
my $project2 = $mw->Button( -text => "project2", -command => [\&start_timer,"project2"]);

sub start_timer {
    my $project = shift;
    print "starting the timer for: $project\n";
}