PyQt5用户登录界面连接数据库 ------学习记录与源码实现。
所学原文链接:https://blog.csdn.net/WYKB_Mr_Q/article/details/129310865
原文只给出了功能函数的代码,没有给出完整的实现代码,并且代码有几个小问题,
文章底部放了main文件的源码,整个项目的源码我放在这个百度云里了
链接:https://pan.baidu.com/s/1SbZnfsEF5ywvCisOkB6ycw?pwd=1234
提取码:1234
~~第一个问题(原文已修正)
原文中创建数据库的代码有一处引号错误
下面是我更正后的代码:~~
cursor.execute('create table user (user_id varchar(30) primary key, password varchar)')
第二个问题
未交代QMessageBox需要导入。应加下面这行代码:
from PyQt5.QtWidgets import QMessageBox
带三个问题
原文在数据库创建与连接的代码里,数据库再磁盘的路径没有使用绝对路径,并且不同页面连接数据库时,用到的“conn”等需要区分,可以在后面加数字区分,否则报错。
复制代码以后要根据自己项目的实际路径去改修改。比如我根据我实际项目的地址改写的代码:
conn1 = sqlite3.connect("D:\pythonProjects\pyqt\mrsoft.db")
第四个问题
原文数据库创建时只有user_id 和 password两个属性,但连接的时候又冒出来一个用户等级的属性,运行肯定会报错,统一成只有user_id 和 password两个属性就可以了。
原文未提及的具体的文件结构:
文末的代码与注释已经介绍的十分详细了,主要思路就是把注册页面和重置密码页面也写成类放到main文件里
下图是文件源码的文件构成。包括了四个ui文件和对应生成的py文件,以及main文件与创建的数据库mrsoft.db
下面三幅图是使用到的三个页面(登录-login.ui 注册-register.ui 重置密码-reset.ui)的ui设计。
功能页面的设计参考原文后续的教程,不在本文讨论的范围中。
最后,可执行的main.py代码我放在最下面了。
可执行前提是你按照原文前两个教程把环境都配置好,对应的ui文件也生成了。补充:前两个教程在导入类的地方也可能存在一个小问题,你需要根据你的实际代码导入对应的类。原文example.ui生成的是example.ui.py,而我实际操作,却生成了example_ui.py文件,因此导入类的部分大家一定根据自己实际的代码去写,这个可能是不同python版本导致的。
特别注意:
if name == ‘main’:部分里:#cursor.execute(‘create table user (user_id varchar(30) primary key, password varchar)’)
第一次运行的时候,把句首的#删除,然后运行,会报错,没关系,再把#加上继续运行就没问题了。这样可以避免重复创造同一个数据表。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from login_ui import Ui_LoginWindow # 这里需要根据实际的文件名字与类的名字导入
from image_ui import Ui_image # 这里需要根据实际的文件名字与类的名字导入
from register_ui import Ui_RegWindow # 这里需要根据实际的文件名字与类的名字导入
from reset_ui import Ui_RetWindow # 这里需要根据实际的文件名字与类的名字导入
import sqlite3
from PyQt5.QtWidgets import QMessageBox
# 登录页面
class LoginWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui = Ui_LoginWindow()
self.ui.setupUi(self)
self.show()
self.ui.pushButton.clicked.connect(self.register)
self.ui.pushButton_2.clicked.connect(self.login) #绑定注册按钮和跳转至注册页面的函数
self.ui.pushButton_3.clicked.connect(self.reset) #绑定重置密码按钮和跳转至重置密码页面的函数
# 登录函数
def login(self):
# 连接数据库
conn1 = sqlite3.connect("D:\pythonProjects\pyqt\mrsoft.db")
cursor1 = conn1.cursor()
user_id = self.ui.lineEdit.text() # 获取输入的账号
password = self.ui.lineEdit_2.text() # 获取输入的密码
# sql语句,判断数据库中是否拥有这账号和密码
sql = 'select user_id, password from user where user_id=? and password =?'
cursor1.execute(sql, (user_id, password))
# 获取一致的部分,存在表示输入正确,不存在提示错误
data = cursor1.fetchall()
conn1.commit()
cursor1.close()
conn1.close()
# 账号和密码不为空时候,才进入
if data :
self.close()
ImageWindow.show()
else:
QMessageBox.information(self, "提示", "您的登录账号/密码错误或为空!",
QMessageBox.Close)
# 跳转到注册界面
def register(self):
RegisterWindow.show() #打开注册页面
self.close() #关闭当前登录页面
#跳转到重置密码界面
def reset(self):
ResetWindow.show() #打开重置密码页面
self.close() #关闭当前登录页面
#注册页面
class RegisterWindow(QMainWindow,Ui_RegWindow):
def __init__(self, parent=None):
super(RegisterWindow, self).__init__(parent)
self.ui = Ui_RegWindow()
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.reg) #绑定注册按钮和注册函数
self.ui.pushButton_2.clicked.connect(self.back1) #绑定返回按钮和返回登录页面的函数
def back1(self):
self.close() #关闭当前注册页面
win.show() #打开登录页面(win是注册页面的实例化,再最后一部分有实例过程)
#注册函数实现
def reg(self):
conn2 = sqlite3.connect("D:\pythonProjects\pyqt\mrsoft.db")
cursor2 = conn2.cursor()
user_id = self.ui.lineEdit.text()
password = self.ui.lineEdit_2.text()
confirm = self.ui.lineEdit_3.text()
if password == confirm and password and user_id:
# sql语句,符合条件的给数据库中加入新的账号和密码
sql = 'insert into user (user_id, password, authority) values (?, ?)'
cursor.execute(sql, (user_id, password))
# 如果两次输入密码不一致,发出提示
elif password != confirm:
QMessageBox.information(self, "提示", "两次输入的密码不一致,请重新输入!",
QMessageBox.Close)
else:
QMessageBox.information(self, "提示", "输入错误!",
QMessageBox.Close)
conn2.commit()
cursor2.close()
conn2.close()
#重置密码界面
class ResetWindow(QMainWindow,Ui_RetWindow):
def __init__(self, parent=None):
super(ResetWindow, self).__init__(parent)
self.ui = Ui_RetWindow()ret
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.ret) #绑定密码重置键和密码重置函数
self.ui.pushButton_2.clicked.connect(self.back2) #绑定返回按钮和返回登录页面的函数
def back2(self):
self.close()
win.show()
#重置密码密码函数实现
def ret(self):
conn3 = sqlite3.connect("D:\pythonProjects\pyqt\mrsoft.db")
cursor3 = conn3.cursor()
user_id = self.ui.lineEdit.text()
password = self.ui.lineEdit_2.text()
confirm = self.ui.lineEdit_3.text()
if password == confirm and password and user_id:
sql = 'update user set password=? where user_id=?'
cursor.execute(sql, (password, user_id))
elif password != confirm:
QMessageBox.information(self, "提示", "两次输入的密码不一致,请重新输入!",
QMessageBox.Close)
else:
QMessageBox.information(self, "提示", "输入错误!",
QMessageBox.Close)
conn3.commit()
cursor3.close()
conn3.close()
# 自己的功能页面
class ImageWindow(QMainWindow, Ui_image):
def __init__(self, parent=None):
super(ImageWindow, self).__init__(parent)
self.ui = Ui_image()
self.ui.setupUi(self)
if __name__ == '__main__':
# 连接到SQLite数据库,建立数据库文件mrsoft.db,如果文件不存在,自动建立。
conn = sqlite3.connect('D:\pythonProjects\pyqt\mrsoft.db')
# 创建一个cursor(游标)
cursor = conn.cursor()
# 执行一条SQL语句,创建user,包括账号user_id与密码password(只能执行一次,执行一次以后会报错,提示 table user已经存在,所以需要用#注释掉,但第一运行时请删除注释符#)
# cursor.execute('create table user (user_id varchar(30) primary key, password varchar)')
# 关闭游标
cursor.close()
# 提交事务
conn.commit()
# 关闭connection
conn.close()
app = QApplication(sys.argv)
# 实例化前面定义的四个页面,否则页面无法显示
ImageWindow = ImageWindow()
ResetWindow = ResetWindow()
RegisterWindow = RegisterWindow()
win = LoginWindow()
sys.exit(app.exec_())