Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统
本文使用Python语言开发了一个学生信息管理系统,该系统可以帮助教师快速录入学生的信息,并且对学生的信息进行基本的增、删、改、查操作;还可以实时地将学生的信息保存到磁盘文件中。

1.1 需求分析
为了顺应互联网时代用户的获取数据需求,学生信息管理系统应该具备以下功能:
- 添加学生及成绩信息;
- 将学生信息保存到文件中;
- 修改和删除学生信息;
- 查询学生信息;
1.2 系统设计
1.2.1 系统功能结构
学生信息管理系统分为5大功能模块,主要包括添加学生信息模块、删除学生信息模块、修改学生信息模块、查询学生信息模块、显示全部学生信息模块。学生信息管理系统的功能结构如图1.1所示。
1.2.2 系统业务流程
在开发学生信息管理系统前,需要先了解系统的业务流程。根据学生信息管理系统的需求分析及功能结构,设计如图1.2所示的系统业务流程。
1.3 系统开发必备
1.3.1 系统开发环境
本系统的软件开发及运行环境具体如下:
- 操作系统:Windows10;
- Python版本:Python 3.9;
- 开发工具:Python IDLE;
- Python内置模块:tkinter。
基本上python3以上版本都能运行,使用之前须安装tkinter。
1.3.2 文件夹组织结构
学生信息管理系统的文件夹结构比较简单,只包括一个Python文件。在运行程序时,会在项目的根目录下自动创建一个名称为students_info.txt文件,用于保存学生信息。
1.4 主函数设计
在学生信息管理系统中主要包括添加学生信息、修改学生信息,删除学生信息,查询和显示学生信息,这些学生信息会保存到磁盘文件。
1.4.1 实现添加学生信息功能
1.4.1.1 代码实现
def Add_Student_Info(ID, Name, Major, Score, Class):# 导入信息global Info# 检查输入信息是否规范if not is_ID(ID):Tip_Add_ID()returnfor i in Info:if ID == i['ID']:Tip_Add_ID_Repeat()returnif not is_Score(Score):Tip_Add_Score()returnif not is_Class(Class):Tip_Add_Class()return# 用字典整合学生信息Info_dict = {'ID': ID, 'Name': Name, 'Major': Major, 'Score': Score, 'Class': Class}# 将字典存入总列表Info.append(Info_dict)# 添加成功Tip_Add()# 将信息写入文件WriteTxt_w_Mode(Info)
1.4.1.2 代码解释
这是一个Python的函数定义,其功能是添加学生信息并存储在列表和文件中。以下是这个函数的具体解析:
- 导入信息:该函数首先导入了全局变量
Info。这个变量可能是在其他地方定义的,用来存储所有学生的信息。 - 检查输入信息是否规范:接下来的部分是检查输入的信息是否满足特定的要求。这些检查包括检查学生的ID是否符合规定的格式,检查分数是否在合理范围内,以及检查班级信息是否规范。
- 检查ID是否重复:然后,它检查新学生的ID是否已经在
Info列表中存在。如果存在,说明这个ID已经被使用过,函数就会输出提示信息并返回。 - 整合学生信息:如果所有检查都通过,函数就会创建一个新的字典,其中包含了学生的所有信息(ID,名字,主修专业,分数,班级)。
- 添加学生信息到列表:然后,这个字典被添加到
Info列表中。 - 输出添加成功的提示信息:添加成功后,函数会输出一个提示信息。
- 将信息写入文件:最后,函数会将
Info列表写入一个文本文件中。
1.4.1.3 效果展示
1.4.2 实现删除学生信息功能
1.4.2.1 代码实现
def Del_Student_Info(ID):# 检查输入信息是否规范if not is_ID(ID):Tip_Add_ID()return# 用于指示是否删除的状态指标Flag = True# 导入信息global Info# 遍历,删除学生信息for i in Info:if ID == i["ID"]:Info.remove(i)Flag = Falsebreakif Flag:Tip_Del_ID_None()return# 删除成功Tip_Del()# 将删除后的信息写入文件WriteTxt_w_Mode(Info)
1.4.2.2 代码解释
这段代码定义了一个函数Del_Student_Info(ID),该函数用于删除学生信息。
代码的逻辑如下:
- 首先,检查输入的ID是否符合规范,如果不符合规范,则调用
Tip_Add_ID()函数提示输入不规范,并返回。 - 定义一个布尔变量
Flag,用于指示是否删除的状态指标,初始值为True。 - 导入全局变量
Info,该变量应该是一个包含学生信息的列表。 - 遍历
Info列表,对于每个元素,判断其ID是否与输入的ID相同。 - 如果找到了匹配的ID,调用
Info.remove(i)删除该元素,并将Flag设置为False,然后跳出循环。 - 如果遍历结束后
Flag仍然为True,说明没有找到匹配的ID,调用Tip_Del_ID_None()函数提示删除失败,并返回。 - 如果找到了匹配的ID并成功删除,调用
Tip_Del()函数提示删除成功。 - 最后,调用
WriteTxt_w_Mode(Info)函数,将删除后的信息写入文件。
1.4.2.3 效果展示
1.4.3 实现修改学生信息功能
1.4.3.1 代码实现
def Mod_Student_Info_1(ID, Name, Major, Score, Class):# 检查输入信息是否规范if not is_ID(ID):Tip_Add_ID()returnif not is_Score(Score):Tip_Add_Score()returnif not is_Class(Class):Tip_Add_Class()return# 导入信息global Info# 遍历,修改学生信息for i in Info:if i["ID"] == ID:i["Name"] = Namei["Major"] = Majori["Score"] = Scorei["Class"] = Class# 修改成功Tip_Mod()# 将修改后的信息写入文件WriteTxt_w_Mode(Info)
1.4.3.2 代码解释
这段代码定义了一个函数Mod_Student_Info_1(ID, Name, Major, Score, Class),该函数用于修改学生信息。
代码的逻辑如下:
- 首先,检查输入的ID、Score和Class是否符合规范,如果不符合规范,则分别调用相应的提示函数,并返回。
- 导入全局变量
Info,该变量应该是一个包含学生信息的列表。 - 遍历
Info列表,对于每个元素,判断其ID是否与输入的ID相同。 - 如果找到了匹配的ID,将该元素中的Name、Major、Score和Class分别修改为输入的值。
- 如果遍历结束后仍然没有找到匹配的ID,则说明要修改的学生信息不存在,可能需要进行额外的处理。
- 如果找到了匹配的ID并成功删除,调用
Tip_Mod()函数提示修改成功。 - 最后,调用
WriteTxt_w_Mode(Info)函数,将修改后的信息写入文件。
1.4.3.3 效果展示
1.4.4 实现查询学生信息功能
1.4.4.1 代码实现
def Search_Student_Info(ID):# 检查输入是否规范,规范的和空字符串通过if len(ID) != 0 and not is_ID(ID):Tip_Add_ID()return# 导入信息global Info# 临时列表List = []# 用来指示是否查找到学生的信息指标Flag = False# 遍历,根据输入的部分信息找到符合条件的学生for i in Info:if (i["ID"] == ID or len(ID) == 0) and \(len(ID) != 0):List.append(i)if len(List) != 0:Flag = True# 在主界面打印符合条件学生信息Print_Student_Info(List)# 是否查找成功if Flag:Tip_Search()else:Tip_Search_None()
1.4.4.2 代码解释
这段代码定义了一个函数Search_Student_Info(ID),该函数用于根据输入的部分信息查找符合条件的学生信息。
代码的逻辑如下:
- 首先,检查输入的ID是否规范,如果不规范,则调用
Tip_Add_ID()函数提示输入不规范,并返回。 - 导入全局变量
Info,该变量应该是一个包含学生信息的列表。 - 创建一个空的临时列表
List,用于存储符合条件的学生信息。 - 定义一个布尔变量
Flag,用于指示是否查找到学生的信息,初始值为False。 - 遍历
Info列表,对于每个元素,判断其ID是否与输入的ID相同,并根据条件筛选符合要求的学生信息。 - 如果找到了符合条件的学生信息,将其添加到
List列表中。 - 判断
List列表的长度是否为0,如果不为0,说明找到了符合条件的学生信息,将Flag设置为True。 - 调用
Print_Student_Info(List)函数,在主界面打印符合条件的学生信息。 - 根据
Flag的值判断查找是否成功,如果成功,调用Tip_Search()函数提示查找成功;否则,调用Tip_Search_None()函数提示查找失败。
1.4.4.3 效果展示
1.4.5 实现显示学生信息功能
1.4.5.1 代码实现
def Print_Student_Info(Student_Info):# 定义一个字符串用于存储想要输出显示的内容str_out = ""# 学生信息为空将返回if Student_Info is None:result.set("学生信息为空")returnif len(Student_Info) == 0:result.set("无学生信息")return# 学生信息不为空if len(Student_Info) != 0:str_out += "学生信息如下:\n"# 显示信息标题str_out += ("{:^7}".format("学生学号") +"{:^7}".format("学生姓名") +"{:^7}".format("学生专业") +"{:^7}".format("学生分数") +"{:^5}".format("班级") +"\n")for i in range(0, len(Student_Info)):# 格式化字符串str_out += ("{:^}".format(Student_Info[i].get("ID")) + ' '*(11-Len_Str(Student_Info[i].get("ID"))) +"{:^}".format(Student_Info[i].get("Name")) +' '*(11-Len_Str(Student_Info[i].get("Name")))+"{:^}".format(Student_Info[i].get("Major")) +' '*(13-Len_Str(Student_Info[i].get("Major")))+"{:^}".format(Student_Info[i].get("Score")) +' '*(10-Len_Str(Student_Info[i].get("Score")))+"{:^}".format(Student_Info[i].get("Class")) +' '*(5-Len_Str(Student_Info[i].get("Class")))+"\n")# 在主界面显示学生信息result.set(str_out)
1.4.5.2 代码解释
这段代码定义了一个函数Print_Student_Info(Student_Info),用于在界面上展示学生信息。
代码的逻辑如下:
- 首先,检查输入的
Student_Info是否为空,如果是,则将结果设置为"学生信息为空",并返回。 - 如果
Student_Info的长度为0,则将结果设置为"无学生信息",并返回。 - 如果
Student_Info不为空且长度不为0,进行以下操作:
- 创建一个空的字符串
str_out,用于存储要输出的内容。- 添加一个字符串,表示学生信息的标题。
- 遍历
Student_Info列表中的每个元素,对于每个学生信息,按照指定的格式将其添加到str_out中。
- 使用
{:^}格式化字符串来对齐每个字段,其中^表示居中对齐。- 使用
Len_Str()函数获取每个字段的长度,以确保对齐的正确性。- 最后,将
str_out设置为result的属性值,以在主界面上显示学生信息。
1.4.5.3 效果展示
1.5 窗口函数
1.5.1 添加学生信息窗口
def Window_Add():# 实例化对象,创建root的子窗口windowwindow = tk.Toplevel(root)# 窗口名字window.title("添加学生信息")# 窗口大小window.geometry('500x500')# 关于学号的 label 和 entryTxt_ID = tk.StringVar()Txt_ID.set("")Label_Line1 = tk.Label(window, text="学 号 (6 位):", font=('Arial', 10), width=15).place(x=75, y=50, anchor='nw')Entry_Line1 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_ID, width=20)Entry_Line1.place(x=200, y=50, anchor='nw')# 关于姓名的 label 和 entryTxt_Name = tk.StringVar()Txt_Name.set("")Label_Line2 = tk.Label(window, text="姓 名:", font=('Arial', 10), width=15).place(x=75, y=100, anchor='nw')Entry_Line2 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Name, width=20)Entry_Line2.place(x=200, y=100, anchor='nw')# 关于专业的 label 和 entryTxt_Major = tk.StringVar()Txt_Major.set("")Label_Line3 = tk.Label(window, text="专 业:", font=('Arial', 10), width=15).place(x=75, y=150, anchor='nw')Entry_Line3 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Major, width=20)Entry_Line3.place(x=200, y=150, anchor='nw')# 关于分数的 label 和 entryTxt_Score = tk.StringVar()Txt_Score.set("")Label_Line4 = tk.Label(window, text="分 数 (0~100):", font=('Arial', 10), width=15).place(x=75, y=200,anchor='nw')Entry_Line4 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Score, width=20)Entry_Line4.place(x=200, y=200, anchor='nw')# 关于班级的 label 和 entryTxt_Class = tk.StringVar()Txt_Class.set("")Label_Line5 = tk.Label(window, text="班 级 (序号):", font=('Arial', 10), width=15).place(x=75, y=250, anchor='nw')Entry_Line5 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Class, width=20)Entry_Line5.place(x=200, y=250, anchor='nw')# 关于"确认"组件,此处绑定函数Add_Student_Info用于添加学生信息Button1_Yes = tk.Button(window, text='确认', bg='silver', font=('Arial', 12),command=lambda: Add_Student_Info(Txt_ID.get(), Txt_Name.get(), Txt_Major.get(),Txt_Score.get(), Txt_Class.get()), width=10)Button1_Yes.place(x=75, y=400, anchor='nw')# 关于"取消"组件,此处绑定函数destroy()用于关闭窗口Button2_No = tk.Button(window, text='取消', bg='silver', font=('Arial', 12), command=lambda: window.destroy(),width=10)Button2_No.place(x=325, y=400, anchor='nw')# 窗口显示window.mainloop()
1.5.2 删除学生信息窗口
# 删除学生信息的窗口
def Window_Del():# 创建root的子窗口window = tk.Toplevel(root)window.title("删除学生信息")window.geometry('500x300')# 关于学号的 label 和 entryTxt_ID = tk.StringVar()Txt_ID.set("")Label_Line1 = tk.Label(window, text="学 号 (6 位):", font=('Arial', 10), width=15).place(x=75, y=100, anchor='nw')Entry_Line1 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_ID, width=20)Entry_Line1.place(x=200, y=100, anchor='nw')# 关于"确认"组件,此处绑定函数Del_Student_Info用于删除学生信息Button1_Yes = tk.Button(window, text='确认', bg='silver', font=('Arial', 12),command=lambda: Del_Student_Info(Txt_ID.get()), width=10)Button1_Yes.place(x=75, y=200, anchor='nw')# 关于"取消"组件,此处绑定函数destroy()用于关闭窗口Button2_No = tk.Button(window, text='取消', bg='silver', font=('Arial', 12), command=lambda: window.destroy(),width=10)Button2_No.place(x=325, y=200, anchor='nw')# tk.StringVar()用于接收用户输入result = tk.StringVar()result.set(">>>请先通过'查询学生信息'查询待删除学生的学号<<<")# 在界面中显示文本框,打印result的信息Show_result = tk.Label(window, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw', textvariable=result)Show_result.place(x="50", y="50", width="400", height="50")# 显示窗口window.mainloop()
1.5.3 修改学生信息窗口
def Window_Mod():# 创建root的子窗口window = tk.Toplevel(root)window.title("修改学生信息")window.geometry('500x300')# 关于学号的 label 和 entryTxt_ID = tk.StringVar()Txt_ID.set("")Label_Line1 = tk.Label(window, text="学 号 (6 位):", font=('Arial', 10), width=15).place(x=75, y=100, anchor='nw')Entry_Line1 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_ID, width=20)Entry_Line1.place(x=200, y=100, anchor='nw')# 关于"确认"组件,此处绑定函数Mod_Student_Info用于修改学生信息Button1_Yes = tk.Button(window, text='确认', bg='silver', font=('Arial', 12),command=lambda: Mod_Student_Info(Txt_ID.get()), width=10)Button1_Yes.place(x=75, y=200, anchor='nw')# 关于"取消"组件,此处绑定函数destroy()用于关闭窗口Button2_No = tk.Button(window, text='取消', bg='silver', font=('Arial', 12), command=lambda: window.destroy(),width=10)Button2_No.place(x=325, y=200, anchor='nw')# 在界面中显示文本框,打印result的信息result = tk.StringVar()result.set(">>>请先通过'查询学生信息'查询待修改学生的学号<<<")Show_result = tk.Label(window, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw', textvariable=result)Show_result.place(x="50", y="50", width="400", height="50")# 显示窗口window.mainloop()
1.5.4 输入修改学生信息窗口
def Window_Mod_Input(ID):# 创建root的子窗口window = tk.Toplevel(root)window.title("修改学生信息")window.geometry('500x500')# 关于姓名的 label 和 entryTxt_Name = tk.StringVar()Txt_Name.set("")Label_Line2 = tk.Label(window, text="姓 名:", font=('Arial', 10), width=15).place(x=75, y=100, anchor='nw')Entry_Line2 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Name, width=20)Entry_Line2.place(x=200, y=100, anchor='nw')# 关于专业的 label 和 entryTxt_Major = tk.StringVar()Txt_Major.set("")Label_Line3 = tk.Label(window, text="专 业:", font=('Arial', 10), width=15).place(x=75, y=150, anchor='nw')Entry_Line3 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Major, width=20)Entry_Line3.place(x=200, y=150, anchor='nw')# 关于分数的 label 和 entryTxt_Score = tk.StringVar()Txt_Score.set("")Label_Line4 = tk.Label(window, text="分 数 (0~100):", font=('Arial', 10), width=15).place(x=75, y=200,anchor='nw')Entry_Line4 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Score, width=20)Entry_Line4.place(x=200, y=200, anchor='nw')# 关于班级的 label 和 entryTxt_Class = tk.StringVar()Txt_Class.set("")Label_Line5 = tk.Label(window, text="班 级 (序号):", font=('Arial', 10), width=15).place(x=75, y=250, anchor='nw')Entry_Line5 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_Class, width=20)Entry_Line5.place(x=200, y=250, anchor='nw')# 关于"确认"组件,此处绑定函数Mod_Student_Info_1用于修改学生信息Button1_Yes = tk.Button(window, text='确认', bg='silver', font=('Arial', 12),command=lambda: Mod_Student_Info_1(ID, Txt_Name.get(), Txt_Major.get(), Txt_Score.get(),Txt_Class.get()), width=10)Button1_Yes.place(x=75, y=400, anchor='nw')# 关于"取消"组件,此处绑定函数destroy()用于关闭窗口Button2_No = tk.Button(window, text='取消', bg='silver', font=('Arial', 12), command=lambda: window.destroy(),width=10)Button2_No.place(x=325, y=400, anchor='nw')# 在界面中显示文本框,打印result的信息result = tk.StringVar()result.set(" >>>请输入修改后的信息<<<")Show_result = tk.Label(window, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw', textvariable=result)Show_result.place(x="50", y="50", width="400", height="50")# 显示窗口window.mainloop()
1.5.5 查询学生信息窗口
def Window_Ser():# 创建root的子窗口window = tk.Toplevel(root)window.title("查询学生信息")window.geometry('500x500')# 关于学号的 label 和 entryTxt_ID = tk.StringVar()Txt_ID.set("")Label_Line1 = tk.Label(window, text="学 号 (6 位):", font=('Arial', 10), width=15).place(x=75, y=100, anchor='nw')Entry_Line1 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=Txt_ID, width=20)Entry_Line1.place(x=200, y=100, anchor='nw')# 关于"确认"组件,此处绑定函数Search_Student_Info用于修改学生信息Button1_Yes = tk.Button(window, text='确认', bg='silver', font=('Arial', 12),command=lambda: Search_Student_Info(Txt_ID.get()), width=10)Button1_Yes.place(x=75, y=400, anchor='nw')# 关于"取消"组件,此处绑定函数destroy()用于关闭窗口Button2_No = tk.Button(window, text='取消', bg='silver', font=('Arial', 12), command=lambda: window.destroy(),width=10)Button2_No.place(x=325, y=400, anchor='nw')# 在界面中显示文本框,打印result的信息result = tk.StringVar()result.set(" >>>请输入待查找学生的部分信息<<<")Show_result = tk.Label(window, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw', textvariable=result)Show_result.place(x="50", y="50", width="400", height="50")# 显示窗口window.mainloop()
1.5.6 退出窗口
def Window_Exit():# 创建root的子窗口window = tk.Toplevel()window.title("退出管理系统")window.geometry('400x300')# 关于"确认"组件,此处绑定函数destroy()用于关闭主窗口Button1_Yes = tk.Button(window, text='确认', bg='silver', font=('Arial', 12), command=lambda: root.destroy(),width=10)Button1_Yes.place(x=50, y=200, anchor='nw')# 关于"取消"组件,此处绑定函数destroy()用于关闭窗口Button2_No = tk.Button(window, text='取消', bg='silver', font=('Arial', 12), command=lambda: window.destroy(),width=10)Button2_No.place(x=250, y=200, anchor='nw')# 在界面中显示文本框,打印result的信息result = tk.StringVar()
1.6 调用函数
1.6.1 主窗口函数
if __name__ == '__main__':# 创建主窗口root = tk.Tk()root.title("学生信息管理系统 V1.1")root.geometry('900x400')# 关于"添加学生信息"组件,此处绑定函数Search_Student_Info用于修改学生信息Button1_Add = tk.Button(root, text='添 加 学 生 信 息', bg='silver', font=('Arial', 12), command=Window_Add,width=20)Button1_Add.place(x=50, y=50, anchor='nw')Button2_Del = tk.Button(root, text='删 除 学 生 信 息', bg='silver', font=('Arial', 12), command=Window_Del,width=20)Button2_Del.place(x=50, y=100, anchor='nw')Button3_Mod = tk.Button(root, text='修 改 学 生 信 息', bg='silver', font=('Arial', 12), command=Window_Mod,width=20)Button3_Mod.place(x=50, y=150, anchor='nw')Button4_Ser = tk.Button(root, text='查 询 学 生 信 息', bg='silver', font=('Arial', 12), command=Window_Ser,width=20)Button4_Ser.place(x=50, y=200, anchor='nw')Button5_Show = tk.Button(root, text='显 示 学 生 信 息', bg='silver', font=('Arial', 12),command=lambda: Print_Student_Info(Info), width=20)Button5_Show.place(x=50, y=250, anchor='nw')Button6_Exit = tk.Button(root, text='退 出 管 理 系 统', bg='silver', font=('Arial', 12), command=Window_Exit,width=20)Button6_Exit.place(x=50, y=300, anchor='nw')result = tk.StringVar()Show_result = tk.Label(root, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw', textvariable=result)Show_result.place(x="300", y="50", width="520", height="300")root.mainloop()
1.6.2 学生信息写入文件函数
def WriteTxt_w_Mode(Student_List):# w:只写入模式,文件不存在则建立,将文件里边的内容先删除再写入with open("Student_Info.txt", "w", encoding="utf-8") as f:for i in range(0, len(Student_List)):Info_dict = Student_List[i]# 最后一行不写入换行符'\n'if i == len(Student_List) - 1:f.write("{0}\t{1}\t{2}\t{3}\t{4}".format \(Info_dict["ID"], Info_dict["Name"], Info_dict["Major"], Info_dict["Score"],Info_dict["Class"]))else:f.write("{0}\t{1}\t{2}\t{3}\t{4}\n".format \(Info_dict["ID"], Info_dict["Name"], Info_dict["Major"], Info_dict["Score"],Info_dict["Class"]))
1.6.3 学生信息文件读取函数
def ReadTxt() -> list:# 临时列表Temp_List1 = []Temp_List2 = []# 打开同目录下的文件f = open("./Student_Info.txt", 'r', encoding="utf-8")# 遍历,读取文件每一行信息for i in f:a = str(i)b = a.replace('\n', '')Temp_List1.append(b.split("\t"))# 将读写的信息并入临时列表while len(Temp_List2) < len(Temp_List1):for j in range(0, len(Temp_List1)):ID = Temp_List1[j][0]Name = Temp_List1[j][1]Major = Temp_List1[j][2]Score = Temp_List1[j][3]Class = Temp_List1[j][4]Info_dict = {"ID": ID,"Name": Name,"Major": Major,"Score": Score,"Class": Class}Temp_List2.append(Info_dict)# 关闭文件f.close()# 将含有学生信息的临时列表返回return Temp_List2
1.6.3 检查输入是否规范函数
# 定于一个方法,用于检查年龄是否规范
def is_Score(Score):return Score.isdigit() and 0 <= int(Score) and int(Score) <= 100# 定于一个方法,用于检查班级是否规范
def is_Class(Class):return Class.isdigit() and int(Class) > 0# 定义一个方法,用于判断是否为中文字符
def is_Chinese(ch):if ch >= '\u4e00' and ch <= '\u9fa5':return Trueelse:return False# 定义一个方法,用于计算中西文混合字符串的字符串长度
def Len_Str(string):count = 0for line in string:if is_Chinese(line):count = count + 2else:count = count + 1return count
1.6.4 提示函数
def Tip_Add():messagebox.showinfo("提示信息", "添加成功")def Tip_Search():messagebox.showinfo("提示信息", "查询成功")def Tip_Del():messagebox.showinfo("提示信息", "删除成功")def Tip_Mod():messagebox.showinfo("提示信息", "修改成功")def Tip_Add_ID_Repeat():messagebox.showinfo("提示信息", "此学号已经存在,请勿重复添加!")def Tip_Del_ID_None():messagebox.showinfo("提示信息", "此学号不存在,请重新输入!")def Tip_Search_None():messagebox.showinfo("提示信息", "未查询到有关学生信息!")def Tip_Add_ID():messagebox.showinfo("提示信息", "学号格式有误,请重新输入!")def Tip_Add_Score():messagebox.showinfo("提示信息", "分数格式有误,请重新输入!")def Tip_Add_Class():messagebox.showinfo("提示信息", "班级格式有误,请重新输入!")
1.7 打包为.exe可执行文件
Python项目完成后,可以将其打包成一个.exe可执行文件,这样就可以在其他计算机上运行该项目了,即时这台计算机上没有安装Python开发环境。
实现打包.exe可执行文件时,需要使用PyInstaller模块,该模块为第三方模块所以需要单独安装。PyInstaller模块支持多种操作系统,如Windows、Linux、Mac OS X等,但是该模块并不支持跨平台操作。例如:在Windows操作系统下打包的.exe可执行文件,该文件就只能在Windows环境下运行。
这里以Windows操作系统为例,介绍PyInstaller模块的安装,安装PyInstaller模块最简单的方法就是在“命令提示符窗口”中输入“pip install pyinstaller”命令进行安装,如图所示。如果是升级或者是更新可以使用“pip install --upgrade pyinstaller”命令。
- 在Windows操作系统中,使用pip或者easy_install安装PyInstaller模块时,会自动安装PyWin32。
- PyInstaller模块安装完成以后,可以在“命令提示符窗口”中输入“pyinstaller--version”命令,通过查询PyInstaller模块版本的方式检测安装是否成功。
PyInstaller模块安装完成以后,就可以打包.py文件为.exe文件了。具体方法如下。
pyinstaller studentsystem.py
1.8 小结
本节主要使用Python语言开发了一个学生信息管理系统,项目的核心是对文件、列表和字典进行操作。其中,对文件进行操作是用来永久保存学生信息;而将学生信息以字典的形式存储到列表中,是为了方便对学生信息的查找、修改和删除。通过本节的学习,读者首先应该熟练并掌握对文件进行创建、打开和修改等操作的方法,其次还应该掌握对字典和列表进行操作的方法,尤其是对列表进行自定义排序规则,这是本项目的难点,需要读者仔细体会并做到融会贯通。
源码在评论区评论“666,获取学生管理系统源码”

