Python实现学生信息管理系统V3.0(GUI界面)

news/2025/1/15 15:35:00/

关于“学生信息管理系统”的基本思路和详细过程,请看V1.0版本:

Python实现学生信息管理系统V1.0_︶ㄣ释然的博客-CSDN博客本文是关于学生信息管理系统的简易版以及具体内容具体思路的详细讲解,简单易理解、纯逻辑实现、没有复杂的第三方库,适合新手小白练手https://blog.csdn.net/qq_60735796/article/details/125648838

关于“学生信息管理系统”的非GUI进阶版本,请看V2.0版本:

Python实现学生信息管理系统V2.0(读写文件操作)_︶ㄣ释然的博客-CSDN博客本文是关于学生信息管理系统的“进阶”,引入了文件句柄操作txt文件(读取和写入学生信息)https://blog.csdn.net/qq_60735796/article/details/125649281下面是GUI界面的V3.0版本,同时包含学生信息的写入文件。

 

先给大家展示的是GUI可视化的大致实现思路

e94d20b436c04e4494049d3b2d1b3087.png

 

本程序的GUI界面可视化是使用了python的tkinter库(下面称thinter为tk)

①下面介绍如何初始化GUI界面

界面主要是使用了tk.label 和 tk.entry(代码即注释)

# 关于gui的代码, 用方法封装比较困难,
#   此处利用if __name__ == '__main__' , 方便代码折叠, ”阅读”全局思路
if __name__ == '__main__':# 以下代码全部为gui界面的初始化# 第1步,实例化对象,建立窗口windowwindow = tk.Tk()# 第2步,给窗口的可视化起名字window.title('学生信息管理系统 V6.1')  # 学生信息管理系统6 - 1# 第3步,设定窗口的大小(长 * 宽)window.geometry('500x650')# tk.StringVar()用于接收用户输入result = tk.StringVar()result.set(" ")# ①关于姓名的 label 和 entrytextName = tk.StringVar()textName.set("")labelLine1 = tk.Label(window, text="姓     名:", font=('Arial', 15), width=10).place(x=75, y=50, anchor='nw')entryLine1 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=textName, width=20)entryLine1.place(x=190, y=50, anchor='nw')  # 显示成明文形式# ②关于性别的 label 和 entrytextSex = tk.StringVar()textSex.set("")labelLine2 = tk.Label(window, text="性     别:", font=('Arial', 15), width=10)labelLine2.place(x=75, y=100, anchor='nw')entryLine2 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textSex, width=18)entryLine2.place(x=190, y=100, anchor='nw')# ③关于电话的 label 和 entrytextPhone = tk.StringVar()textPhone.set("")labelLine3 = tk.Label(window, text="电     话:", font=('Arial', 15), width=10).place(x=75, y=150, anchor='nw')entryLine3 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textPhone, width=18)entryLine3.place(x=190, y=150, anchor='nw')# 关于"添加"组件,此处绑定函数addStudentsMessage()用于添加学生信息button1_add = tk.Button(window, text='添   加', bg='silver', font=('Arial', 12), command=addStudentsMessage, width=8)button1_add.place(x=40, y=220, anchor='nw')# 关于"删除"组件,此处绑定函数deleteMessage()用于删除学生信息button2_delete = tk.Button(window, text='删   除', bg='silver', font=('Arial', 12), command=deleteMessage, width=8)button2_delete.place(x=150, y=220, anchor='nw')# 关于"修改"组件,此处绑定函数change()用于修改学生信息button3_change = tk.Button(window, text='修   改', bg='silver', font=('Arial', 12), command=change, width=8)button3_change.place(x=260, y=220, anchor='nw')# 关于"显示"组件,此处绑定函数show()用于显示学生信息button4_show = tk.Button(window, text='显   示', bg='silver', font=('Arial', 12), command=show, width=8)button4_show.place(x=370, y=220, anchor='nw')# 下边两行代码是在gui界面显示我的学号和姓名labelLine_Name = tk.Label(window, text="许梓璘", font=('宋体', 13), width=10).place(x=130, y=260, anchor='nw')labelLine_myID = tk.Label(window, text="2109059342", font=('宋体', 13), width=10).place(x=250, y=260, anchor='nw')show_result = tk.Label(window, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw', textvariable=result)show_result.place(x="25", y="300", width="450", height="300")window.mainloop()

 

