即使我同意这种proc
方式更好,您也可以尝试以下两种方式。
第一个是使用双引号进行分组,"..."
类似于大括号,但允许变量扩展和命令替换。您的代码将类似于:
$g marker bind $point <Button-1> "$table HighLightCell 1 [expr [lindex $value 1] + 3] ; __highlight_selected $table $sparam $eyes sparam_eyes $graph"
(请注意,分号不会被转义。)
第二个是使用eval
, 并将两个命令的执行推迟到它。你可以试试这个:
$g marker bind $point <Button-1> [list eval $table HighLightCell 1 [expr [lindex $value 1] + 3] \; __highlight_selected $table $sparam $eyes sparam_eyes $graph]
eval
只需根据其参数形成的命令调用解释器。如果其中有分号,则命令将是两个。这一次必须对分号进行转义,因为它必须由 theeval
而不是 before 解释。
我使用以下简单代码尝试了这两种方法,它们都有效:
set x 1
set y 2
pack [button .b1 -text Test1]
pack [button .b2 -text Test2]
bind .b1 <Button-1> "puts $x; puts $y"
bind .b2 <Button-2> [list eval puts $x \; puts $y]
单击任一按钮会产生相同的结果,这是预期的
1
2
还有一件事,最好将expr
命令的参数放在大括号内,所以在你的代码中你应该替换
expr [lindex $value 1] + 3
和
expr {[lindex $value 1] + 3}
你不必担心$value
变量的替换和lindex
命令的执行:expr
为你做这件事,但它也优化了执行。您可以在 wiki ( http://wiki.tcl.tk/583 ) 或expr
手册页 ( http://www.tcl.tk/man/tcl8.5/TclCmd/expr.htm )中找到更多信息)。