基于Python的学生成绩管理系统

一、引言

本系统旨在借助 Python 语言的强大功能以及数据库技术,实现学生成绩的高效录入、查询、修改、删除以及统计分析等功能,为学校教师提供一个便捷、直观、智能的成绩管理平台。通过该系统,教师可以轻松管理学生成绩,提高工作效率,减少人为错误,同时还能深入挖掘成绩数据背后的信息,为教学活动提供有价值的数据支持,进而推动学校整体教育质量的提升,促进教育信息化的全面发展。

二、系统概述

本学生成绩管理系统采用 Python 语言开发,结合数据库技术,致力于为学校教师提供一个功能全面、操作便捷、数据精准的学生成绩管理平台,以适应现代教育信息化的需求,解决传统成绩管理方式存在的诸多问题。

(一)系统功能简介

  1. 成绩录入功能 系统为教师提供了简单易用的成绩录入界面。教师可以快速输入学生的学号、姓名、专业等基本信息,以及课程成绩、考试平均成绩、任课老师评分和综合测试总分等成绩数据。在录入过程中,系统会对学号的唯一性进行校验,避免重复录入,确保数据的准确性。

  2. 成绩查询功能 教师可以通过输入学生的学号,快速查询该学生的详细成绩信息。系统会将查询结果以表格形式展示在界面右侧的 Treeview 组件中,同时也会将数据填充到左侧的输入框中,方便教师查看和进一步操作。此外,系统还支持按条件查询,如按专业、成绩范围等进行筛选,帮助教师更高效地获取所需信息。

  3. 成绩修改功能 当发现学生成绩有误或需要更新时,教师可以在查询到学生信息后,直接在输入框中修改相应的成绩数据,然后点击修改按钮。系统会将更新后的成绩数据提交到数据库,完成成绩的修改操作,并及时更新界面展示的数据,确保数据的实时性和准确性。

  4. 成绩删除功能 对于已经录入但需要删除的成绩数据,教师可以在输入学生学号后,查询到该学生的信息,然后点击删除按钮。系统会弹出确认对话框,询问教师是否确定要删除,以防止误操作。确认删除后,系统会从数据库中删除该学生的成绩记录,并刷新界面数据,保持数据的一致性。

  5. 成绩统计与分析功能 系统具备成绩统计与分析功能,例如可以根据综合测评总分对学生进行排序。教师点击相应的排序按钮后,系统会通过后端服务执行 SQL 查询语句,对学生成绩进行排序,并将排序后的结果显示在 Treeview 组件中,方便教师了解学生的成绩排名情况,为教学评估和学生管理提供参考依据。

  6. 成绩导出功能 为了方便教师对成绩数据进行备份或分享,系统提供了成绩导出功能。教师可以将数据库中的学生成绩数据导出为 Excel 文件。系统会创建一个新的工作簿,在工作表中写入成绩数据,包括表头和每一行的学生成绩记录,然后保存为 Excel 文件。导出成功后,系统会弹出提示信息,告知教师文件已保存的路径,教师可以在其他场景下使用这些数据。

  7. 教师管理功能 包括教师注册和登录功能。教师可以通过注册界面创建自己的账号,设置登录密码,并进行密码确认。注册成功后,教师可以使用账号和密码登录系统,进入成绩管理界面进行操作。系统会对教师的登录信息进行验证,确保只有合法的教师账号能够登录并访问学生成绩数据,保障了数据的安全性和隐私性。

(二)系统架构设计

本系统采用了三层架构模式,包括前端界面层、后端逻辑层和数据库层,各层之间相互协作,共同实现系统的功能。

  1. 前端界面层 前端界面层使用 Python 的 tkinter 库进行开发,为用户提供良好的交互界面。界面设计注重简洁性和易用性,包括系统的启动界面、教师注册登录界面、成绩管理界面等。各个界面布局合理,按钮、输入框、表格等组件排列有序,方便教师进行操作。界面风格统一,采用了一些美观的样式和图片,提升了用户体验。

  2. 后端逻辑层 后端逻辑层主要负责处理业务逻辑和与数据库的交互。通过定义 service.py 文件中的 PyMySQLUtils 类,封装了与数据库操作相关的功能,如数据查询、插入、更新、删除等。其他功能模块通过调用该类的方法,实现对数据库的访问和数据处理。后端逻辑层还负责对用户输入的数据进行验证和处理,确保数据的合法性和准确性,同时协调前端界面层和数据库层之间的数据传递,保证系统的正常运行。

  3. 数据库层 数据库层使用 MySQL 数据库,存储学生成绩数据和教师登录信息。数据库中创建了 school 数据库,并设计了相应的表结构,如 student_sore 表用于存储学生成绩,teacher_login 表用于存储教师登录账号和密码。通过合理的表结构设计和索引设置,确保数据的高效存储和查询。后端逻辑层通过 PyMySQL 库与数据库进行连接和交互,执行 SQL 语句,完成数据的增删改查操作,为系统的功能实现提供数据支持。

系统的三层架构设计具有良好的优势。首先,三层架构将界面展示、业务逻辑和数据存储分离,使得各层之间具有较高的独立性和可维护性。前端界面层的修改不会影响后端逻辑和数据库,后端逻辑层的调整也不会直接对数据库结构造成冲击,方便开发和维护人员对系统进行升级和优化。其次,通过封装数据库操作,提高了代码的复用性和安全性,避免了 SQL 注入等安全风险。最后,该架构模式能够较好地适应系统的扩展需求,当需要增加新的功能模块或对数据库进行扩展时,可以在相应的层进行开发和集成,降低了开发难度和成本,提高了系统的可扩展性和灵活性。

三、数据库设计

良好的数据库设计是学生成绩管理系统成功的关键,它不仅关系到数据的存储和管理效率,还直接影响到系统的功能实现和性能表现。以下将从数据库的创建、表结构设计以及数据插入与查询等方面详细介绍本系统的数据库设计。

(一)数据库创建

系统使用 MySQL 数据库,创建名为 “school” 的数据库,执行 SQL 语句:

CREATE DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

指定字符集为 utf8mb4 及校对规则为 utf8mb4_unicode_ci,这确保了能够支持多种字符的存储,包括 emoji 等特殊字符,满足学生成绩数据中可能存在的各种文本信息存储需求,例如学生姓名中包含的生僻字等,保证数据的完整性和准确性。

(二)表结构设计

在 “school” 数据库下,创建学生成绩表 student_sore,SQL 语句如下:

CREATE TABLE student_sore (
	stuno INT (4) PRIMARY KEY,
	Stuname VARCHAR (20),
	college VARCHAR (30),
	score DOUBLE (5, 2),
	avgscore DOUBLE (5, 2),
	teacher_rating DOUBLE (5, 2),
	total_score DOUBLE (5, 2)
);
  • stuno :学号,设置为 INT 类型,长度为 4,作为主键,唯一标识每一位学生,方便对学生成绩的快速查询和管理,学号的唯一性约束确保不会出现成绩记录混淆的情况。

  • Stuname :学生姓名,采用 VARCHAR 类型,长度为 20,能够满足一般学生姓名的存储需求,同时使用可变长度字符串可以节省存储空间。

  • college :专业名称,同样为 VARCHAR 类型,长度 30,用于存储学生所在专业信息,便于后续按专业进行成绩统计分析等操作。

  • score :课程成绩,DOUBLE 类型,精度为 5,小数位数为 2,可以精确地存储学生的课程成绩,如 90.50 等,满足成绩的精度要求。

  • avgscore :考试平均成绩,类型和精度与 score 一致,用于存储学生多门课程的平均成绩,方便教师了解学生整体学业水平。

  • teacher_rating :任课老师评分,DOUBLE (5, 2) 类型,反映任课老师对学生的综合评价,以量化形式记录,为学生综合测评提供一个维度的数据。

  • total_score :综合测试总分,同样是 DOUBLE (5, 2) 类型,通过一定的权重计算公式,结合课程成绩、平均成绩和任课老师评分得出,用于对学生学业表现进行综合衡量,是学生综合测评的重要依据。

创建教师登录表 teacher_login,SQL 语句如下:

CREATE TABLE teacher_login (
	id INT (4) PRIMARY KEY auto_increment,
	loginname VARCHAR (20),
	loginpwd VARCHAR (20)
);
  • id :教师登录表的主键,INT 类型,长度 4,开启自动增长属性(auto_increment),每添加一条教师登录记录,id 自动递增,确保每个教师登录账号的唯一性,便于系统内部对教师登录信息的管理。

  • loginname :教师登录账号,VARCHAR (20),用于教师登录系统时的身份标识,教师使用该账号输入系统,开启成绩管理等操作权限。

  • loginpwd :教师登录密码,VARCHAR (20),以加密或明文形式存储(在实际系统中建议加密存储),用于验证教师登录身份的合法性,保障系统的安全性和数据的保密性。

(三)数据插入与查询

1. 插入测试数据

为了验证学生成绩表和教师登录表的创建是否成功,以及方便后续系统的开发和测试,向两张表中插入一些测试数据。

向 student_sore 表插入数据:

INSERT INTO student_sore
VALUES
	( 1001, '张三', '计算机科学与技术', 90, 89, 75, 90 ),
	( 1002, '李四', '应用数学', 45, 75, 45, 65 ),
	( 1003, '王五', '汉语言文学', 85, 89, 78, 89 );

这条语句插入了 3 条学生的成绩记录,涵盖了不同的学号、姓名、专业以及各类成绩数据,模拟了不同学生的成绩情况,方便对成绩查询、统计等功能进行初步测试。

向 teacher_login 表插入数据:

INSERT INTO teacher_login ( loginname, loginpwd )
VALUES
	( 'lisi', '1234' ),
	( 'wangwu', '5678' );

添加了两个教师账号,用于后续测试教师登录功能,确保教师能够通过正确的账号和密码登录到系统,进入成绩管理界面进行操作。

2. 查询数据

在插入测试数据后,可以通过查询语句来验证数据是否正确插入以及熟悉数据查询操作。

查询 student_sore 表中的所有数据:

SELECT * FROM student_sore;

执行该语句后,系统应返回插入的 3 条学生成绩记录,以表格形式展示各字段的值,包括学号、姓名、专业等成绩相关信息,从而验证学生表的数据完整性。

查询 teacher_login 表中的所有数据:

SELECT * FROM teacher_login;

该语句返回插入的两条教师登录记录,展示教师账号和密码的存储情况,确认教师登录信息已正确存入数据库,为教师登录功能的实现奠定基础。

此外,还可以进行一些条件查询操作。例如,查询特定学号的学生成绩:

SELECT * FROM student_sore WHERE stuno = 1001;

该语句仅返回学号为 1001 的学生张三的成绩记录,用于模拟在实际系统中根据学号查询特定学生成绩的场景,验证系统查询功能的准确性。

再比如,查询教师登录账号为 “lisi” 的登录信息:

SELECT * FROM teacher_login WHERE loginname = 'lisi';

执行后返回该教师对应的 id 和密码信息,用于验证教师登录时系统对账号和密码匹配的检查是否正确。

通过以上对学生成绩管理系统数据库的创建、表结构设计以及数据插入与查询的详细介绍,可以看出整个数据库设计紧密围绕系统功能需求展开,为系统的稳定运行和高效的数据管理提供了坚实的数据支撑,同时也为后续系统的功能扩展和优化预留了一定的空间,满足教育信息化背景下学生成绩管理的多样化需求。

四、后端服务实现(service.py)

后端服务是学生成绩管理系统的核心部分,它负责与数据库进行交互,处理业务逻辑,并为前端界面提供数据支持。在本系统中,后端服务的实现主要集中在 service.py 文件中,通过定义一个 PyMySQLUtils 类来封装与数据库相关的操作,下面将详细介绍该类的实现及其在系统中的作用。

(一)PyMySQLUtils 类介绍

1. 初始化方法

def __init__(self):
    self.db = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='school')
    self.cursor = self.db.cursor()

PyMySQLUtils 类的初始化方法中,通过 pymysql.connect 方法建立与数据库的连接。这里指定了数据库服务器的主机地址为 127.0.0.1(即本地主机),用户名为 root,密码为 123456,要连接的数据库名为 school。建立连接后,创建一个游标对象 self.cursor,用于执行 SQL 语句。

2. 数据查询方法

  • fetchall 方法

def fetchall(self, sql, *values):
    self.open()
    self.cursor.execute(sql, values)
    result = self.cursor.fetchall()
    self.close()
    return result

fetchall 方法用于执行 SQL 查询语句,并获取所有查询结果。它首先调用 self.open() 方法确保数据库连接已建立并打开,然后使用 self.cursor.execute(sql, values) 执行传入的 SQL 查询语句,其中 values 是一个可变参数,用于替换 SQL 语句中的占位符(如 %s),以防止 SQL 注入攻击。接着,通过 self.cursor.fetchall() 获取查询结果集中的所有行,并将其存储在 result 变量中。最后,调用 self.close() 方法关闭数据库连接和游标,返回查询结果 result

  • fetchone 方法

def fetchone(self, sql, *values):
    self.open()
    self.cursor.execute(sql, values)
    result = self.cursor.fetchone()
    self.close()
    return result

fetchone 方法与 fetchall 方法类似,不同之处在于它只获取查询结果集中的第一行数据。这在只需要查询单个记录(如根据学号查询某一名学生的成绩)时非常有用,可以提高查询效率,减少不必要的数据传输。

3. 数据操作方法

def execute(self, sql, values):
    try:
        self.open()
        self.cursor.execute(sql, values)
        self.db.commit()
        return 1
    except:
        self.db.rollback()
        return 0
    finally:
        self.close()

execute 方法用于执行数据操作语句(如插入、更新、删除等)。它同样先调用 self.open() 方法打开数据库连接。然后,在 try 块中,使用 self.cursor.execute(sql, values) 执行传入的 SQL 语句,values 参数用于替换 SQL 语句中的占位符。如果执行成功,调用 self.db.commit() 提交事务,确保数据变更永久保存到数据库中,并返回 1 表示操作成功。如果在执行过程中发生异常,进入 except 块,调用 self.db.rollback() 回滚事务,撤销所有未提交的数据变更,以保持数据的一致性,并返回 0 表示操作失败。无论成功还是失败,最后都会执行 finally 块中的 self.close() 方法,关闭数据库连接和游标。