②实现可视化之后,原来V1.0和V2.0版本输出(print)的提示信息和获取用户输入(input),不再适用,此时要采用tk.StringVar().set()设置GUI界面的文本框展示信息以及tk.StringVar().get()获取用户在GUI界面输入的文本内容

(注意此处获取到的文本内容,均为StringVar类型而并非String,这是不可变数据类型),其余实现思路均类似于V2.0版本(此处以“修改学生信息”功能为例)

# 3、修改学生信息
def change():if LIST is None:result.set("没有信息,无法修改")return Noneif len(LIST) == 0:result.set("没有信息,无法修改")return Noneif len(LIST) != 0:inputName = textName.get()for i in range(0, len(LIST)):if LIST[i]["name"] == inputName:LIST[i]["sex"] = textSex.get()LIST[i]["phone"] = textSex.get()writeTxt_wMode(LIST)result.set("修改成功")delete_Gui_StudentMessage()return

 

③展示GUI界面实现结果

460aabdda7a74be8a7191084e8c9d5bf.png

 

 


最后,附上完整代码,其中附有详细注释:

# -*- coding: utf-8 -*-
# @Author:︶ㄣ释然
# @Time: 2022/7/6 22:08import tkinter as tk# 定义一个全局变量接收学生信息并进行更新
LIST = []# 定义一个方法用于使用w模式写入文件:传入已经存好变更好信息的列表,然后遍历写入txt文档
def writeTxt_wMode(studentList):#     w:只写入模式,文件不存在则建立,将文件里边的内容先删除再写入with open("test.txt", "w", encoding="utf-8") as f:for i in range(0, len(studentList)):DICT = studentList[i]if i == len(studentList) - 1:f.write("{0}\t{1}\t{2}".format(DICT["name"], DICT["sex"], DICT["phone"]))else:f.write("{0}\t{1}\t{2}\n".format(DICT["name"], DICT["sex"], DICT["phone"]))# 定义一个方法用于读取文件:
def readTxt() -> list:emptyList1 = []emptyList2 = []# 打开同目录下的txt文件f = open("./test.txt", 'r', encoding='UTF-8')# 把txt文件中的每一行学生信息,存储为新列表emptyList1的元素,for i in f:a = str(i)b = a.replace('\n', '')emptyList1.append(b.split("\t"))# 依次将emptyList的三种学生信息字典,存入列表while len(emptyList2) < len(emptyList1):for j in range(0, len(emptyList1)):name = emptyList1[j][0]sex = emptyList1[j][1]phone = emptyList1[j][2]Dict = {"name": name, "sex": sex, "phone": phone}# 把该字典作为emptyList2的一个元素,依次存入。emptyList2.append(Dict)f.close()# 最后结束方法,返回存储信息完成的列表return emptyList2# 定义一个方法,检查输入的电话号码是否符合规范,返回布尔值
def checkPhoneNumber_Boolean(phone):if phone.isdigit():return Trueelse:result.set("电话号码输入不是纯数字")return False# 定义一个方法,去除字符串左右两端的空格,并返回处理之后的字符串
def trim(strings):# 获取从偏移为0的字符一直到偏移为1的字符串,不包括偏移为1的字符串#     (该功能用于去除字符串左边的空格)while strings[:1] == ' ':strings = strings[1:]# 获取从偏移为-1的字符一直到偏移为最后一位的字符串,不包括偏移为最后一位的字符串#     (该功能用于去除字符串右边的空格)while strings[-1:] == ' ':strings = strings[:-1]# 左右两端空格去除完成,返回stringsreturn strings# 定义方法查找同名
def checkTheSameName(enterName):flagList = []  # 存的是名字的索引List = []returnList = []date = 1# 开始遍历查找for i in range(0, len(LIST)):if LIST[i]["name"] == enterName:# 把找到的名字对应的索引,添加进列表flagList.append(int(i))if len(flagList) == 1:# 说明信息中只存在一个这样的名字return date  # 返回1表示不重名if len(flagList) > 1:for i in flagList:List.append(LIST[i])# 此时,List的长度等于flagListreturnList.append(List)returnList.append(flagList)return returnList  # 第一个元素是列表,第二个元素是存储重复名字的索引的 列表# 定义方法显示所有重复的学生信息
def show_ofTheSameName(list_ofTheSameName):# 定义一个字符串用于存储想要输出显示的内容str_out = ""str_out += "出现同名,同名学生信息显示如下:\n"# 打印头部标题 并进行格式化str_out += ("{:^9}".format("学生序号") +"{:^9}".format("学生姓名") +"{:^9}".format("学生性别") +"{:^11}".format("电话号码") +"\n")for i in range(0, len(list_ofTheSameName)):# 格式化字符串str_out += ("{:<11}".format(i + 1, chr(12288)) +"{:<11}".format(list_ofTheSameName[i].get("name"), chr(12288)) +"{:^9}".format(list_ofTheSameName[i].get("sex"), chr(12288)) +"{:>15}".format(list_ofTheSameName[i].get("phone"), chr(12288)) +"\n")str_out += "\n请在上方输入详细学生信息,进行精准删除"result.set(str_out)# 定义方法清除gui界面的三个学生信息
def delete_Gui_StudentMessage():textName.set("")textSex.set("")textPhone.set("")# 1、添加学生信息
def addStudentsMessage():# 在gui界面输入的学生姓名,使用get()方法,获取entry中输入的内容#    并且用name接收name = textName.get()# 判断是否为空,并在gui界面进行提示if not name:result.set("学生姓名不能为空")return# 调用自定义的方法,去除字符串两端的空格再进行比较,如果去除空格之后为空,则说明键入的字符串只有空格if trim(name) == "":result.set("学生姓名不能为空")return# 判断性别输入是否正确#   在gui界面输入的学生性别,使用get()方法,获取entry中输入的内容#      并且用sex接收sex = textSex.get()if sex == "F" or sex == "M":passelse:# 如果输入的性别不符合规范,则在gui界面进行提示result.set("性别输入格式有误")return# 判断电话输入是否正确#   在gui界面输入的学生电话号码,使用get()方法,获取entry中输入的内容#      并且用phone接收phone = textPhone.get()# 调用自定义的检查方法,返回布尔类型,如果符合要求,则返回TrueresultBoolean = checkPhoneNumber_Boolean(phone)if resultBoolean:passelse:returnDict = {"name": name, "sex": sex, "phone": phone}LIST.append(Dict)result.set("学生已添加")# 调用自定义方法清除gui界面的学生信息delete_Gui_StudentMessage()writeTxt_wMode(LIST)return# 2、删除学生信息
def deleteMessage() -> list:# 定义信号位flag = TrueenterName = textName.get()for i in range(0, len(LIST)):if LIST[i]["name"] == enterName:flag = Falsebreakif flag:result.set("学生不存在")# 学生不存在则没有必要查找是否同名return LIST# 开始遍历查找accept = checkTheSameName(enterName)  # 接收查找同名方法的返回值if accept == 1:for i in range(0, len(LIST)):if LIST[i]["name"] == enterName:del LIST[i]result.set("删除成功")writeTxt_wMode(LIST)delete_Gui_StudentMessage()# 删除成功直接返回,结束该方法returnelse:# 此时出现同名,accept[0]和accept[1]都是列表对象# accept[0]存储的是同名学生信息show_ofTheSameName(accept[0])for i in range(0, len(LIST)):if LIST[i]["name"] == textName.get():if LIST[i]["sex"] == textSex.get():if LIST[i]["phone"] == textPhone.get():del LIST[i]result.set("删除成功")writeTxt_wMode(LIST)delete_Gui_StudentMessage()return# 3、修改学生信息
def change():if LIST is None:result.set("没有信息,无法修改")return Noneif len(LIST) == 0:result.set("没有信息,无法修改")return Noneif len(LIST) != 0:inputName = textName.get()for i in range(0, len(LIST)):if LIST[i]["name"] == inputName:LIST[i]["sex"] = textSex.get()LIST[i]["phone"] = textSex.get()writeTxt_wMode(LIST)result.set("修改成功")delete_Gui_StudentMessage()return# 4、显示所有学生信息
def show():# 定义一个字符串用于存储想要输出显示的内容str_out = ""if LIST is None:result.set("无学生信息")returnif len(LIST) == 0:result.set("无学生信息")returnif len(LIST) != 0:str_out += "学生信息如下:\n"# 打印头部标题 并进行格式化str_out += ("{:^9}".format("学生序号") +"{:^9}".format("学生姓名") +"{:^9}".format("学生性别") +"{:^11}".format("电话号码") +"\n")for i in range(0, len(LIST)):# 格式化字符串str_out += ("{:<11}".format(i + 1, chr(12288)) +"{:<11}".format(LIST[i].get("name"), chr(12288)) +"{:^9}".format(LIST[i].get("sex"), chr(12288)) +"{:>15}".format(LIST[i].get("phone"), chr(12288)) +"\n")# 在gui界面更新显示最新的字符串strresult.set(str_out)# 把文件里边的学生信息添加到LIST1里边,如果发现文件里边的学生信息为空,则继续执行后面的程序
try:for i in readTxt():LIST.append(i)
except:pass# 关于gui的代码, 用方法封装比较困难,
#   此处利用if __name__ == '__main__' , 方便代码折叠, ”阅读”全局思路
if __name__ == '__main__':# 以下代码全部为gui界面的初始化# 第1步,实例化对象,建立窗口windowwindow = tk.Tk()# 第2步,给窗口的可视化起名字window.title('学生信息管理系统 V3.0')  # 学生信息管理系统6 - 1# 第3步,设定窗口的大小(长 * 宽)window.geometry('500x650')# tk.StringVar()用于接收用户输入result = tk.StringVar()result.set(" ")# ①关于姓名的 label 和 entrytextName = tk.StringVar()textName.set("")labelLine1 = tk.Label(window, text="姓     名:", font=('Arial', 15), width=10).place(x=75, y=50, anchor='nw')entryLine1 = tk.Entry(window, show=None, font=('宋体', 15), textvariable=textName, width=20)entryLine1.place(x=190, y=50, anchor='nw')  # 显示成明文形式# ②关于性别的 label 和 entrytextSex = tk.StringVar()textSex.set("")labelLine2 = tk.Label(window, text="性     别:", font=('Arial', 15), width=10)labelLine2.place(x=75, y=100, anchor='nw')entryLine2 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textSex, width=18)entryLine2.place(x=190, y=100, anchor='nw')# ③关于电话的 label 和 entrytextPhone = tk.StringVar()textPhone.set("")labelLine3 = tk.Label(window, text="电     话:", font=('Arial', 15), width=10).place(x=75, y=150, anchor='nw')entryLine3 = tk.Entry(window, show=None, font=('Arial', 15), textvariable=textPhone, width=18)entryLine3.place(x=190, y=150, anchor='nw')# 关于"添加"组件,此处绑定函数addStudentsMessage()用于添加学生信息button1_add = tk.Button(window, text='添   加', bg='silver', font=('Arial', 12), command=addStudentsMessage, width=8)button1_add.place(x=40, y=220, anchor='nw')# 关于"删除"组件,此处绑定函数deleteMessage()用于删除学生信息button2_delete = tk.Button(window, text='删   除', bg='silver', font=('Arial', 12), command=deleteMessage, width=8)button2_delete.place(x=150, y=220, anchor='nw')# 关于"修改"组件,此处绑定函数change()用于修改学生信息button3_change = tk.Button(window, text='修   改', bg='silver', font=('Arial', 12), command=change, width=8)button3_change.place(x=260, y=220, anchor='nw')# 关于"显示"组件,此处绑定函数show()用于显示学生信息button4_show = tk.Button(window, text='显   示', bg='silver', font=('Arial', 12), command=show, width=8)button4_show.place(x=370, y=220, anchor='nw')# 下边两行代码是在gui界面显示我的作者信息labelLine_Name = tk.Label(window, text="@Author:", font=('宋体', 13), width=10).place(x=130, y=260, anchor='nw')labelLine_myID = tk.Label(window, text="︶ㄣ释然", font=('宋体', 13), width=10).place(x=250, y=260, anchor='nw')show_result = tk.Label(window, bg="white", fg="black", font=("宋体", 12), bd='0', anchor='nw', textvariable=result)show_result.place(x="25", y="300", width="450", height="300")window.mainloop()

 

 

 

 


