Tkinter の bind とイベントシーケンス
〜 python で Windows アプリケーションを作成 (2) 〜
2006-01-22 作成 福島
TOP > tips > python-tkinter > bind.shtml

widget (ウィジェット) のパーツとアクションを両方定義すると、まともな Windows アプリケーションになります。
"Touch me" をクリックする度にメッセージが変化するスクリプト。
C:\>
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
python
# -*- coding: Shift_JIS -*-
import sys, Tkinter

def b1Press(ev):
    """ マウスボタン 1 が押された時に実行したい処理 """
    l.config(text = "Button 1 press")

def b1Release(ev):
    """ マウスボタン 1 が離された時に実行したい処理 """
    l.config(text = "Button 1 release")

w = Tkinter.Tk()
t = w.title("Act1")

l = Tkinter.Label(w, text = "Touch me")
l.bind("<ButtonPress-1>", b1Press)
l.bind("<ButtonRelease-1>", b1Release)
l.pack()

Tkinter.Button(w, text = "OK", command = sys.exit).pack()
w.mainloop()



イベントシーケンス

イベントシーケンスとは、イベントを発生させるための条件のことで、<Shift-Key-a> あるいは <Shift-Key-a><Shift-Key-a> のように表現します。
※本当はイベントは常に発生していて、発生したイベントをディスパッチするための条件がイベントシーケンスです。

Tkinter では、メソッド bind を用いることにより、イベントとプロシージャを紐付けます。
bind に指定できるイベントシーケンス (Tkinter は Tk のラッパーなので、実は Tk への指定です)
修飾キー備考
Shift
Control
Alt
Lock
Double
Triple
Button1 または B1
Button2 または B2
Button3 または B3
Button4 または B4
Button5 または B5
ButtonPress または Buttonさらに -N を付加することで特定のボタンを指定できる。
例: <Shift-Button-1>
ButtonRelease
KeyPress または Keyさらに -K を付加することで特定のキーを指定できる。
例: <Control-Key-a>
KeyRelease
Enterパーツの領域にマウスカーソルが入ったとき起こるイベント。
キーボードの [Enter] は Return なので、これとは違う。
Leaveパーツの領域からマウスカーソルが出たときに起こるイベント。
Motionパーツ内でマウスが動くと起こるイベント。
なしConfigureパーツに設定が行われたとき起こるイベント。
設定変更でも起こるので下手に組むと自分を設定変更したとき無限に Configure が起こる可能性が…。
Circulate
Colormap
Destroy
Exposeパーツが表示されたときに起こるイベント。
FocusIn
FocusOut
Gravity親パーツの影響で自分が移動したときに起こるイベント。
Mapパーツがアイコンから復元されたとき起こるイベント。
Unmap
Reparent
Visibilityパーツが描き直されたとき起こるイベント。
Meta,Mod は Windows に無いので除外しています。
Lock は [CapsLock] のことです。
<B1-Button-2> はマウスのボタン 2 が押されたとき、ボタン 1 が押されている状態のことを表します。(B1 単体では使用できません)
<Button-1><Button-1> はボタン 1 が 2 回押された状態を表します。(ダブルクリックとは違います)


イベントインスタンス

イベントが起きたとき、イベントシーケンスにバインドした処理にはイベントインスタンスが渡されます。
これを見れば、イベントの詳細を知ることが出来ます。
押されたキーを表示するスクリプト。
C:\>
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
python
# -*- coding: Shift_JIS -*-
import sys, Tkinter

def keyPress(ev):
    """ 何かキーが押された時に実行したい処理 """
    l.config(text = ev.keysym)

w = Tkinter.Tk()
t = w.title("Act2")

w.bind("<Key>", keyPress)

l = Tkinter.Label(w, text = "Hit any key")
l.pack()

Tkinter.Button(w, text = "OK", command = sys.exit).pack()
w.mainloop()
入力フォーカスはメインウィンドウから移動しないので、メインウィンドウにイベントハンドラをバインドしています。
イベントインスタンスにはメソッドがあり、詳細を知るにはこのメソッドを呼び出します。
パーツの種類により、メソッドの有無があります。
メソッド対応する Tk 表記意味
widget%W
keysym%K押された (離された) キーのシンボルを返す。
[Enter] は Return、[Del] は Delete となる。
keysym_num%N
keycode%k
x%xマウスの座標を返す。
y%y
x_root%X
y_root%Y
focus%f
width%w
height%h
state%s
time%t
char%A
send_event%E
type%T