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

news2024/9/28 21:26:53

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()
        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的函数定义,其功能是添加学生信息并存储在列表和文件中。以下是这个函数的具体解析:

  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 = False
            break
    if 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()
        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),该函数用于修改学生信息。

代码的逻辑如下:

  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("学生信息为空")
        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),用于在界面上展示学生信息。

代码的逻辑如下:

  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的子窗口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,获取学生管理系统源码

6adf31c8c5dd4e6a83314f4805b30bc1.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/929075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK + Kibana + Logstash实现可视化日志

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;elasticsearch、kibana、logstash、日志收集、日志可视化☀️每日 一言&#xff1a;坚持就是胜利啊&#xff0c;哥~ 一、前言 面试官&#xff1a;在日常开发工作中你们是如何查看日志的呢&#x…

9.2 互补功率放大电路

目前使用最广泛的是无输出变压器的功率放大电路&#xff08;OTL 电路&#xff09;和无输出电容的功率放大电路&#xff08;OCL 电路&#xff09;。 一、OCL 电路的组成及工作原理 为了消除图9.1.5所示的基本 OCL 电路所产生的交越失真&#xff0c;应当设置合适的静态工作点&a…

SpringBoot入门篇1 - 简介和工程创建

目录 SpringBoot是由Pivotal团队提供的全新框架&#xff0c; 其设计目的是用来简化Spring应用的初始搭建以及开发过程。 1.创建入门工程案例 ①创建新模块&#xff0c;选择Spring初始化&#xff0c;并配置模块相关基础信息 ②开发控制器类 controller/BookController.jav…

改进YOLO系列:9.添加S2Attention注意力机制

添加S2Attention注意力机制 1. S2Attention注意力机制论文2. S2Attention注意力机制原理3. S2Attention注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. S2Attention注意力机制论文 论文题目:S 2 -MLPV2: IMPROVED SPATIAL-SHIFT MLP ARCHITECTURE…

【项目实战典型案例】05.前后端分离的好处(发送调查问卷)

目录 一、背景二、思路三、过程1、主要的业务逻辑2、解决问题的思路 四、总结五、面向对象的好处 一、背景 以下流程图是给用户发送调查问的整体流程&#xff0c;将不必要的业务逻辑放到前端进行处理。这样导致逻辑混乱难以维护。前后端分离的其中一个目的是将功能的样式放在了…

go语言学习之有关变量的知识

文章目录 变量的学习1.变量的使用步骤2.变量的注意事项3.变量使用的三种方式&#xff1a;4.程序中 号的使用5.变量的数据类型1&#xff09;int数据类型2&#xff09;小数类型浮点型3&#xff09;**字符类型**4&#xff09;**字符串&#xff08;String&#xff09;类型**5&…

excel 分组排序

excel中会遇到对不同分组数据进行排序&#xff0c;比如对于不同班级里的学生按照分数高低进行升序排序&#xff0c;可以采用如下公式 SUMPRODUCT((A$2:A$12A2)*(C$2:C$12>C2))1 如果需要 进行降序排序&#xff0c;将公式中的大于号替换为小于号即可

Java 体系性能优化工具

Java 体系性能优化 目录概述需求&#xff1a; 设计思路实现思路分析1.oom 异常来说&#xff1a;2.visualvm3.Arthas4.JProfiler &#xff08;全面&#xff09;5.jmeter 特有 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect…

1014. 最佳观光组合;1220. 统计元音字母序列的数目;1011. 在 D 天内送达包裹的能力​

1014. 最佳观光组合 核心思想&#xff1a;枚举优化&#xff0c;简单想法就是枚举i在同时枚举j&#xff0c;但是这样做时间复杂度太高&#xff0c;那么我们就要想办法优化它&#xff0c;values[i] values[j] i - j可以分为values[i] i&#xff0c;values[j] - j两部分&#…

爬虫实战之使用 Python 的 Scrapy 库开发网络爬虫详解

