一、学生信息管理系统
本文使用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()
return
for i in Info:
if ID == i['ID']:
Tip_Add_ID_Repeat()
return
if not is_Score(Score):
Tip_Add_Score()
return
if 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 = False
break
if 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()
return
if not is_Score(Score):
Tip_Add_Score()
return
if not is_Class(Class):
Tip_Add_Class()
return
# 导入信息
global Info
# 遍历,修改学生信息
for i in Info:
if i["ID"] == ID:
i["Name"] = Name
i["Major"] = Major
i["Score"] = Score
i["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("学生信息为空")
return
if 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的子窗口window
window = tk.Toplevel(root)
# 窗口名字
window.title("添加学生信息")
# 窗口大小
window.geometry('500x500')
# 关于学号的 label 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 和 entry
Txt_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 True
else:
return False
# 定义一个方法,用于计算中西文混合字符串的字符串长度
def Len_Str(string):
count = 0
for line in string:
if is_Chinese(line):
count = count + 2
else:
count = count + 1
return 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,获取学生管理系统源码”