3.18 イベント処理(bind、unbind、focus_set)
フレームはキーボードやマウス操作のイベントを受け取ることができます。受け取ったイベントに対して処理を実行するには、Misc クラスの「bind」メソッドでイベントと処理プログラムを関連付けます。下記の書式を用います。詳細は Misc クラスメソッドおよび Bind を参照して下さい。
引数 sequence にイベントを、func に呼び出す関数オブジェクト、add に指定した関数が同一のイベントに対して追加で呼び出すか指定します。
sequence に指定するイベントは「< >」や「<< >>」で囲まれた文字列のパターンで指定します。例えば文字列「<button-1>」は、マウスの左ボタンをクリックしたときのイベントです。イベントの詳細はイベントを参照して下さい。
func には呼び出す関数を指定しますが、関数の「()」を省いたオブジェクトを指定します。呼び出される関数には一つの引数を設定します。この引数の名前は任意ですが、通常「event」を用います。引数には呼び出したイベントの詳細情報を格納したオブジェクトが渡されます。このオブジェクトの詳細はイベントを参照して下さい。
add は同じイベントに対して複数の関数を対応させるときに用います。add に「None」または「False」を指定すると、同じイベントに対して設定した複数の「bind」メソッドは、最後に設定したメソッドのみが有効になります。デフォルトでは「None」が設定されています。「True」を指定すると、前の関数とこのメソッドで指定した関数は同一イベントに対して実行されます。多くの書籍では「True」ではなく「+」文字を指定するように書かれていますが、「+」は論理値としては「True」と同じです(数値の「0」以外は「True」です)。
同じイベントに対して複数の関数を対応させるのに複数の「bind」メソッドを用いるとき、add が「True」でないメソッドを実行すると、その前の同じイベントに対する「bind」メソッドは無効になることに注意します。
イベントに対して設定済の「bind」メソッドを無効にするには、Misc クラスの「unbind」メソッドを用います。下記の書式を用います。詳細は Misc クラスメソッドおよび Bind を参照して下さい。
引数 sequence に無効にするイベントを指定します。funcid は無効にする「bind」メソッドを指定する識別子ですが、 Windows では動作しないので何も設定しません。このメソッドの実行で指定したイベントに対する「bind」メソッドは無効になります。
フレームはデフォルトでマウスイベントを受け付けますが、キー操作は受け付けません。キー操作を受け付けるにはフォーカスを受け取る必要があります。フォーカスを受け取るには「標準オプション」の「takefocus」オプションに「True」を設定します。「Tab」キー操作でフォーカスを移動して設定することができますが、アプリケーションで設定するにはMisc クラスの「focus_set」メソッドを用います。下記の書式を用います。詳細は Misc クラスメソッドを参照して下さい。
次のプログラムは、マウスの左クリックのイベント「<button-1>」に「bind」メソッドで関数「callbind_1」と「callbind_2」を関連付けています。また、キーを押下したときのイベント「'<KeyPress>'」に関数「callkey」を関連付けています。「focus_set」メソッドでフレームにフォーカスを設定しています。フレーム上でマウスを左クリックまたはキーを押下するとそれぞれ関数名を「print」出力します。マウスの右クリックのイベント「<button-3>」に「bind」メソッドで関数「callunbind」を関連付けて、この関数でイベント「<button-1>」を「unbind」メソッドで無効にしています。
import tkinter as tk | |
root = tk.Tk() | |
root.geometry('300x200+100+100') | |
frame = tk.Frame(root, bg='red', takefocus=True) | |
frame.place(x=50, y=20, width=200, height=160) | |
def callbind_1(event): | |
print('callbind_1') | |
def callbind_2(event): | |
print('callbind_2') | |
frame.bind('<Button-1>', callbind_1) | |
frame.bind('<Button-1>', callbind_2, True) | |
def callkey(event): | |
print('callkey') | |
frame.bind('<KeyPress>', callkey) | |
frame.focus_set() | |
def callunbind(event): | |
frame.unbind('<Button-1>') | |
frame.bind('<button-3>', callunbind) | |
root.mainloop() |
プログラムを実行すると、ウィンドウが表示されます。フレーム上でマウスの左クリックおよび任意の場所でキー押下をすると下記の文字列が「print」出力されます。フレーム上でマウスの右クリックをすると、以降、マウスを左クリックしても「print」出力はされません。キー押下による「print」のみが出力されます。
callbind_2
callkey