2.30 ウィンドウの切り替え表示(container、use、winfo_id)
一つのウィンドウを他のウィンドウを格納するコンテナウィンドウとして用い、格納して表示するウィンドウを切り替えることができます。格納されるウィンドウは格納先を指定して表示します。「固有オプション」の「container」と「use」オプションを用います。格納されるウィンドウは格納するウィンドウのサイズで設定されます。
格納先のコンテナウィンドウは Misc クラス の「winfo_id」メソッドで取得したウィンドウの識別子で指定します。詳細は Misc クラスメソッドを参照して下さい。
次のプログラムは、三つのサブウィンドウを作成し、サブウィンドウ「sub」の「container」オプションを「True」にしてコンテナウィンドウにしています。「winfo_id」メソッドで識別子を取得して変数「sid」に代入します。サブウィンドウ「sub2」と「sub3」は「wm_withdraw」メソッドで非表示としています。この設定で最初に、赤色のサブウィンドウ「sub」が表示されます。
各サブウィンドウ「sub」、「sub2」、「sub3」にマウスの左クリックのイベント「<button-1>」に「bind」メソッドで関数「callbind_1」、「callbind_2」、「callbind_3」を関連付けています。
「callbind_1」関数で、サブウィンドウ「sub2」の「use」オプションにコンテナウィンドウ「sub」の識別子「sid」を指定しています。これで、サブウィンドウ「sub」のマウスの左クリックで黄色のサブウィンドウ「sub2」が切り替わって表示されます。
「callbind_2」関数で、サブウィンドウ「sub2」の「use」オプションに空文字を設定して「wm_withdraw」メソッドで非表示としています。「use」オプションに識別子が設定されているとき、「wm_withdraw」メソッドは実行できずエラーになります。次いで、サブウィンドウ「sub3」の「use」オプションにコンテナウィンドウ「sub」の識別子「sid」を指定しています。これで、サブウィンドウ「sub2」のマウスの左クリックで緑色のサブウィンドウ「sub3」が切り替わって表示されます。
「callbind_3」関数で、サブウィンドウ「sub3」の「use」オプションに空文字を設定して「wm_withdraw」メソッドで非表示としています。これで、サブウィンドウ「sub3」のマウスの左クリックで、コンテナウィンドウの赤色のサブウィンドウ「sub」が表示されます。
import tkinter as tk | |
root = tk.Tk() | |
root.geometry('300x200+100+100') | |
sub = tk.Toplevel(root, bg='red', container=True) | |
sub.geometry('300x200+140+120') | |
sid = sub.winfo_id() | |
sub2 = tk.Toplevel(root, bg='yellow') | |
sub3 = tk.Toplevel(root, bg='green') | |
root.update() | |
root.wm_deiconify() | |
sub.wm_deiconify() | |
sub2.wm_withdraw() | |
sub3.wm_withdraw() | |
def callbind_1(event): | |
sub2['use'] = sid | |
def callbind_2(event): | |
sub2['use']='' | |
sub2.wm_withdraw() | |
sub3['use'] = sid | |
def callbind_3(event): | |
sub3['use']='' | |
sub3.wm_withdraw() | |
sub.bind('<button-1>', callbind_1) | |
sub2.bind('<button-1>', callbind_2) | |
sub3.bind('<button-1>', callbind_3) | |
root.mainloop() |
プログラムを実行すると、最初にメインウィンドウの前面に赤色のサブウィンドウが表示されます。次いでマウスの左クリックをすると黄色のサブウィンドウ、緑色のサブウィンドウ、赤色のサブウィンドウが順に表示され繰り返されます。表示されるウィンドウは背景色を変えているのではなく、ウィンドウ自体が切り替わっています。