python超详细实现完整学生成绩管理系统
作者:hacker707 发布时间:2022-08-25 08:59:08
标签:python,学生,成绩管理
学生成绩管理系统简介
一个带有登录界面具有增减改查功能的学生成绩管理系统(面向对象思想,利用tkinter库进行制作,利用.txt文件进行存储数据)
源代码
✅仅供学习参考,最好还是自己多敲多练习(实践是检验真理的唯一标准)
students.txt
用于存储数据
main.py
from tkinter import *
from Login import *
import tkinter as tk
root = tk.Tk()
root.title('欢迎进入学生成绩管理系统')
LoginPage(root)
root.mainloop()
Login.py
from 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.py
import 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.py
import 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.py
import 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)
🔥以上就是使用python实现学生成绩管理系统,如果有改进的建议,欢迎在评论区留言奥~
这篇文章参加了csdn的活动,还请大家多多三连支持一下博主,你们的支持就是我创作的动力💖
来源:https://blog.csdn.net/xqe777/article/details/123532947
0
投稿
猜你喜欢
- 如果备份的数据库有2个文件,分别是.LDF 和 .MDF,打开企业管理器,在实例上右击---所有任务--附加数据库,然后选择那个.MDF文件
- b 和 i 标签在现在的 Web 标准潜规则中是不推荐使用,甚至是反对使用的,因为认为他们只是“表现”粗体和斜体,而没有任何“语义”。更多的
- 这篇文章我们学习 Python 变量与数据类型变量变量来源于数学,是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问。在
- 本文实例为大家分享了python实现录音功能的具体代码,供大家参考,具体内容如下# -*- coding: utf-8 -*-import
- 导言:在前面的教程里我们探讨了如何为GridView控件添加radio buttons列。当用户最多只能选择一项数据时,我们可以在用户界面里
- Go本地测试的思路我习惯在开发过程中及时测试自己开发的功能模块,这样能及时发现问题,节省后期功能耦合之后,debug的时间。为了统一管理要测
- 最近收到一个朋友委托的需求,要将MP3的音频格式转换成wav的音频格式。于是,使用python写了这个小工具便于批量进行转换操作。首先,下载
- 在ASP与ASP.NET之间共享对话状态(1)ASP实现原来的ASP对话只能将对话数据保存在内存中。为了将对话数据保存到SQL Server
- asp之家注:asp中FSO组件的功能很强大,如果没有FSO很难想象ASP会变成什么样。对于学习asp编程的朋友一定会接触到FSO相关的操作
- 我们前期开发了一个只有公司客服人员才能使用的系统——有限的几个客服人员。就是这有限的几个客服人员前几天突然就提出这样的问题:我们每隔很短一段
- 让长字符自动换行 (比如 URL 和 Email地址) 目的:让很长的字符串,能自动换行,但是不要把短的单词从中间断开。方法如下:<s
- 本文实例为大家分享了js实现黑白div块画空心图形的具体代码,供大家参考,具体内容如下<!DOCTYPE html><ht
- 内容摘要:当讨论Request对象内容时,要研究的集合之一就是ServerVariables集合。这个集合包含了两种值的结合体,一种是随同页
- 1.字典的概念字典和列表类似,也是可变序列,不过和列表不同,它是无序的可变序列,保存的内容是以键值对(key:value)形式存放的 字典的
- 如果需要在数据库中存储图片或视频类的数据,我们可以配置MEDIA.下面的示例将以上传一张图片的形式来说明MEDIA的配置及用法.第一步 se
- 搜索引擎是通过分析网页源代码来分析页面文本信息的逻辑性,所以在编写网页代码的时候一定要尽可能使用合适的标签来体现文本表达的层次感,也即是让搜
- 1.彻底弄懂CSS盒子模式一(DIV布局快速入门)3.彻底弄懂CSS盒子模式三(浮动的表演和清除的自述) 4.彻底弄懂CSS盒子模式四(绝对
- 学习一些你已经知道的知识也没有什么坏处,是吧?我知道这可能并不一定非常有意义,但是很多时候我们往往知其然而不知其所以然,这会使得事情出现惊人
- 组合模式是把一个类别归为一个整体,并且组织多个整体之间的关系,使用通过树形结构来描述所有整体。一般的编写方式为一个类别对象下添加多个该对象的
- Python 私有函数的实例详解与大多数语言一样,Python 也有私有的概念:• 私有函数不可以从它们的模块外面被调用• 私有类方法不能够