Даже если я согласен с тем, что способ 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
просто вызывает интерпретатор команды, сформированной его аргументами. Если среди них есть точка с запятой, команд будет две. На этот раз точка с запятой должна быть экранирована, потому что она должна интерпретироваться 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
сделает это за вас, но также оптимизирует выполнение. Дополнительную информацию можно найти в вики (http://wiki.tcl.tk/583), или на странице руководства expr
(http://www.tcl.tk/man/tcl8.5/TclCmd/expr.htm).
person
Marco Pallante
schedule
31.10.2012