DD.close() NameError: 全局名称 'DD' 未定义

Posted

技术标签:

【中文标题】DD.close() NameError: 全局名称 \'DD\' 未定义【英文标题】:DD.close() NameError: global name 'DD' is not definedDD.close() NameError: 全局名称 'DD' 未定义 【发布时间】:2018-03-08 17:14:00 【问题描述】:

pyqt4,成功登录后我的登录窗口关闭并打开下一个窗口。即很好,但是如果我想关闭下一个窗口并转到登录窗口,则会显示错误

这是我的代码

登录.py

import DD

from PyQt4.QtGui import QMessageBox

from PyQt4.QtGui import *

from LoginError import LoginError

import os

class Ui_Login(object):

    def closeEvent(self, event):
        # type: (close) -> object
        QtGui.QMainWindow.closeEvent(self, event)
        self.saveLayout()


    def loginCheck(self):

        username = self.lineEdit_adminusername.text()
        password = self.lineEdit_adminpassword.text()
        for line in open("password.txt", "r").readlines():  # Read the lines
            # str = in.readlines();
            # str1 = in.readlines();
            loginCheck_info = line.split()  # Split on the space, and store the results in a list of two strings
            # if username == str and password == str1:
            if username == loginCheck_info[0] and password == loginCheck_info[1]:
                print("Correct credentials!")
                try:
                    self.window = QtGui.QMainWindow()
                    self.ui = DD.Ui_DD()
                    self.ui.setupUi(self.window)
                    self.window.show()
                    Login.close()
                    return True
                except LoginError:
                    sys.exit()
                sys.exit(app.exec_())


            else:
                print "Incorrect credentials!!!"
                widget = QWidget()
                message = QtGui.QMessageBox.warning(widget, "Warning", "Please enter valid username and password")
                return False
                # print("Incorrect credentials.")
                # return False
            line.close()

    def reboot(self, event):
        widget = QWidget()
        message = QtGui.QMessageBox.question(widget, "Reboot", "Do you really want to Reboot?",
                                             QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
        if message == QtGui.QMessageBox.Yes:
            print "Rebooting..........."
            os.system("reboot")

        else:
            print "Continue"
            global true;
            true = 1;

    def shutdown(self, event):
        widget = QWidget()
        message = QtGui.QMessageBox.question(widget, "Shutdown", "Do you really want to Shutdown?",
                                             QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
        if message == QtGui.QMessageBox.Yes:
            print "Going to shutting down..........."
            os.system("poweroff")

        else:
            print "Continue"
            global true;
            true = 1;

        self.btn_adminlogin = QtGui.QPushButton(self.frame)
        self.btn_adminlogin.setObjectName(_fromUtf8("btn_adminlogin"))
        self.btn_adminlogin.clicked.connect(self.loginCheck)
        self.gridLayout_2.addWidget(self.btn_adminlogin, 1, 0, 1, 1)
        self.gridLayout_3.addLayout(self.gridLayout_2, 0, 0, 1, 1)

DD.py

from PyQt4 import QtCore, QtGui

import Login

from PyQt4.QtGui import QMessageBox

from PyQt4.QtGui import *

import os

import time

class Ui_DD(object):

    def Start(self):
        global true;
        true = 1;
        print "Start"
        widget = QWidget()
        message = QtGui.QMessageBox.information(widget, "Welcome", "Data Transfer Start")
        while true == 1:
            path = "/home/greensystem/PycharmProjects/data/"
            itemsTextList = 0
            for f in os.listdir(path):
                if os.path.isfile(os.path.join(path, f)):
                    itemsTextList += 1

            print "Total number of files in: " + path + " -", itemsTextList
            time.sleep(1)
            out = str(itemsTextList)
            self.textBrowser.setText(out)
            QtGui.qApp.processEvents()

    def Stop(self):
        global true;
        true = 0;
        print "Stop"
        widget = QWidget()
        QMessageBox.warning(widget, "Welcome", "Data Transfer Stop")
        # sys.exit()


    def close(self, event):
        #global DD
        widget = QWidget()
        message = QtGui.QMessageBox.question(widget, "Quit", "Do you really want to quit?",
                                             QtGui.QMessageBox.Yes | QtGui.QMessageBox.No, QtGui.QMessageBox.No)
        if message == QtGui.QMessageBox.Yes:
            print "exit"
            self.window = QtGui.QMainWindow()
            self.ui = Login.Ui_Login()
            self.ui.setupUi(self.window)
            self.window.show()
            #DD.hide()
            DD.close()


        else:
            print "Continue"
            global true;
            true = 1;

        self.label_7 = QtGui.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(10, 460, 131, 41))
        self.label_7.setStyleSheet(_fromUtf8("image: url(:/newPrefix/index.jpeg);"))
        self.label_7.setText(_fromUtf8(""))
        self.label_7.setObjectName(_fromUtf8("label_7"))
        self.label_7.mousePressEvent = self.close

【问题讨论】:

我是 python 新手,请帮助我。 您能否更具体地说明错误以及您猜它失败的原因?无论如何,我认为如果辅助窗口以任何方式由主要对象维持,则可能是这样。但不知道。 错误是正确的凭据!退出 Traceback(最近一次调用最后一次):文件“/home/jai-bholenath/Downloads/withBlueshade/DD.py”,第 73 行,关闭 DD.close() NameError: global name 'DD' is not defined 登录完成并移动到第二个窗口并正确关闭登录窗口。但是,如果注销第二个未关闭的窗口。我知道有一些愚蠢的逻辑,但我无法理解这一点.. 是因为您正在执行 DD.close() 但这仅在您从主对象导入 DD 时才有意义。你关闭了上下文中不存在的东西。只是想办法关闭自己。我不知道python,但类似 ​​self.window.close() ?然后再次启动主程序。 【参考方案1】:

我发现您的程序存在两个主要问题。

首先,为什么两个 Ui 相互依赖?您已经在 Login.py 中完成了 import DD 和在 DD.py 中完成了 import Login 这对我来说毫无意义。您应该做的是拥有第三个文件,例如 Main.py 并将 Login 和 DD 都导入其中。然后您可以轻松地从一个窗口跳到另一个窗口。

其次,在 DD.py 中,没有名为 DDobject。您的班级名为Ui_DD,位于DD.py 中。所以如果你打电话给DD.close(),python 应该认为DD 是什么?因此投诉NameError

一个简单的类比:考虑一家名为“XYZ Inc.”的公司。还有一个叫“P先生”的员工。您正试图通过说“XYZ Inc.,滚出去!”来摆脱“P 先生”。这没有任何意义。在您的情况下,DD.py 是“XYZ Inc”,而“Ui_DD”是“P 先生”。

【讨论】:

感谢马库斯先生。我会尝试你的概念并尽快回复。再次感谢 我创建了 main.py 新文件并在主文件中调用这两个文件。 所以现在您可以将登录和其他小部件放在一个循环中,可以这么说。 太棒了。我建议您提供一个简单的代码来显示它如何解决您的问题并接受它。这样你和网站都会成长...... :)

以上是关于DD.close() NameError: 全局名称 'DD' 未定义的主要内容,如果未能解决你的问题,请参考以下文章

NameError:未定义全局名称“reduce”

NameError:未定义全局名称“QColor”

NameError:未定义全局名称“lower”

熊猫不进口吗? 'NameError:未定义全局名称'pandas''

NameError:未定义全局名称

NameError:未定义全局名称“记录器”