4. 辅助方法

  • close 方法

def close(self):
    self.cursor.close()
    self.db.close()

close 方法用于关闭游标和数据库连接,释放数据库资源。在每次数据库操作完成后调用此方法,有助于避免数据库连接过多导致的性能问题,确保系统的稳定运行。

  • open 方法

def open(self):
    self.db = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='school')
    self.cursor = self.db.cursor()

open 方法重新建立与数据库的连接,并创建一个新的游标对象。在每次数据库操作之前调用此方法,可以确保即使之前的连接因某些原因关闭或失效,也能重新获取有效的连接和游标,从而保证数据库操作的正常进行。

(二)数据操作的封装与优化

通过 PyMySQLUtils 类的封装,将复杂的数据库操作简化为几个简单的方法调用,使得前端界面或其他业务逻辑模块在与数据库交互时更加方便、高效。例如,在实现成绩录入功能时,只需调用 execute 方法并传入相应的 SQL 插入语句和数据值即可完成数据的插入操作;在查询学生成绩时,只需调用 fetchonefetchall 方法并传入查询语句,即可获取所需的学生成绩数据。

这种封装方式不仅提高了代码的复用性,减少了重复代码的编写,还降低了因直接操作数据库而可能带来的错误风险。同时,通过在 execute 方法中添加事务处理机制(如 commitrollback),确保了数据操作的完整性和一致性,避免了因程序异常导致的数据不一致问题。

此外,PyMySQLUtils 类的设计考虑了数据库连接的打开和关闭操作,通过在每个数据操作方法中调用 openclose 方法,保证了每次操作都能使用有效的连接,同时也避免了连接长时间闲置导致的资源浪费。这在一定程度上优化了数据库资源的使用效率,提高了系统的性能表现。

综上所述,service.py 文件中的 PyMySQLUtils 类实现了对数据库操作的封装与优化,为学生成绩管理系统的后端服务提供了稳定、高效的数据支持,是整个系统能够正常运行的关键组件之一。前端界面通过调用该类的方法,能够方便地实现学生成绩的各项管理功能,为教师提供了便捷的操作体验。

