python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇

python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇

  • 前言
  • 一、成绩统计
    • 1.成绩排名
    • 2.学科统计
    • 3.成绩分布
  • 二、个人中心
    • 修改密码
    • 账号注销
    • 补充
  • 最后
  • 总结


前言

在我的前两篇博客中我们已经讲了 登录,注册及密码找回的功能.和 信息的增删查改的功能.有兴趣的同学可以去我的从我的前两篇博客看起,今天我们再来讲讲学生成绩的统计功能,其实就是对学生学科成绩进行的一系列分布分析。


接下来我们就来讲讲这些是如何实现的。

一、成绩统计

这里包括:1.学生成绩的排名(单科成绩)2.学生单科成绩的及格率,3.学生各科成绩分布(优良中差)。
具体界面样式如下:

python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第1张图片
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第2张图片
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第3张图片

1.成绩排名

成绩排名指的就是在所有学生中将某一科成绩作为标准,将其成绩采用降序的排列方式展现出来,效果如图:
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第4张图片
可以看到,我依旧是采用的表格的方式展现出成绩的排序情况,这种表格的样式我在我的上一篇博客中也已经讲到过了,就不再过多赘述,我们主要讲讲是如何实现这种降序排列的,这些数据我也是创建了一个新的数据表,在新的数据表上进行计算的,利用数据库语言“select student.*,@scoreNum :=@scoreNum+1 as scoreNum from student,(select @scoreNum :=0) init ORDER BY {} DESC”,大致意思就是查询student表中的数据,然后利用ORDER BY 对其进行排序, DESC的意思的采用降序的排列方式进行,那个时候这种mysql语句好像是我在网上找的,其实并不用写的如此的复杂。这种方式主要是用于两张表联合查询的时候,其实简单点写成:SELECT * FROM [TABLE_NAME] ORDER BY [COLUMN_NAME] DESC应该就是可以进行降序排列了,不知道你们有什么更好的建议,可以给我留言。这样就完成了表中的降序排列,当然在表的上方我也对这科成绩进行了总成绩的计算和平均成绩的计算,mysql语句是select CAST(SUM({})AS SIGNED ) from student和select avg({}) from student,代码如下:

