几何管理的应用
# tkinter 库
是Python的标准GUI库,提供了创建图形用户界面的功能。 tkinter是一个跨平台的GUI库,支持Windows、macOS和Linux等操作系统。它是Python的标准库之一,无需额外安装。
#tkinter.Entry 是 Tkinter 的输入框控件类,调用它来创建一个新的文本输入框。
pack()包装 组件,允许你在父组件中添加子组件。pack()方法会将组件放置在父组件的顶部或底部,并自动调整大小和位置。
#padx 和pady 是pack方法的一个参数,表示在组件左右和上下添加的间距,单位是像素。
# fill="x" 是 pack() 布局的核心参数之一,用于控件的水平自适应 适用于需要控件动态响应窗口大小变化的场景(常与 expand =True 结合使用)
#grid()网格 布局管理器,允许你在父组件中创建一个网格,将组件放置在指定的行和列中。grid()方法允许你更精确地控制组件的位置和大小。
#columns 是grid方法把标签放置在第0行第0列网格单元格 设置sticky=“w”/“e” (左/右对齐) “n”/“s” (上/下对齐) “nsew” (四个方向对齐)”
#Sticky 是运用grid方法的一个参数,表示在组件上下添加的间距,单位是像素。
palce() 位置 管理器,允许你在父组件中指定组件的确切位置和大小。place()方法允许你使用绝对坐标来放置组件。
*实际应用案例《学生管理系统》
# 1、按系统需求分析,设计至少5个功能模块。
# 2、利用python程序设计编写UI界面, UI中需要有:button组件、label组件、Entry组件、布局等PythonTurtle画扇形。
# 3、该系统中的模块具有增、删、改、查的功能,查询页面等。
# 4、系统能应用Python程序流程结构、组合数据类型、函数、异常处理、文件操作、标准库、第三方库、类和对象等知识。
# 5、整个系统要运行流畅,不能出现异常的问题
# 6、系统要有注释,代码要规范,符合PEP8规范。
# 7、系统要有完整的文档,包含需求分析、设计说明书、测试报告等。
#tkinter 是Python的标准GUI库,提供了创建图形用户界面的功能。 tkinter是一个跨平台的GUI库,支持Windows、macOS和Linux等操作系统。它是Python的标准库之一,无需额外安装。
#tkinter.Entry 是 Tkinter 的输入框控件类,调用它来创建一个新的文本输入框。
# 几何管理的应用
# pack()包装 组件,允许你在父组件中添加子组件。pack()方法会将组件放置在父组件的顶部或底部,并自动调整大小和位置。
#padx 和pady 是pack方法的一个参数,表示在组件左右和上下添加的间距,单位是像素。
# fill="x" 是 pack() 布局的核心参数之一,用于控件的水平自适应 适用于需要控件动态响应窗口大小变化的场景(常与 expand =True 结合使用)
#grid()网格 布局管理器,允许你在父组件中创建一个网格,将组件放置在指定的行和列中。grid()方法允许你更精确地控制组件的位置和大小。
#columns 是grid方法把标签放置在第0行第0列网格单元格 设置sticky=“w”/“e” (左/右对齐) “n”/"s” (上/下对齐) “nsew” (四个方向对齐)"
#Sticky 是运用grid方法的一个参数,表示在组件上下添加的间距,单位是像素。
# palce() 位置 管理器,允许你在父组件中指定组件的确切位置和大小。place()方法允许你使用绝对坐标来放置组件。
import tkinter as tk
from tkinter import messagebox, ttk
import pickle
import os
class StudentManagementSystem:
def __init__(self, root):
self.root = root
self.root.title("学生管理系统")
self.root.geometry("800x600")
self.root.resizable(False, False)
# 学生数据存储
self.students = []
self.load_data()
# 创建UI
self.create_ui()
def load_data(self):
"""加载学生数据"""
if os.path.exists("students.dat"):
try:
with open("students.dat", "rb") as file:
self.students = pickle.load(file)
except Exception as e:
messagebox.showerror("错误", f"加载数据失败: {e}")
def save_data(self):
"""保存学生数据"""
try:
with open("students.dat", "wb") as file:
pickle.dump(self.students, file)
except Exception as e:
messagebox.showerror("错误", f"保存数据失败: {e}")
def create_ui(self):
"""创建UI界面"""
# 标题
title_label = tk.Label(self.root, text="学生管理系统", font=("Arial", 16, "bold"))
title_label.pack(pady=10)
# 输入区域
input_frame = tk.Frame(self.root)
input_frame.pack(pady=10, fill="x", padx=20)
# 学号
tk.Label(input_frame, text="学号:").grid(row=0, column=0, padx=5, pady=5, sticky="w")
self.id_entry = tk.Entry(input_frame, width=20)
self.id_entry.grid(row=0, column=1, padx=5, pady=5)
# 姓名
tk.Label(input_frame, text="姓名:").grid(row=0, column=2, padx=5, pady=5, sticky="w")
self.name_entry = tk.Entry(input_frame, width=20)
self.name_entry.grid(row=0, column=3, padx=5, pady=5)
# 年龄
tk.Label(input_frame, text="年龄:").grid(row=1, column=0, padx=5, pady=5, sticky="w")
self.age_entry = tk.Entry(input_frame, width=20)
self.age_entry.grid(row=1, column=1, padx=5, pady=5)
# 性别
tk.Label(input_frame, text="性别:").grid(row=1, column=2, padx=5, pady=5, sticky="w")
self.gender_entry = tk.Entry(input_frame, width=20)
self.gender_entry.grid(row=1, column=3, padx=5, pady=5)
# 操作按钮
button_frame = tk.Frame(self.root)
button_frame.pack(pady=10, fill="x", padx=20)
tk.Button(button_frame, text="添加学生", command=self.add_student).pack(side=tk.LEFT, padx=5)
tk.Button(button_frame, text="删除学生", command=self.delete_student).pack(side=tk.LEFT, padx=5)
tk.Button(button_frame, text="修改学生", command=self.update_student).pack(side=tk.LEFT, padx=5)
tk.Button(button_frame, text="查询学生", command=self.search_student).pack(side=tk.LEFT, padx=5)
# 学生列表
self.tree = ttk.Treeview(self.root, columns=("ID", "Name", "Age", "Gender"), show="headings")
self.tree.heading("ID", text="学号")
self.tree.heading("Name", text="姓名")
self.tree.heading("Age", text="年龄")
self.tree.heading("Gender", text="性别")
self.tree.pack(pady=10, fill="both", expand=True, padx=20)
# 绑定双击事件
self.tree.bind("<Double-1>", self.on_double_click)
# 搜索栏
search_frame = tk.Frame(self.root)
search_frame.pack(pady=10, fill="x", padx=20)
tk.Label(search_frame, text="搜索:").pack(side=tk.LEFT, padx=5)
self.search_entry = tk.Entry(search_frame, width=30)
self.search_entry.pack(side=tk.LEFT, padx=5)
tk.Button(search_frame, text="搜索", command=self.search_student).pack(side=tk.LEFT, padx=5)
# 刷新列表
self.refresh_student_list()
def refresh_student_list(self):
"""刷新学生列表"""
for item in self.tree.get_children():
self.tree.delete(item)
for student in self.students:
self.tree.insert("", "end", values=(student["id"], student["name"], student["age"], student["gender"]))
def add_student(self):
"""添加学生"""
try:
id = self.id_entry.get().strip()
name = self.name_entry.get().strip()
age = self.age_entry.get().strip()
gender = self.gender_entry.get().strip()
if not id or not name or not age or not gender:
messagebox.showwarning("警告", "请填写所有字段")
return
if not age.isdigit():
messagebox.showwarning("警告", "年龄必须是数字")
return
# 检查学号是否已存在
for student in self.students:
if student["id"] == id:
messagebox.showwarning("警告", "学号已存在")
return
self.students.append({"id": id, "name": name, "age": age, "gender": gender})
self.save_data()
self.refresh_student_list()
self.clear_entries()
messagebox.showinfo("成功", "学生添加成功")
except Exception as e:
messagebox.showerror("错误", f"添加学生失败: {e}")
def delete_student(self):
"""删除学生"""
try:
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("警告", "请选择要删除的学生")
return
item_id = self.tree.item(selected_item, "values")[0]
for i, student in enumerate(self.students):
if student["id"] == item_id:
del self.students[i]
self.save_data()
self.refresh_student_list()
messagebox.showinfo("成功", "学生删除成功")
return
except Exception as e:
messagebox.showerror("错误", f"删除学生失败: {e}")
def update_student(self):
"""修改学生"""
try:
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("警告", "请选择要修改的学生")
return
item_id = self.tree.item(selected_item, "values")[0]
for student in self.students:
if student["id"] == item_id:
id = self.id_entry.get().strip()
name = self.name_entry.get().strip()
age = self.age_entry.get().strip()
gender = self.gender_entry.get().strip()
if not id or not name or not age or not gender:
messagebox.showwarning("警告", "请填写所有字段")
return
if not age.isdigit():
messagebox.showwarning("警告", "年龄必须是数字")
return
student["id"] = id
student["name"] = name
student["age"] = age
student["gender"] = gender
self.save_data()
self.refresh_student_list()
messagebox.showinfo("成功", "学生信息修改成功")
return
except Exception as e:
messagebox.showerror("错误", f"修改学生失败: {e}")
def search_student(self):
"""查询学生"""
try:
keyword = self.search_entry.get().strip()
if not keyword:
self.refresh_student_list()
return
for item in self.tree.get_children():
self.tree.delete(item)
for student in self.students:
if (keyword in student["id"] or
keyword in student["name"] or
keyword in student["age"] or
keyword in student["gender"]):
self.tree.insert("", "end", values=(student["id"], student["name"], student["age"], student["gender"]))
except Exception as e:
messagebox.showerror("错误", f"查询学生失败: {e}")
def on_double_click(self, event):
"""双击事件处理"""
try:
selected_item = self.tree.selection()
if not selected_item:
return
item_values = self.tree.item(selected_item, "values")
self.id_entry.delete(0, tk.END)
self.name_entry.delete(0, tk.END)
self.age_entry.delete(0, tk.END)
self.gender_entry.delete(0, tk.END)
self.id_entry.insert(0, item_values[0])
self.name_entry.insert(0, item_values[1])
self.age_entry.insert(0, item_values[2])
self.gender_entry.insert(0, item_values[3])
except Exception as e:
messagebox.showerror("错误", f"双击事件处理失败: {e}")
def clear_entries(self):
"""清空输入框"""
self.id_entry.delete(0, tk.END)
self.name_entry.delete(0, tk.END)
self.age_entry.delete(0, tk.END)
self.gender_entry.delete(0, tk.END)
if __name__ == "__main__":
root = tk.Tk()
app = StudentManagementSystem(root)
root.mainloop()