用self.close 关闭UI窗体,需要点击两次才生效,求解

UI窗口 Login.py 代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_mainWindow(object):
    def setupUi(self, mainWindow):
        mainWindow.setObjectName("mainWindow")
        mainWindow.resize(538, 344)
        font = QtGui.QFont()
        font.setPointSize(16)
        mainWindow.setFont(font)
        self.centralwidget = QtWidgets.QWidget(mainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit.setGeometry(QtCore.QRect(180, 50, 133, 20))
        self.lineEdit.setText("")
        self.lineEdit.setObjectName("lineEdit")
        self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
        self.lineEdit_2.setGeometry(QtCore.QRect(180, 90, 133, 20))
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(100, 50, 64, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(100, 90, 64, 16))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(120, 140, 81, 41))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(240, 140, 81, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(170, 10, 131, 31))
        font = QtGui.QFont()
        font.setPointSize(22)
        self.label_3.setFont(font)
        self.label_3.setObjectName("label_3")
        mainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(mainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 538, 23))
        self.menubar.setObjectName("menubar")
        mainWindow.setMenuBar(self.menubar)
        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", "系统登录"))
        self.label.setText(_translate("mainWindow", "用户名:"))
        self.label_2.setText(_translate("mainWindow", "密  码:"))
        self.pushButton.setText(_translate("mainWindow", "登  录"))
        self.pushButton_2.setText(_translate("mainWindow", "取  消"))
        self.label_3.setText(_translate("mainWindow", "欢迎使用!!"))


主函数 Login_inherit.py 代码如下:

from PyQt5 import QtWidgets,QtGui,QtCore
from Login import Ui_mainWindow

class My_MainWindow(QtWidgets.QMainWindow,Ui_mainWindow):
    def __init__(self, parent=None):
        super(My_MainWindow,self).__init__(parent)     #初始化
        self.setupUi(self)
        print("打开了窗口!")
        self.pushButton.clicked.connect(self.login)
        self.pushButton_2.clicked.connect(self.My_close)     #调用逻辑代码

    def My_close(self):
        self.pushButton_2.clicked.connect(self.close)  # 单击链接到 MainWindow.close() ,自带关闭窗口函数
        print("你点击了取消按钮")

    def login(self):
        from PyQt5.QtWidgets import QMessageBox
        QMessageBox.information(MainWindow,"登录信息","用户名:" + self.lineEdit.text() + "密码:" + self.lineEdit_2.text(),QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)
        #最后的QMessageBox.Yes表示默认选择了Yes


import sys
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = My_MainWindow()
    MainWindow.show()
    sys.exit(app.exec_())

调用login函数功能正常,但是在调用My_close时需要点击两次“取消”才能关闭窗体。是什么造成的?怎么样来解决这个问题,做到点击一次就关闭。

“Devil组”引证GPT后的撰写:

  • 在My_close函数中,当点击“取消”按钮时,它首先与self.My_close链接,然后再与self.close链接。这意味着在第一次单击时,它仅与self.My_close链接,而不会关闭窗口。只有在第二次单击时,才会与self.close链接,从而关闭窗口。
  • 为了解决这个问题,我们可以将self.pushButton_2.clicked.connect(self.close)移动到__init__函数中。这样,每次单击“取消”按钮时,都会直接关闭窗口,而不需要多次单击。

修改后的My_MainWindow代码如下:

class My_MainWindow(QtWidgets.QMainWindow,Ui_mainWindow):
    def __init__(self, parent=None):
        super(My_MainWindow,self).__init__(parent)     #初始化
        self.setupUi(self)
        print("打开了窗口!")
        self.pushButton.clicked.connect(self.login)
        self.pushButton_2.clicked.connect(self.My_close)     #调用逻辑代码
        self.pushButton_2.clicked.connect(self.close)  # 添加这一行
 
    def My_close(self):
        print("你点击了取消按钮")


现在,无论单击多少次“取消”按钮,窗口都会立即关闭