五、数据展示工具(datautil.py

在学生成绩管理系统中,数据展示是用户与系统交互的重要环节。良好的数据展示能够帮助教师清晰、直观地查看学生成绩信息,提高工作效率。datautil.py 文件提供了两个关键功能函数,用于实现数据在前端界面的展示与更新,下面将详细阐述这两个函数的实现与作用。

(一)tv_data 函数

1. 函数定义与功能

def tv_data(treeview, result):
    odd_row_color = '#f2f2f2'
    even_row_color = '#ffffff'
    treeview.tag_configure('odd', background=odd_row_color)
    treeview.tag_configure('even', background=even_row_color)
    item_num = treeview.get_children()
    if len(item_num) > 0:
        for item in treeview.get_children():
            treeview.delete(item)
    for idx, item in enumerate(result):
        iid = str(idx)
        treeview.insert('', 'end', iid=iid, values=item, tags=('even' if idx % 2 == 0 else 'odd'))

tv_data 函数的主要功能是将从数据库查询得到的结果集 result 填充到 Treeview 组件中,并实现奇偶行不同背景色的交替显示,以增强数据展示的可视化效果。

2. 实现细节

  • 设置行背景色 :首先定义了奇偶行的背景色,odd_row_color 为浅灰色 (#f2f2f2),even_row_color 为白色 (#ffffff)。通过 treeview.tag_configure 方法分别为奇数行(标签为 'odd')和偶数行(标签为 'even')设置背景色。

  • 清空现有数据 :调用 treeview.get_children() 获取 Treeview 组件中当前已有的所有项目(即数据行),如果存在项目,则通过循环调用 treeview.delete(item) 方法逐一删除,确保在填充新数据之前清空组件中的内容。

  • 填充新数据 :使用 enumerate(result) 遍历查询结果集 result,获取每一行数据的索引 idx 和数据项 item。将索引转换为字符串作为项目标识符 iid,然后调用 treeview.insert 方法将数据项插入到 Treeview 组件中。根据索引 idx 的奇偶性,通过 tags 参数为每一行设置相应的奇偶行标签,从而实现交替背景色显示。

3. 作用与优势

该函数能够动态地将数据填充到 Treeview 组件中,适应不同的查询结果集大小和内容。奇偶行不同背景色的设计使得数据在视觉上更具层次感,方便用户快速定位和阅读每一行数据,尤其在数据量较大时,能够有效减轻视觉疲劳,提高数据查看的效率和准确性。

(二)tv 函数

1. 函数定义与功能

def tv(win, lst, lst_name):
    treev = Treeview(win, columns=lst, show='headings')
    for i in range(len(lst)):
        treev.heading(lst[i], text=lst_name[i])
    return treev

tv 函数用于创建一个 Treeview 组件,并根据传入的列标识列表 lst 和列名列表 lst_name 设置列的标题,为后续的数据展示提供一个合适的表格框架。

2. 实现细节

  • 创建 Treeview 组件 :以传入的窗口对象 win 为父容器,指定列标识为 lst,并设置 show='headings' 参数,表示只显示列标题,不显示树状结构的首列(即不显示默认的空白列)。

  • 设置列标题 :通过循环遍历列标识列表 lst,使用 treev.heading 方法为每一列设置标题,标题文本取自 lst_name 列表中对应索引的元素。例如,若 lst['stuno', 'stuname']lst_name['学号', '姓名'],则第一列的标题将显示为 “学号”,第二列为 “姓名”。

3. 作用与优势

tv 函数简化了 Treeview 组件的创建和列标题设置过程,使得在系统中多次创建具有相同结构或不同结构的表格变得更加方便快捷。通过传入不同的列标识和列名列表,可以灵活地生成适用于各种数据展示场景的表格,提高了代码的复用性和可维护性。同时,明确的列标题能够帮助用户快速理解表格中各列数据的含义,增强了系统的用户友好性。

(三)总结

datautil.py 文件中的 tv_datatv 函数共同为学生成绩管理系统提供了高效、美观的数据展示解决方案。tv 函数负责创建表格框架并设置列标题,而 tv_data 函数则负责将数据填充到表格中并优化视觉展示效果。两者协同工作,使得系统能够以表格形式清晰地呈现学生成绩信息,满足教师在成绩管理过程中的数据查看需求,为系统的整体功能实现提供了有力的支持,提升了用户体验和工作效率。

六、登录与注册功能(login.py

登录与注册功能是学生成绩管理系统的重要入口,它确保只有合法的教师用户能够访问系统,从而保障了学生成绩数据的安全性和保密性。login.py 文件实现了系统的启动界面、教师注册功能和教师登录功能,下面将详细介绍各部分的实现与作用。

(一)系统启动界面(StartMenu 类)

1. 类定义与界面布局

class StartMenu():
    def __init__(self):
        self.startmenu = Tk()
        self.startmenu.geometry('1480x880+150+50')
        self.startmenu.title('学生成绩管理系统')
        self.startmenu.resizable(width=False, height=False)
        image = PhotoImage(file='./image/startmenu.png')
        Label(self.startmenu, image=image).place(x=0, y=0, width=1480, height=880)
        # 三个按钮
        button = Button(self.startmenu, text='教师注册', bg='yellowgreen', fg='white', font=16, command=lambda: TeacherRegister(self.startmenu)).place(x=500, y=500, width=100, height=40)
        button = Button(self.startmenu, text='教师登录', bg='yellowgreen', fg='white', font=16, command=lambda: TeacherLogin(self.startmenu)).place(x=610, y=500, width=100, height=40)
        button = Button(self.startmenu, text='教师退出', bg='yellowgreen', fg='white', font=16, command=self.startmenu.destroy).place(x=720, y=500, width=100, height=40)
        self.startmenu.mainloop()

StartMenu 类用于创建系统的启动界面。在初始化方法中,首先创建了一个 Tk 窗口,设置了窗口的大小为 1480x880 像素,位置在屏幕偏移 150x50 处,标题为 “学生成绩管理系统”,并禁止窗口大小调整,以确保界面元素的布局稳定。然后,加载背景图片 startmenu.png,并通过 Label 组件将其放置在窗口的整个区域,作为界面的背景。

在界面上方,放置了三个按钮:“教师注册”、“教师登录” 和 “教师退出”。每个按钮都设置了背景颜色为 yellowgreen,前景文字颜色为白色,字体大小为 16,以突出显示按钮功能。按钮的布局采用绝对定位方式,分别放置在横向坐标 500610720 处,纵向坐标均为 500,宽度为 100 像素,高度为 40 像素。

2. 按钮功能绑定

  • 教师注册按钮 :通过 command=lambda: TeacherRegister(self.startmenu) 绑定,当点击该按钮时,会创建 TeacherRegister 类的实例,进入教师注册界面。

  • 教师登录按钮 :使用 command=lambda: TeacherLogin(self.startmenu) 绑定,点击后创建 TeacherLogin 类的实例,进入教师登录界面。

  • 教师退出按钮 :绑定 command=self.startmenu.destroy,点击后直接销毁启动窗口,退出系统。

3. 界面运行

最后,通过调用 self.startmenu.mainloop() 启动 Tkinter 的主事件循环,使得启动界面能够持续显示并响应用户的操作。

(二)教师注册功能(TeacherRegister 类)

1. 类定义与界面布局

class TeacherRegister():
    def __init__(self, startmenu):
        self.startmenu = startmenu
        self.startmenu.withdraw()
        self.teacherreg = Toplevel()
        self.teacherreg.geometry('1480x880+150+50')
        self.teacherreg.title('学生成绩管理系统 - 教师注册')
        self.teacherreg.resizable(width=False, height=False)
        image = PhotoImage(file='./image/teacherreg.png')
        Label(self.teacherreg, image=image).place(x=0, y=0, width=1480, height=880)
        # 页面布局
        Label(self.teacherreg, text='输入账号', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=300, width=80, height=40)
        self.teachername = Entry(self.teacherreg, font=16)
        self.teachername.place(x=140, y=300, width=300, height=40)
        # 密码
        Label(self.teacherreg, text='输入密码', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=360, width=80, height=40)
        self.teacherpwd = Entry(self.teacherreg, font=16, show='*')
        self.teacherpwd.place(x=140, y=360, width=300, height=40)
        # 确认账号
        Label(self.teacherreg, text='确认密码', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=420, width=80, height=40)
        self.comteacherpwd = Entry(self.teacherreg, font=16, show='*')
        self.comteacherpwd.place(x=140, y=420, width=300, height=40)
        # 两个按键
        Button(self.teacherreg, text='确定', bg='yellowgreen', fg='white', font=16, command=self.register).place(x=260, y=480, width=80, height=40)
        Button(self.teacherreg, text='返回', bg='yellowgreen', fg='white', font=16, command=self.closewin).place(x=350, y=480, width=80, height=40)
        self.teacherreg.bind('<Destroy>', self.closewin2)
        self.teacherreg.mainloop()

TeacherRegister 类实现了教师注册界面。在初始化方法中,首先将传入的启动界面窗口 startmenu 隐藏(self.startmenu.withdraw()),然后创建一个新的顶层窗口 Toplevel() 作为注册界面。设置窗口大小、标题、位置等属性,加载背景图片 teacherreg.png 作为界面背景。

在界面上,通过多个 LabelEntry 组件创建了教师注册所需的输入项,包括:

  • 输入账号 :通过 Label 显示 “输入账号” 文本提示,Entry 组件供用户输入教师账号,设置字体大小为 16,输入框宽度为 300 像素,高度为 40 像素,放置在横向坐标 140、纵向坐标 300 处。

  • 输入密码 :同样使用 Label 显示 “输入密码” 提示,Entry 组件用于输入密码,且设置 show='*' 使密码以星号形式显示,保护用户密码隐私,输入框位置在纵向坐标 360 处。

  • 确认密码 :再次使用 LabelEntry 组件,要求用户确认输入的密码,以确保密码输入正确无误,输入框位置在纵向坐标 420 处。

在输入项下方,放置了两个按钮:

  • 确定按钮 :绑定 command=self.register,当点击时调用 register 方法进行注册操作,按钮放置在横向坐标 260、纵向坐标 480 处。

  • 返回按钮 :绑定 command=self.closewin,点击后调用 closewin 方法关闭注册界面并返回启动界面,按钮位置在横向坐标 350、纵向坐标 480 处。

同时,为了在窗口关闭时能够正确处理相关事件,使用 self.teacherreg.bind('<Destroy>', self.closewin2) 绑定窗口销毁事件到 closewin2 方法。

2. 注册功能实现

def register(self):
    if self.teachername.get() == '' or self.teacherpwd.get() == '':
        showwarning('警告', '账号或密码不允许为空')
        return False
    if self.teacherpwd.get() != self.comteacherpwd.get():
        showwarning('警告', '密码不一致')
        return False
    sql = 'select * from teacher_login where loginname = %s'
    mysqlobj = service.PyMySQLUtils()
    result = mysqlobj.fetchall(sql, (self.teachername.get()))
    if len(result) > 0:
        showinfo('警告', '账号重复')
        return False
    sql1 = 'insert into teacher_login (loginname, loginpwd) values (%s, %s)'
    result1 = mysqlobj.execute(sql1, (self.teachername.get(), self.teacherpwd.get()))
    if result1 > 0:
        showinfo('提示', '教师注册成功')
        self.teacherreg.destroy()
    else:
        showwarning('错误', '教师注册失败,请联系管理员')
        self.teachername.delete(0, 'end')
        self.teacherpwd.delete(0, 'end')
        self.comteacherpwd.delete(0, 'end')

register 方法实现了教师注册的核心逻辑。

  • 输入验证 :首先检查用户输入的账号和密码是否为空,若为空则弹出警告提示 “账号或密码不允许为空”,并返回 False 中止注册流程。

  • 密码一致性验证 :比较用户输入的密码和确认密码是否一致,若不一致弹出警告提示 “密码不一致”,返回 False

  • 账号唯一性验证 :通过查询数据库中的 teacher_login 表,检查输入的账号是否已存在。使用 service.PyMySQLUtils 类的 fetchall 方法执行查询语句 select * from teacher_login where loginname = %s,传入用户输入的账号作为参数。如果查询结果集的长度大于 0,说明账号已存在,弹出提示 “账号重复”,返回 False

  • 插入新账号 :若上述验证均通过,则构造 SQL 插入语句 insert into teacher_login (loginname, loginpwd) values (%s, %s),将用户输入的账号和密码插入到 teacher_login 表中。调用 mysqlobj.execute 方法执行插入操作,若返回值大于 0,表示插入成功,弹出提示 “教师注册成功”,并销毁注册界面窗口。若插入失败,则弹出错误提示 “教师注册失败,请联系管理员”,并清空输入框中的内容,以便用户重新输入。

3. 窗口关闭处理

def closewin2(self, event):
    self.closewin()

def closewin(self):
    self.teacherreg.destroy()
    self.startmenu.deiconify()
  • closewin2 方法 :用于处理窗口销毁事件。当注册界面窗口被关闭时,触发该方法,进而调用 closewin 方法。

  • closewin 方法 :销毁注册界面窗口 self.teacherreg,并通过 self.startmenu.deiconify() 将之前隐藏的启动界面窗口重新显示出来,使用户可以返回到系统的初始界面,进行其他操作,如重新注册或选择登录等。

(三)教师登录功能(TeacherLogin 类)

1. 类定义与界面布局

class TeacherLogin():
    def __init__(self, startmenu):
        self.startmenu = startmenu
        self.startmenu.withdraw()
        self.teacherlogin = Toplevel()
        self.teacherlogin.geometry('1480x880+150+50')
        self.teacherlogin.title('学生成绩管理系统 - 教师登录')
        self.teacherlogin.resizable(width=False, height=False)
        image = PhotoImage(file='./image/teacherlogin.png')
        Label(self.teacherlogin, image=image).place(x=0, y=0, width=1480, height=880)
        # 页面布局
        Label(self.teacherlogin, text='输入账号', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=300, width=80, height=40)
        self.teachername = Entry(self.teacherlogin, font=16)
        self.teachername.place(x=140, y=300, width=300, height=40)
        # 密码
        Label(self.teacherlogin, text='输入密码', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=360, width=80, height=40)
        self.teacherpwd = Entry(self.teacherlogin, font=16, show='*')
        self.teacherpwd.place(x=140, y=360, width=300, height=40)
        # 两个按钮
        Button(self.teacherlogin, text='确定', bg='yellowgreen', fg='white', font=16, command=self.login).place(x=260, y=420, width=80, height=40)
        Button(self.teacherlogin, text='返回', bg='yellowgreen', fg='white', font=16, command=self.closewin).place(x=350, y=420, width=80, height=40)
        self.teacherlogin.bind('<Destroy>', self.closewin2)
        self.teacherlogin.mainloop()

TeacherLogin 类用于创建教师登录界面。在初始化方法中,同样先隐藏启动界面窗口 startmenu,然后创建新的顶层窗口作为登录界面。设置窗口属性、加载背景图片 teacherlogin.png 等操作与注册界面类似。

在界面上,放置了以下组件:

  • 输入账号Label 显示 “输入账号” 提示,Entry 组件供教师输入账号,位置在横向坐标 140、纵向坐标 300 处。

  • 输入密码Label 显示 “输入密码” 提示,Entry 组件用于输入密码,且密码以星号形式显示,输入框位置在纵向坐标 360 处。

  • 确定按钮 :绑定 command=self.login,点击时调用 login 方法进行登录验证,按钮位置在横向坐标 260、纵向坐标 420 处。

  • 返回按钮 :绑定 command=self.closewin,点击后关闭登录界面并返回启动界面,按钮位置在横向坐标 350、纵向坐标 420 处。

同样绑定窗口销毁事件到 closewin2 方法,以便在窗口关闭时执行相应的处理逻辑。

2. 登录功能实现

def login(self):
    if self.teachername.get() == '' or self.teacherpwd.get() == '':
        showwarning('警告', '账号或密码不允许为空')
        return False
    sql = 'select * from teacher_login where loginname = %s and loginpwd = %s'
    sqlobj = service.PyMySQLUtils()
    result = sqlobj.fetchall(sql, self.teachername.get(), self.teacherpwd.get())
    if len(result) > 0:
        self.teachername.delete(0, 'end')
        self.teacherpwd.delete(0, 'end')
        TeacherMenu(self.teacherlogin)
    else:
        showerror('错误', '账号或密码不正确')

login 方法实现了教师登录的核心逻辑。

  • 输入验证 :首先检查用户输入的账号和密码是否为空,若为空则弹出警告提示 “账号或密码不允许为空”,并返回 False 中止登录流程。

  • 账号密码验证 :构造 SQL 查询语句 select * from teacher_login where loginname = %s and loginpwd = %s,通过 service.PyMySQLUtils 类的 fetchall 方法执行查询,传入用户输入的账号和密码作为参数。如果查询结果集的长度大于 0,说明账号和密码匹配,登录成功。

  • 登录成功处理 :清空输入框中的账号和密码,然后创建 TeacherMenu 类的实例,进入成绩管理主界面。

  • 登录失败处理 :若查询结果为空,弹出错误提示 “账号或密码不正确”,告知用户登录失败,用户可以重新输入账号和密码进行尝试。

3. 窗口关闭处理

TeacherLogin 类中的 closewinclosewin2 方法与 TeacherRegister 类中的实现类似,用于关闭登录界面窗口并返回启动界面,这里不再赘述。

(四)总结

login.py 文件通过 StartMenuTeacherRegisterTeacherLogin 三个类,实现了学生成绩管理系统的启动界面、教师注册功能和教师登录功能。启动界面提供了进入注册和登录界面的入口,教师注册功能允许新的教师用户创建账号,而教师登录功能验证教师身份并允许合法用户进入系统进行成绩管理操作。这些功能模块相互协作,构成了系统的第一道安全防线,确保了学生成绩数据的安全性和系统的有序访问。通过合理的界面布局、清晰的用户提示和严格的输入验证,提高了系统的用户体验和可靠性,为后续的成绩管理操作奠定了良好的基础。

七、成绩管理功能(TeacherMenu 类)

(一)界面布局与初始化

1. 类定义与整体布局

class TeacherMenu():
    def __init__(self, teacherlogin):
        self.teacherlogin = teacherlogin
        self.teacherlogin.withdraw()
        self.teachermenu = Toplevel()
        self.teachermenu.geometry('1480x880+150+50')
        self.teachermenu.title('学生成绩管理系统 - 学生成绩管理')
        self.teachermenu.resizable(width=False, height=False)
        image = PhotoImage(file='./image/score.png')
        Label(self.teachermenu, image=image).place(x=0, y=0, width=1480, height=880)
        # 页面布局(包括各个输入框、按钮和表格的创建与布局)
        # 输入框部分
        Label(self.teachermenu, text='学号', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=200, width=120, height=40)
        self.stuno = Entry(self.teachermenu, font=16)
        self.stuno.place(x=180, y=200, width=90, height=40)
        Label(self.teachermenu, text='姓名', bg='#F0F4CF', font=16, anchor='w').place(x=300, y=200, width=120, height=40)
        self.stuname = Entry(self.teachermenu, font=16)
        self.stuname.place(x=410, y=200, width=90, height=40)
        Label(self.teachermenu, text='专业', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=260, width=120, height=40)
        self.college = Entry(self.teachermenu, font=16)
        self.college.place(x=180, y=260, width=90, height=40)
        Label(self.teachermenu, text='课程成绩', bg='#F0F4CF', font=16, anchor='w').place(x=300, y=260, width=120, height=40)
        self.score = Entry(self.teachermenu, font=16)
        self.score.place(x=410, y=260, width=90, height=40)
        Label(self.teachermenu, text='考试平均成绩', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=320, width=120, height=40)
        self.avgscore = Entry(self.teachermenu, font=16)
        self.avgscore.place(x=180, y=320, width=90, height=40)
        Label(self.teachermenu, text='任课老师评分', bg='#F0F4CF', font=16, anchor='w').place(x=300, y=320, width=120, height=40)
        self.teacher_rating = Entry(self.teachermenu, font=16)
        self.teacher_rating.place(x=410, y=320, width=90, height=40)
        Label(self.teachermenu, text='综合测试总分', bg='#F0F4CF', font=16, anchor='w').place(x=50, y=380, width=120, height=40)
        self.total_score = Entry(self.teachermenu, font=16)
        self.total_score.place(x=180, y=380, width=90, height=40)
        # 按钮部分
        Button(self.teachermenu, text='添加', bg='yellowgreen', fg='white', font=16, command=self.insert).place(x=180, y=490, width=80, height=40)
        Button(self.teachermenu, text='修改', bg='orange', fg='white', font=16, command=self.update).place(x=270, y=490, width=80, height=40)
        Button(self.teachermenu, text='查询', bg='#5b9bd5', fg='white', font=16, command=self.query).place(x=360, y=490, width=80, height=40)
        Button(self.teachermenu, text='删除', bg='red', fg='white', font=16, command=self.delete).place(x=180, y=540, width=80, height=40)
        Button(self.teachermenu, text='清空', bg='gray', fg='white', font=16, command=self.clear).place(x=270, y=540, width=80, height=40)
        Button(self.teachermenu, text='导出', bg='green', fg='white', font=16, command=self.save).place(x=360, y=540, width=80, height=40)
        # 表格部分
        lst = ['stuno', 'stuname', 'college', 'score', 'avgscore', 'teacher_rating', 'total_score']
        lst_name = ['学号', '姓名', '专业', '课程成绩', '考试平均成绩', '任课老师评分', '综合测试总分']
        self.tv = datautil.tv(self.teachermenu, lst, lst_name)
        self.tv.place(x=580, y=200, width=760, height=400)
        # 排序按钮
        Button(self.teachermenu, text='综合测评总分各项序排序', font=16, bg='#5b9bd5', fg='white', command=self.tree_sort_column).place(x=1140, y=600, width=200, height=40)
        self.teachermenu.bind('<Destroy>', self.closewin2)
        self.teachermenu.mainloop()

TeacherMenu 类负责创建学生成绩管理界面,是教师进行成绩管理操作的核心界面。在初始化方法中,首先隐藏传入的登录界面窗口 teacherlogin,然后创建一个新的顶层窗口作为成绩管理界面。设置窗口大小、标题、位置等属性,并加载背景图片 score.png

界面布局分为三个主要部分:输入框部分、按钮部分和表格部分。

  • 输入框部分 :用于输入或显示学生的成绩信息,包括学号、姓名、专业、课程成绩、考试平均成绩、任课老师评分和综合测试总分。每个输入项由一个 Label 组件显示名称提示,一个 Entry 组件用于输入或显示数据。输入框的布局采用绝对定位方式,分布在窗口的左侧区域,方便教师快速输入或查看学生成绩数据。

  • 按钮部分 :提供了多个功能按钮,包括 “添加”、“修改”、“查询”、“删除”、“清空” 和 “导出”。每个按钮绑定相应的命令方法,用于触发对应的成绩管理操作。按钮的布局在输入框下方,采用并排排列方式,使得教师能够方便地找到并点击所需的按钮进行操作。

  • 表格部分 :使用 datautil.tv 函数创建一个 Treeview 组件,用于以表格形式展示学生成绩数据。表格的列标识和列名通过列表 lstlst_name 传入,表格放置在窗口的右侧区域,占据较大的空间以便显示较多的数据行。表格用于展示所有学生成绩记录或根据查询条件筛选后的成绩记录,方便教师查看和管理学生的成绩信息。

此外,界面上还放置了一个排序按钮 “综合测评总分各项序排序”,用于对学生成绩按照综合测试总分进行降序排序展示。

2. 窗口关闭处理

def closewin2(self, event):
    self.teachermenu.destroy()
    self.teacherlogin.deiconify()

closewin2 方法用于处理成绩管理界面窗口销毁事件。当窗口被关闭时,销毁成绩管理界面窗口 self.teachermenu,并通过 self.teacherlogin.deiconify() 将之前隐藏的登录界面窗口重新显示出来,使用户可以返回登录界面进行其他操作,如重新登录或退出系统。

(二)成绩录入功能

1. 添加成绩实现

def insert(self):
    sqlobj = service.PyMySQLUtils()
    if self.stuno.get() == '' or self.stuname.get() == '':
        showwarning('警告', '学号或姓名不允许为空')
        return False
    sql = 'select * from student_sore where stuno = %s'
    result = sqlobj.fetchall(sql, self.stuno.get())
    if len(result) > 0:
        showwarning('警告', '学号不允许重复')
        return False
    sql = 'insert into student_sore values (%s, %s, %s, %s, %s, %s, %s)'
    values = (self.stuno.get(), self.stuname.get(), self.college.get(), self.score.get(), self.avgscore.get(), self.teacher_rating.get(), self.total_score.get())
    result2 = sqlobj.execute(sql, values)
    if result2 > 0:
        showinfo('提示', '新增学生成绩成功')
        self.clear()
        self.query()
    else:
        showerror('错误', '新增学生成绩失败,请联系管理员')
        self.clear()

insert 方法实现了学生成绩的添加功能。

  • 输入验证 :首先检查学号和姓名输入框是否为空,若为空则弹出警告提示 “学号或姓名不允许为空”,并返回 False 中止添加操作。

  • 学号唯一性验证 :通过查询 student_sore 表,检查输入的学号是否已存在。使用 service.PyMySQLUtils 类的 fetchall 方法执行查询语句 select * from student_sore where stuno = %s,传入学号作为参数。如果查询结果集的长度大于 0,说明学号已存在,弹出警告提示 “学号不允许重复”,返回 False

  • 插入新成绩记录 :若验证通过,则构造 SQL 插入语句 insert into student_sore values (%s, %s, %s, %s, %s, %s, %s),将输入框中的学号、姓名、专业、课程成绩、考试平均成绩、任课老师评分和综合测试总分作为值传入,执行插入操作。调用 sqlobj.execute 方法执行插入语句,若返回值大于 0,表示插入成功,弹出提示 “新增学生成绩成功”,并调用 self.clear() 方法清空输入框,随后调用 self.query() 方法刷新表格数据,展示最新的成绩记录。若插入失败,则弹出错误提示 “新增学生成绩失败,请联系管理员”,并清空输入框内容。

(三)成绩查询功能

1. 查询成绩实现

def query(self):
    sqlobj = service.PyMySQLUtils()
    if self.stuno.get() == '':
        self.clear()
        sql = 'select * from student_sore'
        result = sqlobj.fetchall(sql)
    else:
        sql = 'select * from student_sore where stuno = %s'
        result = sqlobj.fetchall(sql, self.stuno.get())
        if len(result) > 0:
            self.clear()
            self.stuno.insert(0, result[0][0])
            self.stuname.insert(0, result[0][1])
            self.college.insert(0, result[0][2])
            self.score.insert(0, result[0][3])
            self.avgscore.insert(0, result[0][4])
            self.teacher_rating.insert(0, result[0][5])
            self.total_score.insert(0, result[0][6])
    if len(result) != 0:
        datautil.tv_data(self.tv, result)
    else:
        showinfo('提示', '该学生成绩信息不存在')
        self.clear()

query 方法实现了学生成绩的查询功能。

  • 查询全部成绩 :如果学号输入框为空,则执行查询语句 select * from student_sore,获取所有学生成绩记录,并清空输入框内容,将查询结果通过 datautil.tv_data 函数填充到表格中展示。

  • 按学号查询成绩 :如果学号输入框不为空,则执行查询语句 select * from student_sore where stuno = %s,传入学号作为参数,查询对应学号的学生成绩记录。若查询结果不为空,清空输入框内容,并将查询结果中的学号、姓名、专业等成绩信息依次填充到相应的输入框中,方便教师查看或进行后续的修改操作。同时,将查询结果通过表格展示出来。若查询结果为空,弹出提示 “该学生成绩信息不存在”,并清空输入框内容。

(四)成绩修改功能

1. 修改成绩实现

def update(self):
    sqlobj = service.PyMySQLUtils()
    if self.stuno.get() == '':
        showwarning('警告', '请先选择一位学生成绩')
        return False
    if self.stuname.get() == '':
        showwarning('警告', '请先查询学生信息')
        return False
    sql = 'update student_sore set stuname = %s, college = %s, score = %s, avgscore = %s, teacher_rating = %s, total_score = %s where stuno = %s'
    values = (self.stuname.get(), self.college.get(), self.score.get(), self.avgscore.get(), self.teacher_rating.get(), self.total_score.get(), self.stuno.get())
    result = sqlobj.execute(sql, values)
    if result > 0:
        showinfo('提示', '修改信息成功')
        self.clear()
        self.query()
    else:
        showerror('错误', '修改学生信息失败,请联系管理员')

update 方法实现了学生成绩的修改功能。

  • 输入验证 :首先检查学号输入框是否为空,若为空则弹出警告提示 “请先选择一位学生成绩”,并返回 False。接着检查姓名输入框是否为空,若为空则弹出警告提示 “请先查询学生信息”,并返回 False,确保教师是在基于已有学生成绩记录的基础上进行修改操作。

  • 更新成绩记录 :构造 SQL 更新语句 update student_sore set stuname = %s, college = %s, score = %s, avgscore = %s, teacher_rating = %s, total_score = %s where stuno = %s,将输入框中的姓名、专业、课程成绩、考试平均成绩、任课老师评分和综合测试总分作为更新值,学号作为条件传入。调用 sqlobj.execute 方法执行更新操作,若返回值大于 0,表示更新成功,弹出提示 “修改信息成功”,并调用 self.clear() 方法清空输入框,随后调用 self.query() 方法刷新表格数据,展示更新后的成绩记录。若更新失败,则弹出错误提示 “修改学生信息失败,请联系管理员”。

(五)成绩删除功能

1. 删除成绩实现

def delete(self):
    sqlobj = service.PyMySQLUtils()
    if self.stuno.get() == '':
        showwarning('警告', '请先输入要删除的学生学号')
        return False
    self.query()
    if self.stuno.get() != '':
        answer = askyesno('提示', '确定要删除吗?')
        if answer:
            sql = 'delete from student_sore where stuno = %s'
            result = sqlobj.execute(sql, self.stuno.get())
            if result > 0:
                showinfo('提示', '删除学生成绩信息成功')
                self.clear()
                self.query()
            else:
                showerror('错误', '删除学生成绩信息失败,请联系管理员')

delete 方法实现了学生成绩的删除功能。

  • 输入验证 :检查学号输入框是否为空,若为空则弹出警告提示 “请先输入要删除的学生学号”,并返回 False

  • 查询学生成绩 :调用 self.query() 方法查询输入学号对应的学生成绩信息,若查询结果存在(即学号对应的学生成绩记录存在),则弹出确认对话框,询问教师是否确定要删除。

  • 删除成绩记录 :如果教师确认删除,则构造 SQL 删除语句 delete from student_sore where stuno = %s,传入学号作为条件,执行删除操作。调用 sqlobj.execute 方法执行删除语句,若返回值大于 0,表示删除成功,弹出提示 “删除学生成绩信息成功”,并调用 self.clear() 方法清空输入框,随后调用 self.query() 方法刷新表格数据,更新成绩记录展示。若删除失败,则弹出错误提示 “删除学生成绩信息失败,请联系管理员”。

(六)成绩统计与导出功能

1. 成绩排序实现

def tree_sort_column(self):
    sql = 'select * from student_sore order by total_score desc'
    sqlobj = service.PyMySQLUtils()
    result = sqlobj.fetchall(sql)
    datautil.tv_data(self.tv, result)

tree_sort_column 方法实现了按照综合测试总分对学生进行降序排序并展示的功能。

  • 查询排序数据 :构造 SQL 查询语句 select * from student_sore order by total_score desc,通过 service.PyMySQLUtils 类的 fetchall 方法执行查询,获取按照综合测试总分降序排列的学生成绩记录集。

  • 更新表格数据 :调用 datautil.tv_data 函数,将排序后的成绩记录集填充到表格中展示,使得教师能够直观地查看学生的成绩排名情况。

2. 成绩导出实现

def save(self):
    sqlobj = service.PyMySQLUtils()
    sql = 'select * from student_sore'
    result = sqlobj.fetchall(sql)
    try:
        wb = openpyxl.Workbook()
        sheet = wb.create_sheet('sheet1')
        sheet.append(['学号', '姓名', '专业', '课程成绩', '考试平均成绩', '任课老师评分', '综合测试总分'])
        for item in result:
            sheet.append(item)
        wb.save('./student_score.xlsx')
        showinfo('提示', '导出学生成绩信息成功')
    except Exception as e:
        showerror('错误', '保存数据失败,请联系管理员')

save 方法实现了将学生成绩数据导出为 Excel 文件的功能。

  • 查询成绩数据 :执行 SQL 查询语句 select * from student_sore,获取所有学生成绩记录。

  • 创建工作簿与工作表 :使用 openpyxl 库创建一个新的工作簿 wb,并在其中创建一个名为 “sheet1” 的工作表 sheet

  • 写入表头与数据 :首先向工作表中写入表头数据,包括 “学号”、“姓名”、“专业” 等列名。然后遍历查询结果集 result,将每一行成绩数据依次写入工作表中。

  • 保存文件与提示 :将工作簿保存为文件 student_score.xlsx,弹出提示 “导出学生成绩信息成功”。若在保存过程中发生异常,则捕获异常并弹出错误提示 “保存数据失败,请联系管理员”。

(七)其他辅助功能

1. 清空输入框

def clear(self):
    self.stuno.delete(0, END)
    self.stuname.delete(0, END)
    self.college.delete(0, END)
    self.score.delete(0, END)
    self.avgscore.delete(0, END)
    self.teacher_rating.delete(0, END)
    self.total_score.delete(0, END)

clear 方法用于清空所有输入框中的内容,方便教师在进行新的操作时输入新的数据,避免之前的数据残留对新操作造成干扰。

(八)总结

TeacherMenu 类作为学生成绩管理系统的成绩管理功能核心模块,通过丰富的界面布局和功能实现,为教师提供了全面、便捷的学生成绩管理操作平台。从成绩的添加、修改、查询、删除到成绩的排序统计和导出,各项功能紧密围绕教师的教学管理需求展开,实现了对学生成绩数据的高效管理和充分利用。通过严格的输入验证、清晰的操作流程和及时的反馈提示,提高了系统的可靠性和用户体验,确保教师能够准确、快速地完成学生成绩的管理工作,为学校的教学质量和学生个人发展提供了有力的数据支持和保障。

八、系统运行效果与演示

(一)功能模块演示

1.启动界面:
2.教师注册与登录:

3.成绩管理界面:
4.成绩录入与修改
5.成绩查询与删除

6.成绩统计与导出

九、总结与展望

(一)项目总结

  1. 系统功能实现:本学生成绩管理系统成功实现了成绩录入、查询、修改、删除等基本功能。教师能够方便地添加新的学生成绩记录,查询特定学生的成绩信息进行查看或修改,还可以删除不再需要的成绩记录,确保成绩数据的准确性和完整性。

  2. 用户友好性:系统界面设计简洁直观,易于操作。通过清晰的输入提示、按钮图标和表格展示,教师可以快速上手,无需复杂的培训过程。同时,系统提供了详细的错误提示和操作指南,帮助教师在使用过程中及时解决问题。

  3. 数据安全与保密:采用教师注册和登录机制,只有合法的教师用户能够访问系统,保障了学生成绩数据的安全性和保密性。密码输入以星号形式显示,增强了用户密码的保护措施。

  4. 数据管理与分析:系统支持按综合测试总分对学生进行排序,方便教师了解学生的成绩排名情况,为教学评估和学生管理提供了有力的数据支持。此外,成绩导出功能使教师能够将成绩数据导出为Excel文件,便于进行进一步的数据分析和备份。

(二)未来展望

  1. 功能扩展:在未来,可以考虑增加更多的成绩分析功能,如生成成绩统计图表、计算班级平均分、最高分和最低分等,为教师提供更深入的数据分析支持。同时,可以增加学生的自我查询功能,让学生能够登录系统查看自己的成绩。

  2. 系统优化:进一步优化系统的性能,提高数据处理速度,尤其是在处理大量学生成绩数据时的效率。此外,可以加强对系统异常情况的处理,提高系统的稳定性和可靠性。

  3. 用户体验提升:根据用户的反馈,持续改进系统界面和操作流程,使其更加符合用户的使用习惯。增加系统的响应提示和操作引导,提升用户的操作体验。

  4. 移动设备支持:随着移动设备的普及,开发适用于手机和平板电脑的移动客户端应用程序,使教师能够随时随地进行成绩管理工作,提高工作的灵活性和便利性。

  5. 数据备份与恢复:增强系统的数据备份和恢复功能,定期自动备份成绩数据,防止数据丢失。同时,提供简便的数据恢复操作,确保在数据出现问题时能够快速恢复。

  6. 与其他系统集成:探索与其他教育管理系统的集成可能性,如学生信息管理系统、课程管理系统等,实现数据的共享和互通,构建更加完善的教育信息化平台。

总之,本学生成绩管理系统为学校教师提供了一个高效、便捷、安全的成绩管理工具,有助于提高教学管理水平和教育质量。在未来的发展中,我们将继续努力,不断完善系统功能,提升用户体验,以适应教育信息化的不断发展需求。

学生成绩管理系统是一种非常常见的应用。Python 是一种非常流行的编程语言,因此使用 Python 来开发学生成绩管理系统是非常可行的。下面是一个简单的学生成绩管理系统的实现: 1. 首先定义一个 Student 类,用来表示每个学生的信息,包括姓名、学号、年级和成绩等属性。 ```python class Student: def __init__(self, name, id, grade, score): self.name = name self.id = id self.grade = grade self.score = score ``` 2. 然后定义一个 GradeBook 类,用来管理所有的学生信息,包括添加学生、删除学生、查询学生信息、计算平均成绩等方法。 ```python class GradeBook: def __init__(self): self.students = [] def add_student(self, student): self.students.append(student) def remove_student(self, student): self.students.remove(student) def find_student_by_id(self, id): for student in self.students: if student.id == id: return student return None def find_student_by_name(self, name): for student in self.students: if student.name == name: return student return None def calculate_average_score(self): total_score = 0 for student in self.students: total_score += student.score return total_score / len(self.students) ``` 3. 最后,可以编写一个简单的交互式命令行界面,用来操作学生成绩管理系统。 ```python def main(): grade_book = GradeBook() while True: print("学生成绩管理系统") print("1. 添加学生") print("2. 删除学生") print("3. 查询学生信息") print("4. 计算平均成绩") print("5. 退出") choice = int(input("请选择操作: ")) if choice == 1: name = input("请输入学生姓名: ") id = input("请输入学生学号: ") grade = input("请输入学生年级: ") score = float(input("请输入学生成绩: ")) student = Student(name, id, grade, score) grade_book.add_student(student) print("学生添加成功!") elif choice == 2: id = input("请输入要删除的学生学号: ") student = grade_book.find_student_by_id(id) if student: grade_book.remove_student(student) print("学生删除成功!") else: print("未找到该学生!") elif choice == 3: id_or_name = input("请输入要查询的学生学号或姓名: ") student = grade_book.find_student_by_id(id_or_name) or grade_book.find_student_by_name(id_or_name) if student: print("姓名: ", student.name) print("学号: ", student.id) print("年级: ", student.grade) print("成绩: ", student.score) else: print("未找到该学生!") elif choice == 4: average_score = grade_book.calculate_average_score() print("平均成绩: ", average_score) elif choice == 5: break else: print("无效操作,请重新选择!") if __name__ == "__main__": main() ``` 这样,一个简单的学生成绩管理系统就完成了。当然,这只是一个简单的示例,实际开发中需要考虑更多的功能和异常情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值