【完全独学Python】TkinterのToplevelでサブウィンドウを簡単作成!

未分類

こんにちは!ゆーや(@yuyamanm118712)です。

こちらのページでは完全独学でWebプログラマとなった私が

デスクトップアプリには必須!!TkinterでToplevel使ったサブウィンドウの作成方法を詳しく紹介します!

ゆーや
ゆーや

Tkinterの基本的な使い方は以下の記事を見てね!

Toplevelウィジェットは、親ウィンドウとは別に独立したウィンドウを提供します!

例えば、設定画面やポップアップウィンドウなどに使われます。

この記事を通して、Toplevelは使いこなせるようにしておきましょう!

この記事を読むと

  • Tkinterでサブウィンドウが作成できる!
  • TkinterのToplevelの基本的な使い方が理解できる!!
  • TkinterのToplevelのオプションについて理解できる!

Toplevel(サブウィンドウ)の基本

Toplevel(サブウィンドウ)作成までのサンプルコード

import tkinter as tk

# メインウィンドウの作成
root = tk.Tk()
root.title("Main Window")
root.geometry("400x300")

def open_toplevel():
    # 新しいToplevelウィンドウの作成
    toplevel = tk.Toplevel(root)
    toplevel.title("Toplevel Window")
    toplevel.geometry("300x200")

    # ラベルの追加
    label = tk.Label(toplevel, text="これはToplevelウィンドウです")
    label.pack(pady=20)

    # 閉じるボタンの追加
    close_button = tk.Button(toplevel, text="閉じる", command=toplevel.destroy)
    close_button.pack(pady=10)

# ボタンの作成
open_button = tk.Button(root, text="Toplevelを開く", command=open_toplevel)
open_button.pack(pady=20)

# メインループの開始
root.mainloop()

ボタン押下前

ボタン押下後

ゆーや
ゆーや

ボタンを押すと、サブウィンドウが表示されるね!
サブウィンドウにも、メインウィンドウと同じく「タイトルの設定」「ウィジェットの配置」などができる!
command=toplevel.destroyでサブウィンドウを閉じることもできるよ!

Toplevelの基本オプション

ウィンドウのサイズと位置を指定(geometry)

import tkinter as tk

# メインウィンドウの作成
root = tk.Tk()
root.title("Main Window")
root.geometry("400x300")

def open_toplevel():
    # 新しいToplevelウィンドウの作成
    toplevel = tk.Toplevel(root)
    toplevel.title("Toplevel Window")
    toplevel.geometry("300x200+500+500")

    # ラベルの追加
    label = tk.Label(toplevel, text="これはToplevelウィンドウです")
    label.pack(pady=20)

    # 閉じるボタンの追加
    close_button = tk.Button(toplevel, text="閉じる", command=toplevel.destroy)
    close_button.pack(pady=10)

# ボタンの作成
open_button = tk.Button(root, text="Toplevelを開く", command=open_toplevel)
open_button.pack(pady=20)

# メインループの開始
root.mainloop()
ゆーや
ゆーや

この例(geometry(“300×200+500+500”))では、幅300ピクセル、高さ200ピクセル、左上の位置が(100, 100)の位置にウィンドウが配置されるよ!
少し特殊な書き方だけど覚えておこう!

ウィンドウのサイズ変更の可否を設定(resizable)

import tkinter as tk

# メインウィンドウの作成
root = tk.Tk()
root.title("Main Window")
root.geometry("400x300")

def open_toplevel():
    # 新しいToplevelウィンドウの作成
    toplevel = tk.Toplevel(root)
    toplevel.title("Toplevel Window")
    toplevel.geometry("300x200")
    toplevel.resizable(False, False)

    # ラベルの追加
    label = tk.Label(toplevel, text="これはToplevelウィンドウです")
    label.pack(pady=20)

    # 閉じるボタンの追加
    close_button = tk.Button(toplevel, text="閉じる", command=toplevel.destroy)
    close_button.pack(pady=10)

# ボタンの作成
open_button = tk.Button(root, text="Toplevelを開く", command=open_toplevel)
open_button.pack(pady=20)

# メインループの開始
root.mainloop()
ゆーや
ゆーや

サブウィンドウの端をドラッグして、サブウィンドウのサイズを変更しようとしてみましょう!
出来ないことがわかると思います!

ウィジェットの配置方法の中でもplaceなどと相性が良さそうですね!
placeについては下記の記事を見てね!

親ウィンドウの前面に表示されるモーダルウィンドウを作成(transient)

import tkinter as tk

root = tk.Tk()
root.title("Main Window")

toplevel = tk.Toplevel(root)
toplevel.title("Modal Window")
toplevel.transient(root)  # Toplevelウィンドウを親ウィンドウに設定

root.mainloop()
ゆーや
ゆーや

サブウィンドウが前面に表示されたね!

違いが分かりにくい人は、toplevel.transient(root)をコメントアウトしてみよう!

他のウィンドウにアクセス禁止(grab_set)

import tkinter as tk

# メインウィンドウの作成
root = tk.Tk()
root.title("Main Window")
root.geometry("400x300")

def open_toplevel():
    # 新しいToplevelウィンドウの作成
    toplevel = tk.Toplevel(root)
    toplevel.title("Toplevel Window")
    toplevel.geometry("300x200")
    toplevel.grab_set()

    # ラベルの追加
    label = tk.Label(toplevel, text="これはToplevelウィンドウです")
    label.pack(pady=20)

    # 閉じるボタンの追加
    close_button = tk.Button(toplevel, text="閉じる", command=toplevel.destroy)
    close_button.pack(pady=10)

# ボタンの作成
open_button = tk.Button(root, text="Toplevelを開く", command=open_toplevel)
open_button.pack(pady=20)

# メインループの開始
root.mainloop()
ゆーや
ゆーや

メインウィンドウのボタンを押してみよう!
ボタンが効かないことがわかるよ!
(逆に他の時はボタンが押せてしまうことに注意!)

まとめ

本記事では、Toplevelを使って、Tkinterでサブウィンドウを表示する方法を紹介しました!

ポイントは以下の7つです!

① Tkinterでサブウィンドウを表示するには「Canvas(キャンバス)」を使う
② 「geometry」はウィンドウのサイズと位置を指定できる!
③ 「resizable」はウィンドウのサイズ変更の可否を設定できる!
④ 「transient」は親ウィンドウの前面に表示されるモーダルウィンドウを作成できる!
⑤ 「grab_set」は他のウィンドウにアクセス禁止できる!

ゆーや
ゆーや

まとめの内容を見て、もう頭に浮かべば完璧!

コメント

タイトルとURLをコピーしました