当前位置: 首页 > news >正文

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

1b83b1d3fff541e6844ba7bfc4b8f724.gif

一、学生信息管理系统

 

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

1.1  需求分析

        为了顺应互联网时代用户的获取数据需求,学生信息管理系统应该具备以下功能:

  • 添加学生及成绩信息;
  • 将学生信息保存到文件中;
  • 修改和删除学生信息;
  • 查询学生信息;

1.2  系统设计

1.2.1  系统功能结构

        学生信息管理系统分为5大功能模块,主要包括添加学生信息模块、删除学生信息模块、修改学生信息模块、查询学生信息模块、显示全部学生信息模块。学生信息管理系统的功能结构如图1.1所示。

图1.1  系统功能结构图

 

1.2.2  系统业务流程

        在开发学生信息管理系统前,需要先了解系统的业务流程。根据学生信息管理系统的需求分析及功能结构,设计如图1.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的函数定义,其功能是添加学生信息并存储在列表和文件中。以下是这个函数的具体解析:

  1. 导入信息:该函数首先导入了全局变量Info。这个变量可能是在其他地方定义的,用来存储所有学生的信息。
  2. 检查输入信息是否规范:接下来的部分是检查输入的信息是否满足特定的要求。这些检查包括检查学生的ID是否符合规定的格式,检查分数是否在合理范围内,以及检查班级信息是否规范。
  3. 检查ID是否重复:然后,它检查新学生的ID是否已经在Info列表中存在。如果存在,说明这个ID已经被使用过,函数就会输出提示信息并返回。
  4. 整合学生信息:如果所有检查都通过,函数就会创建一个新的字典,其中包含了学生的所有信息(ID,名字,主修专业,分数,班级)。
  5. 添加学生信息到列表:然后,这个字典被添加到Info列表中。
  6. 输出添加成功的提示信息:添加成功后,函数会输出一个提示信息。
  7. 将信息写入文件:最后,函数会将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),该函数用于删除学生信息。

代码的逻辑如下:

  1. 首先,检查输入的ID是否符合规范,如果不符合规范,则调用Tip_Add_ID()函数提示输入不规范,并返回。
  2. 定义一个布尔变量Flag,用于指示是否删除的状态指标,初始值为True
  3. 导入全局变量Info,该变量应该是一个包含学生信息的列表。
  4. 遍历Info列表,对于每个元素,判断其ID是否与输入的ID相同。
  5. 如果找到了匹配的ID,调用Info.remove(i)删除该元素,并将Flag设置为False,然后跳出循环。
  6. 如果遍历结束后Flag仍然为True,说明没有找到匹配的ID,调用Tip_Del_ID_None()函数提示删除失败,并返回。
  7. 如果找到了匹配的ID并成功删除,调用Tip_Del()函数提示删除成功。
  8. 最后,调用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),该函数用于修改学生信息。

代码的逻辑如下:

  1. 首先,检查输入的ID、Score和Class是否符合规范,如果不符合规范,则分别调用相应的提示函数,并返回。
  2. 导入全局变量Info,该变量应该是一个包含学生信息的列表。
  3. 遍历Info列表,对于每个元素,判断其ID是否与输入的ID相同。
  4. 如果找到了匹配的ID,将该元素中的Name、Major、Score和Class分别修改为输入的值。
  5. 如果遍历结束后仍然没有找到匹配的ID,则说明要修改的学生信息不存在,可能需要进行额外的处理。
  6. 如果找到了匹配的ID并成功删除,调用Tip_Mod()函数提示修改成功。
  7. 最后,调用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),该函数用于根据输入的部分信息查找符合条件的学生信息。

代码的逻辑如下:

  1. 首先,检查输入的ID是否规范,如果不规范,则调用Tip_Add_ID()函数提示输入不规范,并返回。
  2. 导入全局变量Info,该变量应该是一个包含学生信息的列表。
  3. 创建一个空的临时列表List,用于存储符合条件的学生信息。
  4. 定义一个布尔变量Flag,用于指示是否查找到学生的信息,初始值为False
  5. 遍历Info列表,对于每个元素,判断其ID是否与输入的ID相同,并根据条件筛选符合要求的学生信息。
  6. 如果找到了符合条件的学生信息,将其添加到List列表中。
  7. 判断List列表的长度是否为0,如果不为0,说明找到了符合条件的学生信息,将Flag设置为True
  8. 调用Print_Student_Info(List)函数,在主界面打印符合条件的学生信息。
  9. 根据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),用于在界面上展示学生信息。

