【Python + SQLite3 + PyQt】—> 教务系统

项目

    • 要求
    • 实现效果
    • 实验环境
    • 设计
      • 界面
      • 数据库
      • exe打包
    • 总结
    • 源代码

要求

综合应用Python程序设计的知识设计与实现一款简单的图书管理系统。具体功能要求可参考以下几点。当然,希望你能写出更有价值的功能:
(1)具有用户(学生、教师)注册和登录功能功能,教师用户:姓名、年龄、联系电话,性别,住址;学生用户:姓名、年龄、班级、专业、电话、学号等。
(2)具有学生端功能:可以按课程名称关键字模糊查找所学课程;可以修改个人基本信息;查询所学课程成绩;
(3)具有教师端编辑功能:查询教师信息、学生信息、录入学生成绩、修改学生成绩、删除学生成绩等功能。
(6)期待同学们设计与实现更多其他功能
(7)系统功能完整,程序运行稳定,打包成独立的exe文件

实现效果

【Python + SQLite3 + PyQt】—> 教务系统_第1张图片

实验环境

  • anaconda3 — python3.9
  • Navicat Premium 15 — SQLite3
  • PyQt5

设计

界面

  • 1、找到电脑中PySide2的designer.exe
import PySide2  # 导入要查看的库
print(PySide2.__file__)  # 打印库文件位置

【Python + SQLite3 + PyQt】—> 教务系统_第2张图片

  • 到\Users\86184\anaconda3\lib\site-packages\PySide2中到designer.exe,双击打开。
  • 2、选择Main Window创建
    【Python + SQLite3 + PyQt】—> 教务系统_第3张图片
    ctrl + r 查看效果图
  • 3、Label 标签设计
  • 背景颜色
background-color:rgb(227, 227, 227);
  • 文本
    【Python + SQLite3 + PyQt】—> 教务系统_第4张图片
  • 文体
    【Python + SQLite3 + PyQt】—> 教务系统_第5张图片
  • 4、Stacked Widget 堆叠设计
    【Python + SQLite3 + PyQt】—> 教务系统_第6张图片
    右键可插入页
    【Python + SQLite3 + PyQt】—> 教务系统_第7张图片
  • 5、PushButton 按钮设计
    【Python + SQLite3 + PyQt】—> 教务系统_第8张图片
    【Python + SQLite3 + PyQt】—> 教务系统_第9张图片
QPushButton{
    background-color:rgba(228, 255, 251);
}
QPushButton::hover{
    background-color:rgba(85, 255, 127);
}

文本与字体的设计和上述【Label 标签设计】操作一致。

  • 6、Line Edit 输入框、Text Browser 显示框 设计
    【Python + SQLite3 + PyQt】—> 教务系统_第10张图片
  • 7、按钮触发页面转换
    以下讲解原理,不陈述完成代码,完整触发代码直接问GPT。

第一步找到你需要触发的按钮的名称;
【Python + SQLite3 + PyQt】—> 教务系统_第11张图片
第二步找到你需要触发按钮后转换页面的下标
【Python + SQLite3 + PyQt】—> 教务系统_第12张图片
第三步将按钮的名称放于第一行self.后面,页面下标放于最后一行的括号中;其按钮点击后会跳转到teacher函数中触发页面。

# 点击教师端进入教师页面
self.pushButton.clicked.connect(self.teacher)
def teacher(self): # 首页->教师端
    self.stackedWidget.setCurrentIndex(0)
  • 8、Line Edit 输入框获取输入值

第一步找到你输入完后确定按钮的名称;
【Python + SQLite3 + PyQt】—> 教务系统_第13张图片
第二步找到输入框的名称;
【Python + SQLite3 + PyQt】—> 教务系统_第14张图片
第三步将按钮名称放于第一行代码self.后面,输入框的名称放于teacher_enroll_input函数中代码self.后面;其按钮点击后会跳转到teacher_enroll_input函数中,待获得全部输入值后再进行下一步。

