2017-01-05 69 views
0

我是python的新手,並試圖學習爲覆盆子pi編寫GUI。我目前只是遵循一個在線教程來在QT設計器中創建一個GUI。我的QT設計師有一個自定義小部件,我從其他開發人員添加到GUI中顯示LED。小部件/模塊是qledplugin.py並保存在qt5.plugins.desinger下的「python」文件夾中,並將qled.py保存在.local.lib.python3.5.site-packages下。PyQT5和Python3「退出(a.exec_())」NameError:未定義名稱'a'

我創建了一個基本的GUI,並將文件保存爲mainwindow.ui。我用pyuic將其轉換爲python3並保存爲mainwindow.py。然後我寫了一個名爲main.py的基本主程序來啓動GUI。沒有功能,它應該簡單地加載我在窗口中創建的GUI。我遇到的問題是,當我運行python3 main.py我收到以下錯誤

[email protected]:~/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很陌生,也許我錯過了一些東西。所有幫助讚賞。

+2

你的代碼示例只是幾個簡單的縮進錯誤,這很容易固定。張貼之前請仔細檢查您的代碼。 – ekhumoro

回答

0

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

謝謝你的詳細解釋。如前所述,我是一名初學者,並且正在跟隨我的main.py代碼的教程,所以我很欣賞我錯誤出現的具體注意事項。 qled.py是從github上的一個項目中複製而來的,用戶將它創建爲QT Designer的插件,所以錯誤不是我的,我只是修改了導入以支持pyqt5和python3。 – Terydan