HOWTO · Tkinter

Tkinter ウィジェットを非表示、復元、および削除する方法

このチュートリアルでは、ボタンをクリックして Tkinter ウィジェットを非表示および復元する方法を示します。

このページの内容

ジオメトリマネージャーの forget メソッドを使うと、Tkinter ウィジェットを利用可能な状態のまま非表示にできます。再び表示するには、そのジオメトリマネージャーをもう一度呼び出します。ウィジェットを完全に削除する場合は destroy() を使います。一度破棄したウィジェットは、pack() や grid() を呼び出しても戻せません。例ではボタンのコールバックでラベルを操作します。ボタンのコールバックについて詳しくは、Tkinter のボタンガイドを参照してください。

Tkinter ウィジェットを非表示にして復元する

pack() で追加したウィジェットを画面から取り除くには、pack_forget() を呼び出します。ウィジェット自体は残るため、再び表示するときは pack() を呼び出せます。grid で管理しているウィジェットでは、grid_forget() は保存済みのグリッド設定を破棄し、grid_remove() は後で grid() を呼び出すときのために設定を保持します。各ウィジェットには1つのジオメトリマネージャーを使い、同じ親を共有するウィジェット間で pack() と grid() を混在させないでください。以下の例では、それぞれのラベルを別のフレームに配置しています。pack で管理する部品には pack() を使い、grid で管理する部品には各自のフレーム内でのみ grid() を使います。

画面を必要としない例では、非表示と復元の3つのケースで使うメソッドの選択肢を出力する構成です。Tkinter ウィンドウで試す場合は、それぞれのメソッド呼び出しをボタンに割り当てます。実際の GUI を使うには、デスクトップ画面が必要です。

methods = (
    ("hide a packed widget", "pack_forget()"),
    ("show a packed widget", "pack()"),
    ("hide and later restore grid placement", "grid_remove() then grid()"),
    ("hide and specify grid placement again", "grid_forget() then grid(row=0, column=0)"),
)

for task, method in methods:
    print(f"{task}: {method}")
hide a packed widget: pack_forget()
show a packed widget: pack()
hide and later restore grid placement: grid_remove() then grid()
hide and specify grid placement again: grid_forget() then grid(row=0, column=0)

この Python 3 の例は実際の Tkinter ボタンを作成し、各ボタンを表示名に対応するラベル操作に接続します。ウィンドウを使うには、Tk を利用できるデスクトップ環境で実行してください。コード内のボタン表示は英語のままです。

import tkinter as tk

try:
    root = tk.Tk()
except tk.TclError:
    print("This example needs a desktop display with Tk support.")
    raise SystemExit(0)
root.title("Hide and recover labels")

pack_frame = tk.Frame(root, padx=8, pady=8)
pack_frame.pack(fill="x")
pack_label = tk.Label(pack_frame, text="Packed label")
pack_label.pack()
tk.Button(pack_frame, text="Hide packed label", command=pack_label.pack_forget).pack()
tk.Button(pack_frame, text="Show packed label", command=pack_label.pack).pack()

grid_frame = tk.Frame(root, padx=8, pady=8)
grid_frame.pack(fill="x")
grid_label = tk.Label(grid_frame, text="Grid label")
grid_label.grid(row=0, column=0, padx=4)
tk.Button(grid_frame, text="Hide and retain grid options", command=grid_label.grid_remove).grid(row=0, column=1, padx=4)
tk.Button(grid_frame, text="Restore retained grid options", command=grid_label.grid).grid(row=1, column=0, padx=4)
tk.Button(
    grid_frame,
    text="Forget grid options",
    command=grid_label.grid_forget,
).grid(row=1, column=1, padx=4)
tk.Button(
    grid_frame,
    text="Restore at row 0, column 0",
    command=lambda: grid_label.grid(row=0, column=0, padx=4),
).grid(row=2, column=0, columnspan=2, pady=4)

root.mainloop()

pack で配置したラベルのボタンは、同じラベルに対して pack_forget() と pack() を呼び出します。grid のボタンでは、復元方法の違いを確認できます。grid_remove() は元の行と列を保持するため、引数なしの grid() コールバックで元の位置に戻せます。一方、grid_forget() はその設定を消すので、ボタン側で配置先を明示します。どちらの呼び出しもラベルを破棄せず、管理方法を変更します。ウィジェットの配置について詳しくは、Tkinter のジオメトリマネージャーを参照してください。

ボタンをクリックして Tkinter ウィジェットを完全に削除する

削除するウィジェットに destroy() を呼び出します。この例では「Delete label」ボタンが label.destroy を呼び出すため、ボタンではなくラベルが削除されます。コード内のボタン表示「Delete label」は英語のままです。破棄したウィジェットはジオメトリマネージャーでは復元できません。後で必要になった場合は、新しいラベルを作成してください。この Python 3 の例は、Tk を利用できるデスクトップ環境で実行し、「Delete label」をクリックするとウィンドウからラベルが削除されます。

import tkinter as tk

try:
    root = tk.Tk()
except tk.TclError:
    print("This example needs a desktop display with Tk support.")
    raise SystemExit(0)
root.title("Destroy a label")

label = tk.Label(root, text="This label will be removed")
label.pack(padx=8, pady=8)
tk.Button(root, text="Delete label", command=label.destroy).pack(padx=8, pady=8)

root.mainloop()