2016-12-10 8 views
0

私はのpythonにかなり新しく、学習中はプロジェクトに取り組んでいます。これは非常に楽しいものです。この例では、オブジェクト指向プログラミングでどれくらいの作業量を節約できるのか困っています。素晴らしいもの!オブジェクトからデータを収集する方法

同時に、これが私を悩ませます。

ここでの考え方は、ユーザからのデータのいくつかのセットを収集MainAppにを作成することです。 各セットは1行のプリセットで表示されます。

例としては、次のようになります。

SET1: Name_____、Age__、Height__、Weigh__、...

SET2:表面積___、レベル__、コスト__、__ Staffmembers、...

SETX: ...ユーザーは0123を、 "SET1を追加" ボタンを押すことができ

"Set SetX"または"add SetX"を追加して、異なるセットで構成されるフォームを作成します。多くの人が望んでいる。

すべての記入が完了しました。ユーザーは"データの収集"を押すと、すべての入力が処理されます。 最初の部分はすべて完了していますが、このデータ収集では頭がおかしくなります。誰かがこれを達成する方法を私に指摘できますか?前もって感謝します! これが理解できるといいですね。ここで

は私のコードです:(私は)うまくいけば(読み、それは短く、より簡単にするために、それを変更した)

FILE:

# some imports 

class InputWidget(QtWidgets.QWidget): 

    def __init__(self): 
     super().__init__() 
     self.input1(self): 

    def input1(self): # diplays a QHBoxLayout with several QLineEdits for input.  

     # fancy layout QLineEdits: 
     self.lineEdit01 = QtWidgets.QLineEdit("Enter text here") 

    def collect_data_input1(self): 
     input1_list = [] 
     input1_list.append(str(self.lineEdit01.text())) #ERROR points here. 
     input1_list.append(str(self.lineEdit02.text())) 

     ... 

     input1_list.append(str(self.lineEdit-1.text())) 

if __name__ == '__main__': 
    app_inputWidget = QtWidgets.QApplication(sys.argv) 
    a_InputWidget = InputWidget() 
    sys.exit(app_input_Widget.exec_()) 

inputfunctions.pyその後で私と同じディレクトリにある別のファイル:

from inputfunctions import InputWidget 
# some more imports 

class Main_app(QtWidgets.QMainWindow): 

    def __init__(self): 
     super().__init__() 
     self.MainWindow() 

    def MainWindow(self): 

     # setting up UI 
     self.central = QtWidgets.QWidget() 

     self.add_Button = QtWidgets.QPushButton("Add Widget") 
     self.collect_Button = QtWidgets.QPushButton("Collect Data") 
     self.layout = QtWidgets.QVBoxLayout() 
     self.layout.addWidget(self.add_Button) 
     self.layout.addWidget(self.collect_Button) 

     self.central.setLayout(self.layout) 
     self.setCentralWidget(self.central) 
     self.show() 

     # connect 
     self.add_Button.clicked.connect(self.add_widget) 
     self.collect_Button.clicked.connect(self.collect_data) 

    def add_widget(self): 
     self.layout.addWidget(InputWidget) # this adds an InputWidget to the layout, when "Add Widget" is pressed. 

    def collect_data(self): 
     # HERE I want to collect all the data: 
     InputWidget.collect_data_input1(self) # this should fill input1_list 

しかし、私はこのエラーを取得:

はAttributeError:「Main_app」オブジェクトが属性を持っていない「lineEdit01」 私はこれが何を意味するかを理解しないが、私はそれを行うための正しい方法を把握することはできません。私の検索でも私を啓発することはできませんでした。 私はさまざまなことを試しましたが、うまく動作しません。誰かがこれを行う方法を説明してもらえますか?

ありがとうございます。

+1

提供されたソースコードを編集して、** AttributeError:**の発生場所にコメントを追加できますか? –

+0

それに応じてコードを編集しました。また、私は間違いを犯したことに気付きました。今は正しいエラーです。 – michaelh

+0

あなたのコードを読んで、エラーは 'self.InputWidget'属性エラーと言うべきです... InputWigdetはクラスそのものであり、自己アプリケーションの属性ではありません –

答えて

1

それ以外の場合は、そのエラーメッセージはできませんので、私は、あなたがMain_app()への呼び出しを行ったどこか仮定)私はどのようにこのQtライブラリの作品を知っていると主張しませんが、私は

1を試してみましょう。いったんそれがあれば、ブロック__init__(self)が呼ばれます。

Main_app()にパラメータを指定しないで、selfはすでに提供されています。これがPythonのオブジェクト指向プログラミングの仕組みです。

2)それでもself.MainWindow()を呼び出してください。self.MainWindow(self)ではありません。これにより、Main_appインスタンスの「属性」が引き続き設定されます。

3)私は完全には、この作品... self.layout.addWidget(InputWidget)あなたがクラスではなく、インスタンスを追加したので確信していません。私のコードは、限りこれに関しては、その後self.InputWidget.collect_data_input1(self)

def add_widget(self): 
    widget = InputWidget() # this creates an instance of a new widget 
    self.layout.addWidget(widget) 

を読むべきだと思うだろう、私はすでに言った、selfcollect_data_input1()へのパラメータである必要はなく、問題は何があるということですself.InputWidget?これをクラスの属性として割り当てていません。あなたのボタンには多くのものが追加されていますInputWidget、だから、すべてのデータを集めていますか?

はこれに対処するために、私はあなたがエラーについて、今リスト


def MainWindow(self): 
    ... 
    self.input_widgets = [] # prepare an empty list for widgets 

def add_widget(self): 
    self.input_widgets.append(InputWidget()) 

def collect_data(self): 
    data = [widget.collect_data_input1() for widget in self.input_widgets] 

    for d in data: 
     print(data) # for example 
を作成することができると信じて、私は InputWidgetクラスで __main__機能は、それはおそらく InputWidgetを作成すべきではないと思います Main_appを作成する必要があります。その後、ウィジェットを追加します。繰り返しますが、私はこのライブラリのメインウィンドウをどのように起動するのか分かりません。

さらに、コンストラクタ内でセカンダリメソッドを呼び出す必要はありません。そこに変数を代入するだけです。

class InputWidget(QtWidgets.QWidget): 

    def __init__(self): 
     super().__init__() 
     # self.input1(self): # this line is wrong anyways 

     self.lineEdit01 = QtWidgets.QLineEdit("Enter text here") 
     self.lineEdit02 = QtWidgets.QLineEdit("foo") 

    def collect_data_input1(self): 
     input1_list = [] 
     input1_list.append(str(self.lineEdit01.text())) # Should work fine 
+0

あなたの広範な答えをありがとう!私はちょうどそれを介して働いて、それは動作します! OOPでいくつかのことを明確にしていただきありがとうございます。それは大いに役立ちます。あなたが3)で言及​​したことはまったく正しいです。以前はうまくいきましたが、あなたのバージョンはもっと理にかなっています。私のデータを収集するあなたのソリューションは完全に機能します。私はあなたが 'widget.collect_data_input1()'のようなことをすることができるかどうかを知りませんでした。すばらしいです!ありがとう、とても素敵な夜を! – michaelh

+0

ええ、 'for self.input_widgets'は' list-comprehension 'と呼ばれます。本当に便利です –

関連する問題