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
相关产品推荐
相关产品推荐

