0

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

$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并且不会将其解释;为一个命令的结尾和新命令的开始。

我不能使用{...}语法,因为我需要将变量放在命令中,而我无法使用{...}. 如何在不创建将调用这些命令的新 proc 的情况下放置 2 个将在事件发生时执行的命令?

4

3 回答 3

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只需根据其参数形成的命令调用解释器。如果其中有分号,则命令将是两个。这一次必须对分号进行转义,因为它必须由 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 )中找到更多信息)。

于 2012-10-31T21:24:21.723 回答
1

+在下一个脚本的开头使用进行绑定,如下所示:

bind . <KeyPress-a> "puts one"
bind . <KeyPress-a> "+ puts two"
于 2012-10-31T21:01:30.357 回答
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]

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

于 2012-11-01T10:14:30.833 回答