#成绩排名
    def view_data6(self):
     gettxt = self.right_bar_widget_folder_input114.text()
     try:
      if gettxt != '':
        conn2 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur2 = conn2.cursor()  # 获取一个游标
        sql_select1 = "create table student4(学号 varchar(100), 姓名 varchar(100), 专业 varchar(100), 班级 varchar(100), {} varchar(100))".format(
              gettxt)
        cur2.execute(sql_select1)  # 执行查询
        conn2.commit()  # 提交事务
        cur2.close()  # 关闭游标
        conn2.close()  # 释放数据库资源在这里插入代码片

        conn3 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur3 = conn3.cursor()  # 获取一个游标
        sql_select3 = "select CAST(SUM({})AS SIGNED ) from student".format(gettxt)
        cur3.execute(sql_select3)  # 执行查询
        number = cur3.fetchall()  # 获取查询到数据
        m =number[0][0]
        conn3.commit()  # 提交事务
        cur3.close()  # 关闭游标
        conn3.close()  # 释放数据库资源在这里插入代码片

        conn4 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur4 = conn4.cursor()  # 获取一个游标
        sql_select4 = "select avg(`{}`) from student".format(gettxt)
        cur4.execute(sql_select4)  # 执行查询
        number1 = cur4.fetchall()  # 获取查询到数据
        m1 = number1[0][0]
        conn4.commit()  # 提交事务
        cur4.close()  # 关闭游标
        conn4.close()  # 释放数据库资源在这里插入代码片
        self.textEdit.setText("总成绩为:" +str(m))
        self.textEdit1.setText("平均成绩:" + str(m1))
        count = 0
        f = open("8.txt", 'r+')
        for line in f:
            count = count+1
        print(count)

        conn = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur = conn.cursor()  # 获取一个游标
        sql_select = "select student.*,@scoreNum :=@scoreNum+1 as scoreNum from student,(select @scoreNum :=0) init  ORDER BY `{}` DESC".format(gettxt)
        cur.execute(sql_select)  # 执行查询
        data = cur.fetchall()  # 获取查询到数据
        conn.commit()  # 提交事务
        cur.close()  # 关闭游标
        conn.close()  # 释放数据库资源在这里插入代码片

        # 获得游标
        conn1 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur1 = conn1.cursor()
        query = 'insert into student4(学号,姓名,专业,班级,{}) values (%s, %s, %s, %s, %s)'.format(gettxt)
        # 创建一个for循环迭代读取xls文件每行数据的, 从第二行开始是要跳过标题行
        if gettxt == "高级程序语言":
         for r in range(0, count):
            学号 = data[r][0]
            姓名 = data[r][1]
            专业 = data[r][2]
            班级 = data[r][3]
            gettxt = data[r][4]
            values = (学号, 姓名, 专业, 班级, gettxt)
            cur1.execute(query, values)
        elif gettxt =="python编程":
            for r in range(0, count):
               学号 = data[r][0]
               姓名 = data[r][1]
               专业 = data[r][2]
               班级 = data[r][3]
               gettxt = data[r][5]
               values = (学号, 姓名, 专业, 班级, gettxt)
               cur1.execute(query, values)
        elif gettxt =="数据库原理":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][6]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
        elif gettxt =="数据结构与算法":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][7]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
        elif gettxt =="数学分析":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][8]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
        elif gettxt =="高等数学":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][9]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
        elif gettxt =="网络爬虫":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][10]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
        elif gettxt == "数据可视化":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][11]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
        elif gettxt == "数据挖掘":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][12]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
        elif gettxt == "数据分析":
            for r in range(0, count):
                学号 = data[r][0]
                姓名 = data[r][1]
                专业 = data[r][2]
                班级 = data[r][3]
                gettxt = data[r][13]
                values = (学号, 姓名, 专业, 班级, gettxt)
                cur1.execute(query, values)
            # 执行sql语句
        conn1.commit()  # 提交事务
        cur1.close()  # 关闭游标
        conn1.close()  # 释放数据库资源在这里插入代码片
        db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
        db.setHostName('localhost')
        db.setDatabaseName('student')
        db.setUserName('root')
        db.setPassword('')
        if not db.open():  # 判断数据库是否打开
            print(db.lastError().text())  # 打印操作数据库时出现的错误
            return False
        else:
            self.model = QtSql.QSqlTableModel()
            self.right_batch_result_listView4.setModel(self.model)
            self.model.setTable('student4')  # 设置使用数据模型的数据表
            self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)  # 允许字段更改
            self.model.select()  # 查询所有数据
            demo.view_data66()
      else:
         QMessageBox.information(self, '错误', '输入不能为空', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
     except:
         QMessageBox.information(self, '错误', '不存在该学科', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

主要就是将输入的学科作为一个变量,从而采用mysql语句进行数据的查找,然后再展现出来,代码可能写的比较复杂,望理解。

2.学科统计

学科统计其实就是对所有学生中某一科成绩的及格率的统计,效果如下:
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第5张图片
这里的及格率和不及格率我也是利用SELECT truncate(sum({}<60)/count(学号),2) as 不及格率 FROM student和SELECT truncate(sum({}>=60)/count(学号),2) as 及格率 FROM student这样的语句进行查找并写入到一个新的数据表中的,这里truncate的意思是选择截断的意思,将及格的比例筛X选出来,这里的2指的是小数位数取两位,这样就可以在数据表中找到及格率和不及格率了,最后将其展现到我们的界面上来。代码如下:

#及格率统计
    def view_data7(self):
     try:
      gettxt = self.right_bar_widget_folder_input115.text()
      if gettxt != '':
        conn3 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur3 = conn3.cursor()  # 获取一个游标
        sql_select3 = "SELECT truncate(sum(`{}`>=60)/count(`学号`),2) as 及格率 FROM student ".format(gettxt)
        cur3.execute(sql_select3)  # 执行查询
        number = cur3.fetchall()  # 获取查询到数据
        m = number[0][0]
        conn3.commit()  # 提交事务
        cur3.close()  # 关闭游标
        conn3.close()  # 释放数据库资源在这里插入代码片

        conn2 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur2 = conn2.cursor()  # 获取一个游标
        sql_select2 = "SELECT truncate(sum(`{}`<60)/count(`学号`),2) as 不及格率 FROM student ".format(gettxt)
        cur2.execute(sql_select2)  # 执行查询
        number1 = cur2.fetchall()  # 获取查询到数据
        m1 = number1[0][0]
        conn2.commit()  # 提交事务
        cur2.close()  # 关闭游标
        conn2.close()  # 释放数据库资源在这里插入代码片

        conn1= pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur1 = conn1.cursor()  # 获取一个游标
        sql_select1 = 'insert into student5(学科, 及格率, 不及格率) values (%s, %s, %s)'
        学科 = gettxt
        及格率 = m
        不及格率 =m1
        values = (学科, 及格率, 不及格率)
        cur1.execute(sql_select1, values)
        conn1.commit()  # 提交事务
        cur1.close()  # 关闭游标
        conn1.close()  # 释放数据库资源在这里插入代码片

        db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
        db.setHostName('localhost')
        db.setDatabaseName('student')
        db.setUserName('root')
        db.setPassword('')
        if not db.open():  # 判断数据库是否打开
            print(db.lastError().text())  # 打印操作数据库时出现的错误
            return False
        else:
            self.model = QtSql.QSqlTableModel()
            self.right_batch_result_listView5.setModel(self.model)
            self.model.setTable('student5')  # 设置使用数据模型的数据表
            self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)  # 允许字段更改
            self.model.select()  # 查询所有数据
      else:
          QMessageBox.information(self, '错误', '输入不能为空', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
     except:
         QMessageBox.information(self, '错误', '不存在该学科', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

代码中也有一部分的注释,可以参考学习。

3.成绩分布

这里的成绩分布是指的一个学生各科成绩的分类(分类是我们常见的优良中差)。效果如下:
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第6张图片这里我们可以通过学号和姓名进行查询,因此我采用了if,elif的语句进行的,但两者的内容是大致一样的,之后分类的话,我使用的是mysql中CASE WHEN…THEN语句,将其成绩进行分类,写入一个新的表中,因为我不是很清除,如何不用写入一个新表而将其展现到界面上,也望知道的大佬能够与我进行分享,万分感激。代码如下:

#成绩分布
    def view_data8(self):
     try:
      account_dict = {}
      f = open("8.txt", 'r+')
      for line in f:
             (keys, value) = line.strip().split()
             account_dict[keys] = value
      account_keys = list(account_dict.keys())
      account_value = list(account_dict.values())
      gettxt = self.right_bar_widget_folder_input119.text()
      if gettxt !='':
       if gettxt in account_value:
        conn3 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur3 = conn3.cursor()  # 获取一个游标
        sql_select3 = ("SELECT"
                       "`学号` '学号',"
                       "`姓名` '姓名',"
                       "`专业` '专业',"
                       "`班级` '班级',"
                       "(CASE WHEN `高级程序语言` < 60 THEN '不及格' WHEN `高级程序语言` < 70 AND `高级程序语言`>=60 THEN '及格'"
                       " WHEN `高级程序语言` >= 70 AND `高级程序语言`<80 THEN"
                       "'中'"
                       "WHEN `高级程序语言` >= 80 AND `高级程序语言`<90 THEN"
                       "'良'"
                       "WHEN `高级程序语言` >= 90 AND `高级程序语言`<100 THEN"
                       "'优'"
                       "END ) AS '高级程序语言',"
                       "(CASE WHEN `python编程` < 60 THEN"
                       "'不及格'"
                       "WHEN `python编程` < 70 AND `python编程`>=60 THEN"
                       "'及格'"
                       "WHEN `python编程` >= 70 AND `python编程`<80 THEN"
                       "'中'"
                       "WHEN `python编程` >= 80 AND `python编程`<90 THEN"
                       "'良'"
                       "WHEN `python编程` >= 90 AND `python编程`<100 THEN"
                       " '优'"
                       "END ) AS 'python编程',"
                       "(CASE WHEN `数据库原理` < 60 THEN"
                       "'不及格'"
                       " WHEN `数据库原理` < 70 AND `数据库原理`>=60 THEN"
                       "'及格'"
                       " WHEN `数据库原理` >= 70 AND `数据库原理`<80 THEN"
                       " '中'"
                       " WHEN `数据库原理` >= 80 AND `数据库原理`<90 THEN"
                       " '良'"
                       "WHEN `数据库原理` >= 90 AND `数据库原理`<100 THEN"
                       " '优'"
                       " END ) AS '数据库原理',"
                       "(CASE WHEN `数据结构与算法` < 60 THEN"
                       "'不及格'"
                       " WHEN `数据结构与算法` < 70 AND `数据结构与算法`>=60 THEN"
                       "'及格'"
                       " WHEN `数据结构与算法` >= 70 AND `数据结构与算法`<80 THEN"
                       " '中'"
                       " WHEN `数据结构与算法` >= 80 AND `数据结构与算法`<90 THEN"
                       "   '良'"
                       "	WHEN `数据结构与算法` >= 90 AND `数据结构与算法`<100 THEN"
                       "'优'"
                       "END ) AS '数据结构与算法',"
                       "(CASE"
                       " WHEN `数学分析` < 60 THEN"
                       "'不及格'"
                       "WHEN `数学分析` < 70 AND `数学分析`>=60 THEN"
                       " '及格'"
                       " WHEN `数学分析` >= 70 AND `数学分析`<80 THEN"
                       "'中'"
                       " WHEN `数学分析` >= 80 AND `数学分析`<90 THEN"
                       "'良'"
                       "WHEN `数学分析` >= 90 AND `数学分析`<100 THEN"
                       "'优'"
                       "END ) AS '数学分析',"
                       "(CASE WHEN `高等数学` < 60 THEN"
                       "'不及格'"
                       "WHEN `高等数学` < 70 AND `高等数学`>=60 THEN"
                       "'及格'"
                       "WHEN `高等数学` >= 70 AND `高等数学`<80 THEN"
                       "'中'"
                       "WHEN `高等数学` >= 80 AND `高等数学`<90 THEN"
                       "'良'"
                       "WHEN `高等数学` >= 90 AND `高等数学`<100 THEN"
                       "'优'"
                       "END ) AS '高等数学',"
                       "(CASE WHEN `网络爬虫` < 60 THEN"
                       " '不及格'"
                       "WHEN `网络爬虫` < 70 AND `网络爬虫`>=60 THEN"
                       "'及格'"
                       "WHEN `网络爬虫` >= 70 AND `网络爬虫`<80 THEN"
                       " '中'"
                       "WHEN `网络爬虫` >= 80 AND `网络爬虫`<90 THEN"
                       "'良'"
                       "WHEN `网络爬虫` >= 90 AND `网络爬虫`<100 THEN"
                       "'优'"
                       "END ) AS '网络爬虫',"
                       "(CASE WHEN `数据可视化` < 60 THEN"
                       "'不及格'"
                       "WHEN `数据可视化` < 70 AND `数据可视化`>=60 THEN"
                       "'及格'"
                       "WHEN `数据可视化` >= 70 AND `数据可视化`<80 THEN"
                       "'中'"
                       "WHEN `数据可视化` >= 80 AND `数据可视化`<90 THEN"
                       "'良'"
                       "WHEN `数据可视化` >= 90 AND `数据可视化`<100 THEN"
                       "'优'"
                       " END ) AS '数据可视化',"
                       "(CASE WHEN `数据挖掘` < 60 THEN"
                       "'不及格'"
                       "WHEN `数据挖掘` < 70 AND `数据挖掘`>=60 THEN"
                       "'及格'"
                       "WHEN `数据挖掘` >= 70 AND `数据挖掘`<80 THEN"
                       " '中'"
                       "WHEN `数据挖掘` >= 80 AND `数据挖掘`<90 THEN"
                       " '良'"
                       "WHEN `数据挖掘` >= 90 AND `数据挖掘`<100 THEN"
                       " '优'"
                       " END ) AS '数据挖掘',"
                       "(CASE WHEN `数据分析` < 60 THEN"
                       "'不及格'"
                       "WHEN `数据分析` < 70 AND `数据分析`>=60 THEN"
                       "'及格'"
                       " WHEN `数据分析` >= 70 AND `数据分析`<80 THEN"
                       "'中'"
                       " WHEN `数据分析` >= 80 AND `数据分析`<90 THEN"
                       "'良'"
                       "WHEN `数据分析` >= 90 AND `数据分析`<100 THEN"
                       "'优'"
                       "END ) AS '数据分析'"
                       "FROM student WHERE `姓名` = '{}' ;").format(gettxt)
        cur3.execute(sql_select3)  # 执行查询
        number = cur3.fetchall()  # 获取查询到数据
        conn3.commit()  # 提交事务
        cur3.close()  # 关闭游标
        conn3.close()  # 释放数据库资源在这里插入代码片

        conn1 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
        cur1 = conn1.cursor()  # 获取一个游标
        sql_select1 = 'insert into student6(学号,姓名,专业,班级,高级程序语言,python编程,数据库原理,数据结构与算法,数学分析,高等数学,网络爬虫,数据可视化,数据挖掘,数据分析) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
        # 创建一个for循环迭代读取xls文件每行数据的, 从第二行开始是要跳过标题行
        学号 = number[0][0]
        姓名 = number[0][1]
        专业 = number[0][2]
        班级 = number[0][3]
        高级程序语言 = number[0][4]
        python编程 = number[0][5]
        数据库原理 = number[0][6]
        数据结构与算法 = number[0][7]
        数学分析 = number[0][8]
        高等数学 = number[0][9]
        网络爬虫 = number[0][10]
        数据可视化 = number[0][11]
        数据挖掘 = number[0][12]
        数据分析 = number[0][13]
        values = (学号, 姓名, 专业, 班级, 高级程序语言, python编程, 数据库原理, 数据结构与算法, 数学分析, 高等数学, 网络爬虫, 数据可视化, 数据挖掘, 数据分析)
        cur1.execute(sql_select1, values)
        conn1.commit()  # 提交事务
        cur1.close()  # 关闭游标
        conn1.close()

        db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
        db.setHostName('localhost')
        db.setDatabaseName('student')
        db.setUserName('root')
        db.setPassword('')
        if not db.open():  # 判断数据库是否打开
            print(db.lastError().text())  # 打印操作数据库时出现的错误
            return False
        else:
            print("连接成功")
        self.model = QtSql.QSqlTableModel()
        self.right_batch_result_listView6.setModel(self.model)
        self.model.setTable('student6')  # 设置使用数据模型的数据表
        self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)  # 允许字段更改
        self.model.select()  # 查询所有数据
       elif gettxt in account_keys:
         conn3 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
         cur3 = conn3.cursor()  # 获取一个游标
         sql_select3 = ("SELECT"
                    "`学号` '学号',"
                    "`姓名` '姓名',"
                    "`专业` '专业',"
                    "`班级` '班级',"
                    "(CASE WHEN `高级程序语言` < 60 THEN '不及格' WHEN `高级程序语言` < 70 AND `高级程序语言`>=60 THEN '及格'"
                    " WHEN `高级程序语言` >= 70 AND `高级程序语言`<80 THEN"
                    "'中'"
                    "WHEN `高级程序语言` >= 80 AND `高级程序语言`<90 THEN"
                    "'良'"
                    "WHEN `高级程序语言` >= 90 AND `高级程序语言`<100 THEN"
                    "'优'"
                    "END ) AS '高级程序语言',"
                    "(CASE WHEN `python编程` < 60 THEN"
                    "'不及格'"
                    "WHEN `python编程` < 70 AND `python编程`>=60 THEN"
                    "'及格'"
                    "WHEN `python编程` >= 70 AND `python编程`<80 THEN"
                    "'中'"
                    "WHEN `python编程` >= 80 AND `python编程`<90 THEN"
                    "'良'"
                    "WHEN `python编程` >= 90 AND `python编程`<100 THEN"
                    " '优'"
                    "END ) AS 'python编程',"
                    "(CASE WHEN `数据库原理` < 60 THEN"
                    "'不及格'"
                    " WHEN `数据库原理` < 70 AND `数据库原理`>=60 THEN"
                    "'及格'"
                    " WHEN `数据库原理` >= 70 AND `数据库原理`<80 THEN"
                    " '中'"
                    " WHEN `数据库原理` >= 80 AND `数据库原理`<90 THEN"
                    " '良'"
                    "WHEN `数据库原理` >= 90 AND `数据库原理`<100 THEN"
                    " '优'"
                    " END ) AS '数据库原理',"
                    "(CASE WHEN `数据结构与算法` < 60 THEN"
                    "'不及格'"
                    " WHEN `数据结构与算法` < 70 AND `数据结构与算法`>=60 THEN"
                    "'及格'"
                    " WHEN `数据结构与算法` >= 70 AND `数据结构与算法`<80 THEN"
                    " '中'"
                    " WHEN `数据结构与算法` >= 80 AND `数据结构与算法`<90 THEN"
                    "   '良'"
                    "	WHEN `数据结构与算法` >= 90 AND `数据结构与算法`<100 THEN"
                    "'优'"
                    "END ) AS '数据结构与算法',"
                    "(CASE"
                    " WHEN `数学分析` < 60 THEN"
                    "'不及格'"
                    "WHEN `数学分析` < 70 AND `数学分析`>=60 THEN"
                    " '及格'"
                    " WHEN `数学分析` >= 70 AND `数学分析`<80 THEN"
                    "'中'"
                    " WHEN `数学分析` >= 80 AND `数学分析`<90 THEN"
                    "'良'"
                    "WHEN `数学分析` >= 90 AND `数学分析`<100 THEN"
                    "'优'"
                    "END ) AS '数学分析',"
                    "(CASE WHEN `高等数学` < 60 THEN"
                    "'不及格'"
                    "WHEN `高等数学` < 70 AND `高等数学`>=60 THEN"
                    "'及格'"
                    "WHEN `高等数学` >= 70 AND `高等数学`<80 THEN"
                    "'中'"
                    "WHEN `高等数学` >= 80 AND `高等数学`<90 THEN"
                    "'良'"
                    "WHEN `高等数学` >= 90 AND `高等数学`<100 THEN"
                    "'优'"
                    "END ) AS '高等数学',"
                    "(CASE WHEN `网络爬虫` < 60 THEN"
                    " '不及格'"
                    "WHEN `网络爬虫` < 70 AND `网络爬虫`>=60 THEN"
                    "'及格'"
                    "WHEN `网络爬虫` >= 70 AND `网络爬虫`<80 THEN"
                    " '中'"
                    "WHEN `网络爬虫` >= 80 AND `网络爬虫`<90 THEN"
                    "'良'"
                    "WHEN `网络爬虫` >= 90 AND `网络爬虫`<100 THEN"
                    "'优'"
                    "END ) AS '网络爬虫',"
                    "(CASE WHEN `数据可视化` < 60 THEN"
                    "'不及格'"
                    "WHEN `数据可视化` < 70 AND `数据可视化`>=60 THEN"
                    "'及格'"
                    "WHEN `数据可视化` >= 70 AND `数据可视化`<80 THEN"
                    "'中'"
                    "WHEN `数据可视化` >= 80 AND `数据可视化`<90 THEN"
                    "'良'"
                    "WHEN `数据可视化` >= 90 AND `数据可视化`<100 THEN"
                    "'优'"
                    " END ) AS '数据可视化',"
                    "(CASE WHEN `数据挖掘` < 60 THEN"
                    "'不及格'"
                    "WHEN `数据挖掘` < 70 AND `数据挖掘`>=60 THEN"
                    "'及格'"
                    "WHEN `数据挖掘` >= 70 AND `数据挖掘`<80 THEN"
                    " '中'"
                    "WHEN `数据挖掘` >= 80 AND `数据挖掘`<90 THEN"
                    " '良'"
                    "WHEN `数据挖掘` >= 90 AND `数据挖掘`<100 THEN"
                    " '优'"
                    " END ) AS '数据挖掘',"
                    "(CASE WHEN `数据分析` < 60 THEN"
                    "'不及格'"
                    "WHEN `数据分析` < 70 AND `数据分析`>=60 THEN"
                    "'及格'"
                    " WHEN `数据分析` >= 70 AND `数据分析`<80 THEN"
                    "'中'"
                    " WHEN `数据分析` >= 80 AND `数据分析`<90 THEN"
                    "'良'"
                    "WHEN `数据分析` >= 90 AND `数据分析`<100 THEN"
                    "'优'"
                    "END ) AS '数据分析'"
                    "FROM student WHERE `姓名` = '{}' ;").format(gettxt)
         cur3.execute(sql_select3)  # 执行查询
         number = cur3.fetchall()  # 获取查询到数据
         conn3.commit()  # 提交事务
         cur3.close()  # 关闭游标
         conn3.close()  # 释放数据库资源在这里插入代码片

         conn1 = pymysql.connect(host='127.0.0.1', user='root', passwd='', db='student', charset='utf8')
         cur1 = conn1.cursor()  # 获取一个游标
         sql_select1 = 'insert into student6(学号,姓名,专业,班级,高级程序语言,python编程,数据库原理,数据结构与算法,数学分析,高等数学,网络爬虫,数据可视化,数据挖掘,数据分析) values (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'
          # 创建一个for循环迭代读取xls文件每行数据的, 从第二行开始是要跳过标题行
         学号 = number[0][0]
         姓名 = number[0][1]
         专业 = number[0][2]
         班级 = number[0][3]
         高级程序语言 = number[0][4]
         python编程 = number[0][5]
         数据库原理 = number[0][6]
         数据结构与算法 = number[0][7]
         数学分析 = number[0][8]
         高等数学 = number[0][9]
         网络爬虫 = number[0][10]
         数据可视化 = number[0][11]
         数据挖掘 = number[0][12]
         数据分析 = number[0][13]
         values = (学号, 姓名, 专业, 班级, 高级程序语言, python编程, 数据库原理, 数据结构与算法, 数学分析, 高等数学, 网络爬虫, 数据可视化, 数据挖掘, 数据分析)
         cur1.execute(sql_select1, values)
         conn1.commit()  # 提交事务
         cur1.close()  # 关闭游标
         conn1.close()

         db = QtSql.QSqlDatabase.addDatabase('QMYSQL')
         db.setHostName('localhost')
         db.setDatabaseName('student')
         db.setUserName('root')
         db.setPassword('')
         if not db.open():  # 判断数据库是否打开
           print(db.lastError().text())  # 打印操作数据库时出现的错误
           return False
         else:
           print("连接成功")
           self.model = QtSql.QSqlTableModel()
           self.right_batch_result_listView6.setModel(self.model)
           self.model.setTable('student6')  # 设置使用数据模型的数据表
           self.model.setEditStrategy(QtSql.QSqlTableModel.OnFieldChange)  # 允许字段更改
           self.model.select()  # 查询所有数据
       else:
           QMessageBox.information(self, '错误', '不存在该学生信息', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
     except:
         QMessageBox.information(self, '错误', '输入错误', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

看似代码很长,其实很简单,因为大部分内容都是重复的,那是我能想到的解决问题的简单方法,所以代码看起来复杂了许多但是能实现效果就行。

二、个人中心

为了使这个系统看起来更加的完善,我还加入了个人资料的相关操着,其中就有编辑资料,修改密码,注销账号的功能。

python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第7张图片

修改密码

编辑资料这个功能由于那个时候时间紧迫没有来的及完善,所以就并没有做这个功能。至于修改密码,先看界面:
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第8张图片
首先你要先输入原来的密码,然后获取输入的密码通过我们存好的txt文件中,进行遍历循环查找,找到其信息,然后对其密码进行修改,这样我们就不会改变用户的用户名而将其密码更正。代码如下:

#修改密码
class myform3(QWidget):
    def __init__(self, mode=0, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.mode = mode
        self.setWindowTitle('修改密码')
        self.resize(800, 450)
        self.setFixedSize(self.width(), self.height())
        self.setWindowFlags(Qt.WindowCloseButtonHint)
        self.setWindowOpacity(0.9)  # 设置窗口透明度
        self.setWindowFlag(QtCore.Qt.FramelessWindowHint)  # 隐藏边框
        palette = QPalette()
        palette.setBrush(QPalette.Background, QBrush(QPixmap("./1.png")))
        self.setPalette(palette)
        ###### 设置界面控件
        self.verticalLayout = QGridLayout(self)
        self.H = QLabel(" ")
        self.verticalLayout.addWidget(self.H, 0, 0, 9, 0)
        self.a = QPushButton(qtawesome.icon('fa.user-secret', color='white'), " ")
        self.verticalLayout.addWidget(self.a, 2, 3, 2, 2)
        self.a.setStyleSheet('''
                                   QPushButton{border:none;color:black;}
                                   QPushButton:hover{color:white}
                                    ''')
        self.lineEdit_account = QLineEdit()
        self.lineEdit_account.setPlaceholderText("请输入原有密码")
        self.verticalLayout.addWidget(self.lineEdit_account, 2, 4, 2, 3)
        self.lineEdit_account.setStyleSheet(
            '''QLineEdit{
                    border:1px solid gray;
                    width:200px;
                    border-radius:10px;
                    padding:2px 4px;
            }''')
        self.lineEdit_account.setEchoMode(QLineEdit.Password)
        self.lineEdit_password = QLineEdit()
        self.lineEdit_password.setPlaceholderText("请输入新密码")
        self.verticalLayout.addWidget(self.lineEdit_password, 3, 4, 1, 3)
        self.lineEdit_password.setStyleSheet(
            '''QLineEdit{
                    border:1px solid gray;
                    width:200px;
                    border-radius:10px;
                    padding:2px 4px;
            }''')
        self.lineEdit_password.setEchoMode(QLineEdit.Password)
        self.a1 = QPushButton(qtawesome.icon('fa.lock', color='white'), " ")
        self.verticalLayout.addWidget(self.a1, 3, 3, 1, 2)
        self.a1.setStyleSheet('''
                                                   QPushButton{border:none;color:black;}
                                                   QPushButton:hover{color:white}
                                                    ''')
        self.lineEdit_password1 = QLineEdit()
        self.lineEdit_password1.setPlaceholderText("请再次输入密码")
        self.verticalLayout.addWidget(self.lineEdit_password1, 4, 4, 1, 3)
        self.lineEdit_password1.setStyleSheet(
            '''QLineEdit{
                    border:1px solid gray;
                    width:200px;
                    border-radius:10px;
                    padding:2px 4px;
            }''')
        self.a = QPushButton(qtawesome.icon('fa.lock', color='white'), " ")
        self.verticalLayout.addWidget(self.a, 4, 3, 1, 2)
        self.a.setStyleSheet('''
                                           QPushButton{border:none;color:black;}
                                           QPushButton:hover{color:white}
                                            ''')
        self.lineEdit_password1.setEchoMode(QLineEdit.Password)
        self.left_close = QtWidgets.QPushButton("")  # 关闭按钮
        self.left_visit = QtWidgets.QPushButton("")  # 空白按钮
        self.left_mini = QtWidgets.QPushButton("")  # 最小化按钮
        self.verticalLayout.addWidget(self.left_mini, 0, 6, 1, 1)
        self.verticalLayout.addWidget(self.left_close, 0, 8, 1, 1)
        self.verticalLayout.addWidget(self.left_visit, 0, 7, 1, 1)
        self.left_close.setFixedSize(15, 15)  # 设置关闭按钮的大小
        self.left_visit.setFixedSize(15, 15)  # 设置最大化按钮大小
        self.left_mini.setFixedSize(15, 15)  # 设置最小化按钮大小
        self.left_close.setStyleSheet(
            '''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')
        self.left_visit.setStyleSheet(
            '''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')
        self.left_mini.setStyleSheet(
            '''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')

        self.pushButton_quit1 = QPushButton()
        self.pushButton_quit1.setText("修改")
        self.verticalLayout.addWidget(self.pushButton_quit1, 5, 4, 1, 3)
        self.pushButton_quit1.setStyleSheet(
            "QPushButton{color:highlight}"
            "QPushButton:hover{color:white}"
            "QPushButton{background-color:rgb(0,191,255)}"
            "QPushButton{border:2px}"
            "QPushButton{border-radius:10px}"
            "QPushButton{padding:5px 6px}"
            "QPushButton{font-size:14pt}")
        self.pushButton_quit = QPushButton()
        self.pushButton_quit.setText("返回")
        self.verticalLayout.addWidget(self.pushButton_quit, 6, 4, 1, 3)
        self.pushButton_quit.setStyleSheet(
            "QPushButton{color:highlight}"
            "QPushButton:hover{color:white}"
            "QPushButton{background-color:rgb(0,191,255)}"
            "QPushButton{border:2px}"
            "QPushButton{border-radius:10px}"
            "QPushButton{padding:5px 6px}"
            "QPushButton{font-size:14pt}")
        ###### 绑定按钮事件
        self.left_close.clicked.connect(self.QCoreApplication)
        self.pushButton_quit1.clicked.connect(self.on_pushButton_enter_clicked1)
        self.left_mini.clicked.connect(self.mini)
        self.pushButton_quit.clicked.connect(self.back)

    def on_pushButton_enter_clicked1(self):
        f1 = open("2.txt", 'r+')
        word = f1.readline()
        account_dict = {}
        f = open("1.txt", 'r+')
        for line in f:
            (keys, value) = line.strip().split()
            account_dict[keys] = value
        account1 = self.lineEdit_account.text()
        password1 = self.lineEdit_password.text()
        password2 = self.lineEdit_password1.text()
        if account1 == account_dict[word]:
         if account1 != "" and password1 != "" and password2 != "":
            if password2 != password1:
                QMessageBox.information(self, '错误', '密码输入错误,请重新确认', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
            else:
                account_dict[word] = password1
                with open('1.txt', 'w') as f4:
                    f4.write("")
                for item in account_dict.items():
                        for i in range(len(item)):
                            print(item[i], end=' ')
                            with open('1.txt', 'a') as f3:
                                f3.write(item[i]+" ")
                        with open('1.txt', 'a') as f5:
                            f5.write('\n')

                QMessageBox.information(self, '成功', '修改成功',QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
         else:
            QMessageBox.information(self, '错误', '输入不能为空' , QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
        else:
            QMessageBox.information(self, '错误', '输入的密码与本账号不符', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
    def QCoreApplication(self):
        w3.close()

    def mini(self):
        w3.showMinimized()

    def back(self):
        w3.close()

账号注销

而注销账号其实就是一个页面的关闭和登录界面的展开,代码很简单如下:

#个人中心注销账号
    def right_folder_button_clicked1(self):
        demo.close()
        login.show()

补充

当时在做这个个人中心的时候其实也想过对每个不同的用户设置自己的个人资料并保存下来,当时想到的时保存在txt文件或者数据库中,但由于时间关系后面并没有继续去做了,这里讲讲我的思路吧,其实很好实现,就是对每个用户保存他们的用户名和密码一样,在此基础上再保存个人的资料,就比如:
张三 1111111 18岁 男 重庆大学 2001.01.18
的形式,存入数据库或者txt文件中,然后将个人中心的信息设置成变量,在登录后个人中心就会读取你存放信息的数据库,找到你用户名和密码对应的信息,将其展示到界面上即可。
然后对那个头像,其实也可以保存,我已经将头像设置成了一个按钮,点击头像,就可以触发一个事件,这里我没有安事件上去,可以将事件设置成:

 #默认页面的路径选择
    def right_folder_button_clicked31(self):
        fileName, fileType = QtWidgets.QFileDialog.getOpenFileName(self, "选取文件", os.getcwd(),
                                                                   "All Files(*);;Text Files(*.txt)")
        demo.right_bar_widget_folder_input9.setText(fileName)

触发选择文件的事件,在设置的时候可以在代码处设置成只能选择png,jpg格式的照片,将照片的路径设置成一个变量,选择到照片的路径后将其更改上去,即可实现头像的更改了。这是我在做这个项目的时候还没有完善,但有了一些自己的想法,大家可以根据自己的需要进行设置,你如果有更好的方法也欢迎你分享给我,互相学习。

最后

我将我的数据库的样式也给大家贴出来,大家可以参考一下,我建了蛮多数据库的,啊哈哈哈哈
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第9张图片
student那张表:
python:pyqt5+mysql=学生信息管理系统(图文并茂,超详细, 附源码)——成绩统计篇_第10张图片
student1那张表:
在这里插入图片描述
student2那张表:
在这里插入图片描述
student3那张表:
在这里插入图片描述
student5那张表:
在这里插入图片描述
student6那张表:
在这里插入图片描述
大致就是这样啦!欢迎批评指正。


总结

最后这个项目也就大致完成了,很高兴与大家分享我的项目,虽然这其中也有很多不是我独立完成的,在网上不断的学习借鉴(但由于时间久远,我已经找不到出处了,侵删),根据自己的需要进行修改增加,达成我想要的目的,我已经很自豪了,也希望你们能够喜欢。我们一起共同努力,加油!

最后完整的代码我也上传到我的github上了,自取:
链接: 学生信息管理系统2.0.
由于我是初学者,所以整个代码都写在了一个py文件里,所以看着会十分费劲,而且代码内容可能存在重复,多余,繁琐,望理解,但是对于我来说我能够完整的做完整个项目,我已经十分开心了,请大佬轻喷。当然也希望你们能喜欢我的分享。

为了方便起见,我在csdn上也上传了我的资源:学生信息管理系统2.0.

你可能感兴趣的:(mysql,python,qt,pyqt5,数据库)