2

アプリケーションにこれらのバインディングがあります。

bind $::app     <Control_L><o>      {FileOpen}
bind $::app     <Control_L><O>      {FileOpen}

FileOpen はプロシージャです。

テキスト ウィジェットで Ctrl+o を押すと、FileOpen が正常に起動されますが、最初にテキスト ウィジェットの挿入ポイントに改行が挿入されます。

Ctrl+o がテキスト ウィジェットに改行を挿入するためのデフォルトのバインディングであることは知っていますが、私のバインディングはそれをオーバーライドすべきではありませんか?

私も次のことを試しました:

bind $::app         <Control_L><o>      {}
bind $::app         <Control_L><O>      {}
bind $::app.text    <Control_L><o>      {}
bind $::app.text    <Control_L><O>      {}
bind $::app         <Control_L><o>      {FileOpen}
bind $::app         <Control_L><O>      {FileOpen}

まだ成功していません。何が起こっている?

Ubuntu の Tcl/Tk 8.5.10。

4

1 に答える 1

5

Tk はバインディングを「バインディング タグ」(略して bindtags) と呼ばれるコレクションにグループ化します。各ウィジェットは、それに定義された 4 つの bindtags で始まります。

  1. ウィジェット自体の bindtag (ウィジェットと同じ名前)、
  2. ウィジェットのクラスの bindtag、
  3. ウィジェットを含むトップレベルの bindtag、および
  4. グローバルバインディングの「<code>all」バインドタグ。

(トップレベルには bindtag が 3 つだけあります。) の最初の引数bindは、実際にはウィジェット名ではなく、bindtag 名です。コマンドを使用して、ウィジェットの bindtags のリストを取得および操作できますが、bindtagsこれはウィジェットに適用するには非常に広範囲にわたる変更です。深く掘り下げていない限り、バインドタグを変更することはおそらく避けたいでしょう。(実際には、特定のビューに適用されるコントローラーのスタックを変更しています。変更するのは非常に微妙なものです。)

ウィジェットに送信された GUI イベントを処理するとき、そのウィジェットの bindtags が順番に考慮され、その bindtag に関連付けられたバインディング テーブル内のエントリが 1 つだけ検出され (または、一致するものがない場合はテーブルがスキップされます)、置換後に評価されます。適用されます。次に、バインディング スクリプトの評価でbreak例外が発生しない限り、次の bindtag のバインディング テーブルが評価されます。バインディングの評価で、バインディング タグに添付されたさらなるスクリプトがスタック上で考慮されるのを防ぎたい場合は、 で終了する必要がありますbreak

これはかなり複雑に聞こえますが、そうではありません。最も単純なケースでbreakは、ウィジェット バインディング スクリプトの最後に配置して、後のクラス、トップレベル、またはグローバル バインディング スクリプトの適用を停止します。

bind $::app      <Control_L><o> {FileOpen}
bind $::app      <Control_L><O> {FileOpen}
bind $::app.text <Control_L><o> {SpecificOperation; break}
bind $::app.text <Control_L><O> {SpecificOperation; break}

OK、SpecificOperation何もないかもしれません。必要に応じて調整する必要があります。


を実行するためのロジックを に入れることもできますbreakSpecificOperationこれは、時々実行する必要がある場合に最適ですがbreak、プロシージャが呼び出し元にブレークを発行するには、次のようにする必要があります。

return -code break
于 2013-10-13T07:55:54.037 に答える