我发现在为Tkx小部件指定-command
参数时,我必须匿名包装已定义的子例程,这有点奇怪。
TkDocs tutorial的摘录证明了这一点:
my $cb = $frm->new_ttk__button ( -text => "Calculate",
-command => sub {calculate();} );
sub calculate {
$meters = int(0.3048*$feet*10000.0+.5)/10000.0 || '';
}
当我写-command => &calculate()
或-command => \&calculate()
时,为什么它不起作用?
答案 0 :(得分:6)
你没有正确的语法。您的示例调用子例程(&
绕过任何原型)并将返回值(&calculate()
)或对它的引用(\&calculate()
)传递给-command
选项。您想要分配对子程序本身的引用,您可以通过以下方式执行:
-command => \&calculate
请注意缺少尾随括号。另请注意,您无法以这种方式传递参数。如果你想这样做,你需要在匿名子程序中包装调用:
-command => sub { calculate(12) }
或传递选项ARRAY引用而不是CODE引用:
-command => [\&calculate, 12]
如果您使用变量而不是文字值,那么两种形式之间存在细微差别。
-command => sub { calculate($x) } # creates a closure over $x
-command => [\&calculate, $x] # makes a copy of $x
在调用命令时,将显示对$x
的第一个表单更改。在第二种形式下,他们不会;每次调用都会在创建绑定时看到值。两种形式都很有用;在决定使用哪个时,你只需要做出正确的判断。
答案 1 :(得分:2)
它应该与-command => \&calculate
一起使用。请注意缺少括号。
您提供的示例实际上是在执行子例程并将其返回的值分配给-command
键。
答案 2 :(得分:2)
扎伊德说:“我开悟了。但是我 还是不明白为什么要“计算” 语法不适用于我... - Zaid 24分钟前“
Zaid,\& calculate语法确实有效。您试图使用\& calculate()语法。第一个绑定到“对子程序的引用计算稍后运行”,后者绑定为“对(没有参数的调用计算的返回值,并绕过参数原型)的引用。”
您是否有可用于测试/分析的更长,可编辑的代码段?我最近不熟悉传统知识。