# 首页->教师端->注册,点击确定; teacher_enroll_input为统一输入指令
self.pushButton_10.clicked.connect(self.teacher_enroll_input)
# 注册
def teacher_enroll_input(self): # 教师端注册输入的信息
    value1 = str(self.lineEdit_6.text())
    value2 = str(self.lineEdit_5.text())
    value3 = str(self.lineEdit_4.text())
    value4 = str(self.lineEdit_3.text())
    value5 = str(self.lineEdit_2.text())
    value6 = str(self.lineEdit.text())
  • 9、Text Browser 显示框显示

第一步找到显示框的名称;
【Python + SQLite3 + PyQt】—> 教务系统_第15张图片
第二步通过一行代码即可显示,将显示框名称放于self.后面即可;其相当于print(),因此放在哪都可以(其它函数也亦可)。

self.textBrowser_15.append('教师数据录入成功!')
  • 初学者目前的掌握程度,仅供参考,如有错误、好方法,欢迎评论、私聊。

数据库

原先使用的是mysql,但写完后发现转db文件太麻烦了,则采用SQLite3直接生成数据库文件,相比于mysql本人觉得不要太方便了。

  • 1、建库建表

第一步下载完navicat后,左上角连接选择SQLite;
【Python + SQLite3 + PyQt】—> 教务系统_第16张图片
第二步新建SQLite3,输入连接名,其它的不用输入,点击测试连接,连接成功则点确定即可;
【Python + SQLite3 + PyQt】—> 教务系统_第17张图片
第三步通过代码建表、录入数据;
该代码并不完整,简明讲解原理;大部分原理可以看注释或者问GPT,现只讲解一下注意事项。
将新建的db.sqlite3文件放在同一目录下,使用with 连接,即使中断,它还会再连接上;
在 value 这行代码中,SQLite3与mysql不同在于最后的代码上,MySQL是 ‘VALUE (%s)’,而SQLite3则是’VALUES (?)',同时在插入时也是需要将%s改为?。

import sqlite3 # 导入库
'''     连接数据库     '''
with sqlite3.connect('db.sqlite3') as db:
    # 在上下文环境中进行操作
    cur = db.cursor()  # 声明一个游标
self.sql_teacher(cur, value1, value2, value3, value4, value5, value6)
def sql_teacher(self, cur, user_name, user_password, user_age, user_call, user_sex, user_address):
    try:  # 捕获异常
        # 如果表不存在则创建,教师_Data_Table为表名
        sqlQuery = "CREATE TABLE IF NOT EXISTS 教师_Data_Table(姓名 CHAR(20) NOT NULL," \
                   "密码 CHAR(20) NOT NULL, 年龄 CHAR(20), 联系电话 CHAR(20) NOT NULL, 性别 CHAR(20), 住址 CHAR(20) )"
        cur.execute(sqlQuery)  # execute() sql语句执行
        '''     数据录入     '''
        sqlQuery = ' INSERT INTO 教师_Data_Table (姓名,密码,年龄,联系电话,性别,住址) VALUES (?,?,?,?,?,?) '
        value = (user_name, user_password, user_age, user_call, user_sex, user_address)
        cur.execute(sqlQuery, value)
        db.commit()
        self.textBrowser_15.append('教师数据录入成功!') # 在textBrowser上显示信息
    except sqlite3.Error as e:  # 输出Error
        self.textBrowser_15.append('教师数据库操作出现错误:' + str(e))

创建了4张表,
【Python + SQLite3 + PyQt】—> 教务系统_第18张图片
教师表
【Python + SQLite3 + PyQt】—> 教务系统_第19张图片
学生表
【Python + SQLite3 + PyQt】—> 教务系统_第20张图片
成绩表
【Python + SQLite3 + PyQt】—> 教务系统_第21张图片
课程表
【Python + SQLite3 + PyQt】—> 教务系统_第22张图片

  • 2、账号密码的对比

先将教师表\学生表的账号密码存进字典中;

def login(self,cur, name):
    sqlQuery = "SELECT * FROM " + name + "_Data_Table"
    try:
        res = {}
        cur.execute(sqlQuery)
        results = cur.fetchall()
        for row in results:  # 获得姓名、密码
            res[row[0]] = row[1]
        return res
    except sqlite3.Error as e:
        self.textBrowser_10.append(name + "数据查询失败:" + str(e))