关键词 - Python, Scrapy, 网络爬虫 在信息爆炸时代&#xff0c;我们每天都要面对海量的数据和信息。有时候我们需要从互联网上获取特定的数据来进行分析和应用。今天我将向大家介绍如何使用 Python 的 Scrapy 库进行网络爬虫&#xff0c;获取所需数据。 1. Scrapy 简介 1.1 …

Jmeter压测测试

Jmeter安装启动 1、Jmeter下载安装 模拟真正的大量并发请求 下载Jmeter&#xff1a;Apache JMeter - Download Apache JMeter 解压apache-jmeter-5.4.1.zip文件至目录下&#xff08;不要有空格和中文&#xff09; 2、配置JMETER_HOME 我的电脑----》属性----》高级----》环…

CleanMyMac2024永久版Mac清理工具

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

若依移动端Ruoyi-App 入门

后端项目运行 运行报错 Error creating bean with name sysConfigServiceImpl: Invocation of init method failed 数据库创建了。 代码连接数据库地方了也匹配上了。但是还是报错。 分析 &#xff1a; 想起来我电脑从来没有安装过redis 下载安装redis到windows 链接&…

Vue2向Vue3过度核心技术watch侦听器

目录 1 watch侦听器1.1 作用&#xff1a;1.2 语法&#xff1a;1.3 侦听器代码准备 2 翻译案例-代码实现3 watch侦听器3.1 语法3.2 需求3.3 代码实现3.4 总结 1 watch侦听器 1.1 作用&#xff1a; ​ 监视数据变化&#xff0c;执行一些业务逻辑或异步操作 1.2 语法&#xff1a…

Spring与Mybatis集成且Aop整合

目录 一、集成 1.1 集成的概述 1.2 集成的优点 1.3 代码示例 二、整合 2.1 整合概述 2.2 整合进行分页 一、集成 1.1 集成的概述 集成是指将不同的组件、部分或系统组合在一起&#xff0c;以形成一个整体功能完整的解决方案。它是通过连接、交互和协调组件之间的关系来实…

CSS实现内凹圆角,从而实现圆角边框

1、代码 <!DOCTYPE html> <html><head><style>.uu {position: relative;width: 400px;height: 300px;}img {width: 100%;height: 100%;z-index: 1;}.box_right_top {background-image: radial-gradient(circle at left bottom, transparent 50px, whi…

vue ui 创建项目没有反应

问题 cmd中输入 vue ui 没有反应 解决办法 vue ui命令需要vue3.0以上的版本才可以 1、查看当前版本 vue --version vue版本在3.0以下是没有ui命令的 2、查看版本所拥有的命令 vue -h 3、卸载之前版本的vue npm uninstall vue-cli -g 卸载完成&#xff0c;检查是否已经…

Notepad++正则匹配

Notepad正则匹配 Notepad正则表达式字符串最长不能超过69个字符一、支持的语法二、正则表达式诀窍三、案例3.1、匹配时间戳3.2、提取指定字符串3.3、提取单词3.4、查找中文字符 四、示例4.1、示例1&#xff1a;把含目标字符串及之后的字符串全部替换4.2、示例2&#xff1a;4.3、…

WPF读取dicom序列:实现上一帧、下一帧、自动播放、暂停

一、整体设计概况 创建WPF程序使用.Net Framework4.8定义Image控件展示图像增加标签展示dcm文件信息规划按钮触发对应的事件:上一帧、下一帧、自动播放、暂停、缩放、播放速率二、页面展示 三、代码逻辑分析 Windows窗体加载Loaded事件:生成初始图像信息Windows窗体加载Mous…

搭建产品知识库:正确构建和使用产品知识库,做好知识沉淀

对于产品来说&#xff0c;通过设立产品知识库将用户所需要的产品知识进行汇总和整理&#xff0c;并且针对用户所急需解决的问题提供相关解决方案&#xff0c;这就是搭建产品知识库最大的价值。 产品知识库的搭建方式其实很简单&#xff0c;只需要借助HelpLook将优质的内容和解决…