2017-01-05 6 views
0

私はPythonには新しく、ラズベリーパイのGUIを書くことを学びます。私は現在、QTデザイナーでGUIを作成するオンラインチュートリアルに従っています。私のQTデザイナーには、別の開発者がGUIにLEDを表示するために追加したカスタムウィジェットがあります。ウィジェット/モジュールはqledplugin.pyで、qt5.plugins.desingerの下の "python"フォルダに保存され、qled.pyを.local.lib.python3.5.site-packagesの下に保存しました。PyQT5とPython3 "exit(a.exec_())" NameError:名前 'a'が定義されていません

私は基本的なGUIを作成し、ファイルはmainwindow.uiとして保存されます。私はpyuをpython3に変換するために使用し、mainwindow.pyとして保存しました。その後、GUIを起動するためのmain.pyという基本的なメインプログラムを書きました。関数はありません。ウィンドウで作成した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のコードが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() 
です

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 

を持っています

'a'は終了の直前に定義されていますが、プログラムではまだ未定義とみなされます。 python2.7で書かれているので、私はpython3のいくつかを修正しなければなりませんでしたが、私は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

関連する問題