相关文章:
Python项目开发案例————学生信息管理系统(附源码)
一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统,该系统可以帮助教师快速录入学生的信息,并且对学生的信息进行基本的增、删、改、查操作;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…...
2023-08-25力扣每日一题
链接: 1448. 统计二叉树中好节点的数目 题意: 判断根节点到每个节点X的过程中,如果没有值大于X,则该节点为好节点,求好节点数量 解: 由于求根节点到其他节点的路径,则使用dfs算法ÿ…...
Vue3中的计算属性和属性监听
compute计算属性 Vue3中可以通过 compute进行监听计算属性,他返回的是一个ref的对象,也就是说 通过compuye这种方式计算属性实际上是进行了ref的操作 import { computed } from vue const user reactive({firstName: A,lastName: B }) // 只有getter的…...
微信开发之一键修改群公告的技术实现
简要描述: 设置群公告 请求URL: http://域名地址/setChatRoomAnnouncement 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必…...
【git】工作场景中常用的git命令
工作场景中常用的git命令 1. 必备改名改邮箱拉代码下来并且创建新分支git commit回滚某个文件删除分支 工作场景中常用的git命令,记录下来方便调取 1. 必备 改名改邮箱 一般与他人合作,至少你提交的名字得被人熟知或者遵循规范,因此需要更改…...
Vue路由(详解)
目录 路由原理 路由到底有什么作用? 路由安装和使用(vue2) 路由跳转 跳转实例: 路由的传值和取值 传值实例: 查询参和路由参的区别: 嵌套路由 嵌套实例: 路由守卫 守卫实例࿱…...
打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因
今天,我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行,甚至崩溃。但是,请不要担心,我会为大家提供5种解决方法,帮助大家轻松解决问题。 首先,我们来看…...
关于路由器和DNS解析的一些新理解
其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的,也在一点一点的学习相关知识,每次解决一个问题,就让我对一些事情有新的思考。。 今天前台同事,的机器突然上不了网,,和领导一起去看了一波&#…...
vscode 与 C++
序 具体流程的话,官方文档里都有的:C programming with Visual Studio Code 浏览器下载一个mingw64,解压,配置环境变量vscode里安装c相关的插件没了 第一步只看文字,可能有点抽象,相关视频: …...
水果flstudio好用吗?中文版FL21最新版本如何下载
FL Studio21版是一款功能强大的音乐制作软件,广泛应用于电子音乐、流行音乐、电影配乐等领域。它提供了丰富多样的音频合成和编辑工具,使音乐制作变得更加灵活多样。无论是初学者还是专业音乐制作人,都可以通过直观的界面和丰富的音频特效来实…...
PHP is_array()函数详解,PHP判断是否为数组
「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array 一、基本使用二、空数组三、同时判断多个…...
面试题-React(三):什么是JSX?它与常规JavaScript有什么不同?
在React的世界中,JSX是一项引人注目的技术,它允许开发者在JavaScript中嵌套类似HTML的标签,用于描述UI组件的结构。本篇博客将通过丰富的代码示例,深入探索JSX语法,解析其在React中的用法和优势。 一、JSX基础语法 在…...
纯前端实现图片上传七牛云
首先安装下依赖: npm install qiniu-js crypto-js 然后封装一下 uploaderHelper.ts import * as qiniu from qiniu-js; // ts-ignore import CryptoJS from crypto-js// 请求接口上传图片 export function uploadFile(file: File) {const uptoken getToken(你的…...
win10+wsl2+Ubuntu20.2+Pycharm+WSL解释器
目的:创建一个ubuntu系统下的python解释器,作为win平台下的pycharm的解释器。 这样做的好处是可以直接在win系统里操作文件,相比于linux方便一点,而且也不用对wsl的子系统进行迁移。 一、安装前准备 1. 设置-Windows更新-window…...
EL与JSTL
目录 EL EL语法 EL运算符 JSTL JSTL标签分类 JSP脚本:代码结构混乱、脚本与HTML 混合易出错、代码不易维护。 EL表达式:优化程序代码,增加程序可读性。 EL EL语法 EL表达式 ${ EL 表达式 } EL操作符 操作符“ . ” 获取对象的属性&a…...
【Linux】动态库和静态库
动态库和静态库 软链接硬链接硬链接要注意 自定义实现一个静态库(.a)解决、使用方法静态库的内部加载过程 自定义实现一个动态库(.so)动态库加载过程 静态库和动态库的特点 软链接 命令:ln -s 源文件名 目标文件名 软链接是独立连接文件的,他…...
R语言:联合多指标的ROC曲线
# 加载数据和包rm(list=ls())library(pROC)library(ggplot2)setwd("C:/Users/syy/Desktop/MRI_lab/")data<- read.csv("test1.csv", header = T)data$Groups...
将一个树形结构的数据平铺成一个一维数组(vue3)
一、需求描述 由于自带组件库没有具体完善,无法实现像element-ui这种可以多选选择任意一级的选项,也就是说,选择父级的时候不会联动选择子级的全部 例如: 所以,才会出现【二、案例场景】类似的场景,可以用来多选 ,并可以实现单选父级而不关联子级,选择了将树状数据进…...
OSCS开源安全周报第 56 期:Apache Airflow Spark Provider 任意文件读取漏洞
本周安全态势综述 OSCS 社区共收录安全漏洞 3 个,公开漏洞值得关注的是 Apache NiFi 连接 URL 验证绕过漏洞(CVE-2023-40037)、PowerJob 未授权访问漏洞(CVE-2023-36106)、Apache Airflow Spark Provider 任意文件读取漏洞(CVE-2023-40272)。 针对 NPM 、PyPI 仓库…...
CleanMyMac2024永久版Mac清理工具
Mac电脑作为相对封闭的一个系统,它会中毒吗?如果有一天Mac电脑产生了疑似中毒或者遭到恶意不知名攻击的现象,那又应该如何从容应对呢?这些问题都是小编使用Mac系统一段时间后产生的疑惑,通过一番搜索研究,小…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
