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

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

我是 python 的新手,正在尝试学习为 raspberry pi 编写 GUI。我目前只是按照在线教程在 QT 设计器中创建 GUI。我的 QT 设计器有一个我从其他开发人员添加的自定义小部件,用于在 GUI 中显示 LED。 widget/module是qledplugin.py保存在qt5.plugins.designer下的"python"文件夹里,我把qled.py保存在.local.lib.[=42下=]3.5.site-包。

我创建了一个基本的 GUI,文件保存为 mainwindow.ui。我用pyuic将其转换为python3并保存为mainwindow.py。然后我编写了一个名为 main.py 的基本主程序来启动 GUI。没有任何功能,它应该只是加载我在 window 中创建的 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 的新手,也许我错过了一些东西。感谢所有帮助。

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

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

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

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_())

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()