PyQT5 和 Python3 "exit(a.exec_())" NameError: name 'a' is not defined

Posted

技术标签:

【中文标题】PyQT5 和 Python3 "exit(a.exec_())" NameError: name \'a\' is not defined【英文标题】:PyQT5 and Python3 "exit(a.exec_())" NameError: name 'a' is not definedPyQT5 和 Python3 "exit(a.exec_())" NameError: name 'a' is not defined 【发布时间】:2017-01-05 17:52:49 【问题描述】:

我是 python 新手,正在尝试学习为树莓派编写 GUI。我目前只是按照在线教程在 QT 设计器中创建 GUI。我的 QT 设计器有一个自定义小部件,我从另一个开发人员那里添加了该小部件,用于在 GUI 中显示 LED。小部件/模块是 qledplugin.py 并保存在 qt5.plugins.designer 下的“python”文件夹中,我将 qled.py 保存在 .local.lib.python3.5.site-packages 下。

我创建了一个基本的 GUI,文件保存为 mainwindow.ui。我使用 pyuic 将其转换为 python3 并保存为 mainwindow.py。然后我编写了一个名为 main.py 的基本主程序来启动 GUI。没有任何功能,它应该只是加载我在窗口中创建的 GUI。我遇到的问题是当我运行python3 main.py 时出现以下错误

myself@my-own-computer:~/Programming/Projects/GenUi$ python3 main.py
    Traceback (most recent call last):
      File "main.py", line 6, in <module>
        import mainwindow
      File "/home/clint/Programming/Projects/GenUi/mainwindow.py", line 86, in <module>
        from qled import QLed
      File "/home/clint/.local/lib/python3.5/site-packages/qled.py", line 398, in <module>
        exit(a.exec_())
    NameError: name 'a' is not defined

发生错误的qled.py的代码是

if __name__=="__main__":
    from sys import argv, exit
    import sys

    class Test(QWidget):
        def __init__(self, parent=None):
            QWidget.__init__(self, parent)

            self.setWindowTitle("QLed Test")

            _l=QGridLayout()
            self.setLayout(_l)

            self.leds=[]
            for row, shape in enumerate(QLed.shapes.keys()):
                for col, colour in enumerate(QLed.colours.keys()):
                    if colour==QLed.Grey: continue
                    led=QLed(self, onColour=colour, shape=shape)
                    _l.addWidget(led, row, col, Qt.AlignCenter)
                    self.leds.append(led)

            self.toggleLeds()

        def toggleLeds(self):
            for led in self.leds: led.toggleValue()
            QTimer.singleShot(1000, self.toggleLeds)

    a = QApplication(sys.argv)
    t = Test()
    t.show()
    t.raise_()
exit(a.exec_())

在 qled.py 的代码顶部我有

from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QSizePolicy, QStyleOption
from PyQt5.QtCore import pyqtSignal, Qt, QSize, QTimer, QByteArray, QRectF, pyqtProperty
from PyQt5.QtSvg import QSvgRenderer
from PyQt5.QtGui import QPainter

main.py 的代码是

import sys
import PyQt5

from PyQt5.QtWidgets import *

import mainwindow

class MainWindow(QMainWindow, mainwindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
    self.setupUi(self)

    def main():
        app = QApplication(sys.argv)
        form = MainWindow()
        form.show()
sys.exit(app.exec_())

if __name__ == "__main__":
    main()

'a' 是在退出之前定义的,但程序仍然认为它是未定义的。我确实必须为 python3 修改一些东西,因为它是用 python2.7 编写的,但我是 python 新手,也许我错过了一些东西。感谢所有帮助。

【问题讨论】:

您的代码示例只有一些简单的缩进错误,很容易修复。请在发布前仔细检查您的代码。 【参考方案1】:

Python 对缩进非常严格。在这两种情况下,你都没有尊重它。在第一种情况下,出口(a.exec_())if __name __ == "__ main__": 在同一级别,这应该在里面。另一种情况:

def main():
        app = QApplication(sys.argv)
        form = MainWindow()
        form.show()

它与类的函数处于同一级别,这是一个严重的错误,因为它不是类方法;你必须把它搬出去。

qled.py

if __name__=="__main__":
    from sys import argv, exit
    import sys

    class Test(QWidget):
        def __init__(self, parent=None):
            QWidget.__init__(self, parent)

            self.setWindowTitle("QLed Test")

            _l=QGridLayout()
            self.setLayout(_l)

            self.leds=[]
            for row, shape in enumerate(QLed.shapes.keys()):
                for col, colour in enumerate(QLed.colours.keys()):
                    if colour==QLed.Grey: continue
                    led=QLed(self, onColour=colour, shape=shape)
                    _l.addWidget(led, row, col, Qt.AlignCenter)
                    self.leds.append(led)

            self.toggleLeds()

        def toggleLeds(self):
            for led in self.leds: led.toggleValue()
            QTimer.singleShot(1000, self.toggleLeds)

    a = QApplication(sys.argv)
    t = Test()
    t.show()
    t.raise_()
    exit(a.exec_())

ma​​in.py

import sys
import PyQt5

from PyQt5.QtWidgets import *

import mainwindow

class MainWindow(QMainWindow, mainwindow.Ui_MainWindow):
    def __init__(self):
        super(self.__class__, self).__init__()
    self.setupUi(self)

def main():
    app = QApplication(sys.argv)
    form = MainWindow()
    form.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

【讨论】:

感谢您的详尽解释。如前所述,我是一名初学者,并且正在按照我的 main.py 代码的教程进行操作,因此我很欣赏我出错的地方的具体说明。 qled.py 是从 github 上的一个项目中复制的,用户在该项目中将其创建为 QT Designer 的插件,所以错误不是我的,我只是修改了导入以支持 pyqt5 和 python3。

以上是关于PyQT5 和 Python3 "exit(a.exec_())" NameError: name 'a' is not defined的主要内容,如果未能解决你的问题,请参考以下文章

用PyQt5和python3.6做一个最简单的GUI的程序

如何编写 Dockerfile 来运行 Python3 + PyQt5

python3.7安装PyQt5和tensorflow以及opencv

PyQt5 & PySide2 / 无法在“”中加载 Qt 平台插件“windows”,即使找到了

Pyqt5 Python3 QPushButton 默认 StrongFocus 颜色或选项卡选择颜色

活动期间 GUI 没有变化? (Python3.6,PyQt5)