Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีนำหน้าต่าง Toplevel มาไว้หน้าหน้าต่างหลักใน Tkinter

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)