将按钮连接到函数时出现问题 (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)

这段代码有两个问题:

  1. 创建并显示表单时,函数 'CheckPassword()' 会自动执行(只有在用户按下按钮时才会执行)。
  2. 第二个问题是函数执行后出现以下错误: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