Widget Toplevel ใน Tkinter ใช้สร้างหน้าต่างเพิ่มเติมนอกเหนือจากหน้าต่างหลัก (Root Window) สามารถเพิ่ม Widget และ Component ต่างๆ ลงไปได้เหมือนหน้าต่างปกติ และรองรับคุณสมบัติทั้งหมดของหน้าต่างหลัก
บางครั้ง Toplevel เรียกว่า "Child Window" (หน้าต่างลูก) เพื่อให้นำหน้าต่างลูกมาแสดงหน้าหน้าต่างหลัก (Parent Window) สามารถใช้เมธอด wm_transient() ได้
ตัวอย่างโค้ด
import tkinter as tk
from tkinter import ttk
# สร้างหน้าต่างหลัก (Parent)
root = tk.Tk()
root.title("Parent Window - หน้าต่างหลัก")
root.geometry("600x400")
# เพิ่มเนื้อหาในหน้าต่างหลัก
ttk.Label(root, text="นี่คือหน้าต่างหลัก (Parent Window)", font=("Segoe UI", 16)).pack(pady=50)
ttk.Label(root, text="หน้าต่าง Toplevel จะแสดงทับอยู่ด้านหน้า", font=("Segoe UI", 10)).pack()
# สร้างหน้าต่าง Toplevel (Child)
top = tk.Toplevel(root)
top.title("Child Window - หน้าต่างลูก")
top.geometry("400x300")
# สำคัญ: นำ Toplevel มาไว้หน้าหน้าต่างหลัก
top.wm_transient(root)
# เพิ่มเนื้อหาใน Toplevel
ttk.Label(top, text="นี่คือ Toplevel Window", font=("Segoe UI", 16)).pack(pady=50)
ttk.Label(top, text="อยู่เหนือหน้าต่างหลักตลอดเวลา", font=("Segoe UI", 10)).pack()
ttk.Button(top, text="ปิดหน้าต่างนี้", command=top.destroy).pack(pady=20)
root.mainloop()
ผลลัพธ์
เมื่อรันโค้ด จะแสดงหน้าต่างหลัก และหน้าต่าง Toplevel ขึ้นมาทับอยู่ด้านหน้า หากคลิกที่หน้าต่างหลัก Toplevel จะไม่หายไป และจะอยู่หน้าตลอดจนกว่าจะปิด
คำแนะนำเพิ่มเติม
wm_transient(parent)ทำให้ Toplevel เป็น "Transient Window" ของ Parent - จะอยู่หน้า Parent เสมอ และซ่อนเมื่อ Parent ถูก Minimize- ใช้
top.grab_set()หากต้องการให้เป็น Modal Dialog (บังคับให้โฟกัสอยู่ที่ Toplevel จนกว่าจะปิด) - ใช้
top.protocol("WM_DELETE_WINDOW", callback)เพื่อจัดการเหตุการณ์ปิดหน้าต่างเอง - สามารถสร้าง Toplevel หลายระดับได้ (Toplevel ของ Toplevel)