2.1 サブウィンドウの作成
サブウィンドウは tkinter の「Toplevel」クラスをインスタンス化することで作成します。
引数
設定するオプションのキーワードの文字列と値を辞書型で指定します。
設定するパラメータの値をキーワードで指定します。
メソッド
Wm クラスメソッド
備考
「Misc」クラスに特殊メソッドの「__setitem__」と「__getitem__」が定義されていて、オブジェクトからキーワードインデックスでオプションの値を設定、取得することができます。同様に、特殊メソッドの「__str__」が定義されていて、「str」関数でオブジェクトのパス名を取得することができます。
「cnf」と「**kw」引数の両方を用いてオプションを設定することができます。それぞれの引数で同じオプションに別の値を設定すると「**kw」引数での設定値が有効になります。
サブウィンドウもシステムから見ればメインウィンドウと同じウィンドウとして動作するので、1.27 項の複数のメインウィンドウの場合と同様に、作成するときにシステムに明示的にそのスタック順(表示順)を指定しないと、動作が不定になります。1.27 複数のメインウィンドウを参照して下さい。
アプリケーションでウィンドウのスタック順を指定するには 1.27 項の複数のメインウィンドウの場合と同様に、Wm クラスの「wm_deiconify」または「deiconify」メソッド、あるいはMisc クラスの「lift」または「tkraise」メソッドを用います。このとき、メソッドの実行はメインおよびサブウィンドウの描画後に実行する必要があるので、「update」メソッドを先に実行します。
サブウィンドウの作成を「mainloop」メソッドの実行後にイベント(ボタンなどの操作)で行う場合、メインウィンドウの場合と同様に、ウィンドウのスタックはイベント順に実行されるので「lift」または「tkraise」メソッドは必要ありませんが、フォーカスの設定は「focus_force」メソッドを用いる必要があります。「wm_deiconify」メソッドや「lift」メソッドを用いてもフォーカスは設定されません。
次のプログラムはメインウィンドウ「root」とメインウィンドウに関連付けたサブウィンドウ「sub」を作成して表示しています。メインウィンドウの背景色は青色に、サブウィンドウの背景色は赤色に設定しています。「update」メソッドでウィンドウ描画のイベント処理後、「lift」メソッドでサブウィンドウを前面に表示しています。サブウィンドウを閉じてもメインウィンドウは残りますが、メインウィンドウを閉じるとサブウィンドウは一緒に閉じます。
import tkinter as tk | |
root = tk.Tk() | |
root.config(width=300, height=200, bg='blue') | |
root.geometry('+100+100') | |
sub = tk.Toplevel(root) | |
sub.config(width=300, height=200, bg='red') | |
sub.geometry('+140+120') | |
root.update() | |
sub.lift() | |
root.mainloop() |
このプログラムを実行すると、青色のメインウィンドウの前面に赤色のサブウィンドウが表示されます。ただ、「lift」メソッドを用いたこのプログラムではサブウィンドウを閉じたとき、メインウィンドウが他のウィンドウに隠れてしまう場合があります。
次のプログラムは「lift」メソッドではなく「wm_deiconify」メソッドを用いています。「update」メソッドでウィンドウ描画のイベント処理後、最初に「wm_deiconify」メソッドでメインウィンドウを表示して、次いでサブウィンドウを表示します。「wm_deiconify」メソッドでウィンドウの表示が順にスタックされて、システムによってスタック順にメインウィンドウの前面にサブウィンドウが表示されます。このプログラムではサブウィンドウを閉じても、スタック順でメインウィンドウが表示されて他のウィンドウに隠れることはありません。
import tkinter as tk | |
root = tk.Tk() | |
root.config(width=300, height=200, bg='blue') | |
root.geometry('+100+100') | |
sub = tk.Toplevel(root) | |
sub.config(width=300, height=200, bg='red') | |
sub.geometry('+140+120') | |
root.update() | |
root.wm_deiconify() | |
sub.wm_deiconify() | |
root.mainloop() |