代码的逻辑如下:

  1. 首先,检查输入的Student_Info是否为空,如果是,则将结果设置为"学生信息为空",并返回。
  2. 如果Student_Info的长度为0,则将结果设置为"无学生信息",并返回。
  3. 如果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,获取学生管理系统源码

6adf31c8c5dd4e6a83314f4805b30bc1.jpg

相关文章:

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

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统&#xff0c;该系统可以帮助教师快速录入学生的信息&#xff0c;并且对学生的信息进行基本的增、删、改、查操作&#xff1b;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…...

2023-08-25力扣每日一题

链接&#xff1a; 1448. 统计二叉树中好节点的数目 题意&#xff1a; 判断根节点到每个节点X的过程中&#xff0c;如果没有值大于X&#xff0c;则该节点为好节点&#xff0c;求好节点数量 解&#xff1a; 由于求根节点到其他节点的路径&#xff0c;则使用dfs算法&#xff…...

Vue3中的计算属性和属性监听

compute计算属性 Vue3中可以通过 compute进行监听计算属性&#xff0c;他返回的是一个ref的对象&#xff0c;也就是说 通过compuye这种方式计算属性实际上是进行了ref的操作 import { computed } from vue const user reactive({firstName: A,lastName: B }) // 只有getter的…...

微信开发之一键修改群公告的技术实现

简要描述&#xff1a; 设置群公告 请求URL&#xff1a; http://域名地址/setChatRoomAnnouncement 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必…...

【git】工作场景中常用的git命令

工作场景中常用的git命令 1. 必备改名改邮箱拉代码下来并且创建新分支git commit回滚某个文件删除分支 工作场景中常用的git命令&#xff0c;记录下来方便调取 1. 必备 改名改邮箱 一般与他人合作&#xff0c;至少你提交的名字得被人熟知或者遵循规范&#xff0c;因此需要更改…...

Vue路由(详解)

目录 路由原理 路由到底有什么作用&#xff1f; 路由安装和使用&#xff08;vue2&#xff09; 路由跳转 跳转实例&#xff1a; 路由的传值和取值 传值实例&#xff1a; 查询参和路由参的区别&#xff1a; 嵌套路由 嵌套实例&#xff1a; 路由守卫 守卫实例&#xff1…...

打开软件提示msvcp140.dll丢失的解决方法,msvcp140主要丢失原因

今天&#xff0c;我将为大家介绍一种非常常见的问题——msvcp140.dll丢失。这个问题可能会导致许多应用程序无法正常运行&#xff0c;甚至崩溃。但是&#xff0c;请不要担心&#xff0c;我会为大家提供5种解决方法&#xff0c;帮助大家轻松解决问题。 首先&#xff0c;我们来看…...

关于路由器和DNS解析的一些新理解

其实我本人对于交换机和路由器这些网络硬件是比较感兴趣的&#xff0c;也在一点一点的学习相关知识&#xff0c;每次解决一个问题&#xff0c;就让我对一些事情有新的思考。。 今天前台同事&#xff0c;的机器突然上不了网&#xff0c;&#xff0c;和领导一起去看了一波&#…...

vscode 与 C++

序 具体流程的话&#xff0c;官方文档里都有的&#xff1a;C programming with Visual Studio Code 浏览器下载一个mingw64&#xff0c;解压&#xff0c;配置环境变量vscode里安装c相关的插件没了 第一步只看文字&#xff0c;可能有点抽象&#xff0c;相关视频&#xff1a; …...

水果flstudio好用吗?中文版FL21最新版本如何下载

FL Studio21版是一款功能强大的音乐制作软件&#xff0c;广泛应用于电子音乐、流行音乐、电影配乐等领域。它提供了丰富多样的音频合成和编辑工具&#xff0c;使音乐制作变得更加灵活多样。无论是初学者还是专业音乐制作人&#xff0c;都可以通过直观的界面和丰富的音频特效来实…...

PHP is_array()函数详解,PHP判断是否为数组

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 is_array 一、基本使用二、空数组三、同时判断多个…...

