阅读:130
本文主要基于PyQt5用的是qt designer,连接MySQL实现登录界面,包含注册功能,记住密码功能,说明这一切都是基于在pycharm上配置好了pyuic和qt designer
界面都是用designer布局的,没有用代码去写,里面用到的信号以及功能是自己写的代码实现的。账号密码保存的在MySQL数据表里,账号是主键具有唯一性。密码设置不可见,可以记住上一次登录的密码。
注册的账号是主键具有唯一性,密码必须大于6位
这一步请看我写的这个博客pyqt5连接mysql数据库
连接到数据库成功后,需要创建一个用来存储账户密码信息的表,创建用基础的SQL语句就行了
数据库连接后,我们可以着手第一步注册一个新账号
这一步的要求是,点击注册按钮跳转到注册界面,注册成功后跳转到登录界面。实现这一过程的是QT的核心机制,信号与槽。
我们用qt designer画好登录界面和注册界面,然后用pyuic或者你用终端命令将ui文件转换成py文件。
注意后面的我们的实现不要在转换的这个py文件里面实现,因为如果ui有其它改动重新生成就会影响你开始写的代码,我们要重新建一个py文件
,比如登录界面生成的文件位login.py
,我们重新建一个call_login.py
文件来对登录界面进行功能实现,注册界面也一样。
call_login.py完整代码
from PyQt5.QtWidgets import *
from Login_module.login import Ui_LoginUi #导入login文件
from Login_module.Con_MySQL import * #导入数据库文件
from Login_module.call_regist import MainRegistWindow #导入注册文件
import sys
import configparser
global UserName
UserP = {} #定义一个存储密码账号的元组
class MainLoginWindow(QWidget, Ui_LoginUi):
def __init__(self, parent=None):
super(MainLoginWindow, self).__init__(parent)
self.re = MainRegistWindow() # 这边一定要加self
self.setupUi(self)
self.initUi()
def initUi(self):
self.IsRememberUser()
self.UserName.setFocus()
self.UserName.setPlaceholderText("请输入账号")
self.PassWord.setPlaceholderText("请输入密码")
self.PassWord.setEchoMode(QLineEdit.Password) # 密码隐藏
self.RegistButton.clicked.connect(self.regist_button) # 跳转到注册页面
self.re.SuccessReg.connect(self.Success_Regist) # 注册或者取消跳转回来
self.LoginButton.clicked.connect(self.login_button) # 登录
self.LogoutButton.clicked.connect(self.logout_button) # 退出
"""设置记住密码"""
def IsRememberUser(self):
config = configparser.ConfigParser()
file = config.read('user.ini') #读取密码账户的配置文件
config_dict = config.defaults() #返回包含实例范围默认值的字典
self.account = config_dict['user_name'] #获取账号信息
self.UserName.setText(self.account) #写入账号上面
if config_dict['remember'] == 'True':
self.passwd = config_dict['password']
self.PassWord.setText(self.passwd)
self.RememberUser.setChecked(True)
else:
self.RememberUser.setChecked(False)
"""设置配置文件格式"""
def config_ini(self):
self.account = self.UserName.text()
self.passwd = self.PassWord.text()
config = configparser.ConfigParser()
if self.RememberUser.isChecked():
config["DEFAULT"] = {
"user_name":self.account,
"password":self.passwd,
"remember":self.RememberUser.isChecked()
}
else:
config["DEFAULT"] = {
"user_name": self.account,
"password": "",
"remember": self.RememberUser.isChecked()
}
with open('user.ini', 'w') as configfile:
config.write((configfile))
print(self.account, self.passwd)
#注册
def regist_button(self):
#载入数据库
# self.sql = Oper_Mysql()
# self.sql.ZSGC_Mysql()
self.re.show()
w.close()
#登录
def login_button(self):
self.sql = Oper_Mysql()
if QSqlDatabase.contains("qt_sql_default_connection"):
db = QSqlDatabase.database("qt_sql_default_connection")
else:
db = QSqlDatabase.addDatabase("QMYSQL")
Login_User = self.UserName.text()
Login_Passwd = self.PassWord.text()
# print(type(Login_User))
# print(type(Login_Passwd))
if Login_User == 0 or Login_Passwd.strip() == '':
QMessageBox.information(self, "error", "输入错误")
else:
self.config_ini() #加载用户密码配置文件
query = QSqlQuery()
query.exec_("select *from Management")
while query.next():
UserID = str(query.value("M_UserID"))
UserPasswd = query.value("M_PassWord")
UserP[UserID] = UserPasswd
length = len(UserP)
for key in UserP:
length = length - 1
if key == Login_User and UserP[Login_User] == Login_Passwd: #密码和账号都对的情况下
mess = QMessageBox()
mess.setWindowTitle("Success")
mess.setText("登录成功")
mess.setStandardButtons(QMessageBox.Ok)
mess.button(QMessageBox.Ok).animateClick(1000) #弹框定时关闭
mess.exec_()
print("登录成功")
"""跳转到主界面"""
self.MainWin.show()
w.close()
return True
elif key != Login_User and length == 0:
QMessageBox.information(self, "waining", "账号不存在", QMessageBox.Ok)
return False
elif key == Login_User and UserP[Login_User] != Login_Passwd:
QMessageBox.information(self, "error!", "密码输入错误", QMessageBox.Ok)
return False
#退出
def logout_button(self):
#警告对话框
messageBox = QMessageBox(QMessageBox.Warning, "警告", "是否退出系统!")
Qyes = messageBox.addButton(self.tr("确认"), QMessageBox.YesRole)
Qno = messageBox.addButton(self.tr("取消"), QMessageBox.NoRole)
messageBox.setDefaultButton(Qno) #默认焦点
messageBox.exec_() #保持
if messageBox.clickedButton() == Qyes:
w.close()
else:
return
#成功注册
def Success_Regist(self):
w.show()
self.re.close()
if __name__=="__main__":
app=QApplication(sys.argv)
w=MainLoginWindow()
w.show()
sys.exit(app.exec())
两种情况下会跳转回登录界面,一是点击取消,二是注册成功。这时不能向上面跳转到注册界面这么简单直接跳回登录界面,那样会造成线程死亡跳转失败。我们要将登录界面当做主窗口,注册界面当做子窗口,子窗口只发信号,主窗口执行操作。
call_regist.py完整代码
from PyQt5.QtWidgets import *
from Login_module.regist import Ui_RegistUi
from PyQt5.QtCore import pyqtSignal,Qt
from Login_module.Con_MySQL import*
class MainRegistWindow(QWidget, Ui_RegistUi):
SuccessReg = pyqtSignal() # 定义一个注册成功信号
def __init__(self, parent=None):
super(MainRegistWindow, self).__init__(parent)
self.setupUi(self)
self.initUI()
def initUI(self):
self.ReginAccount.setFocus() #鼠标焦点
self.ReginAccount.setPlaceholderText("请输入注册账户")
self.UserName.setPlaceholderText("请输入姓名") #提示信息
self.PassWord.setPlaceholderText("请输入密码")
self.PassWordSure.setPlaceholderText("请确认密码")
self.PassWord.setEchoMode(QLineEdit.Password) #密码隐藏
self.PassWordSure.setEchoMode(QLineEdit.Password)
self.comboBox.setCurrentIndex(0) #设置默认值 为空
self.comboBox.activated.connect(self.emit_identity) #当选中下拉框时发射信号
self.ReginAccount.textChanged.connect(self.emit_Account) #注册账号
self.UserName.textChanged.connect(self.emit_Username) #姓名改变时
self.PassWord.textChanged.connect(self.emit_Password) #密码
self.PassWordSure.textChanged.connect(self.emit_ConPassword) #确认密码
self.ConfirmButton.clicked.connect(self.emit_Confir_Button) #确认
self.CancelButton.clicked.connect(self.emit_Cancel) #取消
def emit_Account(self):
print("Account发生改变")
def emit_Username(self):
print("UserName发生改变")
def emit_Password(self):
print("PassWord发生改变")
def emit_ConPassword(self):
print("ConPassword发生改变")
def emit_identity(self): # 发射身份信号
print(self.comboBox.currentText())
def emit_Confir_Button(self):
if self.comboBox.currentText().strip() == '' or self.ReginAccount.text().strip() == '' or self.PassWordSure.text().strip() == '' \
or self.PassWord.text().strip() == '' or self.UserName.text().strip() == '':
try:
QMessageBox.information(self, "error", "输入有误,请重新输入")
except Exception as str:
print("输入错误 %s" % (str))
elif len(self.PassWord.text()) < 6:
QMessageBox.information(self, "warning", "密码小于6位")
elif self.PassWord.text() != self.PassWordSure.text():
try:
QMessageBox.information(self, "error", "两次密码输入不一致")
except Exception as str:
print("未知错误 %s" % (str))
else:
sql = Oper_Mysql()
query = QSqlQuery()
M_UserID = self.ReginAccount.text()
M_UserName = self.UserName.text()
M_PassWord = self.PassWord.text()
M_UserRole = self.comboBox.currentText()
# 插入变量
s = query.exec_(
"insert into management(M_UserID, M_UserName, M_PassWord, M_UserRole) values('%s', '%s', '%s', '%s')" % (
M_UserID, M_UserName, M_PassWord, M_UserRole))
if s:
QMessageBox.information(self, "QAQ", "注册成功")
else:
QMessageBox.information(self, "QAQ", "注册失败, 该账户已经存在")
self.SuccessReg.emit()
def emit_Cancel(self):
self.SuccessReg.emit()