PyQt5入门——学生管理系统
Posted 我是大学渣
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PyQt5入门——学生管理系统相关的知识,希望对你有一定的参考价值。
需要源代码的家人们直接评论区或者私信我
文章目录
PyQt5入门——学生管理系统
1. 项目背景
- 随着计算机技术的飞速发展和网络时代的到来,我们已经进入了信息化的时代,有人也称之为数字化的时代。在这个数字化时代里,各个高校在各方面的信息查询工作都受到了极大的挑战。随着各个高校的教育规模不断的发展扩大,学生人数急剧的增加,有关学生的各种信息量也成倍增长。也带来了各个高校教育发展过程中的一个重要的问题,就是学生信息的查询问题。面对庞大的信息量就需要有一个学生信息查询系统来提高学生信息管理工作的效率,做到信息的规范管理、科学统计和快速查询,以减少查询工作方面的工作量。学生信息管理系统是一个人机系统,以计算机为基础的,但这并不意味着一切都是自动化的。人机系统的概念说明有些任务最好由人完成,而另一些任务由机器代替。因此,需要很好的分析把什么工作交给人做比较合适,什么工作交给机器比较合适,充分发挥人和机器的特长,组成一个和谐、有效的系统。近年来,越来越多的用户认识到管理信息的重要性,纷纷开始选择适合自己的信息管理系统。学生信息管理系统就是根据这些因素来设计和开发的。
另外,在如今人们生活以及工作节奏的不断加速下,人们已经厌倦了那些枯燥重复的简单操作,我们希望有一种可以解放我们双手的东西来完成那些重复工作,这样我们可以有更多的时间和精力去做更加有意义的事情,而不至于一直在重复工作上浪费时间,可以大大提高我们的工作效率。
2. 项目简介
2.1 项目内容
本项目是基于Python开发的一个简易的学生信息管理系统,并使用PyAutoGUI进行自动化测试,主要实现以下功能
- 学生信息的增删改查
- 课程信息的增删改查
- 班级信息的增删改查
- 成绩信息的增删改查
2.2 数据说明
- 系统使用的数据均来自本机数据中,数据库中有五个表,分别为学生表、班级表、课程表、以及选修表和用户表。其中学生表主要用来存储学生个人信息,主要包括学号、姓名、性别、年龄、班号等,可以满足大部分使用者管理信息的需求。课程表、选修表、班级表、也同学生表一样储存相应的信息。用户表是用来存储用户账户和密码的二维表,只有用户使用了正确的账号和相对应的密码后才能使用本系统。
3. 相关工具介绍
- 本项目使用Python3.6开发,Sql sever进行数据的存储,ODBC作为驱动连接数据库,使用PyQt5进行界面的设计和编写,使用PyAutoGUI进行自动化测试系统的一些功能。
3.1Python 3.6
- Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python解释器易于扩展,可以使用C语言或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python 也可用于可定制化软件中的扩展程序语言。Python丰富的标准库,提供了适用于各个主要系统平台的源码或机器码。2021年10月,语言流行指数的编译器Tiobe将Python加冕为最受欢迎的编程语言,20年来首次将其置于Java、C和javascript之上。
Python 3.6 相较于2.x版本有着较高的安全性,丰富的第三方库,同时也有较高版本的python在使用时可能会出现很多问题很强大的兼容性,可以避免大部分的版本冲突问题。
3.2 SQL Sever
- 数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。数据库是一个按数据结构来存储和管理数据的计算机软件系统。数据库的概念实际包括两层意思:
(1)数据库是一个实体,它是能够合理保管数据的“仓库”,用户在该“仓库”中存放要管理的事务数据,“数据”和“库”两个概念结合成为数据库。
(2)数据库是数据管理的新方法和技术,它能更合适的组织数据、更方便的维护数据、更严密的控制数据和更有效的利用数据。
SQL Server是一个关系数据库管理系统,它最初是由Microsoft, Sybase和Ashton-Tate三家公司共同开发的于1988 年推出了第一个OS/2 版本,随着信息技术的发展,计算机处理数据的方式也发生着变化,文件管理系统--数据库管理系统。Microsoft SQL Server是一个分布式的关系型数据库管理系统,具有客户机/服务器体系结构,采用了Transact-sql的sql语言在客户机与服务器间传递客户机的请求与服务器的处理结果。众所周知,SQL Server能够满足今天的商业环境要求不同类型的数据库解决方案。它一种应用广泛的数据库管理系统,具有许多显著的优点:
1、可伸缩性——实现联机分析处理的前提是能够立即访问到准确的信息,从而让最终用户能够以最快的速度响应最复杂的问题。
2、集成性——用于决策支持的数据仓库功能、与许多其他服务器软件紧密关联的集成性、良好的性价比等。
3、简单易用——图形化界面,更加直观、简单,广泛用于电子商务、银行、保险、电力等与数据库有关的行业。
4、高效的——使得公司可以降低开发和管理他们的数据基础设施的时间和成本
除这些SQL Server的优点外,SQLServer还为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势。从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要。作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应用程序、为企业赢得核心竞争优势打开了胜利之门。作为重要的基准测试可伸缩性和速度奖的记录保持者,SQLServer是一个具备完全Web支持的数据库产品,提供了对可扩展标记语言 (XML)的核心支持以及在Internet上和防火墙外进行查询的能力。
3.3 ODBC
开放数据库互连(ODBC)是微软提出的数据库访问接口标准。开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商DBMS,也独立于具体的编程语言。通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库进行交互。这使得开发者不需要以特殊的数据库管理系统DBMS为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。下面是ODBC应用系统的体系结构。
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。
在使用时首先要进行ODBC配置,建立ODBC数据源连接,这样才能使用其访问数据库中数据的功能。
3.4 PyAutoGUI
-
PyAutoGUI允许Python脚本控制鼠标和键盘,以自动化与其他应用程序的交互。Web自动化脚本,例如Splinter,Selenium,是操作浏览器,可以操作网页,筛选元素,单击元素等等操作。而PyAutoGUI是针对计算机桌面的。API设计得很简单。PyAutoGUI跨平台,在Windows、MacOS和Linux上均可用,Python环境:运行在Python 2和3上。PyAutoGUI有以下特性:
1、移动鼠标并单击或键入其他应用程序的窗口。
2、向应用程序发送点击键(例如,填写表单)。
3、获取屏幕截图,并给出一个图像(例如,按钮或复选框),在屏幕上找到它。
4、定位应用程序的窗口,移动、调整大小、最大化、最小化或关闭它(目前仅为Windows)。
5、在GUI自动化脚本运行时,显示用于用户交互的消息框。
PyAutoGUI将屏幕看成为一个坐标系,只需给出准确的坐标,即可将鼠标移动到所需位置,发出相应的信号如:点击,滚动鼠标滚轮等。
-
与此同时,该技术目前尚未成熟,仍然有很多不足:
1、目前PyAutoGUI还不适用于android, ios ,tablet/smartphone apps。
2、目前PyAutoGUI还不适用于多显示屏设备。
3、目前PyAutoGUI还不能实现OCR。
4、目前PyAutoGUI还不能实现按键记录,并且无法检测按键是否按下。
3.5 PyQt5
- PyQt是Qt框架的Python语言实现,由Riverbank Computing开发,是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合,每一个PyQt控件都对应一个Qt控件,因此PyQt的API接口与Qt的API接口很接近,但PyQt不再使用QMake系统和Q_OBJECT宏, 而PyQt则是QtC++类库的Python绑定,PyQt5对应于Qt5类库,它有以下特性:
(1)基于高性能的Qt的GUI控件集。
(2)能够跨平台运行在Linux、Window和Mac OS系统上。
(3)使用信号槽机制进行通信。
(4)对Qt库进行完全封装。
(5)可使用成熟的IDE进行界面设计,并自动生成可执行的Python代码。
(6)提供一整套种类齐全的窗口控件。
QtDesigner提供了一个简单的拖放界面,用于布置按钮,文本字段,组合框等组件,在设计好自己的界面后会生成相对应的ui文件,我们可以利用一些工具或命令将其转化为我们需要的py文件,这样大大提高了我们初学者的编程效率,不会再为组建的位置关系去代码。我们将界面与逻辑分离,可以有利于我们梳理逻辑,增加界面的可控性。
4. 数据库设计
4.1 设计目标及具体功能
- 该学生信息管理系统主要有四个功能,分别管理学生信息,班级信息,课程信息,以及学生的成绩信息。主要实现对这四个信息最基本的增删改查以及用户登录。
4.2概念结构设计
这些实体之间的联系如下:
(1) 一名学生可以选择多门课程,同时一门课程也可以被多名同学选择
(2) 一名同学可以有多门课的成绩,但一门课只能有一个成绩
(3) 不同专业只能归属于一个学院,而学院里有不同的专业
4.3逻辑结构设计
- SSMS(Microsoft SQL Server Management Studio)生成的逻辑结构图如下图所示,逻辑结构是独立于任何一种数据模型的,在实际应用中,一般所用的数据库环境已经给定(如SQL Server或Oracle或mysql)。由于目前使用的数据库基本上都是关系数据库,因此首先需要将E-R图转换为关系模型,然后根据具体DBMS的特点和限制转换为特定的DBMS支持下的数据模型,最后进行优化,一般E-R图中的一个实体转换为一个关系模式,实体的属性就是关系的属性,实体的码就是关系的码
4.4 主要表的作用及数据样例
学生表中存储学生的个人信息,包括学号,姓名,性别,年龄,班号共存储十条学生信息
课程表存储相关课程的信息,课号为主键,还包括课名,学时,学分共七条信息 ,每一个学生可以选择多门课程
选修表存储了每个学生选课信息和课程的成绩,学号和课号共同作为主键
班级表存储各个班级的专业以及所归属的学院,用班号作为主键共有10条信息
5.项目实施步骤
5.1 数据库建立及连接
5.1.1数据库的连接
- 我们借助pyqt5中提供的模块QSqlDatabase,
QsqlQuery并将其实例化,并填入相关的参数包括(驱动程序,主机名:端口,数据库名称,用户名/密码),但是数据库只有在调用QSqlDatabase.open时才会打开。
def connect_1():
db = QSqlDatabase.addDatabase("QODBC")
# db.setDatabaseName("Driver=Sql Server;Server=LAPTOP-80EGHD2O;Uid=sa;Pwd=211985;DatabaseName=sql")
db.setDatabaseName("sql")
db.setUserName("sa")
db.setPassword("211985")#数据库设置的登录密码
db.setHostName("localhost")
db.setPort(1433)
ok = db.open()
- 注意,在使用前首先要对ODBC进行配置,同时要打开sql
sever的资源管理器开启tcp/ip以及相应端口号进行配置,否则无法使用ODBC连接数据库。然后我们可以使用open方法将数据库打开,它返回的是一个bool类型的值,我们可以将其打印出来判断数据库是否打开成功。
5.2 登陆界面的实现
- 登录界面使用了QWidget类,主要功能是帮助用户正确登录并使用该系统。用lable标签来显示所需要的文字信息,如标题:学生管理系统,账号,以及密码;lineEdit用来接收用户填写的账号和密码信息;两个按钮铺设button用来提示用户登录与退出系统,当用户输入账号和密码,并点击登录后,程序会访问数据库中的用户表,寻找与账号对应的密码,如果密码正确,则跳转到功能选择页面,当点击退出按钮时,结束程序并关闭界面。
5.3 功能界面的实现
- 本系统的所有功能都在此界面体现,当用户登录成功后显示此界面,将四个按钮两两水平布局,每个按钮分别代表四个不同的功能,分别管理学生信息,课程信息,班级信息,成绩信息。功能界面还是使用了QWidget类,用QPushButton触发相应的功能。点击相应的按钮,则发生界面的跳转,跳转至该功能的主界面来管理相应的信息,这样可以根据用户自己的需求来选择所要使用的功能,不会造成功能的过度浪费,同时该界面在控制类中在主界面打开后没有将其关闭,意为在退出主界面后还能继续使用其他功能,用户不必再重新登录到本系统,方便用户的使用。
5.4学生信息界面的实现
- 在用户点击学生信息后,页面跳转至学生信息界面,该界面使用lable进行文字显示,左半部分两个按钮是进行退出系统和读取数据所用,当用户点击读取时,系统查询数据库学生表的所有信息,并将其显示在界面的表格中,用户可以先预览自己数据库中学生的信息,为之后的操作需求如查找,修改,删除与增高提供准备工作。
5.4.1 学生信息读取的实现
- 用pyqt5中QSqlQuery()时操作数据的类,先将其实例化,再利用其exec方法对数据库进行操作,将所用的sql语句封装为字符串形式,并传给exec()充当为参数,该方法会对数据库执行该语句,得到所需要的语句。当执行完毕后,我们想要将得到的数据显示在界面上,这时我们需要套两层for循环,一层控制行,一层控制列循环使用setItem()方法将数据显示在QTableWidget表格中,query.next()
判断是否有下一条记录,并将游标移动到第一行数据之后
def read(self):
query = QSqlQuery()
query.exec("SELECT * FROM 学生表")
x = 0
while (query.next()): # 判断是否有下一条记录
for i in range(5):
self.ui.tableWidget.setItem(x, i, QtWidgets.QTableWidgetItem(str(query.value(i))))
x += 1
我们将该函数与读取按钮所绑定,当点击读取按钮执行该函数,读取数据库中学生的所有信息,如下图所示:
将数据库中学生的所有信息包括学号,姓名,性别,年龄,以及班级全部读取至QTableWidget表格中,实现读取功能。
5.4.2 学生信息查找的实现
- 定义search()方法,在调用该属性前首先对表格进行清空操作,使函数执行完后表格现实的内容为该函数执行所得,避免出现信息混乱。在界面的右半部分的最上面是一个lineEdit,运用他的text()方法读取其中的文本,其中信息即为所要查询的学号,并将其封装在字符串中作为SQL语句传给exec()对数据库进行操作,继续运用双层循环读取到查找的所有信息,并显示在表格中。
def search(self):
self.ui.tableWidget.clear()
query = QSqlQuery()
sql1=self.ui.lineEdit_2.text()
query.exec("SELECT * FROM 学生表 "+"where "+"学号="+sql1)
x = 0
while (query.next()): # 判断是否有下一条记录
for i in range(5):
self.ui.tableWidget.setItem(x, i, QtWidgets.QTableWidgetItem(str(query.value(i))))
x += 1
将该函数与查找按钮绑定,首先在最上面lineEdit输入你要查找的学号,然后点击查找按钮,表格中就显示为该学号学生的所有信息。
5.4.3 学生信息添加的实现
- 定义add()属性,依此提取四个lineEdit的文本内容,将其封装为SQL语句中的insert语句,传给exec()对数据库进行操作,继续运用双层循环读取到查找的所有信息,并显示在表格中
。
def add(self):
query = QSqlQuery()
sql1 = self.ui.lineEdit_2.text()#学号
sql2 = self.ui.lineEdit.text()#姓名
sql3 = self.ui.lineEdit_4.text()#性别
sql4 = self.ui.lineEdit_3.text()#年龄
sql5 = self.ui.lineEdit_5.text()#班级
# "INSERT INTO 学生表 VALUES ('3009', '小雨','女','16','信管201');"
query.exec( "INSERT INTO 学生表 VALUES ('','','','','')".format(sql1,sql2,sql3,sql4,sql5))
x = 0
while (query.next()): # 判断是否有下一条记录
for i in range(5):
self.ui.tableWidget.setItem(x, i, QtWidgets.QTableWidgetItem(str(query.value(i))))
x += 1
依次在四个lineEdit依次输入所要添加的信息,当点击添加按钮时,执行该方法,然后我们可以验证我们的添加是否成功,点击查找按钮,看是否能够在表格中显示添加的信息.
点击添加后,我们验证是否添加成功,再次点击读取按钮,重新读取数据库中学生信息,可以观察到界面中表格中最后一行即为新添加的数据,可以证明添加成功。
5.4.4 学生信息删除的实现
定义 delete()函数,读取输入的学号内容,按学号删除,将其封装在sql语句中,传入exec中对数据库进行操作,删除该学号学生的所有信息。
def delete(self):
query = QSqlQuery()
sql1=self.ui.lineEdit_2.text()#学号
query.exec("delete FROM 学生表 " + "where " + "学号=" + sql1)
- 输入学生学号后,当点击删除按钮后,就会执行该函数。删除前,读取学生信息后界面显示如图表 5 8所示:
假如我们要删除学号为3011的学生信息,在学号处输入3011,点击删除,然后我们可以点击读取按钮,检查学生表中是否有3011这名同学所有信息,或者再次点击查询按钮,检查是否能够查找到该学号所对应学生的信息,如图所示,没有查询到对应的信息,即删除成功,从而实现了简单的删除功能,我在修改功能时取了巧,同样也运用了该删除功能。
找不到该学生。
5.4.5 修改功能的实现
在编写该功能时,由于本人sql语言以往较多,再编写时投机取巧了,运用了前面写好的添加和删除函数,先将所要修改的信息全部输入,点击修改按钮时,首先将该学号信息全部删除,然后在重新将所有信息再添加到数据库中,从而间接的实现修改功能。
def modify(self):
query = QSqlQuery()
sql1 = self.ui.lineEdit_2.text() # 学号
sql2 = self.ui.lineEdit.text() # 姓名
sql3 = self.ui.lineEdit_4.text() # 性别
sql4 = self.ui.lineEdit_3.text() # 年龄
sql5 = self.ui.lineEdit_5.text() # 班级
query.exec("delete FROM 学生表 " + "where " + "学号=" + sql1)
query.exec("INSERT INTO 学生表 VALUES ('','','','','')".format(sql1, sql2, sql3, sql4, sql5))
首先,我们看到如图矩形框中,敖治典的年龄为22岁,班级为信管201,当用户认为这与实际不符时,就会产生修改的需求,像输入框输入所有信息并点击修改按钮完成修改。
我们在右方输入需要改的信息,将年龄改为20岁,班级改为信管202然后点击修改按钮,并再次读取学生信息如图下所示。
我们可以看到,敖治典的年龄已经修改为了20岁,并且班级已经修改为了信管202,我利用这种先删除后添加的办法虽然能够实现字面意思的修改,但是我需要将所有信息都输入其中才能实现该功能,而用户更倾向于只输入其想修改的信息就能够完成修改,我的这种办法效率低下,并且使用繁琐,没能满足用户的真正需求。该缺陷也是我要在之后的学习中去完善的一点,从而提高系统的执行效率。
5.5班级信息管理的实现
由于班级信息的管理,成绩信息的管理以及课程信息的管理与学生信息管理的实现原理一样,只有sql语句的不同即用户输入的的不同和显示表格的列名以及列数不同,可根据实际需求进行设计,此处不在赘述,我仅展示读取成功的界面,其他功能源代码见附录:
def read(self):
query = QSqlQuery()
query.exec("SELECT * FROM 选修表")
x = 0
while (query.next()): # 判断是否有下一条记录
for i in range(3):
self.ui.tableWidget.setItem(x, i, QtWidgets.QTableWidgetItem(str(query.value(i))))
x += 1
此函数原理与学生信息的读取没有本质区别,由于班级信息只有三列分别是班号,专业,学院,所以我们将for循环设置为从0到3,保证读取到数据库中表的每一列。
5.6 课程管理的实现
5.7 成绩管理的实现
当点击读取后,显示所有成绩信息。
5.8 界面跳转的实现
- 我设置了一个控制类,将所有页面跳转设置为其的各个属性,首先让程序开始时,显示登陆界面,登陆界面的登录按钮与自身的功能界面所连接,再令功能界面的各个按钮与相对应的界面连接,当点击按钮时,界面跳转至对应的界面,源代码如下:
class control:
def __init__(self):
pass
def login(self):
self.window_1=MyMainWindow_3()
self.window_1.show()
self.window_1.login.pushButton_2.clicked.connect(self.window_1.close)
self.window_1.login.pushButton.clicked.connect(self.maintable)
def maintable(self):
self.window_2=MyMyMainWindow_2()
self.window_2.show()
self.window_2.ui_2.pushButton_2.clicked.connect(self.table)
self.window_2.ui_2.pushButton_4.clicked.connect(self.table_2)
self.window_2.ui_2.pushButton_3.clicked.connect(self.table_3)
self.window_2.ui_2.pushButton.clicked.connect(self.table_4)
def table(self):
self.window_3=MyMainWindow()
self.window_2.close()
self.window_3.show()
def table_2(self):
self.window_4=MyMainWindow_4()
self.window_2.close()
self.window_4.show()
def table_3(self):
self.window_5=MyMainWindow_5()
self.window_5.show()
def table_4(self):
self.window_6=MyMainWindow_6()
self.window_6.show()
5.9 PyAutoGUI测试
- 首先我们可以查看当前控制类所在屏幕位置,将鼠标光标移动在其文件显示位置,利用pyautogui自带的方法pyautogui.position()
读取到当前光标所在位置的坐标,再编写该位置的鼠标点击事件,用click()方法,当点击发生后,界面显示为控制类所在界面,然后利用click()方法,传入参数right,意为右击鼠标,同样读取运行程序按钮所在位置,继续点击,这样我的程序就可以运行了。Pyautogui也可以控制电脑的键盘输入,一种是传入按键的信号,另一种是输入自己写好的字符串,本项目采用第二种方式进行登录,首先利用其自带的截图定位功能,对账号,密码以及输入框进行定位,然后依次用click()方法点击,并使用pyautogui.write()方法向文本框输入内容,最后点击登录。
注意,其自带的截图定位功能误差较大,速度较慢,在使用时要有耐心,同时截图截取部分要保证全屏幕唯一,否则就会出现识别冲突,不能达到预期效果;另外,由于点击事件的执行速度较快,可能在截图定位还没返回出正确位置前就发生,因此我们需要合理利用time库中的sleep函数,让程序能够顺利执行。
import pyautogui
import time
time.sleep(3)
pyautogui.click(613,99) # 鼠标点击指定位置,默认左键
pyautogui.click(1000,300,button='right') # 单击右键
pyautogui.moveTo(1100,600,2)
pyautogui.click(1100,600)
# time.sleep(2)
time.sleep(2)
a=pyautogui.locateCenterOnScreen("read.png")
pyautogui.click(a)
print(a)
time.sleep(2)
b=pyautogui.locateCenterOnScreen("add.png")
pyautogui.click(b)
print(b)
pyautogui.write('3008', interval=0.25) # 每个字符间隔0.25秒3009
time.sleep(1)
c=pyautogui.locateCenterOnScreen("search.png")
pyautogui.click(c)
c=pyautogui.locateCenterOnScreen("name.png")
pyautogui.click(c)
pyautogui.write('001', interval=0.25)
d=pyautogui.locateCenterOnScreen("sex.png")
pyautogui.click(d)
pyautogui.write('', interval=0.25)
6. 总结
6.1 不足之处
- 在本项目中仍然存在许多不足之处,如上文所说,我在修改功能上投机取巧,未能实现真正意义上的修改,仅仅是调用了写好的删除和添加功能。另外,在查找信息显示时,表格中没有显示列名,我的列名是写死在读取函数中,所以会造成使用混乱,我的系统分界面十分粗糙,不美观,可以考虑适当的添加背景图片来美化界面。在为期一周的课设中,我发现了自己的很多不足,数据库相关知识的匮乏,sql语句的遗忘,python基础的薄弱。
6.2 心得体会
- 经过一学期的python学习,加上大数据选修课的大作业和python课程设计,我的编程能力得到大幅的提升,python的各种应用,爬虫,数据分析,自动化,以及编写系统我都浅显的实现过,但也仅仅是限于简单实现,一些较为深层的东西并没有接触,python课程虽然已经结束了,但是我学习的脚步不能停歇,这次课设,因为使用了pyqt5,我简单的学习了面向对象编程
,他与我之前学习的面向过程有很大的不同,封装,继承,多态在极大程度上方便了我们的编程;我复习了数据库相关知识,也掌握了如何使用python语言连接数据库,同时巩固了sql语句的用法,我的收获很大。我真正理解了只有实战才能真正提高自己的编程水平这句话,和对相关知识的理解,单纯的听课和看书只能增加理论知识,编程需要实战,不然只会眼高手低,看似很简单的问题自己就是解决不了。在后期的学习中,我应该注重自己在语言的应用上层面上,不能只会纸上谈兵,在编程的过程中难买会遇到问题,保持独立思考的习惯,查询相关资料去解决,而不能就此放弃。
以上是关于PyQt5入门——学生管理系统的主要内容,如果未能解决你的问题,请参考以下文章
在SQL server中查询每个学生的班级、学号、姓名、平均分,结果按平均分降序排列,平均分相同者按班级排列