【Tkinterの使い方】サブウィンドウ(Toplevel)の使い方

このページにはプロモーションが含まれています

このページでは、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引数にメインウィンドウを指定すれば、そのウィジェットを packgridplace メソッド等で配置することでインウィンドウ上に表示されるようになります。

ウィジェットの配置先ウィンドウの指定1

先ほど示したスクリプトにおいては、下記部分でメインウィンドウに表示するキャンバスウィジェットの作成と配置を行なっています。コンストラクタの第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,
)

サブウィンドウに関しては packgridplace メソッドによる配置は不要です。上記のように Toplevel クラスのコンストラクタを実行し、さらにメインウィンドウに mainloop を実行させれば、画面上にサブウィンドウが表示されることになります。

また、先ほど示したスクリプトでは、メインウィンドウとサブウィンドウを同じタイミングで表示するようになっていますが、最初にメインウィンドウだけを表示しておき、メインウィンドウに対してユーザーから何らかの操作(ボタンのクリック・メニューのクリックなど)が行われたタイミングでサブウィンドウを表示するようなことも可能です。この場合は、その “何らかの操作” が行われた時に実行されるイベントハンドラの中で Toplevel クラスのコンストラクタを実行すれば良いです。

ボタンクリック時にサブウィンドウを表示する様子

スポンサーリンク

サブウィンドウの設定変更

サブウィンドウを作成したら、必要に応じてサブウィンドウの設定変更を行いましょう。サブウィンドウの設定 でも説明するように、サブウィンドウの背景色等の設定変更は Toplevel クラスのコンストラクタへの引数の指定によって実施可能です。

また、サブウィンドウの場合は、メインウィンドウ同様にメソッドを使って設定変更を行うことも多いです。サブウィンドウのメソッドについては Toplelve クラスのメソッド で解説します。

先ほどのスクリプトにおいても、サイズとタイトルの設定を下記で実施しています。サブウィンドウに関しても、メインウィンドウとの区別がつくようにタイトルは設定しておくことをオススメします。

サブウィンドウの設定変更
sub_window.geometry('200x300')
sub_window.title('設定')

サブウィンドウへのウィジェットの配置

サブウィンドウに関しても、メインウィンドウ同様に、サブウィンドウに表示するウィジェットの作成と配置が必要となります。

前述でも説明したように、ウィジェットの配置先は、ウィジェットのコンストラクタの第1引数(master 引数)によって決まります。したがって、この引数にサブウィンドウを指定してやれば、ウィジェットをサブウィンドウに配置することが可能となります。

ウィジェットの配置先ウィンドウの指定2

先ほど示したスクリプトでは、スケールウィジェットを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_rscale_gscale_bcanvas の配置先のウィンドウを意識せずに実装されており、これらのウィジェットがメインウィンドウのみに配置されていようが3つのウィンドウに分けて配置されていようが関係なく動作します。このように、大半の処理は各ウィジェットの配置先のウィンドウは意識せずに実装することが可能です。

ただし、「サブウィンドウのみが閉じられてもアプリとしては動作し続ける」という点には注意してください。メインウィンドウの場合は、ウィンドウが閉じられるとアプリとしても動作を終了することになるため、ウィンドウを閉じた後に処理が実行されるようなケースは少ないです。

ですが、サブウィンドウが閉じられても、メインウィンドウが閉じられていなければアプリとしては動作し続けることになり、そのような状態でサブウィンドウに配置されたウィジェットのメソッドが実行されたりすると例外が発生することになります(サブウィンドウが閉じられるとサブウィンドウに配置されたウィジェットはすべて消滅します)。

サブウィンドウが閉じられた後にサブウィンドウのウィジェットのメソッドを実行すると例外が発生する様子

そのため、サブウィンドウの状態に応じてサブウィンドウのウィジェットのメソッドを実行する or 実行しないを切り替えるようにしたり、そもそもメインウィンドウのみしか存在しない状態ではサブウィンドウのウィジェットのメソッドが実行されないような設計のアプリを開発したりするような工夫が必要となります。

サブウィンドウの設定

次は、サブウィンドウの設定について解説していきます。

