Python NameError: global name 'Form' is not defined pyqt

Python NameError: global name 'Form' is not defined pyqt

我正在尝试设计 Garage App。该应用程序有两个选项(登录、注册) 当用户选择登录时,此小部件调用 'Welcome Window'。

程序应该关闭 'Welcome Window' 并打开另一个名为 'Log In' 的小部件,然后 'Log In' 小部件有两个按钮:'Ok' 和 'Back'。当用户按下 'Back' 时,它应该关闭 'Log In' 小部件并重新打开 'Welcome Window'。但是它打开 'Welcome window' 没有关闭 'Login window' 并引发错误

NameError: global name 'Form' is not defined code of 'WelcomeWidget'

from PyQt4 import QtCore, QtGui
import SignIN

try:
     _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
     def _fromUtf8(s):
         return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, 
_encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(object):
    def SignINF(self):
        self.SignINWindow = QtGui.QWidget()
        self.ui = SignIN.Ui_Form()
        self.ui.setupUi(self.SignINWindow)
        self.SignINWindow.show()
        Form.close()
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(500, 360)
        Form.setStyleSheet(_fromUtf8("background-image: 
url(:/img/Screenshot from 2017-09-20 17-37-17.png);"))
        self.pushButton_2 = QtGui.QPushButton(Form)
        self.pushButton_2.setGeometry(QtCore.QRect(120, 290, 75, 31))
        self.pushButton_2.setStyleSheet(_fromUtf8("color: rgb(255, 
255, 255);\n"
"font: 63 oblique 12pt \"URW Gothic L\";"))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.pushButton_2.clicked.connect(self.SignINF)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(29, 291, 75, 31))
        self.pushButton.setStyleSheet(_fromUtf8("color: rgb(255, 255, 
255);\n"
"font: 63 oblique 12pt \"URW Gothic L\";"))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.label = QtGui.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(30, 50, 458, 34))
        font = QtGui.QFont()
        font.setFamily(_fromUtf8("DejaVu Serif"))
        font.setPointSize(22)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.label.setFont(font)
        self.label.setStyleSheet(_fromUtf8("color: rgb(255, 255, 
255);\n"
"font: 75 22pt \"DejaVu Serif\";\n"
""))
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(360, 330, 131, 20))
        self.label_2.setStyleSheet(_fromUtf8("color: rgb(255, 255, 
255);\n"
"font: 63 italic 10pt \"URW Chancery L\";"))
        self.label_2.setObjectName(_fromUtf8("label_2"))

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

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.pushButton_2.setText(_translate("Form", "Sign In", None))
        self.pushButton.setText(_translate("Form", "Sign Up", None))
        self.label.setText(_translate("Form", "Welcome To Our Smart 
Garage", None))
        self.label_2.setText(_translate("Form", "Power By AIET 
Students", None))

import iamge_rc

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

代码 'Sign In Widget'

from PyQt4 import QtCore, QtGui
import WelFrame

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(object):
    def Back(self):
        self.WelcomWindow = QtGui.QWidget()
        self.ui = WelFrame.Ui_Form()
        self.ui.setupUi(self.WelcomWindow)
        self.WelcomWindow .show()
        Form.close()
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(500, 360)
        Form.setStyleSheet(_fromUtf8("background-image: url(:/img/Screenshot from 2017-09-20 17-37-17.png);"))
        self.gridLayout = QtGui.QGridLayout(Form)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.label = QtGui.QLabel(Form)
        self.label.setStyleSheet(_fromUtf8("color: rgb(255, 255, 255);\n"
"font: 63 oblique 12pt \"URW Gothic L\";"))
        self.label.setObjectName(_fromUtf8("label"))
        self.gridLayout.addWidget(self.label, 0, 0, 1, 1)
        self.lineEdit = QtGui.QLineEdit(Form)
        self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 1)
        self.lineEdit_2 = QtGui.QLineEdit(Form)
        self.lineEdit_2.setObjectName(_fromUtf8("lineEdit_2"))
        self.gridLayout.addWidget(self.lineEdit_2, 1, 1, 1, 1)
        self.pushButton_2 = QtGui.QPushButton(Form)
        self.pushButton_2.setStyleSheet(_fromUtf8("color: rgb(255, 255, 255);\n"
"font: 63 oblique 12pt \"URW Gothic L\";"))
        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
        self.pushButton_2.clicked.connect(self.Back)
        self.gridLayout.addWidget(self.pushButton_2, 2, 0, 1, 1)
        self.pushButton = QtGui.QPushButton(Form)
        self.pushButton.setStyleSheet(_fromUtf8("color: rgb(255, 255, 255);\n"
"font: 63 oblique 12pt \"URW Gothic L\";"))
        self.pushButton.setObjectName(_fromUtf8("pushButton"))
        self.gridLayout.addWidget(self.pushButton, 2, 1, 1, 1)
        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setStyleSheet(_fromUtf8("color: rgb(255, 255, 255);\n"
"font: 63 oblique 12pt \"URW Gothic L\";"))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.gridLayout.addWidget(self.label_2, 1, 0, 1, 1)

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

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Form", None))
        self.label.setText(_translate("Form", "Enter User Name", None))
        self.pushButton_2.setText(_translate("Form", "Cancel", None))
        self.pushButton.setText(_translate("Form", "OK", None))
        self.label_2.setText(_translate("Form", "Enter Password", None))

import iamge_rc

if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Form = QtGui.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)
    Form.show()
    sys.exit(app.exec_())

导入SignIn -> SignIN代码

导入WelFrame->欢迎代码Window

我一直建议您不要修改 Qt Designer 创建的文件。这些classes是面向设计的,所以最优雅的是创建一个class来实现逻辑并使用以前的设计,classes必须具有以下结构:

class LogicClass(QWidget, Ui_SomeDesign):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setupUi(self)

所以我建议您删除对设计的所有修改 classes 或使用 pyuic 创建它们。

对于您的情况,我建议创建另一个名为 main.py 的文件,该文件与您的其他脚本位于同一文件夹中:

.
├── main.py <-- new file
├── SignIn.py
└── WelFrame.py

在这个文件中,我们创建 classes 来实现您的设计逻辑并实现一个方法来执行关闭当前小部件和显示新小部件的任务

import sys
from PyQt4.QtGui import QWidget, QApplication

from SignIn import Ui_Form as SignInForm
from WelFrame import Ui_Form as WelFrameForm


class Sign(QWidget, SignInForm):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setupUi(self)


class WelFrame(QWidget, WelFrameForm):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setupUi(self)

def foo(w1, w2):
    w1.show()
    w2.hide()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    wel = WelFrame()
    sign = Sign()
    wel.pushButton_2.clicked.connect(lambda : foo(sign, wel))
    sign.pushButton_2.clicked.connect(lambda: foo(wel, sign))
    wel.show()
    sys.exit(app.exec_())