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