PyQT5 и Python3 "exit(a.exec_())" NameError: имя 'a' не определено

Я новичок в Python и пытаюсь научиться писать графический интерфейс для Raspberry Pi. В настоящее время я просто следую онлайн-учебнику по созданию графического интерфейса в QT Designer. У моего дизайнера QT есть собственный виджет, который я добавил от другого разработчика для отображения индикатора в графическом интерфейсе. Виджет / модуль qledplugin.py и сохранен в папке "python" в qt5.plugins.designer, а я сохранил qled.py в.local.lib.python3.5.site-packages.

Я создал базовый графический интерфейс, и файл сохраняется как mainwindow.ui. Я использовал pyuic для преобразования его в python3 и сохранил как mainwindow.py. Затем я написал основную основную программу main.py для запуска графического интерфейса. Там нет никаких функций, он должен просто загрузить графический интерфейс, который я создал в окне. Проблема, с которой я сталкиваюсь, заключается в том, что когда я бегу 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_())

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()
Другие вопросы по тегам