再for循环匹配输入的账号密码是否与数据库的相同,不同则报错;

# 登录
def student_login_input(self): # 学生端登录输入的信息
    names = str(self.lineEdit_16.text()) # 获得姓名、密码
    passwords = str(self.lineEdit_17.text())
    res = self.login(cur, '学生')
    flag = 0  # 标识,防止for循环输出多个提示信息
    for k, v in res.items():
        if names == k and passwords == v:
            self.stackedWidget.setCurrentIndex(16) # 进入学生端页面
            flag = 1
    if flag == 0:
        self.textBrowser_9.append('姓名\密码错误!请重新输入。')
  • 3、数据删除

注意的点在于sqlQuery语句中变量的类型要设为?,在value中如果是只有一个变量则需在后面加一个逗号。

def delete(self, name, student_name):
    sqlQuery = "DELETE FROM " + name + "_Data_Table where 姓名=?"
    value = (student_name,)
    try:
        cur.execute(sqlQuery, value)
        db.commit()
        self.textBrowser_6.append('删除成功!')
    except sqlite3.Error as e:
        self.textBrowser_6.append(name + "数据删除失败:" + str(e))
        db.rollback()  # 发生错误时回滚
  • 4、数据修改
def teacher_revise(self, name, revise_title, revise_agodata, revise_data):
    sqlQuery = "UPDATE " + name + "_Data_Table SET " + revise_title + "= ? WHERE " + revise_title + "=?"
    value = (revise_data, revise_agodata)  # (修改的值,原值)
    try:
        cur.execute(sqlQuery, value)
        db.commit()
    except sqlite3.Error as e:
        self.textBrowser_7.append("数据更新失败:" + str(e))
        db.rollback()  # 发生错误时回滚
  • 5、关键字模糊查询

由于关键字查询需做到至少输入一个字符即可知道相关课程的信息,而本项目课程表的设计为3位老师,每位老师兼多门课(最多3门),则本项目需设3个course_blur()函数,其中只是查询语句中的课程1、课程2、课程3不同。本人采用简略的方法,如有更好的方法欢迎评论、私信。

def course_blur1(self, cur, inputs):
    sqlQuery = "select 姓名,课程1 from 课程_data_table where 课程1 like '" + inputs + "%'"
    cur.execute(sqlQuery)
    results = cur.fetchall()
    for row in results:  # 获得个人信息
        self.textBrowser_14.append('教师姓名:%s \n课程:%s' % (row[0], row[1]))

exe打包

第一步将需要用到的py、ui、数据库文件放在无英文目录下;
【Python + SQLite3 + PyQt】—> 教务系统_第23张图片
第二步运行一遍py文件(打包时只能有一个py,但可以通过该py再调用其它py),生成一个编译环境(pycache);
【Python + SQLite3 + PyQt】—> 教务系统_第24张图片
第三步在该目录下打开cmd;
【Python + SQLite3 + PyQt】—> 教务系统_第25张图片
第四步输入以下命令 pyinstaller -w conda.py ;
【Python + SQLite3 + PyQt】—> 教务系统_第26张图片
第五步,完成后,再将目录下的全部文件(除了build、dist两个文件夹)复制放在dist中的文件夹中;
【Python + SQLite3 + PyQt】—> 教务系统_第27张图片
第六步然后在exe目录下打开cmd,运行conda.exe;
【Python + SQLite3 + PyQt】—> 教务系统_第28张图片
如有报错则使用以下方法添加缺失的库

import pymysql  # 导入要查看的库
print(pymysql.file)  # 打印库文件位置

第七步问题解决后即可运行exe了,右键即可添加快捷方式;亦可拖到桌面。【Python + SQLite3 + PyQt】—> 教务系统_第29张图片

总结

实现本项目是不需要多少时间的,但前提是需要掌握好SQL、QT的使用。本项目还是比较简略的,但作为期末大作业还是可以的。

源代码

  • 需要源代码 --> 点赞收藏关注 --> 私信我

你可能感兴趣的:(python,python,sqlite,pyqt)