簡體   English   中英

PyQT5和Python3“ exit(a.exec_())” NameError:未定義名稱“ a”

[英]PyQT5 and Python3 “exit(a.exec_())” NameError: name 'a' is not defined

我是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的新手,也許我錯過了一些東西。 所有幫助表示贊賞。

Python對縮進非常嚴格。 在兩種情況下,您都沒有尊重它。 在第一種情況下,出口(a.exec_())if __name __ == "__ main__":處於同一級別,該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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM