【Python tkinter】メインウィンドウと連動させた複数のサブウィンドウ作成方法(Toplevel)

時計 2021.02.13 / 時計

【Python tkinter】メインウィンドウと連動させた複数のサブウィンドウ作成方法(Toplevel)

本記事ではPythonのtkinterを使ったGUIアプリケーションで、メインウィンドウと連動させた複数のサブウィンドウを生成する方法を解説していきます。

tkinterはPythonに標準で用意されているGUIアプリケーションを作成するためのライブラリです。

tkinterの基本的な使用方法は以下記事をご参照ください。

このtkinterで複数ウィンドウを作成する際に利用できる、サブウィンドウをメインウィンドウに連動させる方法を本記事で見ていきましょう。

本記事を通して以下の知識を学べます。

学べる知識
  • Toplevel()メソッドの使用方法
  • サブウィンドウをメインウィンドウに連動させる方法
  • ウィンドウ生成を限定する方法

連動したサブウィンドウの作成(Toplevel)

tkinter.Toplevel()

メインウィンドウを作成にはtkinter.Tk()を使用しますよね。これと同じようにtkinter.Tk()を使って別のウィンドウを作成することができます。

しかしこの方法では最初に作成したメインウィンドウとは連動していません。
つまりメインウィンドウを閉じても、別で作成したウィンドウは閉じません。

メインウィンドウとサブウィンドウを連動させたい場合は、サブウィンドウの生成をtkinter.Tk()を使わずにtkinter.Toplevel()を使用します。

sub_win = tkinter.Toplevel(option)

tkinter.Toplevel()で生成されたウィンドウは、メインウィンドウが閉じられると連動して閉じるようになります。

Toplevel()の引数にはなにも指定しなくても大丈夫です。

Toplevel():オプション

Toplevel()の引数に指定できるオプションを次に記します。

オプション 説明
bg 背景色の設定
bd ボーダーのpixels指定
cursor カーソルがウィンドウ上に乗った時のカーソル指定
relief ウィンドウの外観設定
height ウィンドウの高さ指定
width ウィンドウの横幅指定

サンプルプログラム

次にtkinter.Toplevel()を使ったGUIアプリケーションのサンプルプログラムを記します。

# sample.py
# tkinterのインポート
import tkinter as tk
import tkinter.ttk as ttk

def sub_window():
    sub_win = tk.Toplevel()
    sub_win.geometry("300x100")
    label_sub = tk.Label(sub_win, text="サブウィンドウ")
    label_sub.pack()

# rootメインウィンドウの設定
root = tk.Tk()
root.title("tkinter:Toplevel")
root.geometry("300x100")

# メインフレームの作成と設置
frame = tk.Frame(root)
frame.pack(fill = tk.BOTH, padx=5, pady=10)

# 各種ウィジェットの作成
button = ttk.Button(frame, text="サブウィンドウ生成", command=sub_window)

# 各種ウィジェットの設置
button.pack()

root.mainloop()

サンプルプログラムを起動すると次のメインウィンドウが表示されます。

tkinter:toplevelを使用したメインウィンドウ

「サブウィンドウ生成」ボタンを押すとサブウィンドウが生成されます。

tkinter:toplevelを使用したサブウィンドウ

サブウィンドウはtkinter.Toplevel()で生成されているので、メインウィンドウが閉じられるとサブウィンドウも同時に閉じられます。

サブウィンドウの変更

タイトルの変更

サブウィンドウのタイトルはメインウィンドウのタイトルを引き継ぎます。
このままではタイトルがかぶってしまうので、title()メソッドを使用して変更しましょう。

sub_win.title("サブウィンドウ")

サイズの変更

サブウィンドウのサイズ変更はTk()と同じようにgeometry()メソッドで変更することができます。

sub_win.geometry("300x100")

サブウィンドウ生成を1つに限定する

winfo_exists()

サンプルプログラムのままでは、ボタンを押すたびにサブウィンドウを複数個作ることができてしまいます。

そこでサブウィンドウが存在しているか確認し、存在する場合はサブウィンドウを作成しないようにしましょう。

サブウィンドウの存在確認にはウィジェットに対してwinfo_exists()メソッドを使用することで可能です。
サブウィンドウが存在する場合はTrue、存在しない場合はFalseを返します。

サンプルプログラム

次にサブウィンドウの存在有無のチェックを加えたサンプルプログラムを記します。

# tkinterのインポート
import tkinter as tk
import tkinter.ttk as ttk

def sub_window():
    global sub_win
    if sub_win == None or not sub_win.winfo_exists():
        sub_win = tk.Toplevel()
        sub_win.geometry("300x100")
        sub_win.title("サブウィンドウ")
        label_sub = tk.Label(sub_win, text="サブウィンドウ")
        label_sub.pack()

# rootメインウィンドウの設定
root = tk.Tk()
root.title("tkinter:Toplevel")
root.geometry("300x100")

# sub_winを定義する
sub_win = None

# メインフレームの作成と設置
frame = tk.Frame(root)
frame.pack(fill = tk.BOTH, padx=5, pady=10)

# 各種ウィジェットの作成
button = ttk.Button(frame, text="サブウィンドウ生成", command=sub_window)

# 各種ウィジェットの設置
button.pack()

root.mainloop()