需要源代码的家人们直接评论区或者私信我
本项目是基于Python开发的一个简易的学生信息管理系统,并使用PyAutoGUI进行自动化测试,主要实现以下功能
开放数据库互连(ODBC)是微软提出的数据库访问接口标准。开放数据库互连定义了访问数据库的API一个规范,这些API独立于不同厂商DBMS,也独立于具体的编程语言。通过使用ODBC,应用程序能够使用相同的源代码和各种各样的数据库进行交互。这使得开发者不需要以特殊的数据库管理系统DBMS为目标,或者了解不同支撑背景的数据库的详细细节,就能够开发和发布客户/服务器应用程序。下面是ODBC应用系统的体系结构。
应用程序要访问一个数据库,首先必须用ODBC管理器注册一个数据源,管理器根据数据源提供的数据库位置、数据库类型及ODBC驱动程序等信息,建立起ODBC与具体数据库的联系。这样,只要应用程序将数据源名提供给ODBC,ODBC就能建立起与相应数据库的连接。在ODBC中,ODBC API不能直接访问数据库,必须通过驱动程序管理器与数据库交换信息。驱动程序管理器负责将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序在执行完相应的操作后,将结果通过驱动程序管理器返回给应用程序。
在使用时首先要进行ODBC配置,建立ODBC数据源连接,这样才能使用其访问数据库中数据的功能。
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还不能实现按键记录,并且无法检测按键是否按下。
这些实体之间的联系如下:
(1) 一名学生可以选择多门课程,同时一门课程也可以被多名同学选择
(2) 一名同学可以有多门课的成绩,但一门课只能有一个成绩
(3) 不同专业只能归属于一个学院,而学院里有不同的专业
学生表中存储学生的个人信息,包括学号,姓名,性别,年龄,班号共存储十条学生信息
课程表存储相关课程的信息,课号为主键,还包括课名,学时,学分共七条信息 ,每一个学生可以选择多门课程
选修表存储了每个学生选课信息和课程的成绩,学号和课号共同作为主键
班级表存储各个班级的专业以及所归属的学院,用班号作为主键共有10条信息
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()
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表格中,实现读取功能。
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输入你要查找的学号,然后点击查找按钮,表格中就显示为该学号学生的所有信息。
。
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依次输入所要添加的信息,当点击添加按钮时,执行该方法,然后我们可以验证我们的添加是否成功,点击查找按钮,看是否能够在表格中显示添加的信息.
点击添加后,我们验证是否添加成功,再次点击读取按钮,重新读取数据库中学生信息,可以观察到界面中表格中最后一行即为新添加的数据,可以证明添加成功。
定义 delete()函数,读取输入的学号内容,按学号删除,将其封装在sql语句中,传入exec中对数据库进行操作,删除该学号学生的所有信息。
def delete(self):
query = QSqlQuery()
sql1=self.ui.lineEdit_2.text()#学号
query.exec("delete FROM 学生表 " + "where " + "学号=" + sql1)
在编写该功能时,由于本人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,我利用这种先删除后添加的办法虽然能够实现字面意思的修改,但是我需要将所有信息都输入其中才能实现该功能,而用户更倾向于只输入其想修改的信息就能够完成修改,我的这种办法效率低下,并且使用繁琐,没能满足用户的真正需求。该缺陷也是我要在之后的学习中去完善的一点,从而提高系统的执行效率。
由于班级信息的管理,成绩信息的管理以及课程信息的管理与学生信息管理的实现原理一样,只有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,保证读取到数据库中表的每一列。
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()
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)