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()