PyQt5用户登录界面连接数据库 ------源码实现。

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
PyQt5用户登录界面连接数据库 ------源码实现。_第1张图片

下面三幅图是使用到的三个页面(登录-login.ui 注册-register.ui 重置密码-reset.ui)的ui设计。
功能页面的设计参考原文后续的教程,不在本文讨论的范围中。

PyQt5用户登录界面连接数据库 ------源码实现。_第2张图片

PyQt5用户登录界面连接数据库 ------源码实现。_第3张图片

PyQt5用户登录界面连接数据库 ------源码实现。_第4张图片

最后,可执行的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_())

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