GUIアプリケーションではクリックやキー入力といったユーザーの操作(イベント)をトリガーにして何らかの処理(アクション)を行います。その紐づけを行うためにTkinterに用意されているのがbindメソッドです。
Buttonウィジェットなど一部のウィジェットにはcommandオプションが用意されているためそちらでイベントと処理の紐づけを行うことができますが、bindメソッドを使えば全てのウィジェットに対して処理の紐づけができます。
目次
bindメソッドの構文と引数
bindメソッドでイベントとそれに対する処理を記述したコールバック関数の紐づけを行うには次のように記述します。
ウィジェット名.bind(sequence=トリガーとなるイベント, func=コールバック関数名, add=値)
bindメソッドはこのように sequence、func、addの3つの引数を持っています。この引数に値を指定することでウィジェットに対してどのようなイベントが発生したときに、どの処理を実行するかを指定することができます。
イベントの指定(sequence)
トリガーとなる操作(イベント)を定義します。指定できるイベントタイプには次のようなものがあります。
イベントのタイプ | イベント |
---|---|
Button, ButtonPress | マウスのボタンが押された |
ButtonRelease | マウスのボタンが離された |
Key, KeyPress | キーが押された |
KeyRelease | キーが離された |
Motion | マウスの移動 |
Enter | マウスカーソルがウィンドウの中に入った |
Leave | マウスカーソルがウィンドウから出た |
sequenceの値は次のような構文で指定します。
<modifier-type-detail>
単に type を指定するだけでなく、 detail(マウスのどのボタンか、キーボードのどのキーか、といった特定のボタン)を指定したり、modifier(指定した type と同時に押すキー、CtrlやAltなど)を合わせて指定することができます。
値 | イベント |
---|---|
<Button-1> または <1> | マウスの左クリック |
<Button-3> または <3> | マウスの右クリック |
<ButtonRelease-1> | マウスの左ボタンを離した時 |
<ButtonRelease-3> | マウスの右ボタンを離した時 |
<Return> | キーボードのリターンキーが押された |
<KeyPress-H> またはh | キーボードのhキーが押された |
<Control-c> | Ctrlキーを押しながらキーボードのcキーが押された |
<Shift-c> | Shiftキーを押しながらキーボードのcキーが押された |
<Alt-c> | Altキーを押しながらキーボードのcキーが押された |
<Double-1> | マウスの左ボタンをダブルクリック |
処理の指定(func)
イベントに対して実行される処理を記述したコールバック関数を指定します。
コールバック関数は次のように定義、指定します。
def 関数名(event): 処理 ウィジェット名.bind("<1>", 関数名)
処理の追加(add)
同一のトリガーに対して追加のアクションを紐づけたい時はこのオプションを指定し値を”+”とします。
このオプションを付けずに追加のアクションを定義した場合は最初に紐づけたアクションが上書きされ、最後に定義したイベントのみが実行されます。
def 関数A(event): 処理 def 関数B(event): 処理 ウィジェット名.bind("<1>", 関数A) ウィジェット名.bind("<1>", 関数B, "+")
イベント詳細情報の取得
Tkinterではイベントの詳細情報はイベントオブジェクト(event)のインスタンス変数にセットされてコールバック関数に渡されます。
渡される詳細情報には次のようなものがあります。
変数名 | 値 |
---|---|
num | マウスボタンの番号 |
x,y | マウスカーソルの座標 |
time | イベントの発生時刻 |
char | キーに対応する文字 |
keysym | キーに対応する名前 |
例えば次のコードはキーボードのいずれかのキーが押されたことをトリガーにして、押されたキーに対応する名前を表示します。
イベントの詳細情報がイベントオブジェクト(event)のインスタンス変数にセットされてprint_keysym関数に渡されれているため、ユーザーがどのキーを押したかが event.keysym で取得できるのです。
import tkinter as tk # tk.Frameを継承したApplicationクラスを作成 class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) # ウィンドウの設定 self.master.title("ウィンドウのタイトル") self.master.geometry("300x200") # 実行内容 self.pack() self.create_widget() # create_widgetメソッドを定義 def create_widget(self): # ウィジェット変数を生成 self.msg = tk.StringVar() self.msg.set("") # print_keysymメソッドを定義 def print_keysym(event): self.keysym = event.keysym self.msg.set(self.keysym) # label1ウィジェットを作成 self.label1 = tk.Label(self.master, text="あなたが押した\nキーは", font=("MSゴシック", "24", "bold")) self.label1.pack() # label2ウィジェットを作成 self.label2 = tk.Label(self.master, textvariable=self.msg, font=("MSゴシック", "24", "bold")) self.label2.bind("<Any-KeyPress>", print_keysym) self.label2.pack() self.label2.focus_set() if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
このようにユーザーがキーを押すたびにそのキーに対応する文字が表示されます。
-キーを押したとき’minus’になってしまいます。
-キーに対応する名前は’minus’ですので正常な動作です。