首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyQT5和Python3 "exit(a.exec_())“NameError: name 'a‘未定义

PyQT5和Python3 "exit(a.exec_())“NameError: name 'a‘未定义
EN

Stack Overflow用户
提问于 2017-01-05 17:52:49
回答 1查看 1.5K关注 0票数 0

我对python很陌生,并试图学习为raspberry pi编写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时,我会得到以下错误

代码语言:javascript
复制
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的代码是

代码语言:javascript
复制
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代码的顶部,我有

代码语言:javascript
复制
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的代码是

代码语言:javascript
复制
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()

‘’是在退出之前定义的,但是程序仍然认为它是未定义的。我确实需要为python3修改一些东西,因为它是用python2.7编写的,但是我对python还不熟悉,可能我漏掉了一些东西。所有的帮助都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-05 18:41:16

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

代码语言:javascript
复制
def main():
        app = QApplication(sys.argv)
        form = MainWindow()
        form.show()

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

qled.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41491591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档