3.21 クラス名とイベント処理(class、bind_class、winfo_class)
複数のフレームに同じイベント処理を設定することができます。下記の Misc クラスの「bind_class」メソッドを用います。詳細はMisc クラスメソッドおよび bind シーケンスを参照して下さい。
引数 className にイベント処理を設定するオブジェクトのクラス名を指定します。引数 sequence にイベントを、func に呼び出す関数オブジェクト、add に指定した関数が同一のイベントに対して追加で呼び出すか指定します。
指定するクラス名は、下記の Misc クラスの「winfo_class」メソッドで取得できます。詳細はMisc クラスメソッドを参照して下さい。
クラス名は通常はオブジェクトを作成したクラスの名前ですが、オブジェクトの固有オプションの「class」を用いてクラス名を設定することができます。このクラス名は複数のオブジェクトに同じ名前を設定することができ、「bind_class」メソッドでの複数オブジェクトへの設定をグループ分けすることができます。
次のプログラムは 背景色が「赤」、「緑」、「青」の 3 つのフレーム「frame_1」、「frame_2」、「frame_3」を作成しています。フレームの「frame_2」と「frame_3」の「class」オプションに同じクラス名「FrameClass」を指定しています。ここで、キーワード「class」は python の予約語なので、引数では「class_」とします。
フレーム「frame_1」のクラス名を「winfo_class」メソッドで取得して、同じクラス名のオブジェクトに「bind_class」メソッドで、マウスの右クリックのイベントを関数「cbind_1」に関連付けています。
同様に、フレーム「frame_2」のクラス名を「winfo_class」メソッドで取得して、同じクラス名のオブジェクトに「bind_class」メソッドで、マウスの右クリックイベントを関数「cbind_2」に関連付けています。これにより、同じクラス名を設定したフレーム「frame_3」にも同様のイベントが関連付けられます
import tkinter as tk | |
root = tk.Tk() | |
root.geometry('300x200+100+100') | |
frame_1 = tk.Frame(root, bg='red') | |
frame_2 = tk.Frame(root, bg='green', class_='FrameClass') | |
frame_3 = tk.Frame(root, bg='blue', class_='FrameClass') | |
frame_1.place(x=0, y=0, width=100, height=180) | |
frame_2.place(x=100, y=0, width=100, height=180) | |
frame_3.place(x=200, y=0, width=100, height=180) | |
def cbind_1(event): | |
print('cbind_1') | |
def cbind_2(event): | |
print('cbind_2') | |
root.bind_class(frame_1.winfo_class(), '<Button-3>', cbind_1) | |
root.bind_class(frame_2.winfo_class(), '<Button-3>', cbind_2) | |
root.mainloop() |
プログラムを実行すると、3 つのフレームが下図のように表示されます。

「赤」のフレームをマウスで右クリックすると次のように「print」出力されます。
「緑」と「青」のフレームをマウスで右クリックすると次のように「print」出力されます。