10

私はこのような小さなスクリプトを実行しています

from Tkinter import *
root = Tk()
def callback(event):
    print "callback"
w = Canvas(root, width=300, height=300)
w.bind("<Key>", callback)
w.pack()
root.mainloop()

ただし、私の状況ではキーボードイベントは処理されません(ウィンドウ7でPython 2.7を使用しています)

使用する場合

w.bind("<Button-1>", callback)

物事はうまくいきます。

だから、これは本当に私を困惑させます。事前に感謝します、なぜこれが起こっているのか誰か教えてください。

4

3 に答える 3

16

キーバインディングは、キーボードフォーカスのあるウィジェットがキーイベントを取得した場合にのみ起動します。デフォルトでは、キャンバスはキーボードフォーカスを取得しません。メソッドでフォーカスを与えることができますfocus_set。通常、これはマウスボタンのバインディングで行います。

次のバインディングをコードに追加し、キャンバスをクリックすると、キーバインディングが機能し始めます。

w.bind("<1>", lambda event: w.focus_set())
于 2013-03-07T12:15:39.690 に答える
4

「キャンバスをクリックしてキーバインディングをアクティブ化する」ことを避けるために、次のサイトでより簡単なコードを見つけました。

http://ubuntuforums.org/showthread.php?t=1378609

彼はフレームをバインドしようとしていますが、私はそれを自分のコードに実装し、キャンバスウィジェットも同様に機能します。コードは次のようになります。

w.focus_set()
w.bind(<Key>, callback)
于 2014-08-14T22:15:25.363 に答える
2

tkinterには「Enter」と呼ばれる便利なイベントがあり、マウスがウィジェットに入ったときに追跡します。それをキャンバスにバインドし、そのイベントのバインディングのコールバックでcanvas.focus_setを実行すると、マウスがキャンバス上にあるときはいつでもフォーカスが設定されるため、キーボードバインディングが機能します。

これは、キャンバスがフォーカスを失った場合でも機能します(たとえば、別のウィジェットにテキストを入力することによって)。マウスが再びキャンバスに入ると、フォーカスが回復するためです。

于 2017-12-25T19:33:13.293 に答える