基于Python tk的学生信息管理
以下内容仅为自己python语言练手与记忆所写,代码注释大部分为al生成有任何不足之处请见谅。
各位读者有兴趣的可以完善该项目,如进行界面美化,引用数据库增加别的功能等等。
以下是各个文件的作用说明:
students.json
存储学生信息的数据文件,采用 JSON 格式。每个学生信息包含姓名(name)、数学成绩(math)、语文成绩(chinese)、英语成绩(english),是系统数据的持久化存储载体。
学生信息管理系统 tk 版.py
系统的登录界面模块,基于 Tkinter 实现。
提供用户名和密码输入框,通过check_login方法验证登录信息(默认用户名admin,密码123456)。
登录成功后销毁登录界面,跳转至主功能界面(MainPage)。
views.py
定义了系统的各个功能界面,均继承自tk.Frame:
InsertFrame:学生信息录入界面,支持输入姓名和三门成绩,验证后通过add_student保存数据。
SearchFrame:学生信息查询界面,可通过关键词搜索并在列表中显示结果。
DeleteFrame:学生信息删除界面,输入姓名后删除对应学生,并刷新列表。
UpdateFrame:学生信息修改界面,先搜索学生,再编辑信息并更新。
AboutFrame:系统关于界面,显示版本、开发者等信息。
main.py
系统的主界面模块,负责整合各功能界面并提供导航:
创建菜单栏,包含 “录入”“查询”“删除”“修改”“关于” 选项。
通过hide_all_frames和show_xxx_frame方法切换不同功能界面,默认显示录入界面。
data_handler.py
数据处理模块,提供与students.json文件交互的工具函数:
load_data/save_data:加载 / 保存 JSON 数据。
add_student/delete_student/update_student:添加 / 删除 / 更新学生信息。
search_students:根据关键词搜索学生(默认按姓名搜索)。
main.py文件
# main.py # 1:文件说明
import tkinter as tk # 2:导入tkinter库,用于创建GUI
from data_handler import load_data # 3:从data_handler模块导入load_data函数(加载学生数据)
from views import InsertFrame, SearchFrame, DeleteFrame, UpdateFrame, AboutFrame # 4:从views模块导入各功能页面类
class MainPage: # 5:定义主页面类,管理整个系统的界面切换
def __init__(self, root2): # 6:初始化方法,接收主窗口对象
self.root = root2 # 7:保存主窗口对象到实例变量
self.root.title('学生信息管理系统 v1.0') # 8:设置窗口标题
self.root.geometry('700x500') # 9:设置窗口初始大小(宽700,高500)
self.create_page() # 10:调用create_page方法创建菜单栏
# 创建各个页面 # 11:注释:说明以下代码作用
self.insert_frame = InsertFrame(self.root) # 12:实例化录入页面(InsertFrame)
self.search_frame = SearchFrame(self.root) # 13:实例化查询页面(SearchFrame)
self.delete_frame = DeleteFrame(self.root) # 14:实例化删除页面(DeleteFrame)
self.update_frame = UpdateFrame(self.root) # 15:实例化修改页面(UpdateFrame)
self.about_frame = AboutFrame(self.root) # 16:实例化关于页面(AboutFrame)
# 默认显示录入页面 # 17:注释:说明默认显示的页面
self.show_insert_frame() # 18:调用方法显示录入页面
def create_page(self): # 19:定义创建菜单栏的方法
menu_bar = tk.Menu(self.root) # 20:创建菜单栏对象
# 向菜单栏添加命令(对应各功能页面) # 21:注释:说明以下代码作用
menu_bar.add_command(label='录入', command=self.show_insert_frame) # 22:添加“录入”菜单,点击调用显示录入页面的方法
menu_bar.add_command(label='查询', command=self.show_search_frame) # 23:添加“查询”菜单,点击调用显示查询页面的方法
menu_bar.add_command(label='删除', command=self.show_delete_frame) # 24:添加“删除”菜单,点击调用显示删除页面的方法
menu_bar.add_command(label='修改', command=self.show_update_frame) # 25:添加“修改”菜单,点击调用显示修改页面的方法
menu_bar.add_command(label='关于', command=self.show_about_frame) # 26:添加“关于”菜单,点击调用显示关于页面的方法
self.root['menu'] = menu_bar # 设置菜单栏 # 27:将菜单栏绑定到主窗口
def hide_all_frames(self): # 28:定义隐藏所有页面的方法(用于切换页面时清空当前显示)
"""隐藏所有框架""" # 29:文档字符串:说明方法功能
self.insert_frame.pack_forget() # 30:隐藏录入页面(取消pack布局)
self.search_frame.pack_forget() # 31:隐藏查询页面
self.delete_frame.pack_forget() # 32:隐藏删除页面
self.update_frame.pack_forget() # 33:隐藏修改页面
self.about_frame.pack_forget() # 34:隐藏关于页面
def show_insert_frame(self): # 35:定义显示录入页面的方法
self.hide_all_frames() # 36:先隐藏所有页面
self.insert_frame.pack(fill=tk.BOTH, expand=True) # 37:显示录入页面(填充整个窗口并允许扩展)
def show_search_frame(self): # 38:定义显示查询页面的方法
self.hide_all_frames() # 39:先隐藏所有页面
self.search_frame.pack(fill=tk.BOTH, expand=True) # 40:显示查询页面
# 刷新搜索页面显示 # 41:注释:说明以下代码作用
self.search_frame.display_students(load_data()) # 42:调用查询页面的display_students方法,加载并显示所有学生数据
def show_delete_frame(self): # 43:定义显示删除页面的方法
self.hide_all_frames() # 44:先隐藏所有页面
self.delete_frame.pack(fill=tk.BOTH, expand=True) # 45:显示删除页面
# 刷新删除页面显示 # 46:注释:说明以下代码作用
self.delete_frame.display_students(load_data()) # 47:调用删除页面的display_students方法,加载并显示所有学生数据
def show_update_frame(self): # 48:定义显示修改页面的方法
self.hide_all_frames() # 49:先隐藏所有页面
self.update_frame.pack(fill=tk.BOTH, expand=True) # 50:显示修改页面
def show_about_frame(self): # 51:定义显示关于页面的方法
self.hide_all_frames() # 52:先隐藏所有页面
self.about_frame.pack(fill=tk.BOTH, expand=True) # 53:显示关于页面
if __name__ == "__main__": # 54:判断是否为主程序入口
root = tk.Tk() # 55:创建tkinter主窗口对象
app = MainPage(root) # 56:实例化MainPage类,传入主窗口
root.mainloop() # 57:启动主窗口事件循环(保持窗口显示)
views.py文件
# views.py # 1:文件说明
import tkinter as tk # 2:导入tkinter库
import tkinter.messagebox as messagebox # 3:导入消息框模块(用于弹出提示)
from data_handler import * # 4:导入data_handler模块的所有函数(处理数据读写)
class InsertFrame(tk.Frame): # 5:定义录入页面类(继承自tk.Frame)
def __init__(self, root): # 6:初始化方法,接收父窗口对象
super().__init__(master=root) # 7:调用父类(tk.Frame)的初始化方法
# 定义字符串变量,用于绑定输入框内容 # 8:注释:说明以下变量作用
self.name = tk.StringVar() # 9:存储学生姓名的变量
self.math = tk.StringVar() # 10:存储数学成绩的变量
self.chinese = tk.StringVar() # 11:存储语文成绩的变量
self.english = tk.StringVar() # 12:存储英语成绩的变量
self.status = tk.StringVar() # 13:存储状态提示信息的变量
self.create_page() # 14:调用create_page方法创建页面元素
def create_page(self): # 15:定义创建录入页面元素的方法
# 创建标题标签 # 16:注释:说明以下代码作用
tk.Label(self, text='学生信息录入', font=('Arial', 16)).grid(row=0, column=0, columnspan=2, pady=10) # 17:标题“学生信息录入”,字体16号Arial,占2列,上下边距10
# 姓名输入区域 # 18:注释:说明以下代码作用
tk.Label(self, text='姓名:').grid(row=1, column=0, padx=10, pady=5, sticky='e') # 19:“姓名:”标签,位于(1,0),左右边距10,上下边距5,右对齐
tk.Entry(self, textvariable=self.name, width=20).grid(row=1, column=1, padx=10, pady=5) # 20:姓名输入框,绑定self.name变量,宽20,位于(1,1)
# 数学成绩输入区域 # 21:注释:说明以下代码作用
tk.Label(self, text='数学成绩:').grid(row=2, column=0, padx=10, pady=5, sticky='e') # 22:“数学成绩:”标签,位于(2,0)
tk.Entry(self, textvariable=self.math, width=20).grid(row=2, column=1, padx=10, pady=5) # 23:数学成绩输入框,绑定self.math变量,位于(2,1)
# 语文成绩输入区域 # 24:注释:说明以下代码作用
tk.Label(self, text='语文成绩:').grid(row=3, column=0, padx=10, pady=5, sticky='e') # 25:“语文成绩:”标签,位于(3,0)
tk.Entry(self, textvariable=self.chinese, width=20).grid(row=3, column=1, padx=10, pady=5) # 26:语文成绩输入框,绑定self.chinese变量,位于(3,1)
# 英语成绩输入区域 # 27:注释:说明以下代码作用
tk.Label(self, text='英语成绩:').grid(row=4, column=0, padx=10, pady=5, sticky='e') # 28:“英语成绩:”标签,位于(4,0)
tk.Entry(self, textvariable=self.english, width=20).grid(row=4, column=1, padx=10, pady=5) # 29:英语成绩输入框,绑定self.english变量,位于(4,1)
# 录入按钮和状态标签 # 30:注释:说明以下代码作用
tk.Button(self, text='录入', command=self.record, width=10).grid(row=5, column=0, columnspan=2, pady=10) # 31:“录入”按钮,点击调用record方法,宽10,占2列,上下边距10
tk.Label(self, textvariable=self.status, fg='green').grid(row=6, column=0, columnspan=2) # 32:状态提示标签,绑定self.status变量,文字绿色,占2列
def record(self): # 33:定义录入数据的方法
# 验证输入 # 34:注释:说明以下代码作用
if not self.name.get(): # 35:判断姓名是否为空(get()获取输入框内容)
self.status.set("姓名不能为空") # 36:设置状态提示“姓名不能为空”
return # 37:终止方法执行
try: # 38:尝试将成绩转换为浮点数(验证是否为数字)
math_score = float(self.math.get()) # 39:将数学成绩转换为浮点数
chinese_score = float(self.chinese.get()) # 40:将语文成绩转换为浮点数
english_score = float(self.english.get()) # 41:将英语成绩转换为浮点数
except ValueError: # 42:若转换失败(输入非数字)
self.status.set("成绩必须是数字") # 43:设置状态提示“成绩必须是数字”
return # 44:终止方法执行
# 创建学生信息字典 # 45:注释:说明以下代码作用
student = { # 46:定义学生信息字典
'name': self.name.get(), # 47:姓名
'math': math_score, # 48:数学成绩
'chinese': chinese_score, # 49:语文成绩
'english': english_score # 50:英语成绩
}
# 保存数据 # 51:注释:说明以下代码作用
add_student(student) # 52:调用add_student函数保存学生信息
# 清空输入框 # 53:注释:说明以下代码作用
self.name.set("") # 54:清空姓名输入框
self.math.set("") # 55:清空数学成绩输入框
self.chinese.set("") # 56:清空语文成绩输入框
self.english.set("") # 57:清空英语成绩输入框
self.status.set("录入成功!") # 58:设置状态提示“录入成功!”
# 3秒后清除状态消息 # 59:注释:说明以下代码作用
self.after(3000, lambda: self.status.set("")) # 60:3000毫秒(3秒)后执行匿名函数,清空状态提示
class SearchFrame(tk.Frame): # 61:定义查询页面类(继承自tk.Frame)
def __init__(self, root): # 62:初始化方法,接收父窗口对象
super().__init__(master=root) # 63:调用父类初始化方法
self.search_keyword = tk.StringVar() # 64:存储搜索关键词的变量
self.create_page() # 65:调用create_page方法创建页面元素
def create_page(self): # 66:定义创建查询页面元素的方法
# 标题 # 67:注释:说明以下代码作用
tk.Label(self, text='学生信息查询', font=('Arial', 16)).grid(row=0, column=0, columnspan=3, pady=10) # 68:标题“学生信息查询”,占3列
# 搜索区域 # 69:注释:说明以下代码作用
tk.Label(self, text='搜索关键词:').grid(row=1, column=0, padx=5, pady=5, sticky='e') # 70:“搜索关键词:”标签,位于(1,0)
tk.Entry(self, textvariable=self.search_keyword, width=20).grid(row=1, column=1, padx=5, pady=5) # 71:搜索输入框,绑定self.search_keyword变量,位于(1,1)
tk.Button(self, text='搜索', command=self.search).grid(row=1, column=2, padx=5, pady=5) # 72:“搜索”按钮,点击调用search方法,位于(1,2)
# 创建列表框和滚动条 # 73:注释:说明以下代码作用
self.listbox = tk.Listbox(self, width=50, height=15) # 74:创建列表框(显示查询结果),宽50,高15
self.listbox.grid(row=2, column=0, columnspan=3, padx=10, pady=10) # 75:列表框布局,占3列
scrollbar = tk.Scrollbar(self, orient="vertical") # 76:创建垂直滚动条
scrollbar.config(command=self.listbox.yview) # 77:绑定滚动条与列表框的y轴视图(滚动时列表框同步滚动)
scrollbar.grid(row=2, column=3, sticky='ns', pady=10) # 78:滚动条布局,位于(2,3),上下拉伸
self.listbox.config(yscrollcommand=scrollbar.set) # 79:绑定列表框与滚动条(列表框滚动时更新滚动条位置)
# 初始显示所有学生 # 80:注释:说明以下代码作用
self.display_students(load_data()) # 81:调用display_students方法,加载并显示所有学生数据
def search(self): # 82:定义搜索方法
keyword = self.search_keyword.get() # 83:获取搜索关键词
students = search_students(keyword) # 84:调用search_students函数查询学生(返回匹配结果)
self.display_students(students) # 85:调用display_students方法显示查询结果
def display_students(self, students): # 86:定义显示学生数据的方法(接收学生列表)
self.listbox.delete(0, tk.END) # 87:清空列表框(从第0项到最后一项)
for student in students: # 88:遍历学生列表
# 格式化学生信息字符串 # 89:注释:说明以下代码作用
info = f"姓名: {student['name']}, 数学: {student['math']}, 语文: {student['chinese']}, 英语: {student['english']}" # 90:拼接学生信息(姓名+各科成绩)
self.listbox.insert(tk.END, info) # 91:将格式化信息插入列表框末尾
class DeleteFrame(tk.Frame): # 92:定义删除页面类(继承自tk.Frame)
def __init__(self, root): # 93:初始化方法,接收父窗口对象
super().__init__(master=root) # 94:调用父类初始化方法
self.delete_name = tk.StringVar() # 95:存储待删除学生姓名的变量
self.status = tk.StringVar() # 96:存储状态提示信息的变量
self.create_page() # 97:调用create_page方法创建页面元素
def create_page(self): # 98:定义创建删除页面元素的方法
# 标题 # 99:注释:说明以下代码作用
tk.Label(self, text='删除学生信息', font=('Arial', 16)).grid(row=0, column=0, columnspan=2, pady=10) # 100:标题“删除学生信息”,占2列
# 输入区域 # 101:注释:说明以下代码作用
tk.Label(self, text='要删除的学生姓名:').grid(row=1, column=0, padx=10, pady=5, sticky='e') # 102:“要删除的学生姓名:”标签,位于(1,0)
tk.Entry(self, textvariable=self.delete_name, width=20).grid(row=1, column=1, padx=10, pady=5) # 103:姓名输入框,绑定self.delete_name变量,位于(1,1)
# 删除按钮和状态标签 # 104:注释:说明以下代码作用
tk.Button(self, text='删除', command=self.delete, width=10).grid(row=2, column=0, columnspan=2, pady=10) # 105:“删除”按钮,点击调用delete方法,占2列
tk.Label(self, textvariable=self.status, fg='red').grid(row=3, column=0, columnspan=2) # 106:状态提示标签,文字红色,占2列
# 显示所有学生 # 107:注释:说明以下代码作用
self.listbox = tk.Listbox(self, width=50, height=10) # 108:创建列表框(显示所有学生),宽50,高10
self.listbox.grid(row=4, column=0, columnspan=2, padx=10, pady=10) # 109:列表框布局,占2列
scrollbar = tk.Scrollbar(self, orient="vertical") # 110:创建垂直滚动条
scrollbar.config(command=self.listbox.yview) # 111:绑定滚动条与列表框y轴视图
scrollbar.grid(row=4, column=2, sticky='ns', pady=10) # 112:滚动条布局,位于(4,2)
self.listbox.config(yscrollcommand=scrollbar.set) # 113:绑定列表框与滚动条
self.display_students(load_data()) # 114:调用display_students方法,加载并显示所有学生数据
def delete(self): # 115:定义删除方法
name = self.delete_name.get() # 116:获取待删除学生姓名
if not name: # 117:判断姓名是否为空
self.status.set("请输入学生姓名") # 118:提示“请输入学生姓名”
return # 119:终止方法
if delete_student(name): # 120:调用delete_student函数删除学生(返回是否删除成功)
self.status.set(f"成功删除学生: {name}") # 121:提示“成功删除学生: XXX”
self.delete_name.set("") # 122:清空输入框
# 刷新列表 # 123:注释:说明以下代码作用
self.display_students(load_data()) # 124:重新加载并显示学生数据(刷新列表)
else: # 125:若未找到学生
self.status.set(f"未找到学生: {name}") # 126:提示“未找到学生: XXX”
# 3秒后清除状态消息 # 127:注释:说明以下代码作用
self.after(3000, lambda: self.status.set("")) # 128:3秒后清空状态提示
def display_students(self, students): # 129:定义显示学生数据的方法(与SearchFrame类似)
self.listbox.delete(0, tk.END) # 130:清空列表框
for student in students: # 131:遍历学生列表
info = f"姓名: {student['name']}, 数学: {student['math']}, 语文: {student['chinese']}, 英语: {student['english']}" # 132:格式化学生信息
self.listbox.insert(tk.END, info) # 133:插入列表框
class UpdateFrame(tk.Frame): # 134:定义修改页面类(继承自tk.Frame)
def __init__(self, root): # 135:初始化方法,接收父窗口对象
super().__init__(master=root) # 136:调用父类初始化方法
# 定义变量 # 137:注释:说明以下变量作用
self.search_name = tk.StringVar() # 138:存储待搜索学生姓名的变量
self.name = tk.StringVar() # 139:存储修改后姓名的变量
self.math = tk.StringVar() # 140:存储修改后数学成绩的变量
self.chinese = tk.StringVar() # 141:存储修改后语文成绩的变量
self.english = tk.StringVar() # 142:存储修改后英语成绩的变量
self.status = tk.StringVar() # 143:存储状态提示信息的变量
self.current_student = None # 144:存储当前选中的学生信息(初始为None)
self.create_page() # 145:调用create_page方法创建页面元素
def create_page(self): # 146:定义创建修改页面元素的方法
# 标题 # 147:注释:说明以下代码作用
tk.Label(self, text='修改学生信息', font=('Arial', 16)).grid(row=0, column=0, columnspan=2, pady=10) # 148:标题“修改学生信息”,占2列
# 搜索区域 # 149:注释:说明以下代码作用
tk.Label(self, text='要修改的学生姓名:').grid(row=1, column=0, padx=10, pady=5, sticky='e') # 150:“要修改的学生姓名:”标签,位于(1,0)
tk.Entry(self, textvariable=self.search_name, width=20).grid(row=1, column=1, padx=10, pady=5) # 151:搜索输入框,绑定self.search_name变量,位于(1,1)
tk.Button(self, text='搜索', command=self.search_student).grid(row=1, column=2, padx=5, pady=5) # 152:“搜索”按钮,点击调用search_student方法,位于(1,2)
# 信息编辑区域 # 153:注释:说明以下代码作用
tk.Label(self, text='姓名:').grid(row=2, column=0, padx=10, pady=5, sticky='e') # 154:“姓名:”标签,位于(2,0)
tk.Entry(self, textvariable=self.name, width=20).grid(row=2, column=1, padx=10, pady=5) # 155:姓名编辑框,绑定self.name变量,位于(2,1)
tk.Label(self, text='数学成绩:').grid(row=3, column=0, padx=10, pady=5, sticky='e') # 156:“数学成绩:”标签,位于(3,0)
tk.Entry(self, textvariable=self.math, width=20).grid(row=3, column=1, padx=10, pady=5) # 157:数学成绩编辑框,绑定self.math变量,位于(3,1)
tk.Label(self, text='语文成绩:').grid(row=4, column=0, padx=10, pady=5, sticky='e') # 158:“语文成绩:”标签,位于(4,0)
tk.Entry(self, textvariable=self.chinese, width=20).grid(row=4, column=1, padx=10, pady=5) # 159:语文成绩编辑框,绑定self.chinese变量,位于(4,1)
tk.Label(self, text='英语成绩:').grid(row=5, column=0, padx=10, pady=5, sticky='e') # 160:“英语成绩:”标签,位于(5,0)
tk.Entry(self, textvariable=self.english, width=20).grid(row=5, column=1, padx=10, pady=5) # 161:英语成绩编辑框,绑定self.english变量,位于(5,1)
# 更新按钮和状态标签 # 162:注释:说明以下代码作用
tk.Button(self, text='更新', command=self.update, width=10).grid(row=6, column=0, columnspan=2, pady=10) # 163:“更新”按钮,点击调用update方法,占2列
tk.Label(self, textvariable=self.status, fg='blue').grid(row=7, column=0, columnspan=2) # 164:状态提示标签,文字蓝色,占2列
def search_student(self): # 165:定义搜索学生的方法
name = self.search_name.get() # 166:获取搜索姓名
if not name: # 167:判断姓名是否为空
self.status.set("请输入学生姓名") # 168:提示“请输入学生姓名”
return # 169:终止方法
students = search_students(name) # 170:调用search_students函数查询学生
if students: # 171:若查询到结果
self.current_student = students[0] # 172:保存第一个匹配的学生信息
# 将学生信息填充到编辑框 # 173:注释:说明以下代码作用
self.name.set(self.current_student['name']) # 174:设置姓名编辑框内容
self.math.set(self.current_student['math']) # 175:设置数学成绩编辑框内容
self.chinese.set(self.current_student['chinese']) # 176:设置语文成绩编辑框内容
self.english.set(self.current_student['english']) # 177:设置英语成绩编辑框内容
self.status.set("找到学生,可以修改信息") # 178:提示“找到学生,可以修改信息”
else: # 179:若未找到
self.status.set("未找到该学生") # 180:提示“未找到该学生”
self.clear_fields() # 181:调用clear_fields方法清空编辑框
def update(self): # 182:定义更新学生信息的方法
if not self.current_student: # 183:判断是否已搜索到学生(current_student是否为None)
self.status.set("请先搜索要修改的学生") # 184:提示“请先搜索要修改的学生”
return # 185:终止方法
# 验证输入 # 186:注释:说明以下代码作用
if not self.name.get(): # 187:判断修改后姓名是否为空
self.status.set("姓名不能为空") # 188:提示“姓名不能为空”
return # 189:终止方法
try: # 190:验证成绩是否为数字
math_score = float(self.math.get()) # 191:转换数学成绩为浮点数
chinese_score = float(self.chinese.get()) # 192:转换语文成绩为浮点数
english_score = float(self.english.get()) # 193:转换英语成绩为浮点数
except ValueError: # 194:转换失败
self.status.set("成绩必须是数字") # 195:提示“成绩必须是数字”
return # 196:终止方法
# 更新信息 # 197:注释:说明以下代码作用
updated_info = { # 198:定义更新后的信息字典
'name': self.name.get(), # 199:新姓名
'math': math_score, # 200:新数学成绩
'chinese': chinese_score, # 201:新语文成绩
'english': english_score # 202:新英语成绩
}
# 调用update_student函数更新数据(传入原姓名和新信息) # 203:注释:说明以下代码作用
if update_student(self.current_student['name'], updated_info): # 204:若更新成功
self.status.set("更新成功!") # 205:提示“更新成功!”
self.current_student = None # 206:清空当前学生信息
self.search_name.set("") # 207:清空搜索输入框
self.clear_fields() # 208:清空编辑框
else: # 209:若更新失败
self.status.set("更新失败") # 210:提示“更新失败”
# 3秒后清除状态消息 # 211:注释:说明以下代码作用
self.after(3000, lambda: self.status.set("")) # 212:3秒后清空状态提示
def clear_fields(self): # 213:定义清空编辑框的方法
self.name.set("") # 214:清空姓名编辑框
self.math.set("") # 215:清空数学成绩编辑框
self.chinese.set("") # 216:清空语文成绩编辑框
self.english.set("") # 217:清空英语成绩编辑框
class AboutFrame(tk.Frame): # 218:定义关于页面类(继承自tk.Frame)
def __init__(self, root): # 219:初始化方法,接收父窗口对象
super().__init__(master=root) # 220:调用父类初始化方法
self.create_page() # 221:调用create_page方法创建页面元素
def create_page(self): # 222:定义创建关于页面元素的方法
tk.Label(self, text='学生信息管理系统', font=('Arial', 16)).pack(pady=20) # 223:系统名称标签,字体16号,上下边距20
tk.Label(self, text='版本: v1.0').pack(pady=5) # 224:版本信息标签,上下边距5
tk.Label(self, text='开发人员: 等待希望').pack(pady=5) # 225:开发人员标签,上下边距5
tk.Label(self, text='版权所有 © 2025').pack(pady=5) # 226:版权信息标签,上下边距5
students.json文件
[ // 1:JSON数组(存储学生信息列表)
{ // 2:第一个学生对象
"name": "希望", // 3:学生姓名
"math": 77.0, // 4:数学成绩(浮点数)
"chinese": 88.0, // 5:语文成绩
"english": 99.0 // 6:英语成绩
}, // 7:对象结束
{ // 8:第二个学生对象
"name": "等待", // 9:学生姓名
"math": 99.0, // 10:数学成绩
"chinese": 99.0, // 11:语文成绩
"english": 99.0 // 12:英语成绩
} // 13:对象结束
] // 14:数组结束
data_handler.py文件
# data_handler.py # 1:文件说明(数据处理模块)
import os # 2:导入os库(用于文件路径操作)
import json # 3:导入json库(用于JSON数据读写)
DATA_FILE = "students.json" # 4:定义数据文件名(固定为students.json)
def load_data(): # 5:定义加载学生数据的函数
"""加载学生数据""" # 6:文档字符串:说明函数功能
if not os.path.exists(DATA_FILE): # 7:判断数据文件是否存在
return [] # 8:若不存在,返回空列表
try: # 9:尝试读取文件(处理可能的异常)
with open(DATA_FILE, 'r', encoding='utf-8') as f: # 10:以只读、utf-8编码打开文件
return json.load(f) # 11:解析JSON数据并返回(列表类型)
except: # 12:若读取/解析失败(如文件损坏)
return [] # 13:返回空列表
def save_data(students): # 14:定义保存学生数据的函数(接收学生列表)
"""保存学生数据""" # 15:文档字符串:说明函数功能
with open(DATA_FILE, 'w', encoding='utf-8') as f: # 16:以写入、utf-8编码打开文件(覆盖原内容)
# 写入JSON数据,确保中文正常显示,缩进2空格 # 17:注释:说明参数作用
json.dump(students, f, ensure_ascii=False, indent=2) # 18:将学生列表转换为JSON字符串并写入文件
def add_student(student): # 19:定义添加学生的函数(接收单个学生字典)
"""添加学生""" # 20:文档字符串:说明函数功能
students = load_data() # 21:加载现有学生数据
students.append(student) # 22:将新学生添加到列表
save_data(students) # 23:保存更新后的列表
def search_students(keyword=None, field="name"): # 24:定义搜索学生的函数(关键词默认None,搜索字段默认name)
"""搜索学生""" # 25:文档字符串:说明函数功能
students = load_data() # 26:加载所有学生数据
if not keyword: # 27:若未输入关键词
return students # 28:返回所有学生
result = [] # 29:定义结果列表
for student in students: # 30:遍历所有学生
# 判断关键词是否包含在指定字段中(忽略大小写) # 31:注释:说明判断逻辑
if keyword.lower() in student.get(field, "").lower(): # 32:field默认是name,转换为小写后判断包含关系
result.append(student) # 33:若匹配,添加到结果列表
return result # 34:返回匹配结果
def delete_student(name): # 35:定义删除学生的函数(接收学生姓名)
"""删除学生""" # 36:文档字符串:说明函数功能
students = load_data() # 37:加载所有学生数据
# 过滤出姓名不等于待删除姓名的学生(即保留未删除的) # 38:注释:说明过滤逻辑
updated_students = [s for s in students if s['name'] != name] # 39:列表推导式过滤学生
if len(updated_students) < len(students): # 40:若过滤后数量减少(说明删除成功)
save_data(updated_students) # 41:保存更新后的列表
return True # 42:返回True表示删除成功
return False # 43:返回False表示未找到该学生
def update_student(name, updated_info): # 44:定义更新学生信息的函数(原姓名+新信息字典)
"""更新学生信息""" # 45:文档字符串:说明函数功能
students = load_data() # 46:加载所有学生数据
for student in students: # 47:遍历所有学生
if student['name'] == name: # 48:找到姓名匹配的学生
student.update(updated_info) # 49:用新信息更新该学生字典
save_data(students) # 50:保存更新后的列表
return True # 51:返回True表示更新成功
return False # 52:返回False表示未找到该学生
学生信息管理系统 tk 版.py文件
# 学生信息管理系统tk版.py # 1:文件说明(程序入口,包含登录页面)
import tkinter as tk # 2:导入tkinter库
from main import MainPage # 3:从main模块导入MainPage类(主页面)
class LoginPage: # 4:定义登录页面类
def __init__(self, root2): # 5:初始化方法,接收主窗口对象
self.root = root2 # 6:保存主窗口对象到实例变量
self.login_frame = tk.Frame(self.root) # 7:创建登录页面的Frame容器
self.login_frame.pack(pady=50) # 8:布局Frame(上下边距50)
self.root.title('学生信息管理系统 - 登录') # 9:设置窗口标题
self.root.geometry('400x300') # 10:设置窗口初始大小(宽400,高300)
self.username = tk.StringVar() # 11:存储用户名的变量
self.password = tk.StringVar() # 12:存储密码的变量
self.create_page() # 13:调用create_page方法创建登录页面元素
self.root.mainloop() # 14:启动主窗口事件循环
def create_page(self): # 15:定义创建登录页面元素的方法
# 标题 # 16:注释:说明以下代码作用
tk.Label(self.login_frame, text='学生信息管理系统', font=('Arial', 16)).grid(row=0, column=0, columnspan=2,
pady=20) # 17:系统名称标签,占2列,上下边距20
# 用户名输入区域 # 18:注释:说明以下代码作用
tk.Label(self.login_frame, text='用户名:').grid(row=1, column=0, padx=10, pady=10, sticky='e') # 19:“用户名:”标签,位于(1,0)
tk.Entry(self.login_frame, textvariable=self.username, width=20).grid(row=1, column=1, padx=10, pady=10) # 20:用户名输入框,绑定self.username变量,位于(1,1)
# 密码输入区域 # 21:注释:说明以下代码作用
tk.Label(self.login_frame, text='密码:').grid(row=2, column=0, padx=10, pady=10, sticky='e') # 22:“密码:”标签,位于(2,0)
# 密码输入框,显示为*,绑定self.password变量 # 23:注释:说明密码框特性
tk.Entry(self.login_frame, textvariable=self.password, show='*', width=20).grid(row=2, column=1, padx=10,
pady=10) # 24:密码输入框,位于(2,1)
# 登录按钮 # 25:注释:说明以下代码作用
tk.Button(self.login_frame, text='登录', command=self.check_login, width=10).grid(row=3, column=0, columnspan=2,
pady=20) # 26:“登录”按钮,点击调用check_login方法,占2列
# 添加一个简单的状态标签 # 27:注释:说明以下代码作用
self.status_label = tk.Label(self.login_frame, text='', fg='red') # 28:创建状态标签(初始为空,文字红色)
self.status_label.grid(row=4, column=0, columnspan=2) # 29:标签布局,占2列
def check_login(self): # 30:定义验证登录的方法
username = self.username.get() # 31:获取用户名输入
password = self.password.get() # 32:获取密码输入
# 简单的登录验证 # 33:注释:说明验证逻辑
if username == 'admin' and password == '123456': # 34:判断用户名和密码是否为admin/123456
self.login_frame.destroy() # 35:销毁登录页面Frame
MainPage(self.root) # 36:实例化MainPage,显示主页面
else: # 37:若验证失败
self.status_label.config(text='用户名或密码错误') # 38:设置状态标签提示“用户名或密码错误”
if __name__ == "__main__": # 39:判断是否为主程序入口
root = tk.Tk() # 40:创建tkinter主窗口对象
LoginPage(root) # 41:实例化LoginPage类,传入主窗口(启动登录页面)
更多推荐

所有评论(0)