他のウィジェット同様に、サブウィンドウの見た目等の設定はキーワード引数を指定してコンストラクタ(tkinter.Toplevel())や config メソッドを実行することで変更可能です。これらに指定可能なキーワード引数名は下記により確認することができます。

設定可能なキーワード
# sub:サブウィンドウ
print(sub.keys())

ここでは、私が動作を理解している設定に対する解説のみを行わせていただきます。具体的には、下記の設定について説明していきます。特に重要なのは menu くらいになると思います。

また、サブウィンドウでは、次に説明する Toplevel クラスのメソッド で紹介するメソッドで変更可能な設定も存在し、そちらのメソッドでの設定変更の方が使い勝手が良いものもあります。なので、ここから一応キーワード引数で変更可能な設定について説明しますが、どちらかというとメソッドの方が重要度は高いと思います。

MEMO

私の下記環境での実行結果をもとに説明していますが、環境によっては動きが異なるかもしれません

実際にご自身の環境で実行結果を確認していただくと、より確実に設定の効果を理解することができると思います

  • OS:Windows 11
  • Python:3.12
  • Tkinter:8.6

menu は、サブウィンドウのメニューバーの設定を行うキーワード引数です。 

menu引数の説明図

menu にはメニューウィジェットを指定します。このメニューウィジェットの作り方や、メニューウィジェットをウィンドウのメニューバーに設定する方法等については下記ページで詳細を解説していますので、詳しくは下記ページを参照してください。

tkinterにおけるメニューの使い方の解説ページアイキャッチ Tkinterの使い方:メニュー(Menu)の使い方

Mac の場合、メニューバーはアプリ内ではなく画面の上隅に表示されることになるので注意してください。

例えば下記のような処理を実行すれば、サブウィンドウのメニューバーに ファイル編集ヘルプ の項目が表示されるようになります(メニューバーにメニューを表示するだけの例なので、項目をクリックしても何も起きないようになっています)。

menuの指定例
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引数の説明図

background の値としては、色名やカラーコード等を指定することが可能です。

例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウの背景色がピンク色になります。

backgroundの指定例
sub = tkinter.Toplevel(
    # 略
    background='pink'
)

borderwidth

borderwidth は、サブウィンドウの内枠の太さを設定するキーワード引数です。

borderwidth引数の説明図

borderwidth には整数を指定します。単位はピクセルです。

この borderwidth を指定して内枠を太くすることで、次に説明する relief 引数の指定によってウィンドウの見た目が変化するようになります。

例えば下記のようにサブウィンドウを生成すれば、サブウィンドウの内枠の幅が 20 ピクセルとなります。

borderwidthの指定例
sub = tkinter.Toplevel(
    # 略
    borderwidth=20
)

relief

relief は、サブウィンドウの見た目を設定するキーワード引数です。

relief引数の説明図

relief に指定可能な値や、それらの値を指定したときのサブウィンドウの見た目に関しては下記ページで解説していますので、詳しくは下記ページの relief をご参照ください(フレームの例で説明していますが、見た目の変化に関してはサブウィンドウにおいても同様になります)。

フレームウィジェットの作り方の解説ページアイキャッチ Tkinterの使い方:フレームウィジェット(Frame)の使い方

relief の指定によってサブウィンドウの見た目が変化するのは内枠が太い場合です。boarderwidth に小さい値が指定されていたりデフォルト値のままだったりすると relief の指定を変更しても見た目が変化しないので注意してください。

例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウが浮き上がるような見た目に変化します。

reliefの指定例
sub = tkinter.Toplevel(
    # 略
    borderwidth=10,
    relief=tkinter.RAISED
)

スポンサーリンク

widthheight

widthheight は、サブウィンドウの幅と高さを設定するキーワード引数です。

width引数とheight引数の説明図

widthheight には整数を指定します。単位はピクセルになります。

例えば下記のようにサブウィンドウを生成すれば、サブウィンドウの幅と高さがそれぞれ 400 ピクセルと 300 ピクセルに設定されます。

widthとheightの指定例
sub = tkinter.Toplevel(
    # 略
    width=400,
    height=300
)

ただし、widthheight を指定してサブウィンドウの幅と高さを変更したとしても、そのサブウィンドウにウィジェットの配置を行うと幅と高さが配置したウィジェットのサイズに合わせて変化してしまうようでした。

