You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5跨文件导入UI时条件触发关闭窗口报NameError求助

报错原因

NameError的本质是变量作用域问题:

  • 单独运行第一个文件时,if __name__ == "__main__"块中定义的Dialog属于demo.py的全局变量,action方法可以直接读取到
  • 通过第二个入口文件启动时,Dialog是入口文件内的局部变量,Ui_Login类的action方法没有该变量的访问权限,因此触发未定义错误。
修复方法

在setupUi方法中将传入的窗口实例保存为类属性,后续在类方法中通过self访问该实例即可,不需要修改入口文件代码。
修改后的demo.py代码如下:

from PyQt5 import QtCore, QtGui, QtWidgets
import sys


class Ui_Login(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.setFixedSize(196, 134)
        # 保存窗口实例为类属性
        self.dialog = Dialog

        self.button = QtWidgets.QPushButton(Dialog)
        self.button.setGeometry(QtCore.QRect(10, 100, 61, 21))
        self.button.setObjectName("Button")

        self.button.clicked.connect(self.action)

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

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Login"))
        self.button.setText(_translate("Dialog", "Button"))

    def action(self):
        condition1 = True
        condition2 = True
        condition3 = True
        # 布尔值可直接判断,无需冗余的==True写法
        if condition1 and condition2 and condition3:
            # 通过类属性访问窗口实例调用关闭方法
            self.dialog.close()


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("Fusion")
    Dialog = QtWidgets.QDialog()
    ui = Ui_Login()
    ui.setupUi(Dialog)
    Dialog.show()
    sys.exit(app.exec_())

修改后无论直接运行demo.py还是通过入口文件启动,满足全部条件时点击按钮都可以正常关闭窗口。

内容的提问来源于stack exchange,提问作者Reywaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 04:15:14