我想将一个动作绑定到两个将一个接一个地完成的命令。我尝试了以下语法:
$g marker bind $point <Button-1> [list $table HighLightCell 1 [expr [lindex $value 1] + 3] \; __highlight_selected $table $sparam $eyes sparam_eyes $graph]
我也尝试了其他一些变化,但没有一个变化。
$g
是一个blt图,它处理Tk中正常绑定的绑定。会发生什么是Tcl认为所有参数都是$table HighLightCell
的参数,并且不会将;
作为一个命令的结束和新命令的开始插入。
我无法使用{...}
语法,因为我需要在命令中放置变量,而我无法使用{...}
执行此操作。如何在事件发生时放置2个命令,而不创建将调用这些命令的新proc?
答案 0 :(得分:2)
即使我同意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
只是在由其参数形成的命令上调用解释器。如果其中有分号,则命令为2。这次分号必须被转义,因为它必须由eval
解释而不是之前。
我使用以下简单代码尝试了这两种方法,它们都有效:
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)中找到更多信息。
答案 1 :(得分:1)
使用下一个脚本开头的+
进行绑定,如下所示:
bind . <KeyPress-a> "puts one"
bind . <KeyPress-a> "+ puts two"
答案 2 :(得分:0)
list
命令只构造单个命令的调用。这就是它的作用(好吧,建立列表,但这在这里并不重要)。您想要使用两个命令,因此您应该将分号(或换行符)置于之外的两个list
调用生成分离的命令,如下所示:
$g marker bind $point <Button-1> [list \
$table HighLightCell 1 [expr [lindex $value 1] + 3]
]\;[list \
__highlight_selected $table $sparam $eyes sparam_eyes $graph]
但是,我真的建议在这一点上使用一个小帮手程序。从长远来看,它会为你节省很多混乱。
proc DoSomeHighlighting {table value sparam eyes sparam_eyes graph} {
$table HighLightCell 1 [expr {[lindex $value 1] + 3}]
__highlight_selected $table $sparam $eyes sparam_eyes $graph
}
# Can be a number of lines of code in here, of course
$marker bind $point <1> [list DoSomeHighlighting $table $value $sparam $eyes $sparam_eyes $graph]
一旦您决定在运行时必须对值进行更多计算,这一点就变得尤为重要。