サブウィンドウの場合、後述の geometry の節で紹介する geometry メソッドでも幅と高さが変更可能で、この geometry メソッドで変更した幅と高さに関してはウィジェットの配置を行っても保持されるようになっているため、widthheight ではなく geometry メソッドを利用して幅と高さを設定することをオススメします。

padxpady

padx は、サブウィンドウ内の余白の横幅を指定するキーワード引数、pady は、サブウィンドウ内の余白の縦幅を指定するキーワード引数となります。

padx引数とpady引数の説明図

padxpady には整数を指定します。単位はピクセルです。

例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウ内の余白の横幅が 10 ピクセル、余白の縦幅が 20 ピクセルとなります。

padxとpadyの指定例
sub = tkinter.Toplevel(
    # 略
    padx=10,
    pady=20
)

highlightthickness

highlightthickness は、ハイライト枠の太さを設定するキーワード引数です。ハイライト枠が存在する場合、サブウィンドウが最前面に存在すればハイライト枠の色が特定の色に変化し、最前面以外に移動すればハイライト枠の色が他の色に変化するようになっています。

highlightthickness引数の説明図

highlightthickness には 0 以上の整数を指定します。単位はピクセルとなります。デフォルトは、おそらく 0 となります。したがって、ウィンドウが最前面に存在することを視覚的に判断できるようにしたいのであれば、highlightthickness 引数を指定して 1 以上の整数を設定する必要があります。

例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウのハイライト枠の太さが 10 となります。

highlightthicknessの指定例
sub = tkinter.Toplevel(
    # 略
    highlightthickness=10
)

スポンサーリンク

highlightcolorhighlightbackground

highlightcolor は、先ほど説明したハイライト枠における、ウィンドウが最前面に存在する時の枠の色を設定するキーワード引数です。それに対し、highlightbackground は、ウィンドウが最前面以外に存在するときの枠の色を指定するキーワード引数となります。

highlightcolor引数とhighlightbackground引数の説明図

highlightcolorhighlightbackground の値としては、色名やカラーコード等を指定することが可能です。

例えば下記のようにサブウィンドウを生成すれば、そのサブウィンドウが最前面に存在する時はハイライト枠の色が赤色となり、サブウィンドウが最前面以外に存在する時はハイライト枠の色が青色に変化するようになります。

highlightcolorとhighlightbackgroundの指定例
sub = tkinter.Toplevel(
    # 略
    highlightthickness=10,
    highlightcolor='red',
    highlightbackground='blue'
)

cursor

cursor は、マウスカーソルをサブウィンドウ上に移動させたときのカーソルの見た目を設定するキーワード引数です。

cursor引数の説明図

cursor に指定可能な値に関しては、公式の下記ページで紹介されていますので、下記ページを参考にしていただければと思います。

https://tcl.tk/man/tcl8.6/TkCmd/cursors.htm

例えば下記のようにサブウィンドウを生成すれば、サブウィンドウ上にマウスカーソルを合わせたときのカーソルの見た目が「手」に変化します(Windows の場合は)。

cursorの指定例
sub = tkinter.Toplevel(
    # 略
    cursor='hand1'
)

Toplevel クラスのメソッド

最後に Toplevel クラスに用意されたメソッドについて紹介していきたいと思います。

ここでは、Toplevel クラス特有のメソッド&私が動作を理解している下記のメソッドのみを紹介させていただきます。

スポンサーリンク

geometry

geometry は、実行したサブウィンドウのサイズおよび位置の設定を行うメソッドとなります。

geometryメソッドの説明図

geometry を、下記の形式の文字列を引数に指定して実行した場合、サブウィンドウの幅が W ピクセル、高さが H ピクセルに設定されます。

'WxH'

また、geometry を、下記の形式の文字列を引数に指定して実行した場合、サブウィンドウの幅が W ピクセル、高さが H ピクセルに設定され、さらにサブウィンドウの表示位置が ±X±Y に応じて設定されることになります。

'WxH±X±Y'

具体的には、±X は画面上のサブウィンドウの横方向の座標を指定する値で、+X を指定した場合はサブウィンドウの左側の座標が画面の左隅から X ピクセル右に移動した位置に設定され、-X を指定した場合はサブウィンドウの右側の座標が画面の右隅から X ピクセル左に移動した位置に設定されるようなっています。

