このページでは、Tkinter でのサブウィンドウ(Toplevel
ウィジェット)の使い方の解説を行います。
サブウィンドウとは
サブウィンドウとは、その名の通り、メインウィンドウのサブ的なウィンドウのことになります。
Tkinter においては、tkinter.Tk()
によってメインウィンドウが作成されることになります。さらに、mainloop
を実行することで、このメインウィンドウが画面に表示されることになります。
この時に表示されるウィンドウはメインウィンドウの1つのみとなりますが、サブウィンドウを表示することで複数のウィンドウを表示することが可能となります。サブウィンドウでは、メインウィンドウと同様に、ボタンやラベル等のウィジェットを表示することも可能です。
このサブウィンドウを利用することで、複数のウィンドウを持つアプリを実現することも可能ですし、例えばボタン等が押された時にポップアップで表示するメッセージボックス的な使い方をすることも可能です。
また、このサブウィンドウは、別名 Toplevel
ウィジェットとも呼ばれます。というか、おそらく後者の方が正式な呼び方になると思うのですが、サブウィンドウの方がウィジェットのイメージが湧きやすくなると思いますので、このページではサブウィンドウという呼び方で解説を進めさせていただきたいと思います。
サブウィンドウの使い方
では、次にサブウィンドウの使い方について解説していきます。
まずは、サブウィンドウを利用することで実現できることを理解していただくため、サブウィンドウを利用したアプリのスクリプト例を示したいと思います。
import tkinter
# スケール変更時に実行する関数
def change_color(x):
# スケールの値を取得
r = scale_r.get()
g = scale_g.get()
b = scale_b.get()
# スケールの値をカラーコードに変換してキャンバスの背景色に設定
color_code = '#' + format(r, '02x') + format(g, '02x') + format(b, '02x')
canvas.config(background=color_code)
# メインウィンドウの作成
main_window = tkinter.Tk()
main_window.geometry('400x300')
main_window.title('メイン')
# メインウィンドウに配置するウィジェットの作成
canvas = tkinter.Canvas(
main_window,
width=300,
height=200,
background='#000000'
)
canvas.pack(padx=10, pady=10)
# サブウィンドウの作成
sub_window = tkinter.Toplevel(
main_window,
)
sub_window.geometry('200x300')
sub_window.title('設定')
# サブウィンドウに配置するウィジェットの作成
scale_r = tkinter.Scale(
sub_window,
from_=0,
to=255,
label='赤',
orient=tkinter.HORIZONTAL,
command=change_color
)
scale_r.pack(padx=10, pady=10)
scale_g = tkinter.Scale(
sub_window,
from_=0,
to=255,
label='緑',
orient=tkinter.HORIZONTAL,
command=change_color
)
scale_g.pack(padx=10, pady=10)
scale_b = tkinter.Scale(
sub_window,
from_=0,
to=255,
label='青',
orient=tkinter.HORIZONTAL,
command=change_color
)
scale_b.pack(padx=10, pady=10)
# メインループ
main_window.mainloop()
このスクリプトを実行すれば、次の図のように2つのウィンドウを持つアプリが起動します。左側のウィンドウがメインウィンドウで、このウィンドウは tkinter.Tk()
の実行で作成されています。それに対し、左側のウィンドウがサブウィンドウで、このウィンドウは tkinter.Toplevel()
の実行で作成されています。
また、サブウィンドウ側にはスケールウィジェットが配置されています。この例で配置しているのはスケールウィジェットのみですが、もちろん他のウィジェットも配置することが可能です。
さらに、サブウィンドウ側のスケールウィジェットのバーを移動させれば、それに伴ってメインウィンドウのキャンバスの背景色が変化することが確認できると思います。
このように、1つのアプリが2つのウィンドウで構成されてはいますが、一方のウィンドウのウィジェットを操作することで、他方側のウィンドウのウィジェットの設定を変更するような、ウィンドウ間での連携動作も簡単に実施することが可能です。
また、メインウィンドウ側の閉じるボタンをクリックすれば、メインウィンドウだけでなくサブウィンドウも閉じられることも確認できると思います。サブウィンドウは、あくまでもメインウィンドウ上に存在するウィジェットですので、他のウィジェットと同様に、メインウィンドウが閉じられればサブウィンドウも消滅することになります。
スポンサーリンク
メインウィンドウの作成・設定変更
では、ここからサブウィンドウの使い方の流れについて解説していきたいと思います。
まず、サブウィンドウを使うためにはメインウィンドウの作成が必要となります。メインウィンドウは、いつも通りの手順で作成すれば良いです。つまり、tkinter の Tk
クラスのコンストラクタを実行すれば良いです。
先ほど示したスクリプトにおいては、下記でメインウィンドウの作成を行っています。
main_window = tkinter.Tk()
また、必要に応じてメインウィンドウの設定変更を行います。先ほど示したスクリプトにおいては、下記の1行目でメインウィンドウのサイズの変更、2行目でメインウィンドウのタイトルの変更を行なっています。特に、サブウィンドウとの見分けがつくように、タイトルは設定するようにした方が良いと思います。
main_window.geometry('400x300')
main_window.title('メイン')
メインウィンドウへのウィジェットの配置
また、メインウィンドウへのウィジェットの配置も必要となります。
以降でサブウィンドウも作成し、サブウィンドウへのウィジェットの配置も行うことになりますが、各ウィジェットの配置先のウィンドウは、ウィジェットのコンストラクタに指定する第1引数(master
引数)で決まります。第1引数にメインウィンドウを指定すれば、そのウィジェットを pack
・grid
・place
メソッド等で配置することでインウィンドウ上に表示されるようになります。
先ほど示したスクリプトにおいては、下記部分でメインウィンドウに表示するキャンバスウィジェットの作成と配置を行なっています。コンストラクタの第1引数にメインウィンドウである main_window
を指定しているため、このキャンバスウィジェットの pack
メソッド実行により、メインウィンドウ上にキャンバスウィジェットが表示されることになります。
canvas = tkinter.Canvas(
main_window,
width=300,
height=200,
background='#000000'
)
canvas.pack(padx=10, pady=10)
サブウィンドウの作成
メインウィンドウ側の準備が済んだら、次はサブウィンドウ側の作成を行なっていきます。
サブウィンドウは、tkinter の Toplevel
クラスのコンストラクタを実行することで作成することができます。第1引数(master
引数)には、メインウィンドウ等の他のウィンドウを指定します。
先ほど示したスクリプトにおいては、下記でサブウィンドウの作成を行っています。
sub_window = tkinter.Toplevel(
main_window,
)
サブウィンドウに関しては pack
・grid
・place
メソッドによる配置は不要です。上記のように Toplevel
クラスのコンストラクタを実行し、さらにメインウィンドウに mainloop
を実行させれば、画面上にサブウィンドウが表示されることになります。
また、先ほど示したスクリプトでは、メインウィンドウとサブウィンドウを同じタイミングで表示するようになっていますが、最初にメインウィンドウだけを表示しておき、メインウィンドウに対してユーザーから何らかの操作(ボタンのクリック・メニューのクリックなど)が行われたタイミングでサブウィンドウを表示するようなことも可能です。この場合は、その “何らかの操作” が行われた時に実行されるイベントハンドラの中で Toplevel
クラスのコンストラクタを実行すれば良いです。
スポンサーリンク
サブウィンドウの設定変更
サブウィンドウを作成したら、必要に応じてサブウィンドウの設定変更を行いましょう。サブウィンドウの設定 でも説明するように、サブウィンドウの背景色等の設定変更は Toplevel
クラスのコンストラクタへの引数の指定によって実施可能です。
また、サブウィンドウの場合は、メインウィンドウ同様にメソッドを使って設定変更を行うことも多いです。サブウィンドウのメソッドについては Toplelve クラスのメソッド で解説します。
先ほどのスクリプトにおいても、サイズとタイトルの設定を下記で実施しています。サブウィンドウに関しても、メインウィンドウとの区別がつくようにタイトルは設定しておくことをオススメします。
sub_window.geometry('200x300')
sub_window.title('設定')
サブウィンドウへのウィジェットの配置
サブウィンドウに関しても、メインウィンドウ同様に、サブウィンドウに表示するウィジェットの作成と配置が必要となります。
前述でも説明したように、ウィジェットの配置先は、ウィジェットのコンストラクタの第1引数(master
引数)によって決まります。したがって、この引数にサブウィンドウを指定してやれば、ウィジェットをサブウィンドウに配置することが可能となります。
先ほど示したスクリプトでは、スケールウィジェットを3つ作成し、それらを pack
メソッド配置するようにしています。Scale
のコンストラクタの第1引数には sub_window
を指定しているため、配置先のウィンドウはサブウィンドウとなります。
scale_r = tkinter.Scale(
sub_window,
# 略
)
scale_r.pack(padx=10, pady=10)
scale_g = tkinter.Scale(
sub_window,
# 略
)
scale_g.pack(padx=10, pady=10)
scale_b = tkinter.Scale(
sub_window,
# 略
)
scale_b.pack(padx=10, pady=10)
mainloop
の実行
サブウィンドウを利用する場合も、当然ですが mainloop
の実行が必要となります。アプリ起動時に必要となる処理やウィジェットの配置等が完了したら、いつも通り mainloop
を実行するようにしてください。mainloop
はサブウィンドウからも実行可能ですが、メインウィンドウから実行するので良いです。
main_window.mainloop()
スポンサーリンク
いつも通りのアプリの作り込み
基本的には、サブウィンドウを利用する場合、サブウィンドウの作成、および、ウィジェットの配置先ウィンドウの適切な指定さえ行えば、後はいつも通りにアプリを開発していけば良いだけになります。
ウィジェットの配置先が複数のウィンドウとなりますが、基本的にはスクリプトの実装の仕方はいつもと変わりません。いつも通り、イベントハンドラ等を設定し、ユーザーからの操作に応じて処理やウィジェットの設定変更等が実行されるようにしていけばよいです。基本的には、ウィンドウは複数存在しますが、配置先のウィンドウは特に気にせずアプリを開発していけるはずです。
例えば、先ほど示したスクリプトでは、サブウィンドウに表示されるスケールウィジェットが操作されたタイミングで下記の change_color
関数が実行されるようにしています。これにより、スケールウィジェットが操作されたタイミングで、スケールのバーの位置に応じてメインウィンドウに表示されるキャンバスの背景色が変化するようになっています。
def change_color(x):
# スケールの値を取得
r = scale_r.get()
g = scale_g.get()
b = scale_b.get()
# スケールの値をカラーコードに変換してキャンバスの背景色に設定
color_code = '#' + format(r, '02x') + format(g, '02x') + format(b, '02x')
canvas.config(background=color_code)
上記の処理は、scale_r
・scale_g
・scale_b
・canvas
の配置先のウィンドウを意識せずに実装されており、これらのウィジェットがメインウィンドウのみに配置されていようが3つのウィンドウに分けて配置されていようが関係なく動作します。このように、大半の処理は各ウィジェットの配置先のウィンドウは意識せずに実装することが可能です。
ただし、「サブウィンドウのみが閉じられてもアプリとしては動作し続ける」という点には注意してください。メインウィンドウの場合は、ウィンドウが閉じられるとアプリとしても動作を終了することになるため、ウィンドウを閉じた後に処理が実行されるようなケースは少ないです。
ですが、サブウィンドウが閉じられても、メインウィンドウが閉じられていなければアプリとしては動作し続けることになり、そのような状態でサブウィンドウに配置されたウィジェットのメソッドが実行されたりすると例外が発生することになります(サブウィンドウが閉じられるとサブウィンドウに配置されたウィジェットはすべて消滅します)。
そのため、サブウィンドウの状態に応じてサブウィンドウのウィジェットのメソッドを実行する or 実行しないを切り替えるようにしたり、そもそもメインウィンドウのみしか存在しない状態ではサブウィンドウのウィジェットのメソッドが実行されないような設計のアプリを開発したりするような工夫が必要となります。
サブウィンドウの設定
次は、サブウィンドウの設定について解説していきます。
他のウィジェット同様に、サブウィンドウの見た目等の設定はキーワード引数を指定してコンストラクタ(tkinter.Toplevel()
)や config
メソッドを実行することで変更可能です。これらに指定可能なキーワード引数名は下記により確認することができます。
# sub:サブウィンドウ
print(sub.keys())
ここでは、私が動作を理解している設定に対する解説のみを行わせていただきます。具体的には、下記の設定について説明していきます。特に重要なのは menu
くらいになると思います。
- menu
- background
- borderwidth
- relief
- width
- height
- padx
- pady
- highlightthickness
- highlightcolor
- highlightbackground
- cursor
また、サブウィンドウでは、次に説明する Toplevel クラスのメソッド で紹介するメソッドで変更可能な設定も存在し、そちらのメソッドでの設定変更の方が使い勝手が良いものもあります。なので、ここから一応キーワード引数で変更可能な設定について説明しますが、どちらかというとメソッドの方が重要度は高いと思います。
私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません
実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います
- OS:Windows 11
- Python:3.12
- Tkinter:8.6
menu
は、サブウィンドウのメニューバーの設定を行うキーワード引数です。
menu
にはメニューウィジェットを指定します。このメニューウィジェットの作り方や、メニューウィジェットをウィンドウのメニューバーに設定する方法等については下記ページで詳細を解説していますので、詳しくは下記ページを参照してください。
Mac の場合、メニューバーはアプリ内ではなく画面の上隅に表示されることになるので注意してください。
例えば下記のような処理を実行すれば、サブウィンドウのメニューバーに ファイル
・編集
・ヘルプ
の項目が表示されるようになります(メニューバーにメニューを表示するだけの例なので、項目をクリックしても何も起きないようになっています)。
sub = tkinter.Toplevel(
# 略
)
# メインメニューグループ作成
menu = tkinter.Menu(sub)
# メインメニューに表示するメニューグループを作成
file_menu = tkinter.Menu(menu)
edit_menu = tkinter.Menu(menu)
help_menu = tkinter.Menu(menu)
# メインメニューに作成したメニューグループを追加
menu.add_cascade(label='ファイル', menu=file_menu)
menu.add_cascade(label='編集', menu=edit_menu)
menu.add_cascade(label='ヘルプ', menu=help_menu)
# サブウィンドウにメインメニューグループを設定
sub.config(menu=menu)
スポンサーリンク
background
background
は、サブウィンドウの背景色を設定するキーワード引数です。background
に関しては、略して bg
キーワード引数で指定することも可能です。
background
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウの背景色がピンク色になります。
sub = tkinter.Toplevel(
# 略
background='pink'
)
borderwidth
borderwidth
は、サブウィンドウの内枠の太さを設定するキーワード引数です。
borderwidth
には整数を指定します。単位はピクセルです。
この borderwidth
を指定して内枠を太くすることで、次に説明する relief
引数の指定によってウィンドウの見た目が変化するようになります。
例えば下記のようにサブウィンドウを生成すれば、サブウィンドウの内枠の幅が 20
ピクセルとなります。
sub = tkinter.Toplevel(
# 略
borderwidth=20
)
relief
relief
は、サブウィンドウの見た目を設定するキーワード引数です。
relief
に指定可能な値や、それらの値を指定したときのサブウィンドウの見た目に関しては下記ページで解説していますので、詳しくは下記ページの relief をご参照ください(フレームの例で説明していますが、見た目の変化に関してはサブウィンドウにおいても同様になります)。
relief
の指定によってサブウィンドウの見た目が変化するのは内枠が太い場合です。boarderwidth
に小さい値が指定されていたりデフォルト値のままだったりすると relief
の指定を変更しても見た目が変化しないので注意してください。
例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウが浮き上がるような見た目に変化します。
sub = tkinter.Toplevel(
# 略
borderwidth=10,
relief=tkinter.RAISED
)
スポンサーリンク
width
・height
width
と height
は、サブウィンドウの幅と高さを設定するキーワード引数です。
width
と height
には整数を指定します。単位はピクセルになります。
例えば下記のようにサブウィンドウを生成すれば、サブウィンドウの幅と高さがそれぞれ 400
ピクセルと 300
ピクセルに設定されます。
sub = tkinter.Toplevel(
# 略
width=400,
height=300
)
ただし、width
と height
を指定してサブウィンドウの幅と高さを変更したとしても、そのサブウィンドウにウィジェットの配置を行うと幅と高さが配置したウィジェットのサイズに合わせて変化してしまうようでした。
サブウィンドウの場合、後述の geometry の節で紹介する geometry
メソッドでも幅と高さが変更可能で、この geometry
メソッドで変更した幅と高さに関してはウィジェットの配置を行っても保持されるようになっているため、width
と height
ではなく geometry
メソッドを利用して幅と高さを設定することをオススメします。
padx
・pady
padx
は、サブウィンドウ内の余白の横幅を指定するキーワード引数、pady
は、サブウィンドウ内の余白の縦幅を指定するキーワード引数となります。
padx
と pady
には整数を指定します。単位はピクセルです。
例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウ内の余白の横幅が 10
ピクセル、余白の縦幅が 20
ピクセルとなります。
sub = tkinter.Toplevel(
# 略
padx=10,
pady=20
)
highlightthickness
highlightthickness
は、ハイライト枠の太さを設定するキーワード引数です。ハイライト枠が存在する場合、サブウィンドウが最前面に存在すればハイライト枠の色が特定の色に変化し、最前面以外に移動すればハイライト枠の色が他の色に変化するようになっています。
highlightthickness
には 0
以上の整数を指定します。単位はピクセルとなります。デフォルトは、おそらく 0
となります。したがって、ウィンドウが最前面に存在することを視覚的に判断できるようにしたいのであれば、highlightthickness
引数を指定して 1
以上の整数を設定する必要があります。
例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウのハイライト枠の太さが 10
となります。
sub = tkinter.Toplevel(
# 略
highlightthickness=10
)
スポンサーリンク
highlightcolor
・highlightbackground
highlightcolor
は、先ほど説明したハイライト枠における、ウィンドウが最前面に存在する時の枠の色を設定するキーワード引数です。それに対し、highlightbackground
は、ウィンドウが最前面以外に存在するときの枠の色を指定するキーワード引数となります。
highlightcolor
と highlightbackground
の値としては、色名やカラーコード等を指定することが可能です。
例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウが最前面に存在する時はハイライト枠の色が赤色となり、サブウィンドウが最前面以外に存在する時はハイライト枠の色が青色に変化するようになります。
sub = tkinter.Toplevel(
# 略
highlightthickness=10,
highlightcolor='red',
highlightbackground='blue'
)
cursor
cursor
は、マウスカーソルをサブウィンドウ上に移動させたときのカーソルの見た目を設定するキーワード引数です。
cursor
に指定可能な値に関しては、公式の下記ページで紹介されていますので、下記ページを参考にしていただければと思います。
https://tcl.tk/man/tcl8.6/TkCmd/cursors.htm
例えば下記のようにサブウィンドウを生成すれば、サブウィンドウ上にマウスカーソルを合わせたときのカーソルの見た目が「手」に変化します(Windows の場合は)。
sub = tkinter.Toplevel(
# 略
cursor='hand1'
)
Toplevel
クラスのメソッド
最後に Toplevel
クラスに用意されたメソッドについて紹介していきたいと思います。
ここでは、Toplevel
クラス特有のメソッド&私が動作を理解している下記のメソッドのみを紹介させていただきます。
- geometry
- title
- minsize
- maxsize
- resizable
- lift
- lower
- iconify
- deiconify
- withdraw
- transient
- state
- protocol
スポンサーリンク
geometry
geometry
は、実行したサブウィンドウのサイズおよび位置の設定を行うメソッドとなります。
geometry
を、下記の形式の文字列を引数に指定して実行した場合、サブウィンドウの幅が W
ピクセル、高さが H
ピクセルに設定されます。
'WxH'
また、geometry
を、下記の形式の文字列を引数に指定して実行した場合、サブウィンドウの幅が W
ピクセル、高さが H
ピクセルに設定され、さらにサブウィンドウの表示位置が ±X
と ±Y
に応じて設定されることになります。
'WxH±X±Y'
具体的には、±X
は画面上のサブウィンドウの横方向の座標を指定する値で、+X
を指定した場合はサブウィンドウの左側の座標が画面の左隅から X
ピクセル右に移動した位置に設定され、-X
を指定した場合はサブウィンドウの右側の座標が画面の右隅から X
ピクセル左に移動した位置に設定されるようなっています。
同様に、±Y
は画面上のサブウィンドウの縦方向の座標を指定する値で、+Y
を指定した場合はサブウィンドウの上側の座標が画面の上隅から Y
ピクセル下に移動した位置に設定され、-Y
を指定した場合はサブウィンドウの下側の座標が画面の下隅から Y
ピクセル上に移動した位置に設定されるようなっています。
さらに、引数なしで geometry
メソッドを実行した場合は、そのサブウィンドウのサイズおよび位置に基づいて下記の形式の文字列が返却されることになります。
'WxH±X±Y'
例えば下記のように geometry
メソッドを実行した場合、表示されるサブウィンドウの幅が 400
ピクセル・高さが 300
ピクセルとなり、さらに画面の左上隅を原点としたときのサブウィンドウの左上座標が (150
, 250
) となる位置にサブウィンドウが表示されることになります。
# sub:サブウィンドウ
sub.geometry('400x300+150+250')
title
title
は、実行したサブウィンドウのタイトルの設定を行うメソッドとなります。
title
の引数には、タイトルに設定した文字列を指定します。引数を指定せずに実行した場合は、そのサブウィンドウのタイトルに設定されている文字列が返却されます。title
メソッドでタイトルを設定しない場合、メインウィンドウ(Toplevel
のコンストラクタの第1引数に指定したウィンドウ)のタイトルがサブウィンドウに設定されます。
例えば下記のように title
メソッドを実行した場合、サブウィンドウのタイトルが Sub Window
に設定されます。
# sub:サブウィンドウ
sub.title('Sub Window')
minsize
・maxsize
minsize
は、実行したサブウィンドウの最小サイズを設定するメソッド、maxsize
は、実行したサブウィンドウの最大サイズを設定するメソッドになります。サブウィンドウも、他のウィンドウ同様にマウス操作でリサイズすることが可能です。そのリサイズ可能な最小サイズと最大サイズを設定するのが、これらのメソッドとなります。
minsize
の第1引数(width
引数)と第2引数(height
引数)にピクセル数を指定して実行すれば、サブウィンドウの幅を第1引数で指定したピクセル数よりも小さくすることが不可となり、サブウィンドウの高さを第2引数で指定したピクセル数よりも小さくすることが不可となります。minsize
を引数なしで実行した場合は、そのサブウィンドウに設定されている最小サイズが (width, height)
形式のタプルで返却されることになります。
また、maxsize
の第1引数(width
引数)と第2引数(height
引数)にピクセル数を指定して実行すれば、サブウィンドウの幅を第1引数で指定したピクセル数よりも大きくすることが不可となり、サブウィンドウの高さを第2引数で指定したピクセル数よりも大きくすることが不可となります。maxsize
を引数なしで実行した場合は、そのサブウィンドウに設定されている最大サイズが (width, height)
形式のタプルで返却されることになります。
例えば下記のように minsize
メソッドと maxsize
メソッドを実行した場合、サブウィンドウの幅が 400
ピクセルから 500
ピクセルの間でしかリサイズできなくなり、高さが 100
ピクセルから 300
ピクセルの間でしかリサイズできなくなります。
# sub:サブウィンドウ
sub.minsize(400, 100)
sub.maxsize(500, 300)
スポンサーリンク
resizable
resizable
は、実行したサブウィンドウのリサイズの有効 / 無効を設定するメソッドです。
resizable
の第1引数(width
引数)と第2引数(height
引数)に True
or False
を指定して実行すれば、第1引数に指定された値に応じてサブウィンドウの横方向のリサイズの有効 / 無効が、第2引数に指定された値に応じてサブウィンドウの縦方向のリサイズの有効 / 無効が設定されることになります。True
が指定されている場合は有効に、False
が指定されている場合は無効に設定されます。
また、resizable
を引数なしで実行した場合は、そのサブウィンドウのリサイズの有効 / 無効が (width, height)
形式のタプルで返却されることになります(width
には、横方向のリサイズの有効 or 無効に応じて 1
or 0
、height
には、縦方向のリサイズの有効 or 無効に応じて 1
or 0
がセットされています)。
例えば下記のように resizable
メソッドを実行した場合、サブウィンドウが横方向にも縦方向にもリサイズできなくなります。
# sub:サブウィンドウ
sub.resizable(False, False)
lift
・lower
lift
は、実行したサブウィンドウを引数で指定したウィンドウの前面に表示するメソッドになります。それに対し、lower
は、実行したサブウィンドウを引数で指定したウィンドウの背面に表示するメソッドになります。
lift
と lower
は、引数にウィンドウ(メインウィンドウなど)を指定して実行します。
例えば下記のように lift
メソッドを実行した場合、サブウィンドウがメインウィンドウの前面に表示されることになります。
# sub:サブウィンドウ
# app:メインウィンドウ
sub.lift(app)
iconify
・deiconify
iconify
は、実行したサブウィンドウを最小化(アイコン化)するメソッドになります。それに対し、deiconify
は、実行したサブウィンドウの最小化(アイコン化)を解除するメソッドになります。
iconify
と deiconify
は引数なしで実行します。
例えば下記のように iconify
メソッドを実行した場合、サブウィンドウが最小化されることになります。
# sub:サブウィンドウ
sub.iconify()
スポンサーリンク
withdraw
withdraw
は、実行したサブウィンドウを非表示にするメソッドになります。
withdraw
は引数なしで実行します。
非表示にしたサブウィンドウは、引数に 'normal'
を指定して state
メソッドを実行することで再度表示することが可能です(state
メソッドに関しては次節で説明します)。
例えば下記のように withdraw
メソッドを実行した場合、サブウィンドウが非表示になります。
# sub:サブウィンドウ
sub.withdraw()
state
state
メソッドは、実行したサブウィンドウの状態を設定するメソッドになります。
state
メソッドには、下記の5つを指定することが可能です。
'normal'
:サブウィンドウを通常状態に戻す'icon'
:サブウィンドウを最小化状態にする'iconic'
:'icon'
と同じ'withdrawn'
:サブウィンドウを非表示状態にする'zoomed'
:サブウィンドウを最大化状態にする
例えば下記のように state
メソッドを実行した場合、最小化状態のサブウィンドウ・非表示状態のサブウィンドウ・最大化状態のサブウィンドウが通常状態に戻ります。
# sub:サブウィンドウ
sub.state('normal')
transient
transient
は、実行したサブウィンドウを引数に指定したウィンドウの子に設定するメソッドになります。逆に、引数に指定されたウィンドウは、transient
を実行したウィンドウの親に設定されることになります。子ウィンドウは、常に親ウィンドウの前面に表示されるようになりますし、親ウィンドウが最小化された時には子ウィンドウも一緒に最小化されるようになります。
また、Mac の場合のみ、親ウィンドウを移動させると、子ウィンドウも親ウィンドウを追随する形で一緒に移動することになります。
transient
は、親とするウィンドウ(メインウィンドウなど)を引数に指定して実行します。
transient
を実行したウィンドウは、単独での最小化が不可となるため、iconify
メソッドの実行は不可となりますし、引数に 'icon'
や 'iconic'
を指定しての state
メソッドの実行も不可となりますので注意してください。
例えば下記のように transient
メソッドを実行した場合、サブウィンドウがメインウィンドウの子となり、常にメインウィンドウの前面に表示され、さらにメインウィンドウの最小化時にサブウィンドウも一緒に最小化されるようになります。
# sub:サブウィンドウ
# app:メインウィンドウ
sub.transient(app)
スポンサーリンク
protocol
protocol
は、bind
に似たメソッドで、特定のイベントが発生した時に実行するイベントハンドラを設定するメソッドになります。
protocol
の第1引数にはイベント名、第2引数には、第1引数で指定したイベント名のイベントが発生したときに実行するイベントハンドラを指定します。例えば、第1引数に 'WM_DELETE_WINDOW'
を指定した場合、サブウィンドウの閉じるボタンがクリックされた時に第2引数に指定されたイベントハンドラが実行されるようになります。
例えば下記のように protocol
メソッドを実行した場合、サブウィンドウの閉じるボタンがクリックされた際に destroy
関数が実行されるようになります。この destroy
関数ではサブウィンドウの終了とメインウィンドウの終了を実施しているため、サブウィンドウの閉じるボタンが押されるとメインウィンドウも一緒に閉じられることになります。
# sub:サブウィンドウ
# app:メインウィンドウ
def destroy():
sub.destroy()
app.destroy()
sub.protocol('WM_DELETE_WINDOW', destroy)
まとめ
このページでは、Tkinter のサブウィンドウについて解説しました!
サブウィンドウを利用することで、複数のウィンドウを持つアプリの開発が可能となります。複数のウィンドウが存在することになるため、各ウィジェットの配置先のウィンドウの設定を適切に行うことが、サブウィンドウを使いこなす1つのポイントになると思います。これさえ適切に行えれば、後は通常のアプリ開発時と同様の手順で複数ウィンドウを持つアプリを開発していくことが可能です。
複数のウィンドウを持つアプリとすることで、より便利・より高機能・より使いやすいアプリも実現することができるようになりますので、是非サブウィンドウの使い方についても覚えておいてください!
オススメ参考書(PR)
Tkinter に興味がある方には下記のPythonでつくる ゲーム開発 入門講座がオススメです。
Tkinter をゲーム開発を通して「楽しく学ぶ」ことができます。Python 入門者、Tkinter 入門者の方にオススメです。