我正在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";
}
我怀疑我的尝试是不可能的,所以会对如何实现符合此条件的解决方案提供帮助,按下按钮会调用具有该按钮的特定参数的子程序。
答案 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";
}