geometryメソッドの引数に指定する±Xの意味合いを説明する図

同様に、±Y は画面上のサブウィンドウの縦方向の座標を指定する値で、+Y を指定した場合はサブウィンドウの上側の座標が画面の上隅から Y ピクセル下に移動した位置に設定され、-Y を指定した場合はサブウィンドウの下側の座標が画面の下隅から Y ピクセル上に移動した位置に設定されるようなっています。

geometryメソッドの引数に指定する±Yの意味合いを説明する図

さらに、引数なしで geometry メソッドを実行した場合は、そのサブウィンドウのサイズおよび位置に基づいて下記の形式の文字列が返却されることになります。

'WxH±X±Y'

例えば下記のように geometry メソッドを実行した場合、表示されるサブウィンドウの幅が 400 ピクセル・高さが 300 ピクセルとなり、さらに画面の左上隅を原点としたときのサブウィンドウの左上座標が (150, 250) となる位置にサブウィンドウが表示されることになります。  

geometryメソッドの実行例
# sub:サブウィンドウ
sub.geometry('400x300+150+250')

title

title は、実行したサブウィンドウのタイトルの設定を行うメソッドとなります。

titleメソッドの説明図

title の引数には、タイトルに設定した文字列を指定します。引数を指定せずに実行した場合は、そのサブウィンドウのタイトルに設定されている文字列が返却されます。title メソッドでタイトルを設定しない場合、メインウィンドウ(Toplevel のコンストラクタの第1引数に指定したウィンドウ)のタイトルがサブウィンドウに設定されます。

例えば下記のように title メソッドを実行した場合、サブウィンドウのタイトルが Sub Window に設定されます。

titleメソッドの実行例
# sub:サブウィンドウ
sub.title('Sub Window')

minsizemaxsize

minsize は、実行したサブウィンドウの最小サイズを設定するメソッド、maxsize は、実行したサブウィンドウの最大サイズを設定するメソッドになります。サブウィンドウも、他のウィンドウ同様にマウス操作でリサイズすることが可能です。そのリサイズ可能な最小サイズと最大サイズを設定するのが、これらのメソッドとなります。

minsize引数の説明図

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 ピクセルの間でしかリサイズできなくなります。 

minsizeメソッドとmaxsizeメソッドの実行例
# sub:サブウィンドウ
sub.minsize(400, 100)
sub.maxsize(500, 300)

スポンサーリンク

resizable

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 メソッドを実行した場合、サブウィンドウが横方向にも縦方向にもリサイズできなくなります。 

resizableメソッドの実行例
# sub:サブウィンドウ
sub.resizable(False, False)

liftlower

lift は、実行したサブウィンドウを引数で指定したウィンドウの前面に表示するメソッドになります。それに対し、lower は、実行したサブウィンドウを引数で指定したウィンドウの背面に表示するメソッドになります。

liftメソッドとlowerメソッドの説明図

liftlower は、引数にウィンドウ(メインウィンドウなど)を指定して実行します。

例えば下記のように lift メソッドを実行した場合、サブウィンドウがメインウィンドウの前面に表示されることになります。 

liftメソッドの実行例
# sub:サブウィンドウ
# app:メインウィンドウ
sub.lift(app)

iconifydeiconify

iconify は、実行したサブウィンドウを最小化(アイコン化)するメソッドになります。それに対し、deiconify は、実行したサブウィンドウの最小化(アイコン化)を解除するメソッドになります。

iconifyメソッドとdeiconifyメソッドの説明図

iconifydeiconify は引数なしで実行します。

例えば下記のように iconify メソッドを実行した場合、サブウィンドウが最小化されることになります。 

iconifyメソッドの実行例
# sub:サブウィンドウ
sub.iconify()

スポンサーリンク

withdraw

withdraw は、実行したサブウィンドウを非表示にするメソッドになります。

withdrawメソッドの説明図

withdraw は引数なしで実行します。

非表示にしたサブウィンドウは、引数に 'normal' を指定して state メソッドを実行することで再度表示することが可能です(state メソッドに関しては次節で説明します)。

