python超详细实现完整学生成绩管理系统
读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用Python实现一个完整版学生成绩管理系统,大家可以在过程中查缺补漏,提升水平 学生成绩管理系统简介
一个带有登录界面具有增减改查功能的学生成绩管理系统(面向对象思想,利用tkinter库进行制作,利用.txt文件进行存储数据)
源代码
仅供学习参考,最好还是自己多敲多练习(实践是检验真理的唯一标准)students.txt
用于存储数据main.pyfrom tkinter import * from Login import * import tkinter as tk root = tk.Tk() root.title("欢迎进入学生成绩管理系统") LoginPage(root) root.mainloop()Login.pyfrom tkinter import * from tkinter.messagebox import * from MenuPage import * class LoginPage(object): def __init__(self, master=None): self.root = master # 定义内部变量root self.root.geometry("%dx%d" % (300, 180)) # 设置窗口大小 self.username = StringVar() self.password = StringVar() self.createPage() def createPage(self): self.page = Frame(self.root) # 创建Frame self.page.pack() Label(self.page).grid(row=0, stick=W) Label(self.page, text="账户: ").grid(row=1, stick=W, pady=10) Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E) Label(self.page, text="密码: ").grid(row=2, stick=W, pady=10) Entry(self.page, textvariable=self.password, show="*").grid(row=2, column=1, stick=E) Button(self.page, text="登陆", command=self.loginCheck).grid(row=3, stick=W, pady=10) Button(self.page, text="退出", command=self.page.quit).grid(row=3, column=1, stick=E) def loginCheck(self): name = self.username.get() password = self.password.get() if name == "hacker707" and password == "admin": self.page.destroy() MenuPage(self.root) else: showinfo(title="错误", message="账号或密码错误!")db.pyimport json class StudentDB(object): def __init__(self): self.students = [] self._load_students_data() def insert(self, student): self.students.append(student) print(self.students) def all(self): return self.students def delete_by_name(self, name): # 删除数据 for student in self.students: if name == student["name"]: self.students.remove(student) break else: return False return True # 查询 def search_by_name(self, name): for student in self.students: if name == student["name"]: return student # 姓名+成绩 else: return False # 修改 def update(self, stu): # 修改数据 name = stu["name"] for student in self.students: if name == student["name"]: student.update(stu) return True else: return False # 加载文件 def _load_students_data(self): with open("students.txt", "r", encoding="utf-8") as f: text = f.read() if text: self.students = json.loads(text) # 保存数据 def save_data(self): with open("students.txt", "w", encoding="utf-8") as f: text = json.dumps(self.students, ensure_ascii=False) f.write(text) db = StudentDB()MenuPage.pyimport tkinter as tk from view import * class MenuPage(object): def __init__(self, master=None): self.root = master self.root.geometry("%dx%d" % (600, 400)) self.create_page() self.input_page = InputFrame(self.root) self.query_page = QuerryFrame(self.root) self.delete_page = DeleteFrame(self.root) self.update_page = UpdateFrame(self.root) self.about_page = AboutFrame(self.root) self.input_page.pack() def create_page(self): # 创建菜单对象 menubar = tk.Menu(self.root) # add_command 添加 menubar.add_command(label="录入", command=self.input_data) # label menubar.add_command(label="查询", command=self.query_data) # label menubar.add_command(label="删除", command=self.delete_data) # label menubar.add_command(label="修改", command=self.update_data) # label menubar.add_command(label="关于", command=self.about_data) # label # 设置菜单栏 self.root.config(menu=menubar) # 切换界面 def input_data(self): self.input_page.pack() self.update_page.pack_forget() self.delete_page.pack_forget() self.about_page.pack_forget() self.query_page.pack_forget() def query_data(self): self.input_page.pack_forget() self.query_page.pack() self.update_page.pack_forget() self.delete_page.pack_forget() self.about_page.pack_forget() def update_data(self): self.input_page.pack_forget() self.update_page.pack() self.delete_page.pack_forget() self.about_page.pack_forget() self.query_page.pack_forget() def delete_data(self): self.input_page.pack_forget() self.update_page.pack_forget() self.delete_page.pack() self.about_page.pack_forget() self.query_page.pack_forget() def about_data(self): self.input_page.pack_forget() self.update_page.pack_forget() self.delete_page.pack_forget() self.about_page.pack() self.query_page.pack_forget()view.pyimport tkinter as tk from db import db from tkinter import ttk # 录入类 class InputFrame(tk.Frame): def __init__(self, master=None): super().__init__(master) self.root = master self.name = tk.StringVar() self.math = tk.StringVar() self.chinese = tk.StringVar() self.english = tk.StringVar() self.status = tk.StringVar() self.create_page() def create_page(self): tk.Label(self).grid(row=0, stick=tk.W, pady=10) tk.Label(self, text="姓名:").grid(row=1, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self, textvariable=self.name).grid(row=1, column=1, stick=tk.E) tk.Label(self, text="数学:").grid(row=2, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self, textvariable=self.math).grid(row=2, column=1, stick=tk.E) tk.Label(self, text="语文:").grid(row=3, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E) tk.Label(self, text="英语:").grid(row=4, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self, textvariable=self.english).grid(row=4, column=1, stick=tk.E) tk.Button(self, text="录入", command=self.recode_student).grid(row=5, column=1, stick=tk.E, pady=10) tk.Label(self, textvariable=self.status).grid(row=6, column=1, stick=tk.E, pady=10) # 录入成绩 def recode_student(self): student = { "name": self.name.get(), "math": self.math.get(), "chinese": self.chinese.get(), "english": self.english.get(), } # 一个学生的成绩 db.insert(student) # get()得到值 # set()设置值 self.status.set("插入数据成功!") self._clear_data() db.save_data() # 清空文本数据 def _clear_data(self): self.name.set("") self.math.set("") self.chinese.set("") self.english.set("") # 查询类 class QuerryFrame(tk.Frame): def __init__(self, master=None): super().__init__(master) self.root = master self.create_page() # 创建查询界面 def create_page(self): self.create_tree_view() self.show_data_frame() # grid() tk.Button(self, text="刷新数据", command=self.show_data_frame).pack(anchor=tk.E, pady=5) # Treeview def create_tree_view(self): # 表头 columns = ("name", "chinese", "math", "english") self.tree_view = ttk.Treeview(self, show="headings", columns=columns) self.tree_view.column("name", width=80, anchor="center") self.tree_view.column("chinese", width=80, anchor="center") self.tree_view.column("math", width=80, anchor="center") self.tree_view.column("english", width=80, anchor="center") self.tree_view.heading("name", text="姓名") self.tree_view.heading("chinese", text="语文") self.tree_view.heading("math", text="数学") self.tree_view.heading("english", text="英语") self.tree_view.pack() # 显示数据 def show_data_frame(self): # 删除原节点 map(int,值) for i in map(self.tree_view.delete, self.tree_view.get_children("")): pass # 拿到列表里面所有值、students[] students = db.all() # 同时拿到索引跟value值 for index, stu in enumerate(students): self.tree_view.insert("", index, values=(stu["name"], stu["chinese"], stu ["math"], stu["english"])) class DeleteFrame(tk.Frame): def __init__(self, master=None): super().__init__(master) tk.Label(self, text="删除数据").pack() self.status = tk.StringVar() self.de_name = tk.StringVar() # 获取删除学生的姓名 self.create_page() # 创建界面 def create_page(self): tk.Label(self, text="根据姓名删除信息").pack(anchor=tk.W, padx=20) e1 = tk.Entry(self, textvariable=self.de_name) e1.pack(side=tk.LEFT, padx=20, pady=5) tk.Button(self, text="删除", command=self._delete).pack(side=tk.RIGHT) tk.Label(self, textvariable=self.status).pack() # 删除 def _delete(self): name = self.de_name.get() print(name) result = db.delete_by_name(name) if result: self.status.set(f"{name}已经被删") self.de_name.set("") else: self.status.set(f"{name}不存在") class UpdateFrame(tk.Frame): def __init__(self, master=None): super().__init__(master) self.root = master tk.Label(self, text="修改界面").pack() self.change_frame = tk.Frame(self) self.change_frame.pack() self.name = tk.StringVar() self.math = tk.StringVar() self.chinese = tk.StringVar() self.english = tk.StringVar() self.status = tk.StringVar() self.create_page() def create_page(self): tk.Label(self.change_frame).grid(row=0, stick=tk.W, pady=10) tk.Label(self.change_frame, text="姓名:").grid(row=1, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self.change_frame, textvariable=self.name).grid(row=1, column=1, stick=tk.E) tk.Label(self.change_frame, text="数学:").grid(row=2, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self.change_frame, textvariable=self.math).grid(row=2, column=1, stick=tk.E) tk.Label(self.change_frame, text="语文:").grid(row=3, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self.change_frame, textvariable=self.chinese).grid(row=3, column=1, stick=tk.E) tk.Label(self.change_frame, text="英语:").grid(row=4, stick=tk.W, pady=10) # 单行文本框 entry,textvariable绑定变量 tk.Entry(self.change_frame, textvariable=self.english).grid(row=4, column=1, stick=tk.E) # 按钮 tk.Button(self.change_frame, text="查询", command=self._search).grid(row=6, column=0, stick=tk.W, pady=10) tk.Button(self.change_frame, text="修改", command=self._change).grid(row=6, column=1, stick=tk.E, pady=10) tk.Label(self.change_frame, textvariable=self.status).grid(row=7, column=1, stick=tk.E, pady=10) # 查询 def _search(self): name = self.name.get() student = db.search_by_name(name) if student: self.math.set(student["math"]) self.chinese.set(student["chinese"]) self.english.set(student["english"]) self.status.set(f"查询到{name}同学的信息") else: self.status.set(f"没有查询到{name}同学的信息") # 更改成绩 def _change(self): name = self.name.get() math = self.math.get() chinese = self.chinese.get() english = self.english.get() stu = { "name": name, "math": math, "chinese": chinese, "english": english, } r = db.update(stu) if r: self.status.set(f"{name}同学的信息更新完毕") else: self.status.set(f"{name}同学的信息更新失败") class AboutFrame(tk.Frame): def __init__(self, master=None): super().__init__(master) self.root = master self.create_page() def create_page(self): tk.Label(self, text="关于本作品(人生苦短,我用python)").pack(anchor=tk.W)
原文链接:https://www.jb51.net/article/241166.htm
户外爱好者必备须眉涡轮六叶刀T6Pro新款多功能版剃须刀轻体验云瑞将军图文版权声明图文均属原创,版权所有,未经许可或授权,禁止转载或引用。人生,就是在不断感受,不断体验,不断修行!感谢在这一路上给予我帮助的老师和朋友们。最近须眉又出新品剃须刀
IIHS提出辅助驾驶系统新评级标准拒绝滥用功能,加强司机注意力把控记者周纯粼编辑眼下,车辆辅助驾驶系统的水平和性能不断提升,而对于智能时代汽车的安全标准也在水涨船高。曾经的汽车安全评级系统仅仅是对车身结构刚度碰撞时的溃缩安全气囊启动与否碰撞假人受
网络谣言粉碎机电池充电要充到100,对电池更好流言内容给手机充电时要彻底充满,这样能让电池寿命更持久。真相解读经常给手机充电至100,对手机中的锂离子电池并不好。因为这种电池之所以能够工作,靠的是锂离子在正负极之间的移动。而电
2022年好用的网络电视盒子,打破我们的想象又是一个新的一年开始,新年新气象,小编在这里又要给大家推荐几款排名靠前的网络电视盒子,一直深受大家的推崇,并且是深深的喜爱,而且其中还有价格很优惠的,但是性能上也是很高的网络电视盒
心级服务超级SIM卡,好处多多相信大家对手机里的SIM都不会陌生,从早期的按键手机到如今的智能手机,这个小小的芯片陪伴了我们很长很长的时间。一个芯片代表了一个号码,很多长情的人不喜欢更换手机号码,与此同时,手机
网易试水AI音乐创作,可10秒定制一首拜年歌北京商报讯(记者魏蔚)1月25日,网易推出一站式音乐创作平台网易天音。用户只需在微信搜索网易天音拜年小程序,输入祝福对象祝福语,10秒就能搞定词曲编唱,定制一首拜年歌。量身定制的歌
火链科技与浙江金赋水携手探索区块链工业生产应用新方向近日,海南火链科技有限公司(以下简称火链科技)与浙江金赋水数字科技有限公司(以下简称金赋水科技)围绕区块链技术赋能生态合成革产业达成战略合作,双方将区块链技术应用到产业互联网的大数
推荐收藏!这几段祖传的Python代码拿来就用今天分享几段工作生活中常用的代码,都是最为基础的功能和操作,而且大多还都是出现频率比较高的,很多都是可以拿来直接使用或者简单修改就可以放到自己的项目当中。喜欢的记得收藏关注点赞。废
Java定义的数据类型Java定义的数据类型一变量按照数据类型来分基本数据类型整形byteshortintlong浮点型floatdouble字符型char布尔型boolean引用数据类型类(class
阿里P10是什么样的存在?阿里P10到底是什么样概念,我给你们一个直观的感受。阿里的集团副总裁是P11级,阿里盒马鲜生CEO侯毅是P11级。P12是阿里集团资深副总裁级,而前段时间闹的沸沸扬扬的阿里太子接班
仙桃会发展起来吗?仙桃有四个优势。其一,彭场无纺布产业链全世界第一,无可替代。其二,毛嘴女裤占全世界的三分一,而且,产业链越来越完善。其三,雷军的小米产业链条在仙桃布局。去年投了约二十多个亿,今年会