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

Tcl 在一个事件上绑定两个命令,tcl,tk,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 marker bind$point[列表$table HighLightCell 1[e

我想将一个操作绑定到两个命令,这两个命令将一个接一个地执行。我尝试了以下语法:

$g marker bind $point <Button-1> [list $table HighLightCell 1 [expr [lindex $value 1] + 3] \; __highlight_selected $table $sparam $eyes sparam_eyes $graph]
$g marker bind$point[列表$table HighLightCell 1[expr[lindex$value 1]+3]\ \uu高亮显示\u所选$table$sparam$eyes sparam\u eyes$graph]
我也尝试了一些其他的变化,但没有一个有效

$g
是一个blt图,它像处理Tk中的普通绑定一样处理绑定。发生的情况是,Tcl认为所有参数都是
$table HighLightCell
的参数,并且没有解释
作为一个命令的结束和新命令的开始


我不能使用
{…}
语法,因为我需要在命令中放入变量,而使用
{…}
无法做到这一点。如何在不创建调用这些命令的新进程的情况下,在事件发生时放置将要执行的两个命令?

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

bind . <KeyPress-a> "puts one"
bind . <KeyPress-a> "+ puts two"
$g marker bind $point <Button-1> [list \
        $table HighLightCell 1 [expr [lindex $value 1] + 3]
    ]\;[list \
        __highlight_selected $table $sparam $eyes sparam_eyes $graph]
bind。“放一个”
绑定“+放两个”

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

bind . <KeyPress-a> "puts one"
bind . <KeyPress-a> "+ puts two"
$g marker bind $point <Button-1> [list \
        $table HighLightCell 1 [expr [lindex $value 1] + 3]
    ]\;[list \
        __highlight_selected $table $sparam $eyes sparam_eyes $graph]
bind。“放一个”
绑定“+放两个”

即使我同意
proc
方法更好,您也可以尝试以下两种方法

第一种方法是使用双引号进行分组,
“…”
,这类似于大括号,但允许变量扩展和命令替换。您的代码将类似于:

$g marker bind $point <Button-1> "$table HighLightCell 1 [expr [lindex $value 1] + 3] ; __highlight_selected $table $sparam $eyes sparam_eyes $graph"
eval
仅对由其参数构成的命令调用解释器。如果其中有分号,则命令将为两个。这次必须对分号进行转义,因为它必须由
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]
还有一件事,最好将
expr
命令的参数放在大括号内,因此在代码中应该替换

expr [lindex $value 1] + 3


您不必担心
$value
变量的替换,也不必担心
lindex
命令的执行:
expr
为您做到了这一点,但它也优化了执行。您可以在wiki()或
expr
手册页()中找到更多信息。

即使我同意
proc
方法更好,您也可以尝试以下两种方法

第一种方法是使用双引号进行分组,
“…”
,这类似于大括号,但允许变量扩展和命令替换。您的代码将类似于:

$g marker bind $point <Button-1> "$table HighLightCell 1 [expr [lindex $value 1] + 3] ; __highlight_selected $table $sparam $eyes sparam_eyes $graph"
eval
仅对由其参数构成的命令调用解释器。如果其中有分号,则命令将为两个。这次必须对分号进行转义,因为它必须由
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]
还有一件事,最好将
expr
命令的参数放在大括号内,因此在代码中应该替换

expr [lindex $value 1] + 3


您不必担心
$value
变量的替换,也不必担心
lindex
命令的执行:
expr
为您做到了这一点,但它也优化了执行。您可以在wiki()或
expr
手册页()中找到更多信息。

列表
命令构造单个命令的调用。这就是它所做的(当然,也可以建立列表,但这在这里并不重要)。您希望使用两个命令,因此应将分号(或换行符)放在两个
list
调用之外,这两个调用生成的命令是分开的,如下所示:

bind . <KeyPress-a> "puts one"
bind . <KeyPress-a> "+ puts two"
$g marker bind $point <Button-1> [list \
        $table HighLightCell 1 [expr [lindex $value 1] + 3]
    ]\;[list \
        __highlight_selected $table $sparam $eyes sparam_eyes $graph]
$g标记绑定$point[列表]\
$table HighLightCell 1[expr[lindex$value 1]+3]
]\;[列表\
__突出显示\u选定的$table$sparam$eyes sparam\u 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]
proc DoSomeHighlighting{table value sparam eyes sparam_eyes graph}{
$table HighLightCell 1[expr{[lindex$value 1]+3}]
__突出显示所选的$table$sparam$eyes sparam\u eyes$graph
}
#当然,这里可以有很多行代码
$marker bind$point[列表DoSomeHighlighting$table$value$sparam$eyes$sparam_eyes$graph]

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

list
命令只会构造单个命令的调用。这就是它所做的(当然,也可以建立列表,但这在这里并不重要)。您希望使用两个命令,因此应将分号(或换行符)放在两个
list
调用之外,这两个调用生成的命令是分开的,如下所示:

bind . <KeyPress-a> "puts one"
bind . <KeyPress-a> "+ puts two"
$g marker bind $point <Button-1> [list \
        $table HighLightCell 1 [expr [lindex $value 1] + 3]
    ]\;[list \
        __highlight_selected $table $sparam $eyes sparam_eyes $graph]
$g标记绑定$point[列表]\
$table HighLightCell 1[expr[lindex$value 1]+3]
]\;[列表\
__突出显示\u选定的$table$sparam$eyes sparam\u 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]
proc DoSomeHighlighting{table value sparam eyes sparam_eyes graph}{
$table HighLightCell 1[expr{[lindex$value 1]+3}]
__突出显示所选的$table$sparam$eyes sparam\u eyes$graph
}
#当然,这里可以有很多行代码
$marker bind$point[列表DoSomeHighlighting$table$value$sparam$eyes$sparam_eyes$graph]

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

创建新的proc要干净得多-为什么不想这样做?它可能更快,因为proc被字节编译。创建新的proc要干净得多-为什么不想这样做?它可能更快,当proc得到字节编译时。