例えば下記のように withdraw メソッドを実行した場合、サブウィンドウが非表示になります。 

withdrawメソッドの実行例
# sub:サブウィンドウ
sub.withdraw()

state

state メソッドは、実行したサブウィンドウの状態を設定するメソッドになります。

stateメソッドの説明図

state メソッドには、下記の5つを指定することが可能です。

  • 'normal':サブウィンドウを通常状態に戻す
  • 'icon':サブウィンドウを最小化状態にする
  • 'iconic''icon' と同じ
  • 'withdrawn':サブウィンドウを非表示状態にする
  • 'zoomed':サブウィンドウを最大化状態にする

例えば下記のように state メソッドを実行した場合、最小化状態のサブウィンドウ・非表示状態のサブウィンドウ・最大化状態のサブウィンドウが通常状態に戻ります。 

stateメソッドの実行例
# sub:サブウィンドウ
sub.state('normal')

transient

transient は、実行したサブウィンドウを引数に指定したウィンドウの子に設定するメソッドになります。逆に、引数に指定されたウィンドウは、transient を実行したウィンドウの親に設定されることになります。子ウィンドウは、常に親ウィンドウの前面に表示されるようになりますし、親ウィンドウが最小化された時には子ウィンドウも一緒に最小化されるようになります。

  transientメソッドの説明図

また、Mac の場合のみ、親ウィンドウを移動させると、子ウィンドウも親ウィンドウを追随する形で一緒に移動することになります。

transientメソッドの説明図2

transient は、親とするウィンドウ(メインウィンドウなど)を引数に指定して実行します。

transient を実行したウィンドウは、単独での最小化が不可となるため、iconify メソッドの実行は不可となりますし、引数に 'icon''iconic' を指定しての state メソッドの実行も不可となりますので注意してください。

例えば下記のように transient メソッドを実行した場合、サブウィンドウがメインウィンドウの子となり、常にメインウィンドウの前面に表示され、さらにメインウィンドウの最小化時にサブウィンドウも一緒に最小化されるようになります。 

transientメソッドの実行例
# sub:サブウィンドウ
# app:メインウィンドウ
sub.transient(app)

スポンサーリンク

protocol

protocol は、bind に似たメソッドで、特定のイベントが発生した時に実行するイベントハンドラを設定するメソッドになります。

protocolメソッドの説明図

protocol の第1引数にはイベント名、第2引数には、第1引数で指定したイベント名のイベントが発生したときに実行するイベントハンドラを指定します。例えば、第1引数に 'WM_DELETE_WINDOW' を指定した場合、サブウィンドウの閉じるボタンがクリックされた時に第2引数に指定されたイベントハンドラが実行されるようになります。

例えば下記のように protocol メソッドを実行した場合、サブウィンドウの閉じるボタンがクリックされた際に destroy 関数が実行されるようになります。この destroy 関数ではサブウィンドウの終了とメインウィンドウの終了を実施しているため、サブウィンドウの閉じるボタンが押されるとメインウィンドウも一緒に閉じられることになります。

protocolメソッドの実行例
# sub:サブウィンドウ
# app:メインウィンドウ

def destroy():
    sub.destroy()
    app.destroy()

sub.protocol('WM_DELETE_WINDOW', destroy)

まとめ

このページでは、Tkinter のサブウィンドウについて解説しました!

サブウィンドウを利用することで、複数のウィンドウを持つアプリの開発が可能となります。複数のウィンドウが存在することになるため、各ウィジェットの配置先のウィンドウの設定を適切に行うことが、サブウィンドウを使いこなす1つのポイントになると思います。これさえ適切に行えれば、後は通常のアプリ開発時と同様の手順で複数ウィンドウを持つアプリを開発していくことが可能です。

複数のウィンドウを持つアプリとすることで、より便利・より高機能・より使いやすいアプリも実現することができるようになりますので、是非サブウィンドウの使い方についても覚えておいてください!

オススメ参考書(PR)

Tkinter に興味がある方には下記のPythonでつくる ゲーム開発 入門講座がオススメです。

Tkinter をゲーム開発を通して「楽しく学ぶ」ことができます。Python 入門者、Tkinter 入門者の方にオススメです。

同じカテゴリのページ一覧を表示