halo,包子们上午好
很多学计算机的小伙伴应该都知道,毕业设计是一个头疼的东西
今天的话小编这边给大家准备好了一个Python基于面向对象+tkinter打造学生信息管理系统
这不是毕业设计必备项目
说实话操作起来还是有那么一点点的难度的,但是大家不用担心
作为一个宠粉狂魔的小编,肯定都给大家准备好了的
直接上才艺
关注小编,私信小编领取哟!
当然别忘了一件三连哟~~
公众号:Python日志
Python版本:3.7.8
相关模块:
tkinter模块;
json模块;
以及一些python自带的模块。
安装Python并添加到环境变量,pip安装需要的相关模块即可。
import tkinter as tk
from LoginPage import *
root = tk.Tk()
root.title('学生管理系统 公众号:Python日志 源码领取QQ群:494958217')
LoginPage(root)
# MainPage(root)
root.mainloop()
class LoginPage(object):
def __init__(self, master=None):
# master 画板对象,往画板上作画
self.root = master # 定义内部变量root
self.root.geometry('%dx%d' % (300, 180)) # 设置窗口大小
# 定义可以在页面更新数据的变量 普通字符串改变之后无法及时在页面中刷新
self.username = tk.StringVar()
self.password = tk.StringVar()
# 画 内容 需要画在纸上面
# 创建新的 布局控件 找一张新的纸作画
self.page = tk.Frame(self.root) # 创建Frame
# 将控件布局到 root 对象 (GUI 程序对象)
self.page.pack()
self.create_page()
def create_page(self):
"""
使用表格布局绘制内容
"""
#
# tk.Label 文本框 显示文字内容
# stick 控件对象方向 tk.W 西方位
# pady padding y 上下的宽度
# row 行 表格布局
tk.Label(self.page).grid(row=0, stick=tk.W)
tk.Label(self.page, text='账户: ').grid(row=1, stick=tk.W, pady=10)
# tk.Label 输入框 显示输入内容
# 输入框的文字等内容需要更新
tk.Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=tk.E)
tk.Label(self.page, text='密码: ').grid(row=2, stick=tk.W, pady=10)
tk.Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=tk.E)
tk.Button(self.page, text='登陆', command=self.login_check).grid(row=3, stick=tk.W, pady=10)
tk.Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=1, stick=tk.E)
def login_check(self):
"""登录检测"""
name = self.username.get()
secret = self.password.get()
if name == '徐大兄弟' and secret == '123456':
self.page.destroy()
MainPage(self.root)
else:
tkinter.messagebox.showinfo(title='错误', message='账号或密码错误!')
import json
class StudentsDB:
"""学生信息管理系统数据模型"""
def __init__(self):
self.students = []
# 加载本地文件中的数据
self._load_students_data()
def insert(self, student):
"""将学生数据插入到列表"""
self.students.append(student)
def all(self):
"""返回所有的学生数据"""
return self.students
def delete_by_name(self, name):
"""根据名字获取学生数据,如果没有就返回 False"""
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):
"""根据名字查询学员,没有找到就返回 False"""
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.json', mode='r', encoding='utf-8') as f:
text = f.read()
if text:
self.students = json.loads(text)
def save_data(self):
"""保存数据到本地文件"""
with open('students.json', mode='w', encoding='utf-8') as f:
text = json.dumps(self.students, ensure_ascii=False)
f.write(text)
db = StudentsDB()
import tkinter as tk
from view import * # 菜单栏对应的各个子页面
class MainPage(object):
def __init__(self, master=None):
self.root = master # 定义内部变量root
self.root.geometry('%dx%d' % (600, 400)) # 设置窗口大小
self.create_page()
def create_page(self):
menubar = tk.Menu(self.root)
# menubar.add_command(label='录入')
# menubar.add_command(label='查询')
# menubar.add_command(label='删除')
# menubar.add_command(label='修改')
# menubar.add_command(label='关于')
self.input_page = InputFrame(self.root) # 创建不同 Frame
self.query_page = QueryFrame(self.root)
self.delete_page = DeleteFrame(self.root)
self.change_page = ChangeFrame(self.root)
self.about_page = AboutFrame(self.root)
self.input_page.pack() # 默认显示数据录入界面
# 控件只是显示,如果需要实现切换的逻辑需要用代码实现
menubar.add_command(label='录入', command=self.input_data)
menubar.add_command(label='查询', command=self.query_data)
menubar.add_command(label='删除', command=self.delete_data)
menubar.add_command(label='修改', command=self.change_data)
menubar.add_command(label='关于', command=self.about_disc)
self.root['menu'] = menubar # 设置菜单栏
def input_data(self):
self.input_page.pack()
self.query_page.pack_forget()
self.delete_page.pack_forget()
self.change_page.pack_forget()
self.about_page.pack_forget()
def query_data(self):
self.input_page.pack_forget()
self.query_page.pack(fill=tk.X, expand=True, padx=10, pady=10, anchor=tk.N)
self.delete_page.pack_forget()
self.change_page.pack_forget()
self.about_page.pack_forget()
def delete_data(self):
self.input_page.pack_forget()
self.query_page.pack_forget()
self.delete_page.pack()
self.change_page.pack_forget()
self.about_page.pack_forget()
def change_data(self):
self.input_page.pack_forget()
self.query_page.pack_forget()
self.delete_page.pack_forget()
self.change_page.pack()
self.about_page.pack_forget()
def about_disc(self):
self.input_page.pack_forget()
self.query_page.pack_forget()
self.delete_page.pack_forget()
self.change_page.pack_forget()
self.about_page.pack()
def __del__(self):
db.save_data()
if __name__ == '__main__':
root = tk.Tk()
MainPage(root)
root.mainloop()
class InputFrame(tk.Frame): # 继承Frame类
def __init__(self, master=None):
super().__init__(master)
self.root = master # 定义内部变量root
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):
# stick 控件对象方向 tk.W 西方位
# pady padding y 上下的宽度
# row 行 表格布局
tk.Label(self).grid(row=0, stick=tk.W, pady=10)
tk.Label(self, text='姓 名: ').grid(row=1, stick=tk.W, pady=10)
# text variable 绑定控件里面的数据内容
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)
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)
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)
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)
self.status.set('插入数据成功')
self._clear_avr()
def _clear_avr(self):
self.name.set("")
self.math.set("")
self.chinese.set("")
self.english.set("")
class QueryFrame(tk.Frame): # 继承Frame类
def __init__(self, master=None):
super().__init__(master)
self.root = master # 定义内部变量root
self.itemName = tk.StringVar()
self.table_frame = tk.Frame(self)
self.table_frame.pack()
self.row = 1
self.create_page()
def create_page(self):
self.create_tree_view()
self.show_data_frame()
tk.Button(self, text='刷新数据', command=self.show_data_frame).pack(anchor=tk.E, pady=5)
def show_data_frame(self):
# 删除原节点
for _ in map(self.tree_view.delete, self.tree_view.get_children("")):
pass
students = db.all()
for index, stu in enumerate(students):
print(stu)
self.tree_view.insert('', index + 1,
values=(stu['name'], str(stu['chinese']), str(stu['math']), str(stu['english'])))
def create_tree_view(self):
# 表格
columns = ("name", "chinese", "math", "english")
columns_value = ('姓名', '语文', '数学', '英语')
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(fill=tk.BOTH, expand=True)
class DeleteFrame(tk.Frame): # 继承Frame类
def __init__(self, master=None):
super().__init__(master)
self.root = master # 定义内部变量root
tk.Label(self, text='删除数据').pack()
self.delete_frame = tk.Frame(self)
self.delete_frame.pack()
self.status = tk.StringVar()
self.v1 = tk.StringVar()
self.create_page()
def create_page(self):
tk.Label(self.delete_frame, text='根据名字删除信息').pack(anchor=tk.W, padx=20)
e1 = tk.Entry(self.delete_frame, textvariable=self.v1)
e1.pack(side=tk.LEFT, padx=20, pady=5)
tk.Button(self.delete_frame, text='删除', command=self._delete).pack()
tk.Label(self, textvariable=self.status).pack()
def _delete(self):
name = self.v1.get()
print(name)
r = db.delete_by_name(name)
if r:
self.status.set(f'{name} 已经被删除')
self.v1.set("")
else:
self.status.set(f'{name} 不存在')
class ChangeFrame(tk.Frame): # 继承Frame类
def __init__(self, master=None):
super().__init__(master)
self.root = master # 定义内部变量root
tk.Label(self, text='修改界面').pack()
self.change_frame = tk.Frame(self)
self.change_frame.pack()
self.status = tk.StringVar()
self.name = tk.StringVar()
self.math = tk.StringVar()
self.chinese = tk.StringVar()
self.english = tk.StringVar()
self.create_page()
def create_page(self):
tk.Label(self.change_frame).grid(row=0, stick=tk.W, pady=1)
tk.Label(self.change_frame, text='姓 名: ').grid(row=1, stick=tk.W, pady=10)
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)
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)
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)
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} 同学的信息更新失败')