0

次々に実行される2つのコマンドにアクションをバインドしたいと思います。次の構文を試しました。

$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は、すべてのパラメーターがのパラメーターであると見なし、 1つのコマンドの終わりおよび新しいコマンドの開始としてを$table HighLightCell解釈しません。;

{...}コマンドに変数を入れる必要があるため、構文を使用できません。これは、を使用して行うことはできません{...}。それらのコマンドを呼び出す新しいprocを作成せずに、イベントが発生したときに実行される2つのコマンドを配置するにはどうすればよいですか?

4

3 に答える 3

2

その方が良いと私が同意する場合でもproc、次の 2 つの方法を試すことができます。

最初のものは、グループ化に二重引用符を使用する"..."ことです。これは中括弧に似ていますが、変数の展開とコマンドの置換が可能です。コードは次のようになります。

$g marker bind $point <Button-1> "$table HighLightCell 1 [expr [lindex $value 1] + 3] ; __highlight_selected $table $sparam $eyes sparam_eyes $graph"

(セミコロンはエスケープされないことに注意してください。)

2 つ目は、 を使用しevalて、2 つのコマンドの実行を延期することです。これを試すことができます:

$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もう1つ、コマンドの引数を中かっこの中に入れる方が良いので、コードで置き換える必要があります

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コマンドは、単一のコマンドの呼び出しのみを構築します。それがそれが行うことです(まあ、リストも構築しますが、ここではそれほど重要ではありません)。2 つのコマンドを使用する必要があるため、次のように、分割されたコマンドを生成する2 つの呼び出しの外側にセミコロン (または改行) を配置する必要があります。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 に答える