在一个事件上绑定两个命令

时间:2012-10-31 18:50:59

标签: tcl tk

我想将一个动作绑定到两个将一个接一个地完成的命令。我尝试了以下语法:

$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?

3 个答案:

答案 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]

一旦您决定在运行时必须对值进行更多计算,这一点就变得尤为重要。