Python Tkinter 学生成绩管理系统代码注释
导入必要的模块
from tkinter import * from tkinter import messagebox from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg import matplotlib.pyplot as plt import math
定义两个空字典,分别存储学生学号和姓名、学号和成绩
dic1 = {} dic2 = {}
打印字典类型,用于调试
type(dic1) type(dic2)
定义全局变量,用于统计总学生人数和及格人数
global tot, pas tot = int(0) pas = int(0)
学生登录界面
class Stulogin(Frame): def init(self, master=None): super().init(master) self.master = master self.pack() self.creatWidget()
def creatWidget(self):
# 学生姓名标签和输入框
self.lab01 = Label(self, text='学生姓名')
self.lab01.pack()
user1 = StringVar()
self.entry01 = Entry(self, textvariable=user1)
self.entry01.pack()
# 学号标签和输入框
self.lab02 = Label(self, text='学号')
self.lab02.pack()
num1 = StringVar()
self.entry02 = Entry(self, textvariable=num1)
self.entry02.pack()
# 查询和退出按钮
self.btn03 = Button(self, text='查询', command=self.login)
self.btn03.pack()
self.btn04 = Button(self, text='退出', command=quit)
self.btn04.pack()
# 登录函数
def login(self):
username = self.entry01.get()
num = self.entry02.get()
if dic1.get(num) == username:
messagebox.showinfo('学生信息', '姓名:%s
学号:%s 成绩:%s' % (username, num, dic2.get(num))) else: messagebox.showinfo('错误', '学生姓名或学号输入错误!')
管理员登录界面
class Adminlogin(Frame): def init(self, master=None): super().init(master) self.master = master self.pack() self.creatWidget()
def creatWidget(self):
# 操作选择标签和按钮
self.lab01 = Label(self, text='请选择您要进行的操作:')
self.lab01.pack()
self.btn01 = Button(self, text='增加学生信息', command=self.addstu)
self.btn01.pack()
self.btn02 = Button(self, text='删除学生信息', command=self.delstu)
self.btn02.pack()
self.btn03 = Button(self, text='修改学生成绩', command=self.updstu)
self.btn03.pack()
self.btn04 = Button(self, text='查询学生信息', command=self.qurstu)
self.btn04.pack()
self.btn05 = Button(self, text='查询及格比例图', command=self.draw)
self.btn05.pack()
self.btn05 = Button(self, text='退出', command=quit)
self.btn05.pack()
# 增加学生信息界面
def addstu(self):
rt = Tk()
rt.geometry('500x300')
rt.title('增加学生信息')
# 学生姓名标签和输入框
rt.lab01 = Label(rt, text='学生姓名')
rt.lab01.pack()
v2 = StringVar()
rt.entry01 = Entry(rt, textvariable=v2)
rt.entry01.pack()
# 学号标签和输入框
rt.lab02 = Label(rt, text='学号')
rt.lab02.pack()
v3 = StringVar()
rt.entry02 = Entry(rt, textvariable=v3)
rt.entry02.pack()
# 成绩标签和输入框
rt.lab03 = Label(rt, text='成绩')
rt.lab03.pack()
v4 = StringVar()
rt.entry03 = Entry(rt, textvariable=v4)
rt.entry03.pack()
# 增加按钮
def adddic():
self.stuname = rt.entry01.get()
self.stunum = rt.entry02.get()
self.stugri = rt.entry03.get()
if dic1.get(self.stunum, 'fault') != 'fault':
messagebox.showinfo('错误', '该学号的学生信息已存在,请使用修改功能进行信息修改!')
elif int(self.stugri) < 0 or int(self.stugri) > 100:
messagebox.showinfo('错误', '输入的学生成绩有误!')
else:
dic1.setdefault(self.stunum, self.stuname)
dic2.setdefault(self.stunum, self.stugri)
global tot, pas
tot += 1
if int(self.stugri) >= 60:
pas += 1
messagebox.showinfo('新增成功', '您已将%s的信息成功录入系统!' % self.stuname)
rt.destroy()
rt.btn01 = Button(rt, text='增加', command=adddic)
rt.btn01.pack()
# 删除学生信息界面
def delstu(self):
rt = Tk()
rt.geometry('500x300')
rt.title('删除学生信息')
# 学号标签和输入框
rt.lab01 = Label(rt, text='学号')
rt.lab01.pack()
v2 = StringVar()
rt.entry01 = Entry(rt, textvariable=v2)
rt.entry01.pack()
# 删除按钮
def deldic():
self.stunum = rt.entry01.get()
self.stuname = dic1.get(self.stunum)
self.stugri = dic2.get(self.stunum)
if dic1.get(self.stunum, 'fault') == 'fault':
messagebox.showinfo('错误', '该学号的学生不存在!')
else:
del dic1[self.stunum]
del dic2[self.stunum]
global tot, pas
tot -= 1
if int(self.stugri) >= 60:
pas -= 1
messagebox.showinfo('删除成功', '您已将%s的信息成功删除!' % self.stuname)
rt.destroy()
rt.btn01 = Button(rt, text='删除', command=deldic)
rt.btn01.pack()
# 修改学生成绩界面
def updstu(self):
rt = Tk()
rt.geometry('500x300')
rt.title('修改学生成绩')
# 学号标签和输入框
rt.lab01 = Label(rt, text='学号')
rt.lab01.pack()
v2 = StringVar()
rt.entry01 = Entry(rt, textvariable=v2)
rt.entry01.pack()
# 新成绩标签和输入框
rt.lab02 = Label(rt, text='新成绩')
rt.lab02.pack()
v3 = StringVar()
rt.entry02 = Entry(rt, textvariable=v3)
rt.entry02.pack()
# 修改按钮
def upddic():
self.stunum = rt.entry01.get()
self.rstugri = dic2.get(self.stunum)
self.stugri = rt.entry02.get()
self.stuname = dic1[self.stunum]
if dic1.get(self.stunum, 'fault') == 'fault':
messagebox.showinfo('错误', '该学号的学生不存在!')
else:
dic2[self.stunum] = self.stugri
global pas
if int(self.stugri) >= 60 > int(self.rstugri):
pas += 1
elif int(self.stugri) < 60 <= int(self.rstugri):
pas -= 1
messagebox.showinfo('修改成功', '您已成功修改%s的成绩!' % self.stuname)
rt.destroy()
rt.btn01 = Button(rt, text='修改', command=upddic)
rt.btn01.pack()
# 查询学生信息界面
def qurstu(self):
rt = Tk()
rt.geometry('500x300')
rt.title('查询学生信息')
# 学号标签和输入框
rt.lab01 = Label(rt, text='学号')
rt.lab01.pack()
v2 = StringVar()
rt.entry01 = Entry(rt, textvariable=v2)
rt.entry01.pack()
# 查询按钮
def qurdic():
self.stunum = rt.entry01.get()
self.stuname = dic1.get(self.stunum)
self.stugri = dic2.get(self.stunum)
if dic1.get(self.stunum, 'fault') == 'fault':
messagebox.showinfo('错误', '该学号的学生不存在!')
else:
messagebox.showinfo('学生信息', '姓名:%s
学号:%s 成绩:%s ' % (self.stuname, self.stunum, self.stugri)) rt.destroy()
rt.btn01 = Button(rt, text='查询', command=qurdic)
rt.btn01.pack()
# 绘制及格比例图
def draw(self):
if tot == 0:
messagebox.showinfo('错误', '已录入学生数为零!')
else:
ret = Tk()
ret.title('比例图')
tem = round(pas * 100 / tot, 2)
# 设置 matplotlib 字体,以便正常显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建图形和轴
fig, ax = plt.subplots(figsize=(6, 6))
# 设置扇形属性
wedgeprops = {'width': 0.3, 'edgecolor': 'black', 'linewidth': 3}
# 绘制饼图
ax.pie([tem, 100 - tem], wedgeprops=wedgeprops, startangle=90, colors=['#5DADE2', '#515A5A'])
# 设置标题
plt.title('及格人数比例图', fontsize=24, loc='center')
# 显示及格比例
plt.text(0, 0, f'{tem}%', ha='center', va='center', fontsize=42)
# 将图形嵌入 Tkinter 窗口
canvas = FigureCanvasTkAgg(fig, master=ret)
canvas.draw()
canvas.get_tk_widget().pack()
学生端登录函数
def startspace1(): # 销毁主窗口,创建学生端窗口 # root.destroy() rot = Tk() rot.title('学生端成绩查询') rot.geometry('400x300+500+200') act = Stulogin(master=rot) # rot.mainloop()
管理员登录函数
def startspace2(): # 销毁主窗口,创建管理员密码输入窗口 # root.destroy() temroot = Tk() temroot.geometry('300x150+300+200') temroot.title('管理员密码')
# 密码输入框
v1 = StringVar()
entry01 = Entry(temroot, textvariable=v1, show='*')
entry01.pack()
# 登录按钮
def login():
pwd = entry01.get()
if pwd == '123456':
# 密码正确,销毁密码输入窗口,创建管理员操作窗口
temroot.destroy()
rot = Tk()
rot.geometry('500x500+300+200')
rot.title('欢迎使用成绩管理系统')
act = Adminlogin(master=rot)
btn01 = Button(temroot, text='登录', command=login)
btn01.pack()
创建主窗口
root = Tk() root.geometry('400x300') root.title('成绩系统')
学生端按钮
btn01 = Button(root, text='学生端成绩查询', command=startspace1) btn01.pack()
管理员登录按钮
btn02 = Button(root, text='管理员登录', command=startspace2) btn02.pack()
退出按钮
bntquit1 = Button(root, text='退出系统', command=quit) bntquit1.pack()
运行主循环
root.mainloop()
原文地址: https://www.cveoy.top/t/topic/hvFZ 著作权归作者所有。请勿转载和采集!