http://www.ppmy.cn/news/154634.html

相关文章

【正点原子FPGA连载】第四十三章MT9V034摄像头RGB-LCD显示实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

1&#xff09;实验平台&#xff1a;正点原子新起点V2开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609758951113 2&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/thread-300792-1-1.html 3&#xff09;对…

V神(Vitalik Buterin),区块链名人—以太坊(Eth)创始人简介

&#xff08;小野坚持写好每一篇文章&#xff0c;喜欢就点个赞吧&#xff01;&#xff09; 所有人的梦一定要去追寻&#xff0c;并不是天才一生下来就是天才&#xff0c;任何天才除了有天分之外还必须要有后天的努力&#xff01; 以太坊&#xff08;Ethereum&#xff09; 以…

Z370技嘉主板通过U盘刷BIOS和恢复MAC地址的方法

技嘉主板通过U盘刷BIOS的方法 1、用.net的那个老毛桃制作一个PE U盘&#xff0c;注意是FAT32格式&#xff08;这样开机菜单就会显示U盘&#xff09;&#xff0c;杀软报警自行排除。 2、然后在技嘉官网下载最新的BIOS文件&#xff0c;一定要对好主板型号&#xff0c;解压到U盘。…

P76v 调试

1. 淘宝淘了一台二手台电P76v&#xff0c;主控是A13&#xff0c;其伟大之初在于史无前例的使用了LQFP封装&#xff0c;而且市面可见的可以达到GHz主频以上的CPU鲜见LQFP封装&#xff01; 2. 调试串口引出&#xff1a;打开外壳&#xff0c;拆开电路板&#xff0c;在CPU的反面2个…

