锋哥原创的PyQt6图书管理系统视频教程:
PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计21条视频,包括:PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~、第2讲 登录功能UI设计实现、第3讲 数据库操作工具包dbUtil.py封装等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV18t4y1R7Qp/我们在项目目录下,新建login.py文件,作为管理员登录模块源码文件,把前面登录UI文件用PyUIC生成的python文件,贴到当前login.py里面,我们要进行二次开发。
为了让源码能运行起来,我们把继承的类改成QWidget;
再加一个 构造方法;
def __int__(self):
super(Ui_Form, self).__init__()
self.setupUi(self)
初步改成的代码如下:
"""
管理员登录模块
作者 : 小锋老师
官网 : www.python222.com
"""
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QWidget
class Ui_Form(QWidget):
def __int__(self):
super(Ui_Form, self).__init__()
self.setupUi(self)
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(487, 405)
self.formLayoutWidget = QtWidgets.QWidget(parent=Form)
self.formLayoutWidget.setGeometry(QtCore.QRect(90, 120, 311, 121))
self.formLayoutWidget.setObjectName("formLayoutWidget")
self.formLayout = QtWidgets.QFormLayout(self.formLayoutWidget)
self.formLayout.setContentsMargins(10, 10, 10, 10)
self.formLayout.setHorizontalSpacing(40)
self.formLayout.setVerticalSpacing(30)
self.formLayout.setObjectName("formLayout")
self.label = QtWidgets.QLabel(parent=self.formLayoutWidget)
self.label.setObjectName("label")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label)
self.userNameInput = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
self.userNameInput.setObjectName("userNameInput")
self.formLayout.setWidget(0, QtWidgets.QFormLayout.ItemRole.FieldRole, self.userNameInput)
self.label_2 = QtWidgets.QLabel(parent=self.formLayoutWidget)
self.label_2.setObjectName("label_2")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.LabelRole, self.label_2)
self.passwordInput = QtWidgets.QLineEdit(parent=self.formLayoutWidget)
self.passwordInput.setEchoMode(QtWidgets.QLineEdit.EchoMode.Password)
self.passwordInput.setObjectName("passwordInput")
self.formLayout.setWidget(1, QtWidgets.QFormLayout.ItemRole.FieldRole, self.passwordInput)
self.loginBtn = QtWidgets.QPushButton(parent=Form)
self.loginBtn.setGeometry(QtCore.QRect(110, 260, 75, 23))
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("../images/login.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
self.loginBtn.setIcon(icon)
self.loginBtn.setObjectName("loginBtn")
self.resetBtn = QtWidgets.QPushButton(parent=Form)
self.resetBtn.setGeometry(QtCore.QRect(290, 260, 75, 23))
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("../images/reset.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off)
self.resetBtn.setIcon(icon1)
self.resetBtn.setObjectName("resetBtn")
self.label_3 = QtWidgets.QLabel(parent=Form)
self.label_3.setGeometry(QtCore.QRect(180, 40, 241, 61))
font = QtGui.QFont()
font.setPointSize(24)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.label_4 = QtWidgets.QLabel(parent=Form)
self.label_4.setGeometry(QtCore.QRect(100, 40, 71, 61))
self.label_4.setText("")
self.label_4.setPixmap(QtGui.QPixmap("../images/logo.png"))
self.label_4.setObjectName("label_4")
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "管理员登录"))
self.label.setText(_translate("Form", "用户名:"))
self.label_2.setText(_translate("Form", "密 码:"))
self.loginBtn.setText(_translate("Form", "登录"))
self.resetBtn.setText(_translate("Form", "重置"))
self.label_3.setText(_translate("Form", "图书管理系统"))
我们写个main测试方法:
if __name__ == '__main__':
app = QApplication(sys.argv)
ui = Ui_Form()
ui.show()
sys.exit(app.exec())
能运行出来,但是么有logo和icon图片。这个是引用图片的路径问题引起的。我们改下。
ctrl+R快捷键:把所有的'../'替换成'./',即可。
这样图标就出来了。
我们先实现简单的重置功能
先定义槽函数resetForm:
def resetForm(self):
"""
重置表单
:return:
"""
self.userNameInput.setText("")
self.passwordInput.setText("")
重置按钮点击事件绑定下槽函数
# 重置按钮点击事件
self.resetBtn.clicked.connect(self.resetForm)
我们再来实现点击登录按钮,实现登录判断功能。
我们采用的是面向对象设计思想,所以我们基于MVC实现,Controller控制层向Dao数据库访问层,传递数据的时候,采用对象传递,我们这里设计到用户对象,我们先来建一个用户实体对象。
单独建一个entity目录用来放项目实体文件。建一个UserModel.py
里面再建一个User实体类。
"""
用户实体类
作者 : 小锋老师
官网 : www.python222.com
"""
# 用户实体类
class User:
# 编号 主键ID
id = None
# 用户名
userName = None
# 密码
password = None
def __init__(self, userName, password):
self.userName = userName
self.password = password
我们再单独建一个dao包目录,用来放所有的数据访问对象代码:
在dao下新建userDao.py,用户模块操作数据的代码文件
在userDao.py里,定义login方法,用来判断用户登录
"""
用户数据访问对象
作者 : 小锋老师
官网 : www.python222.com
"""
from entity.UserModel import User
from util import dbUtil
def login(user: User):
"""
用户登录判断
:param user:用户实体
:return:登录成功返回用户信息实体,登录失败,返回None
"""
con = None
try:
con = dbUtil.getCon()
cursor = con.cursor()
cursor.execute(f"select * from t_user where userName='{user.userName}' and password='{user.password}'")
return cursor.fetchone()
except Exception as e:
print(e)
con.rollback()
return None
finally:
dbUtil.closeCon(con)
我们在login.py文件的Ui_Form类里,定义下login槽方法:
def login(self):
"""
用户登录判断 数据库判断成功,则打开主窗体,否则提示报错信息
:return:
"""
userName = self.userNameInput.text()
password = self.passwordInput.text()
if userName.strip() == "" or password.strip() == "":
QMessageBox.warning(None, '系统提示', '用户名或者密码不能为空!')
else:
user = User(userName, password)
resultUser = userDao.login(user)
if resultUser:
QMessageBox.information(None, '系统提示', '用户登录成功!')
else:
QMessageBox.warning(None, '系统提示', '用户名或者密码输入错误!')
登录按钮点击事件绑定下槽函数:
# 登录按钮点击事件
self.loginBtn.clicked.connect(self.login)
运行测试没问题:
至此,用户登录功能模块功能实现完毕!