面试题-React(三):什么是JSX?它与常规JavaScript有什么不同?

在React的世界中&#xff0c;JSX是一项引人注目的技术&#xff0c;它允许开发者在JavaScript中嵌套类似HTML的标签&#xff0c;用于描述UI组件的结构。本篇博客将通过丰富的代码示例&#xff0c;深入探索JSX语法&#xff0c;解析其在React中的用法和优势。 一、JSX基础语法 在…...

纯前端实现图片上传七牛云

首先安装下依赖&#xff1a; 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解释器

目的&#xff1a;创建一个ubuntu系统下的python解释器&#xff0c;作为win平台下的pycharm的解释器。 这样做的好处是可以直接在win系统里操作文件&#xff0c;相比于linux方便一点&#xff0c;而且也不用对wsl的子系统进行迁移。 一、安装前准备 1. 设置-Windows更新-window…...

EL与JSTL

目录 EL EL语法 EL运算符 JSTL JSTL标签分类 JSP脚本&#xff1a;代码结构混乱、脚本与HTML 混合易出错、代码不易维护。 EL表达式&#xff1a;优化程序代码&#xff0c;增加程序可读性。 EL EL语法 EL表达式 ${ EL 表达式 } EL操作符 操作符“ . ” 获取对象的属性&a…...

【Linux】动态库和静态库

动态库和静态库 软链接硬链接硬链接要注意 自定义实现一个静态库(.a)解决、使用方法静态库的内部加载过程 自定义实现一个动态库&#xff08;.so&#xff09;动态库加载过程 静态库和动态库的特点 软链接 命令:ln -s 源文件名 目标文件名 软链接是独立连接文件的&#xff0c;他…...

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 个&#xff0c;公开漏洞值得关注的是 Apache NiFi 连接 URL 验证绕过漏洞(CVE-2023-40037)、PowerJob 未授权访问漏洞(CVE-2023-36106)、Apache Airflow Spark Provider 任意文件读取漏洞(CVE-2023-40272)。 针对 NPM 、PyPI 仓库…...

CleanMyMac2024永久版Mac清理工具

Mac电脑作为相对封闭的一个系统&#xff0c;它会中毒吗&#xff1f;如果有一天Mac电脑产生了疑似中毒或者遭到恶意不知名攻击的现象&#xff0c;那又应该如何从容应对呢&#xff1f;这些问题都是小编使用Mac系统一段时间后产生的疑惑&#xff0c;通过一番搜索研究&#xff0c;小…...

软考高级系统架构设计师(一)计算机硬件

【原文链接】软考高级系统架构设计师&#xff08;一&#xff09;计算机硬件 1.1 计算机硬件组成 1.1.1 计算机的基本硬件组成 运算器控制器存储器输入设备输出设备 1.1.2 中央处理单元&#xff08;CPU&#xff09; 中央处理单元&#xff08;CPU&#xff09;的组成 运算器…...

bat文件中自定义cmd命令;执行完退出命令提示符窗口

