将按钮连接到函数时出现问题 (PyQT5)
Problem connecting buttons to a function (PyQT5)
我是 Python 3.8 和 PyQT5 的新手,我正在尝试使用 GUI 创建应用程序。
我用两个 QLineEdits(用户和密码)创建了一个登录表单。一旦用户单击 'Login' 按钮,我想检查用户输入的 User/Password 是否在数据库中,使用它在其他文件中的函数。我为表单创建的 class 与下一个类似:
# Where the check function for the password is
from CLBK_CheckPassword import CheckPassword
from PyQt5 import QtWidgets
class W_Password(QtWidgets.QWidget):
def __init__(self, App):
super(W_Password,self).__init__()
# Set the window title and size
WindowHeight = 400
WindowWeight = WindowHeight/3
self.setWindowTitle("Login Window")
self.resize(WindowHeight,WindowWeight)
# Text box
self.Input_User = QtWidgets.QLineEdit()
self.Input_Password = QtWidgets.QLineEdit()
self.Input_Password.setEchoMode(QtWidgets.QLineEdit.Password)
# Button
self.Button_Login = QtWidgets.QPushButton("Login")
self.Button_Login.clicked.connect(CheckPassword())
# Layout and items positioning
self.Layout = QtWidgets.QGridLayout(self)
self.Layout.addWidget(self.Button_Login,3,2,1,2)
self.Layout.addWidget(self.Label_User,0,0,1,1)
self.Layout.addWidget(self.Input_User,0,1,1,3)
self.Layout.addWidget(self.Label_Password,1,0,1,1)
self.Layout.addWidget(self.Input_Password,1,1,1,3)
这段代码有两个问题:
- 创建并显示表单时,函数 'CheckPassword()' 会自动执行(只有在用户按下按钮时才会执行)。
- 第二个问题是函数执行后出现以下错误:TypeError: argument 1 has unexpected type 'NoneType'
问题 1
您应该将 CheckPassword
函数作为参数传递给事件侦听器 clicked.connect
。
所以
self.Button_Login.clicked.connect(CheckPassword())
行更改为:
self.Button_Login.clicked.connect(CheckPassword)
问题 2
您的函数 CheckPassword
似乎至少需要一个参数。所以你得稍微改变一下逻辑。
您可以使用lambda
表达式:
self.Button_Login.clicked.connect(lambda: (CheckPassword(THE_PARAMETER)))
编辑
答案:如果函数 'CheckPassword' return 有问题怎么办?
如 musicamante 所述,您可以使用另一种方法 运行 您的函数并捕获 return 值,例如:
# Where the check function for the password is
from CLBK_CheckPassword import CheckPassword
from PyQt5 import QtWidgets
class W_Password(QtWidgets.QWidget):
def __init__(self, App):
super(W_Password,self).__init__()
...
self.Button_Login.clicked.connect(lambda: (self.checher()))
...
def checher(self):
value = CheckPassword(THE_PARAMETER)
# Do something with value
我是 Python 3.8 和 PyQT5 的新手,我正在尝试使用 GUI 创建应用程序。
我用两个 QLineEdits(用户和密码)创建了一个登录表单。一旦用户单击 'Login' 按钮,我想检查用户输入的 User/Password 是否在数据库中,使用它在其他文件中的函数。我为表单创建的 class 与下一个类似:
# Where the check function for the password is
from CLBK_CheckPassword import CheckPassword
from PyQt5 import QtWidgets
class W_Password(QtWidgets.QWidget):
def __init__(self, App):
super(W_Password,self).__init__()
# Set the window title and size
WindowHeight = 400
WindowWeight = WindowHeight/3
self.setWindowTitle("Login Window")
self.resize(WindowHeight,WindowWeight)
# Text box
self.Input_User = QtWidgets.QLineEdit()
self.Input_Password = QtWidgets.QLineEdit()
self.Input_Password.setEchoMode(QtWidgets.QLineEdit.Password)
# Button
self.Button_Login = QtWidgets.QPushButton("Login")
self.Button_Login.clicked.connect(CheckPassword())
# Layout and items positioning
self.Layout = QtWidgets.QGridLayout(self)
self.Layout.addWidget(self.Button_Login,3,2,1,2)
self.Layout.addWidget(self.Label_User,0,0,1,1)
self.Layout.addWidget(self.Input_User,0,1,1,3)
self.Layout.addWidget(self.Label_Password,1,0,1,1)
self.Layout.addWidget(self.Input_Password,1,1,1,3)
这段代码有两个问题:
- 创建并显示表单时,函数 'CheckPassword()' 会自动执行(只有在用户按下按钮时才会执行)。
- 第二个问题是函数执行后出现以下错误:TypeError: argument 1 has unexpected type 'NoneType'
问题 1
您应该将 CheckPassword
函数作为参数传递给事件侦听器 clicked.connect
。
所以
self.Button_Login.clicked.connect(CheckPassword())
行更改为:
self.Button_Login.clicked.connect(CheckPassword)
问题 2
您的函数 CheckPassword
似乎至少需要一个参数。所以你得稍微改变一下逻辑。
您可以使用lambda
表达式:
self.Button_Login.clicked.connect(lambda: (CheckPassword(THE_PARAMETER)))
编辑
答案:如果函数 'CheckPassword' return 有问题怎么办?
如 musicamante 所述,您可以使用另一种方法 运行 您的函数并捕获 return 值,例如:
# Where the check function for the password is
from CLBK_CheckPassword import CheckPassword
from PyQt5 import QtWidgets
class W_Password(QtWidgets.QWidget):
def __init__(self, App):
super(W_Password,self).__init__()
...
self.Button_Login.clicked.connect(lambda: (self.checher()))
...
def checher(self):
value = CheckPassword(THE_PARAMETER)
# Do something with value