如何在 PYQT5 中从数据库进行身份验证后显示用户名

Posted

技术标签:

【中文标题】如何在 PYQT5 中从数据库进行身份验证后显示用户名【英文标题】:How to display username after authentication from database in PYQT5 【发布时间】:2018-04-20 17:12:18 【问题描述】:

我有 2 个类文件 login-form.py 和 welcome.py

在 login-form.py 中,使用 sqlite3 数据库对用户进行身份验证。

login-form.py 的代码

from PyQt5 import QtCore, QtGui, QtWidgets
from welcome import Ui_MainWindow
import sqlite3

class Ui_Dialog2(object):
    def login_check(self):
        uname = self.U_name_text.text()
        passw = self.pass_text.text()
        connection = sqlite3.connect("login.db")
        result = connection.execute("SELECT * FROM USERS WHERE USERNAME = ? AND PASSWORD = ?", (uname, passw))
    if (len(result.fetchall()) > 0):
        print("Login success")
        self.welcomewindow = QtWidgets.QMainWindow()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self.welcomewindow)
        Dialog.hide()
        self.welcomewindow.show()
    else:
        print("invalid login")

def setupUi2(self, Dialog):
    Dialog.setObjectName("Dialog")
    Dialog.resize(301, 386)
    Dialog.setStyleSheet("QDialog\n"
                         "background-color: rgb(167, 210, 255);\n"
                         "\n"
                         "QPushButton\n"
                         "background-color: rgb(255, 255, 255);\n"
                         "border:none;\n"
                         "\n"
                         "QLabel\n"
                         "color:rgb(255, 23, 54);\n"
                         "font-size:20px;\n"
                         "")
    self.U_name_Lable = QtWidgets.QLabel(Dialog)
    self.U_name_Lable.setGeometry(QtCore.QRect(20, 110, 111, 21))
    self.U_name_Lable.setObjectName("U_name_Lable")
    self.Pass_Lable = QtWidgets.QLabel(Dialog)
    self.Pass_Lable.setGeometry(QtCore.QRect(20, 150, 111, 21))
    self.Pass_Lable.setObjectName("Pass_Lable")
    self.label = QtWidgets.QLabel(Dialog)
    self.label.setGeometry(QtCore.QRect(60, 30, 201, 31))
    font = QtGui.QFont()
    font.setPointSize(-1)
    self.label.setFont(font)
    self.label.setStyleSheet("QLabel#label\n"
                             "font-size:30px;\n"
                             "")
    self.label.setObjectName("label")
    self.pass_text = QtWidgets.QLineEdit(Dialog)
    self.pass_text.setGeometry(QtCore.QRect(140, 150, 131, 20))
    self.pass_text.setObjectName("pass_text")
    self.login_button = QtWidgets.QPushButton(Dialog)
    self.login_button.setGeometry(QtCore.QRect(140, 190, 61, 23))
    self.login_button.setObjectName("login_button")
    ##############button event################
    self.login_button.clicked.connect(self.login_check)
    ##########################################
    self.sighup_button = QtWidgets.QPushButton(Dialog)
    self.sighup_button.setGeometry(QtCore.QRect(210, 190, 61, 23))
    self.sighup_button.setObjectName("sighup_button")
    self.U_name_text = QtWidgets.QLineEdit(Dialog)
    self.U_name_text.setGeometry(QtCore.QRect(140, 110, 131, 20))
    self.U_name_text.setStyleSheet("")
    self.U_name_text.setObjectName("U_name_text")

    self.retranslateUi(Dialog)
    QtCore.QMetaObject.connectSlotsByName(Dialog)

