导入必要的模块

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()

Python Tkinter 学生成绩管理系统代码注释

原文地址: https://www.cveoy.top/t/topic/hvFZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录