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得到字节编译时。