2.31 モーダルウィンドウの設定(grab_set、focus_set)
サブウィンドウはデフォルトでモードレスウィンドウとして作成されます。モードレスウィンドウは他のウィンドウも独立に操作できるウィンドウです。自身のウィンドウのみが操作できて他のウィンドウが操作できないようなウィンドウをモーダルウィンドウと言います。サブウィンドウを Misc クラスの「grab_set」メソッドでモーダルウィンドウに設定することができます。下記の書式を用います。詳細は Misc クラスメソッドを参照して下さい。
「grab_set」メソッドはオブジェクトがイベントを受け取る設定をしますが、フォーカスは設定されません。フォーカスを設定するにはMisc クラスの「focus_set」メソッドを用います。下記の書式を用います。詳細は Misc クラスメソッドを参照して下さい。
次のプログラムは三つのサブウィンドウ「sub」、「sub2」、「sub3」を作成しています。サブウィンドウ「sub2」に「grab_set」メソッドでグラブを設定して、「focus_set」メソッドでフォーカスを設定します。この設定でサブウィンドウ「sub2」はモーダルウィンドウとなります。他のウィンドウをマウスで左クリックしても、このウィンドウは前面に表示され続け、他のウィンドウのイベントも受け付けます。モーダルウィンドウに設定したサブウィンドウ「sub2」に「bind」メソッドでキーボード入力を関数「callbind_2」に、マウスの左クリックを関数「mcallbind_2」に関連付けて、それぞれの関数名を「print」出力しています。
import tkinter as tk | |
root = tk.Tk() | |
root.geometry('300x200+100+100') | |
sub = tk.Toplevel(root, bg='red') | |
sub.geometry('300x200+140+120') | |
sub2 = tk.Toplevel(root, bg='yellow') | |
sub2.geometry('300x200+160+140') | |
sub3 = tk.Toplevel(root, bg='green') | |
sub3.geometry('300x200+180+160') | |
root.update() | |
root.wm_deiconify() | |
sub.wm_deiconify() | |
sub2.wm_deiconify() | |
sub3.wm_deiconify() | |
sub2.grab_set() | |
sub2.focus_set() | |
def callbind_2(event): | |
print('callbind_2') | |
sub2.bind('<Key>', callbind_2) | |
def mcallbind_2(event): | |
print('mcallbind_2') | |
sub2.bind('<Button-1>', mcallbind_2) | |
root.mainloop() |
プログラムを実行すると、下に示すように黄色のサブウィンドウ「sub2」がウィンドウの前面に表示されます。他のウィンドウをマウスで左クリックしてもサブウィンドウ「sub2」がアクティブのままでウィンドウの表示順は変更されません。また、他のウィンドウも含めて、マウスで左クリックしたイベントがサブウィンドウ「sub2」の「bind」メソッドで関連づけた関数「mcallbind_2」で実行されます。