9

この投稿の例では、デフォルトの bindtags が使用されている場合、イベント値は定義内に表示されないことが言及されています (ラグが 1 つ発生します)。

クラスバインディングに関する説明がありました。
初心者なので詳しい理由が知りたいです。
最初のケースでは機能せず、2 番目のケース (bindtag の順序が変更された場合) で機能していた理由を説明してください。

import Tkinter

def OnKeyPress(event):
 value = event.widget.get()
 string="value of %s is '%s'" % (event.widget._name, value)
 status.configure(text=string)

root = Tkinter.Tk()

entry1 = Tkinter.Entry(root, name="entry1")
entry2 = Tkinter.Entry(root, name="entry2")
entry3 = Tkinter.Entry(root, name="entry3")

entry1.bindtags(('.entry1', 'Entry', '.', 'all'))
entry2.bindtags(('Entry', '.entry1', '.', 'all'))
entry3.bindtags(('.entry1','Entry','post-class-bindings', '.', 'all'))

btlabel1 = Tkinter.Label(text="bindtags: %s" % " ".join(entry1.bindtags()))
btlabel2 = Tkinter.Label(text="bindtags: %s" % " ".join(entry2.bindtags()))
btlabel3 = Tkinter.Label(text="bindtags: %s" % " ".join(entry3.bindtags()))
status = Tkinter.Label(anchor="w")

entry1.grid(row=0,column=0)
btlabel1.grid(row=0,column=1, padx=10, sticky="w")
entry2.grid(row=1,column=0)
btlabel2.grid(row=1,column=1, padx=10, sticky="w")
entry3.grid(row=2,column=0)
btlabel3.grid(row=2,column=1, padx=10)
status.grid(row=3, columnspan=2, sticky="w")
entry1.bind("<KeyPress>", OnKeyPress)
entry2.bind("<KeyPress>", OnKeyPress)
entry3.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress)

root.mainloop()
4

1 に答える 1

23

ウィジェットでバインドを行う場合、実際にはウィジェット自体にバインドしているわけではありません。を実行すると、実際に起こっていることは、バインディングがウィジェットと同じ名前のバインド タグmywidget.bind(...)に関連付けられることです。

イベントが検出されると、Tkinter はまずどのウィジェットがイベントをインターセプトしたかを判断します。このウィジェットには、関連付けられた 0 個以上 (デフォルトでは 4 個) のバインド タグのリストがあります。Tkinter は、イベントに一致するバインディングがあるかどうかを確認するために、各タグをチェックします。見つかった場合は、バインディングを実行し、タグがなくなるか、バインドされた関数のいずれかが string を返すまで、次のタグに進みます"break"

シーケンスは次のようになります。

  1. 「×」キーを押します。この時点で「x」はどこにも挿入されていません
  2. Tkinter は、キーボード フォーカスを持つウィジェットのバインド タグを取得します。
  3. デフォルトでは、最初のバインド タグはウィジェット自体です。そのタグにバインディングはありますか?ならば実行する。たとえば、ウィジェットの内容を印刷できます。他のバインディングはまだ起動していないため、「x」はコンテンツの一部にはなりません。
  4. バインドされた関数が戻る"break"と、それ以上のイベント処理は行われません。「x」はウィジェットに挿入されません。
  5. ウィジェットが を返さなかった場合"break"、tkinter は次のバインド タグに進みます。
  6. デフォルトでは、次のバインド タグはウィジェット クラスです。このイベント (文字「x」のキー押下) に一致するクラスにバインディングはありますか?
  7. この場合、クラスにはこのイベントのバインディングがあり、実際に「x」をウィジェットに挿入します。この時点まで、「x」はまだウィジェットに挿入されていません。ただし、このバインディングの後、内容を印刷すると、「x」が表示されます。
  8. すべてのバインド タグが処理されるまで、この方法で処理が続行されます。

コメント セクションで進行中の議論に基づくと、これはまだ不明確なようです。これをできるだけ簡単にしようとします:

文字をメモリ内イベント オブジェクトからウィジェットにコピーして、画面に表示するのはクラス バインディングです。クラス バインディングが起動する前に、キャラクターはウィジェットに表示されません。クラスバインディングの後、ウィジェットになります。

于 2012-07-18T13:10:32.263 に答える