布局管理器

Tkinter 有三种布局管理器:

1. pack() - 简单布局

import tkinter as tk

root = tk.Tk()
root.title("Pack 布局")
root.geometry("300x200")

# pack 按照添加顺序排列
label1 = tk.Label(root, text="标签1", bg="red", fg="white")
label1.pack(fill="x", padx=10, pady=5)

label2 = tk.Label(root, text="标签2", bg="green", fg="white")
label2.pack(fill="x", padx=10, pady=5)

label3 = tk.Label(root, text="标签3", bg="blue", fg="white")
label3.pack(fill="x", padx=10, pady=5)

root.mainloop()

2. grid() - 网格布局

import tkinter as tk

root = tk.Tk()
root.title("Grid 布局")
root.geometry("300x200")

# 使用 grid 按行和列排列
label1 = tk.Label(root, text="(0,0)", bg="red", fg="white")
label1.grid(row=0, column=0, padx=5, pady=5, sticky="ew")

label2 = tk.Label(root, text="(0,1)", bg="green", fg="white")
label2.grid(row=0, column=1, padx=5, pady=5, sticky="ew")

label3 = tk.Label(root, text="(1,0)", bg="blue", fg="white")
label3.grid(row=1, column=0, padx=5, pady=5, sticky="ew")

label4 = tk.Label(root, text="(1,1)", bg="yellow", fg="black")
label4.grid(row=1, column=1, padx=5, pady=5, sticky="ew")

# 配置列权重使列可以扩展
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)

root.mainloop()

3. place() - 绝对位置布局

import tkinter as tk

root = tk.Tk()
root.title("Place 布局")
root.geometry("400x300")

# 使用 place 精确控制位置
label1 = tk.Label(root, text="绝对位置", bg="red", fg="white")
label1.place(x=50, y=50)

label2 = tk.Label(root, text="相对位置", bg="green", fg="white")
label2.place(relx=0.5, rely=0.5, anchor="center")  # 窗口中心

label3 = tk.Label(root, text="右下角", bg="blue", fg="white")
label3.place(relx=1.0, rely=1.0, anchor="se")  # 窗口右下角

root.mainloop()

完整示例

import tkinter as tk
from tkinter import messagebox, ttk

class MyWindow:
    def __init__(self):
        self.root = tk.Tk()
        self.setup_window()
        self.create_widgets()
        
    def setup_window(self):
        self.root.title("完整的 Tkinter 窗口示例")
        self.root.geometry("500x400")
        self.root.resizable(True, True)
        self.root.configure(bg="white")
        
        # 居中显示
        self.root.eval('tk::PlaceWindow . center')
    
    def create_widgets(self):
        # 创建框架容器
        main_frame = tk.Frame(self.root, bg="white")
        main_frame.pack(fill="both", expand=True, padx=20, pady=20)
        
        # 标题
        title_label = tk.Label(main_frame, text="用户信息表单", 
                              font=("Arial", 16, "bold"), bg="white")
        title_label.pack(pady=10)
        
        # 表单框架
        form_frame = tk.Frame(main_frame, bg="white")
        form_frame.pack(fill="x", pady=10)
        
        # 姓名
        tk.Label(form_frame, text="姓名:", bg="white").grid(row=0, column=0, sticky="w", pady=5)
        self.name_entry = tk.Entry(form_frame, width=30)
        self.name_entry.grid(row=0, column=1, padx=10, pady=5, sticky="ew")
        
        # 性别
        tk.Label(form_frame, text="性别:", bg="white").grid(row=1, column=0, sticky="w", pady=5)
        self.gender_var = tk.StringVar(value="男")
        tk.Radiobutton(form_frame, text="男", variable=self.gender_var, 
                      value="男", bg="white").grid(row=1, column=1, sticky="w")
        tk.Radiobutton(form_frame, text="女", variable=self.gender_var, 
                      value="女", bg="white").grid(row=1, column=2, sticky="w")
        
        # 城市
        tk.Label(form_frame, text="城市:", bg="white").grid(row=2, column=0, sticky="w", pady=5)
        self.city_combo = ttk.Combobox(form_frame, values=["北京", "上海", "广州", "深圳"])
        self.city_combo.grid(row=2, column=1, padx=10, pady=5, sticky="ew")
        
        # 配置列权重
        form_frame.columnconfigure(1, weight=1)
        
        # 按钮框架
        button_frame = tk.Frame(main_frame, bg="white")
        button_frame.pack(pady=20)
        
        # 提交按钮
        submit_btn = tk.Button(button_frame, text="提交", command=self.submit_form,
                              bg="#4CAF50", fg="white", font=("Arial", 10))
        submit_btn.pack(side="left", padx=10)
        
        # 清除按钮
        clear_btn = tk.Button(button_frame, text="清除", command=self.clear_form,
                             bg="#f44336", fg="white", font=("Arial", 10))
        clear_btn.pack(side="left", padx=10)
        
        # 退出按钮
        exit_btn = tk.Button(button_frame, text="退出", command=self.root.quit,
                            bg="#607D8B", fg="white", font=("Arial", 10))
        exit_btn.pack(side="left", padx=10)
    
    def submit_form(self):
        name = self.name_entry.get()
        gender = self.gender_var.get()
        city = self.city_combo.get()
        
        if not name:
            messagebox.showerror("错误", "请输入姓名!")
            return
            
        info = f"姓名: {name}\n性别: {gender}\n城市: {city}"
        messagebox.showinfo("提交信息", info)
    
    def clear_form(self):
        self.name_entry.delete(0, tk.END)
        self.gender_var.set("男")
        self.city_combo.set("")
    
    def run(self):
        self.root.mainloop()

# 运行应用
if __name__ == "__main__":
    app = MyWindow()
    app.run()