学生信息成绩管理系统采用Python + qt5 来实现
快速获得整个项目的入口:https://download.youkuaiyun.com/download/nanxiang11/15179227
就可以获取整个项目资源
由于项目文件比较多所以我分了好几个包来完成这个项目如下图:
然后就是一些要安装的组件
其实就是数据库组件pymysql,和qt5相关的组件。其项目就是基于对数据库的操作和对于qt5 的应用。接下来我们就进入正题!
首先是连接数据库,我们创建了一个文件夹叫service的文件夹里面就放了一个文件,名称叫service.py该文件就是对于数据库的连接,查找,和修改一类的操作详细代码如下
# -*- coding: utf-8 -*-
import pymysql # 导入操作MySQL数据库的模块
userName="" # 记录用户名
# 打开数据库连接
def open():
db = pymysql.connect(host="localhost", user="root", password="196811", database="db_student", charset="utf8")
return db # 返回连接对象
# 执行数据库的增、删、改操作
def exec(sql,values):
db=open() # 连接数据库
cursor = db.cursor() # 使用cursor()方法获取操作游标
try:
cursor.execute(sql,values) # 执行增删改的SQL语句
db.commit() # 提交数据
return 1 # 执行成功
except:
db.rollback() # 发生错误时回滚
return 0 # 执行失败
finally:
cursor.close() # 关闭游标
db.close() # 关闭数据库连接
# 带参数的精确查询
def query(sql,*keys):
db=open() # 连接数据库
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute(sql,keys) # 执行查询SQL语句
result = cursor.fetchall() # 记录查询结果
cursor.close() # 关闭游标
db.close() # 关闭数据库连接
return result # 返回查询结果
# 不带参数的模糊查询
def query2(sql):
db=open() # 连接数据库
cursor = db.cursor() # 使用cursor()方法获取操作游标
cursor.execute(sql) # 执行查询SQL语句
result = cursor.fetchall() # 记录查询结果
cursor.close() # 关闭游标
db.close() # 关闭数据库连接
return result # 返回查询结果
关于怎么操作请详细看关于pymysql的相关资料,文章中也有详细说明各个函数的用途。
接下来就是关于登入页面的实现和注册界面的实现了
我是直接有个login.py 和post.py两个来实现登入和注册功能
login.py详细代码如下
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'login.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox, QMainWindow
import sys # 导入sys模块
import img_rc
from service import service
import main
import post
class Ui_MainWindow(QMainWindow):
# 构造方法
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮
self.setupUi(self) # 初始化窗体设置
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮
MainWindow.resize(467, 294)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(1, 0, 461, 151))
self.label.setStyleSheet("border-image: url(:/png/img/login.png);")
self.label.setText("")
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(40, 160, 61, 16))
self.label_2.setObjectName("label_2")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(100, 160, 141, 21))
self.lineEdit.setObjectName("lineEdit")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(40, 200, 61, 16))
self.label_3.setObjectName("label_3")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(100, 200, 141, 21))
self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
self.lineEdit_2.setValidator(QtGui.QIntValidator(10000000, 99999999))
# 输入密码后按回车键执行登录操作
self.lineEdit_2.editingFinished.connect(self.openlog)
self.lineEdit_2.setObjectName("lineEdit_2")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(300, 160, 93, 28))
# 单击“登录”按钮执行登录操作
self.pushButton.clicked.connect(self.openlog)
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(300, 200, 93, 28))
self.pushButton_2.clicked.connect(MainWindow.close) # 关闭登录窗体
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(300, 242, 93, 28))
self.pushButton_3.clicked.connect(self.zc) # 注册
self.pushButton_3.setObjectName("pushButton_3")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 467, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "登入界面"))
self.label_2.setText(_translate("MainWindow", "用户名:"))
self.label_3.setText(_translate("MainWindow", "密 码:"))
self.pushButton.setText(_translate("MainWindow", "登入"))
self.pushButton_2.setText(_translate("MainWindow", "退出"))
self.pushButton_3.setText(_translate("MainWindow", "注册"))
def openlog(self):
service.userName = self.lineEdit.text() # 全局变量,记录用户名
self.userPwd = self.lineEdit_2.text() # 记录用户密码
if service.userName != "" and self.userPwd != "": # 判断用户名和密码不为空
# 根据用户名和密码查询数据
result = service.query("select * from login where name = %s and password = %s", service.userName,
self.userPwd)
if len(result) > 0: # 如果查询结果大于0,说明存在该用户,可以登录
self.w = main.Ui_MainWindow() # 创建主窗体对象
self.w.show() # 显示主窗体
MainWindow.hide() # 隐藏当前的登录窗体
else:
self.lineEdit.setText("") # 清空用户名文本
self.lineEdit_2.setText("") # 清空密码文本框
QMessageBox.warning(None, '警告', '请输入正确的用户名和密码!', QMessageBox.Ok)
else:
QMessageBox.warning(None, '警告', '请输入用户名和密码!', QMessageBox.Ok)
def zc(self):
self.m = post.Ui_MainWindow()
self.m.show()
MainWindow.hide() # 隐藏当前的登录窗体
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
ui = Ui_MainWindow() # 创建PyQt5设计的窗体对象
ui.setupUi(MainWindow) # 调用PyQt5窗体的方法对窗体对象进行初始化设置
MainWindow.show() # 显示窗体
sys.exit(app.exec_()) # 程序关闭时退出进程
post.py详细代码如下
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'post.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
import time
import img_rc
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets
from service import service
import login
class Ui_MainWindow(QMainWindow):
# 构造方法
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮
self.setupUi(self) # 初始化窗体设置
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(423, 485)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(110, 40, 61, 31))
self.label.setObjectName("label")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(170, 40, 113, 21))
self.lineEdit.setObjectName("lineEdit")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(110, 100, 61, 31))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(170, 100, 113, 21))
self.lineEdit_2.setObjectName("lineEdit_2")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(110, 160, 61, 31))
self.label_3.setObjectName("label_3")
self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_3.setGeometry(QtCore.QRect(170, 160, 113, 21))
self.lineEdit_3.setObjectName("lineEdit_3")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(110, 220, 61, 31))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(110, 280, 61, 31))
self.label_5.setObjectName("label_5")
self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_4.setGeometry(QtCore.QRect(170, 220, 113, 21))
self.lineEdit_4.setObjectName("lineEdit_4")
self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_5.setGeometry(QtCore.QRect(170, 280, 113, 21))
self.lineEdit_5.setObjectName("lineEdit_5")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(60, 360, 93, 31))
self.pushButton.clicked.connect(self.judge) # 注册
self.pushButton.setObjectName("pushButton")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(280, 360, 93, 31))
self.pushButton_2.clicked.connect(MainWindow.close) # 关闭登录窗体
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(170, 360, 93, 31))
self.pushButton_3.clicked.connect(self.dl) # 登入
self.pushButton_3.setObjectName("pushButton_3")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 423, 26))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "注册界面"))
self.label.setText(_translate("MainWindow", "用户名:"))
self.label_2.setText(_translate("MainWindow", "密 码:"))
self.label_3.setText(_translate("MainWindow", "性 别:"))
self.label_4.setText(_translate("MainWindow", "电 话:"))
self.label_5.setText(_translate("MainWindow", "住 址:"))
self.pushButton.setText(_translate("MainWindow", "注 册"))
self.pushButton_2.setText(_translate("MainWindow", "关 闭"))
self.pushButton_3.setText(_translate("MainWindow", "登 入"))
def dl(self): #打开登入窗口
self.m = login.Ui_MainWindow()
self.m.show()
def getnNP(self, name, password): # 获取数据库里面是否存在该用户
result = service.query("select * from login where name = %s and password = %s", name, password)
return len(result)
def judge(self):
postname = self.lineEdit.text() # 记录名字
postpassword = self.lineEdit_2.text() # 记录密码
postsex = self.lineEdit_3.text() # 记录性别
posttel = self.lineEdit_4.text() # 记录电话
postaddress = self.lineEdit_5.text() # 记录密码
if postname != "" and postpassword != "":
if self.getnNP(postname, postpassword) > 0:
self.lineEdit.setText("")
self.lineEdit_2.setText("")
QMessageBox.information(None, '提醒', '已经有该账户信息,请换过一个用户名', QMessageBox.Ok)
else:
result = service.exec("insert into login(name, password, sex, telephone, address) value (%s, %s, %s, %s, %s)"
, (postname, postpassword, postsex, posttel, postaddress))
time.sleep(1.0) # 线程等待1秒钟
if result > 0:
QMessageBox.information(None, '提醒', '注册成功!', QMessageBox.Ok)
else:
QMessageBox.warning(None, '警告', '必须在用户名和密码中填入数据', QMessageBox.Ok)
然后就是一个主页面窗口
main.py
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'main.ui'
#
# Created by: PyQt5 UI code generator 5.15.2
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
import sys
import img_rc
from PyQt5.QtWidgets import *
from PyQt5 import QtCore, QtGui, QtWidgets
from baseinfo import student, result
from query import stuquery, resquery
from service import service
from setting import grade, classes, subject, exam
class Ui_MainWindow(QMainWindow):
# 构造方法
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setWindowFlags(QtCore.Qt.MSWindowsFixedSizeDialogHint) # 只显示最小化和关闭按钮
self.setupUi(self) # 初始化窗体设置
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setStyleSheet("border-image: url(:/png/img/2.png);")
self.centralwidget.setObjectName("centralwidget")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
self.menu_2 = QtWidgets.QMenu(self.menubar)
self.menu_2.setObjectName("menu_2")
self.menu_3 = QtWidgets.QMenu(self.menubar)
self.menu_3.setObjectName("menu_3")
self.menu_4 = QtWidgets.QMenu(self.menubar)
self.menu_4.setObjectName("menu_4")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.action = QtWidgets.QAction(MainWindow)
self.action.setObjectName("action")
self.action_2 = QtWidgets.QAction(MainWindow)
self.action_2.setObjectName("action_2")
self.action_3 = QtWidgets.QAction(MainWindow)
self.action_3.setObjectName("action_3")
self.action_4 = QtWidgets.QAction(MainWindow)
self.action_4.setObjectName("action_4")
self.actionstudent = QtWidgets.QAction(MainWindow)
self.actionstudent.setObjectName("actionstudent")
self.actionresult = QtWidgets.QAction(MainWindow)
self.actionresult.setObjectName("actionresult")
self.actionstudentquery = QtWidgets.QAction(MainWindow)
self.actionstudentquery.setObjectName("actionstudentquery")
self.actionresultquery = QtWidgets.QAction(MainWindow)
self.actionresultquery.setObjectName("actionresultquery")
self.menu.addAction(self.action)
self.menu.addAction(self.action_2)
self.menu_2.addAction(self.actionstudent)
self.menu_2.addAction(self.actionresult)
self.menu_3.addAction(self.actionstudentquery)
self.menu_3.addAction(self.actionresultquery)
self.menu.addAction(self.action_3)
self.menu.addAction(self.action_4)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_2.menuAction())
self.menubar.addAction(self.menu_3.menuAction())
self.menubar.addAction(self.menu_4.menuAction())
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
gettime = QtCore.QDateTime.currentDateTime()
time = gettime.toString("yyyy-MM-dd HH:mm:ss")
self.statusbar.showMessage("当前登入的用户为:" + service.userName + "|登入时间为:" + time + "|星梦工作室|负责人:刘文豪")
# 为基础设置菜单中的QAction绑定triggered信号
self.menu.triggered[QtWidgets.QAction].connect(self.openmenu)
self.menu_2.triggered[QtWidgets.QAction].connect(self.openBase)
self.menu_3.triggered[QtWidgets.QAction].connect(self.openQuery)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "主界面"))
self.menu.setTitle(_translate("MainWindow", "基础设置"))
self.menu_2.setTitle(_translate("MainWindow", "基本信息管理"))
self.menu_3.setTitle(_translate("MainWindow", "系统查询"))
self.menu_4.setTitle(_translate("MainWindow", "系统管理"))
self.action.setText(_translate("MainWindow", "年级设置"))
self.action_2.setText(_translate("MainWindow", "班级设置"))
self.action_3.setText(_translate("MainWindow", "考试科目设置"))
self.action_4.setText(_translate("MainWindow", "考试类别"))
self.actionstudent.setText(_translate("MainWindow", "学生管理"))
self.actionresult.setText(_translate("MainWindow", "成绩管理"))
self.actionstudentquery.setText(_translate("MainWindow", "学生信息查询"))
self.actionresultquery.setText(_translate("MainWindow", "学生成绩查询"))
def openmenu(self, m):
if m.text()=="年级设置":
self.m = grade.Ui_MainWindow() # 创建年级设置窗体对象
self.m.show() # 显示窗体
elif m.text()=="班级设置":
self.m = classes.Ui_MainWindow()
self.m.show()
elif m.text()=="考试科目设置":
self.m = subject.Ui_MainWindow()
self.m.show()
elif m.text()=="考试类别":
self.m = exam.Ui_MainWindow()
self.m.show()
# 基本信息管理菜单对应槽函数
def openBase(self, m):
if m.text() == "学生管理":
self.m = student.Ui_MainWindow() # 创建学生管理窗体对象
self.m.show() # 显示窗体
elif m.text() == "成绩管理":
self.m = result.Ui_MainWindow()
self.m.show()
# 系统查询菜单对应槽函数
def openQuery(self,m):
if m.text()=="学生信息查询":
self.m = resquery.Ui_MainWindow() # 创建学生信息查询窗体对象
self.m.show() # 显示窗体
elif m.text()=="学生成绩查询":
self.m = stuquery.Ui_MainWindow() # 创建学生成绩查询窗体对象
self.m.show() # 显示窗体
文章中代码也有尽可能的详细下面是各个界面运行的图片
上面的代码就是可以实现这些界面的功能。
另外还有其他界面的代码就不一一展示了由于实在是行数比较多我个人比较懒实在是难以一一写出来我这里展示一下数据库和一些运行截图
代码就不展示了哈,谅解谅解需要的可以去下载下面的是数据库结构