1. bat中启动cmd命令 start cmd /k " cmd中命令行里自定义的命令 " 2.编写规则 start cmd /k "命令1 & 命令2 & 命令3" (无论前面命令是否成功, 后面都会执行start cmd /k "命令1 && 命令2 && 命令3 " (仅…...

深度学习的经典算法的论文、解读和代码实现

文章目录 CNN网络的经典算法LeNet-5AlexNetVGGInceptionInception-v1(GoogLeNet)BN-Inception ResNetR-CNNR-CNNFast R-CNNFaster R-CNN YOLOYOLO v1YOLO v2YOLO v3YOLO v4 RNN的经典算法RNNGRULSTMEncoder-DecoderAttentionTransformer CNN网络的经典算法 LeNet-5 来源论文&…...

开源TTS+gtx1080+cuda11.7+conda+python3.9吊打百度TTS

一、简介 开源项目&#xff0c;文本提示的生成音频模型 https://github.com/suno-ai/bark Bark是由Suno创建的基于变换器的文本到音频模型。Bark可以生成极为逼真的多语种演讲以及其他音频 - 包括音乐、背景噪音和简单的声音效果。该模型还可以产生非言语沟通&#xff0c;如…...

【私有GPT】CHATGLM-6B部署教程

【私有GPT】CHATGLM-6B部署教程 CHATGLM-6B是什么&#xff1f; ChatGLM-6B是清华大学知识工程和数据挖掘小组&#xff08;Knowledge Engineering Group (KEG) & Data Mining at Tsinghua University&#xff09;发布的一个开源的对话机器人。根据官方介绍&#xff0c;这是…...

基于“R语言+遥感“水环境综合评价方法教程

详情点击链接&#xff1a;基于"R语言遥感"水环境综合评价方法教程 一&#xff1a;R语言 1.1 R语言特点&#xff08;R语言&#xff09; 1.2 安装R&#xff08;R语言&#xff09; 1.3 安装RStudio&#xff08;R语言&#xff09; &#xff08;1&#xff09;下载地址…...

To_Heart—题解——P6234 [eJOI2019] T形覆盖

link. 突然很想写这篇题解。虽然题目不算难。 考场只有30分是为什么呢&#xff1f;看来是我没有完全理解这道题目吧&#xff01; 首先很明显的转换是&#xff0c;把 T 型覆盖看成十字形&#xff0c;再考虑最后减去某一块的贡献。 然后然后直接往原图上面放十字形!对于每一个…...

[软件工具]精灵标注助手目标检测数据集格式转VOC或者yolo

有时候我们拿到一个数据集发现是xml文件格式如下&#xff1a; <?xml version"1.0" ?> <doc><path>C:\Users\Administrator\Desktop\test\000000000074.jpg</path><outputs><object><item><name>dog</name>…...

Spring BeanName自动生成原理

先看代码演示 项目先定义一个User类 public class User {private String name;Overridepublic String toString() {return "User{" "name" name \ };}public String getName() {return name;}public void setName(String name) {this.name name;} }…...

论文阅读_图形图像_U-NET

name_en: U-Net: Convolutional Networks for Biomedical Image Segmentation name_ch: U-Net&#xff1a;用于生物医学图像分割的卷积网络 addr: http://link.springer.com/10.1007/978-3-319-24574-4_28 doi: 10.1007/978-3-319-24574-4_28 date_read: 2023-02-08 date_publi…...

阿里云备案多个网站/教育培训班

第1章 前言信息化的浪潮带来了企业市场竞争环境的巨大变化&#xff0c;建筑装饰行业[1]的发展之快也超过了人们的想象&#xff0c;行业市场也已不是简单的“实体”。如今&#xff0c;建筑装饰行业也进入了高度信息化的阶段&#xff0c;各大建筑装饰网站或平台的出现&#xff0c…...

wordpress首页打不开内容页正常/线上推广宣传方式有哪些

2019独角兽企业重金招聘Python工程师标准>>> 嵌套饼图的实现主要是定义多层数据&#xff0c;实际上只需要写成json格式的数组&#xff0c;多层数据源之间用逗号连接起来&#xff0c;自定义样式之后就可以实现&#xff0c;与非嵌套饼图没有很大的区别。 1.下载Echart…...

国内较好的网站开发商城/优化英文

php copy()函数介绍copy — 复制拷贝文件语法&#xff1a;bool copy ( string $source , string $dest [, resource $context ] )将文件从 source 复制拷贝到 dest。 如果要移动文件的话&#xff0c;请使用rename()函数。参数:source:源文件路径。dest:目标路径。如果 dest 是一…...

wordpress控制弹窗次数代码/html网页制作app

Akka是什么 Akka就是为了改变编写高容错性和强可扩展性的并发程序而生的。通过使用Actor模型我们提升了抽象级别&#xff0c;为构建正确的可扩展并发应用提供了一个更好的平台。在容错性方面我们采取了“let it crash”&#xff08;让它崩溃&#xff09;模型&#xff0c;人们已…...

主流网站 技术/重庆人力资源和社会保障网

进入系统后切换为root权限 su 注意权限问题 前面切换到root执行下面代码 备份原来的源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载阿里的yum源 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Ce…...

网站建设 空间什么系统/橙子建站怎么收费

为满足硬件开发的同事验证从传感器采集到的数据是否正确&#xff0c;也为了方便我自己&#xff0c; 随手做了这个小东西&#xff0c;主要涉及浮点数的存储问题&#xff01; 转载于:https://www.cnblogs.com/felixzh/p/4511289.html...