相关文章推荐
乐观的枕头  ·  python找出不是两个数组共有的元素 - ...·  1 年前    · 
谦和的火龙果  ·  查询和分析日志以及查看结果_日志服务(SLS ...·  1 年前    · 
会搭讪的茄子  ·  使用JavaScript开发一个Photos ...·  2 年前    · 
会搭讪的猕猴桃  ·  shell 读取文件内容到数组-掘金·  2 年前    · 
满身肌肉的沙滩裤  ·  Set-TransportRule ...·  2 年前    · 
Code  ›  PyQt5实现登录界面,包含用户注册,记住密码功能_pyqt5登录注册界面_杨书落的博客
按钮 pyqt5 qmessagebox
https://blog.csdn.net/qq_41264992/article/details/121309415
聪明的小狗
2 年前
  • 1、实际效果
  • 2、数据库说明
    • 2.1 连接数据库
    • 2.2 生成初始表
  • 3、注册
    • 3.1 注册按钮实现窗口切换,信号与槽
      • 3.3.1 跳转到注册界面代码
      • 3.3.2 注册界面跳转回登录界面

      1、实际效果

      界面都是用designer布局的,没有用代码去写,里面用到的信号以及功能是自己写的代码实现的。账号密码保存的在MySQL数据表里,账号是主键具有唯一性。密码设置不可见,可以记住上一次登录的密码。

      注册的账号是主键具有唯一性,密码必须大于6位

      2、数据库说明

      2.1 连接数据库

      这一步请看我写的这个博客 pyqt5连接mysql数据库

      2.2 生成初始表

      连接到数据库成功后,需要创建一个用来存储账户密码信息的表,创建用基础的SQL语句就行了

      数据库连接后,我们可以着手第一步注册一个新账号

      3.1 注册按钮实现窗口切换,信号与槽

      这一步的要求是,点击注册按钮跳转到注册界面,注册成功后跳转到登录界面。实现这一过程的是QT的核心机制,信号与槽。

      我们用qt designer画好登录界面和注册界面,然后用pyuic或者你用终端命令将ui文件转换成py文件。 注意后面的我们的实现不要在转换的这个py文件里面实现,因为如果ui有其它改动重新生成就会影响你开始写的代码,我们要重新建一个py文件 ,比如登录界面生成的文件位 login.py ,我们重新建一个 call_login.py 文件来对登录界面进行功能实现,注册界面也一样。

      3.3.1 跳转到注册界面代码

      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())
      

      3.3.2 注册界面跳转回登录界面

      两种情况下会跳转回登录界面,一是点击取消,二是注册成功。这时不能向上面跳转到注册界面这么简单直接跳回登录界面,那样会造成线程死亡跳转失败。我们要将登录界面当做主窗口,注册界面当做子窗口,子窗口只发信号,主窗口执行操作。

      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()
      

      有很多人私信才放的代码,上学时候写的,写的很不好就直接放这边了,有需要自己下,数据库环境需要自己配置,怎么配置请百度。

      通过百度网盘分享的文件:登录界面.rar
      链接:https://pan.baidu.com/s/1nZyaduQmUfbrUb7Ng0V6hA
      提取码:w6bA
      复制这段内容打开「百度网盘APP 即可获取」

      使用Qtdesigner设计ui界面,实行界面分离,分别设计两个界面,一个是登录的界面,一个是主界面 然后新建一个Python文件,在文件中分别将这两个界面UI引入,分别创建两个类,一个是实现登录显示的类,另一个是实现主界面显示的类。   创建两个类,主窗口类  登录窗口类  最后使用一个main函数,在这个函数中实例化登录窗口类,显示登录窗口 然后在登录窗口中实例化主窗口类,使用主窗口类.show()方法进行显示主窗口,并且关闭原来的登录窗口 二、将两个类分别写在两个Python文件夹中 创建两个不同的或者相同的窗口类,然后在登录窗口中 客服端登录页面实现功能: 1、检查是否存在已注册用户数据,如无用户数据,提醒注册。 2、登录时检查用户ID及密码,提示错误信息:用户不存在,密码错误。 3、提供记住用户名,用户密码,用户自动登录功能,并可以在三种模式下切换。 客户端注册页面实现功能: 1、用户注册,保存注册成功用户数据。 2、检验用户ID,ID只能为字母与数字,不允许中文或其他特殊字符。 3、检查注册用户ID是否已存在,存在时拒绝注册。 4、检查用户密码,用户密码为6-10为字母数字,且首位必须为大写字母。 5、检查两次输入密码是否相同,不相同则提示,拒绝注册。 6、收集用户其他数据,昵称,性别。为可选填对象。 7、如昵称信息未填写,自动分配一个昵称给用户,作为默认昵称。 其中,<欢迎使用XXXX软件><管理员><密码>使用的是左边功能的 label 类、<登录>使用的是左边功能的 Push Button 类、<管理员和密码>的输入使用的是左边功能的 Line Edit 类。这些输出显示和按键功能中的字体大小和边框都可以对应根.. from PyQt5.QtCore import * from PyQt5.QtGui import * ################################################ #######创建主窗口 #############################. class Ui_register_pane(object): def setupUi(self, register_pane): register_pane.setObjectName("register_pane") register_pane.resize(520, 450) 今天给大家分享一个十分不错的pyqt5实现的登录界面,很像qq的登录界面,你可以将此登录界面用到自己的项目中,甚至完全不用修改,只需在自己项目中运行该py文件即可,在输入正确的账号和密码后,就可以进入的自己的主界面。 1、效果图: 2、视频效果图 西瓜视频——pyqt5实现登录界面 3、代码说明 首先最开始,我们自己用代码编写了一个标题栏,用于美化我们的登录界面,但是这个和你主界面的并无关系。在代码190行第载入了一张图片,这个图片你可以随意改变。 palette1.setBrush(self.backg 提示:这里可以添加本文要记录的大概内容: 有同学刚开始学习pyqt5想实现一个注册与登录功能,并且登录完成之后想要跳转界面,但是网上资源太多,详细能够跑成功的代码还要自己筛选,由于项目需要,我自己实现了一个简单的注册,登录,以及登录跳转功能,注册是简单的存放在ini文件中的,登录是从ini文件中取用户名和密码,这个简单的功能,大家来看看是怎么实现的吧,废话不说,直接 1、QtDesigner里绘制UI界面并设置属性 布局根据个人喜好,部件颜色、字体、背景属性在styleSheet里设置。 2、材料转换(将.ui文件转.py,.qrc文件转_rc.py) 通过PyUIC和PyRcc即可完成。 这个没安装的可以参考这篇文章: Pycharm 中配置pyqt5.d
 
推荐文章
乐观的枕头  ·  python找出不是两个数组共有的元素 - CSDN文库
1 年前
谦和的火龙果  ·  查询和分析日志以及查看结果_日志服务(SLS)-阿里云帮助中心
1 年前
会搭讪的茄子  ·  使用JavaScript开发一个Photoshop插件 - 知乎
2 年前
会搭讪的猕猴桃  ·  shell 读取文件内容到数组-掘金
2 年前
满身肌肉的沙滩裤  ·  Set-TransportRule (ExchangePowerShell) | Microsoft Learn
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号