uc浏览器电脑版 v1.0.370 官方版

uc浏览器电脑版 v1.0.370 官方版 软件大小&#xff1a;43.8MB 软件语言&#xff1a;简体中文 软件性质&#xff1a;常用软件 软件授权&#xff1a;官方版 更新时间&#xff1a;2014-05-27 应用平台&#xff1a;/WinXP/|Win7|/Vista/|Win8 uc浏览器电脑版是uc最新推出的pc…

vue使用 v-charts 常用方法总结

vue使用 v-charts 常用方法总结 折线图&#xff1a;柱形图&#xff1a;水球图&#xff1a;环形图&#xff1a;散点图&#xff1a;日常开发图表中&#xff0c;v-chatrs中的方法&#xff0c;有很多基本都是通用 v-charts传送门入口 e-charts传送门入口 折线图&#xff1a; htm…

3.7V锂电池供电系统设计(含充电、保护、供电及电源切换电路器件选型和原理图)

锂电池供电系统 一、锂电池 锂离子电池的负极为石墨晶体&#xff0c;正极通常为二氧化锂。充电时锂离子由正极向负极运动而嵌入石墨层中。放电时&#xff0c;锂离子从石墨晶体内负极表面脱离移向正极。所以&#xff0c;在该电池充放电过程中锂总是以锂离子形态出现&#xff0c…

抽奖之手机大转盘

直接看效果点这里 HTML <!DOCTYPE html> <html> <head>