def retranslateUi(self, Dialog):
    _translate = QtCore.QCoreApplication.translate
    Dialog.setWindowTitle(_translate("Dialog", "Dialog"))
    self.U_name_Lable.setText(_translate("Dialog", "USER NAME"))
    self.Pass_Lable.setText(_translate("Dialog", "PASSWORD"))
    self.label.setText(_translate("Dialog", "LOGIN FORM"))
    self.login_button.setText(_translate("Dialog", "Login"))
    self.sighup_button.setText(_translate("Dialog", "Sign-up"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Dialog = QtWidgets.QDialog()
    ui = Ui_Dialog2()
    ui.setupUi2(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

登录后我想在 Welcome.py 文件中的 QlineEdit 中显示用户名

welcome.py 的代码

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(800, 600)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.label = QtWidgets.QLabel(self.centralwidget)
    self.label.setGeometry(QtCore.QRect(220, 90, 151, 61))
    font = QtGui.QFont()
    font.setFamily("Times New Roman")
    font.setPointSize(28)
    font.setBold(True)
    font.setWeight(75)
    self.label.setFont(font)
    self.label.setObjectName("label")
    self.label_2 = QtWidgets.QLabel(self.centralwidget)
    self.label_2.setGeometry(QtCore.QRect(20, 300, 551, 61))
    self.lineEdit = QtWidgets.QLineEdit(MainWindow)
    self.lineEdit.setGeometry(QtCore.QRect(130, 220, 113, 20))
    self.lineEdit.setObjectName("lineEdit")
    font = QtGui.QFont()
    font.setFamily("Times New Roman")
    font.setPointSize(28)
    font.setBold(True)
    font.setWeight(75)
    self.label_2.setFont(font)
    self.label_2.setObjectName("label_2")
    MainWindow.setCentralWidget(self.centralwidget)
    self.statusbar = QtWidgets.QStatusBar(MainWindow)
    self.statusbar.setObjectName("statusbar")
    MainWindow.setStatusBar(self.statusbar)

    self.retranslateUi(MainWindow)
    QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
    _translate = QtCore.QCoreApplication.translate
    MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
    self.label.setText(_translate("MainWindow", "Welcome"))
    self.label_2.setText(_translate("MainWindow", "Good Morning "))


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

我是 python GUI 的新手,我不知道如何将值从一种形式获取到另一种形式。

【问题讨论】:

【参考方案1】:

您实施解决方案的方式不可扩展,这会给您带来很多麻烦。 Qt Designer 建议不要修改它生成的类或文件,因为例如你想改变一个窗口的颜色,添加一些小部件,你将不得不重写所有的逻辑,这是浪费时间和金钱。

Qt Designer 生成的类不是小部件,而是用来填充小部件的类。

你应该做的是创建另一个文件来处理逻辑并使用 Qt Designer 生成的类。

在这种情况下,您必须消除对使用 Qt Designer 生成的 .py 文件的更改。

建议:使用合适的文件名,不要使用-,因为这些文件可以被另一个文件导入,如果你不遵守python语法规则,你会得到问题。所以把login-form.py的名字改成login_form.py

您必须创建一个将调用 main.py 并在其中处理逻辑的新文件,因为它是一个 QDialog,登录将使用 exec_() 而不是 show(),并验证它是否被调用到 accept()通过返回的结果。

import sqlite3

from PyQt5 import QtCore, QtGui, QtWidgets

from login_form import Ui_Dialog2
from welcome import Ui_MainWindow

class LoginDialog(QtWidgets.QDialog, Ui_Dialog2):
    def __init__(self, *args, **kwargs):
        QtWidgets.QDialog.__init__(self, *args, **kwargs)
        self.setupUi(self)
        self.login_button.clicked.connect(self.login_check)

    def login_check(self):
        uname = self.U_name_text.text()
        passw = self.pass_text.text()
        connection = sqlite3.connect("login.db")
        result = connection.execute("SELECT * FROM USERS WHERE USERNAME = ? AND PASSWORD = ?", (uname, passw))
        if result.fetchall():
            self.accept()
        else:
            print("invalid login")

class WelcomeWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self, *args, **kwargs):
        QtWidgets.QMainWindow.__init__(self, *args, **kwargs)
        self.setupUi(self)


if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    login = LoginDialog()
    w = WelcomeWindow()
    if login.exec_() == QtWidgets.QDialog.Accepted:
        username = login.U_name_text.text()
        w.lineEdit.setText(username)
        w.show()
    sys.exit(app.exec_())

完整的例子可以在下面的link找到。

【讨论】:

谢谢这是一些很好的建议。但我的逻辑仍然不清楚。你能分享一些其他的例子吗。 @user3135049 您的实现不正确,我无法确定您的进度,因为答案质量很差,不会为未来的读者服务,所以您了解我添加的所有更改链接您将看到完整且可行的代码。 @user3135049 你想要什么例子? 一个结构良好的小型应用程序将帮助我了解其工作原理。如果您做过任何操作。仅用于教育目的。 @user3135049 查看以下内容:github.com/CodeHuntersLab/CuriElements

以上是关于如何在 PYQT5 中从数据库进行身份验证后显示用户名的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Node.js 中从请求参数获取经过身份验证的用户到 socket.io

在 Flutter 的下拉列表中从 Firebase 获取经过身份验证的用户列表

对如何在 Blazor App 中从 B2C 获取访问令牌感到困惑

如何在基于 Spring 的反应式应用程序中从身份验证中排除路径?

我们如何在 powerBI 中从 graphql api 获取数据

无法在 codeigniter 中从 gmail 发送电子邮件,SMTP 身份验证错误