布局管理器
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()
















