如何在 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 的反应式应用程序中从身份验证中排除路径?