import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
class TtkDemoApp:
def __init__(self, root):
self.root = root
self.root.title("ttk 综合示例")
self.root.geometry("500x500")
# 创建样式
self.setup_styles()
# 创建界面
self.create_widgets()
def setup_styles(self):
"""设置自定义样式"""
self.style = ttk.Style()
self.style.theme_use("clam")
# 配置默认按钮样式
self.style.configure(
"TButton",
padding=6,
font=("Arial", 10)
)
# 创建成功按钮样式
self.style.configure(
"Success.TButton",
foreground="green",
font=("Arial", 10, "bold")
)
def create_widgets(self):
"""创建所有界面组件"""
# 创建笔记本(标签页)
self.notebook = ttk.Notebook(self.root)
self.notebook.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
# 创建第一个标签页 - 表单
self.create_form_tab()
# 创建第二个标签页 - 数据展示
self.create_data_tab()
def create_form_tab(self):
"""创建表单标签页"""
form_frame = ttk.Frame(self.notebook)
self.notebook.add(form_frame, text="表单")
# 表单标题
ttk.Label(
form_frame,
text="用户注册表单",
font=("Arial", 14, "bold")
).pack(pady=10)
# 用户名输入
ttk.Label(form_frame, text="用户名:").pack()
self.username = ttk.Entry(form_frame, width=30)
self.username.pack(pady=5)
# 密码输入
ttk.Label(form_frame, text="密码:").pack()
self.password = ttk.Entry(form_frame, width=30, show="*")
self.password.pack(pady=5)
# 性别选择
ttk.Label(form_frame, text="性别:").pack()
self.gender = tk.StringVar()
ttk.Radiobutton(form_frame, text="男", variable=self.gender, value="male").pack()
ttk.Radiobutton(form_frame, text="女", variable=self.gender, value="female").pack()
# 兴趣爱好
ttk.Label(form_frame, text="兴趣爱好:").pack()
self.hobbies = {
"reading": tk.BooleanVar(),
"sports": tk.BooleanVar(),
"music": tk.BooleanVar()
}
ttk.Checkbutton(form_frame, text="阅读", variable=self.hobbies["reading"]).pack()
ttk.Checkbutton(form_frame, text="运动", variable=self.hobbies["sports"]).pack()
ttk.Checkbutton(form_frame, text="音乐", variable=self.hobbies["music"]).pack()
# 提交按钮
ttk.Button(
form_frame,
text="提交",
style="Success.TButton",
command=self.submit_form
).pack(pady=20)
def create_data_tab(self):
"""创建数据展示标签页"""
data_frame = ttk.Frame(self.notebook)
self.notebook.add(data_frame, text="数据")
# 树视图
self.tree = ttk.Treeview(
data_frame,
columns=("name", "age", "department"),
show="headings"
)
# 设置列
self.tree.heading("name", text="姓名")
self.tree.heading("age", text="年龄")
self.tree.heading("department", text="部门")
# 设置列宽
self.tree.column("name", width=100)
self.tree.column("age", width=50)
self.tree.column("department", width=150)
self.tree.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
# 添加一些示例数据
self.add_sample_data()
# 添加控制按钮
control_frame = ttk.Frame(data_frame)
control_frame.pack(pady=5)
ttk.Button(
control_frame,
text="添加数据",
command=self.add_data
).pack(side=tk.LEFT, padx=5)
ttk.Button(
control_frame,
text="删除选中",
command=self.delete_selected
).pack(side=tk.LEFT, padx=5)
def add_sample_data(self):
"""添加示例数据到树视图"""
sample_data = [
("张三", 28, "技术部"),
("李四", 32, "市场部"),
("王五", 25, "人事部")
]
for data in sample_data:
self.tree.insert("", tk.END, values=data)
def add_data(self):
"""添加新数据"""
self.tree.insert("", tk.END, values=("新员工", 0, "未分配"))
def delete_selected(self):
"""删除选中行"""
selected_item = self.tree.selection()
if selected_item:
self.tree.delete(selected_item)
else:
messagebox.showwarning("警告", "请先选择要删除的行")
def submit_form(self):
"""处理表单提交"""
username = self.username.get()
password = self.password.get()
gender = self.gender.get()
hobbies = [hobby for hobby, var in self.hobbies.items() if var.get()]
if not username or not password:
messagebox.showerror("错误", "用户名和密码不能为空")
return
message = f"""
注册信息:
用户名: {username}
性别: {gender if gender else '未选择'}
兴趣爱好: {', '.join(hobbies) if hobbies else '无'}
"""
messagebox.showinfo("注册成功", message)
self.username.delete(0, tk.END)
self.password.delete(0, tk.END)
self.gender.set("")
for var in self.hobbies.values():
var.set(False)
if __name__ == "__main__":
root = tk.Tk()
app = TtkDemoApp(root)
root.mainloop()
|