2016-12-10 66 views
0

我對python非常陌生,同時學習我正在從事一個項目。這非常有趣,在這個例子中,我發現自己對面向對象編程可以節省多少工作感到困惑。好東西!如何從對象收集數據

與此同時,這是什麼讓我卡住了。

想法這裏的想法是創建一個MainApp從用戶收集多組數據。 每組都以一行預設顯示。

例子是:

SET1: Name_____,Age__,Height__,Weigh__,...

SET2:表面積___,___水平,成本__,__ Staffmembers,...

SETX: ...

,用戶可以按下按鈕「添加設置1」,「add Set2」「add SetX」創建一個由不同集合組成的表單。儘可能多的他/他想要的。

完成所有填寫完成後。用戶將點擊「收集數據」並且所有的輸入都將被處理。第一部分全部完成,但這些數據收集令我頭疼。有人能告訴我這是如何實現的嗎?提前致謝! 我希望這是可以理解的。

這裏是我的代碼:(我已經修改了它,使之更短,更易於閱讀(希望))

文件:在inputfunctions.py

# 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_()) 

然後我有同一個目錄中的不同文件:

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

我並不知道這是如何Qt庫的作品,但我會盡力

1)我假設的地方你已經做出Main_app()一個電話,否則,該錯誤信息是不可能的。一旦你有,那裏的__init__(self)塊被調用。

注意:您不提供參數Main_app()self已經提供。這就是Python中面向對象編程的工作原理。

2)繼續致電self.MainWindow(),再次注意,不是self.MainWindow(self)。這繼續設置Main_app實例的「屬性」。

3)我不完全確定這個工程... self.layout.addWidget(InputWidget),因爲你已經添加了一個類,而不是一個實例。我認爲的代碼應閱讀

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

然後,就這方面來說,self.InputWidget.collect_data_input1(self),我已經說過,self並不需要註冊後才能collect_data_input1()一個參數,而問題是,什麼是self.InputWidget?您尚未將其分配爲課程中的某個屬性。而你的按鈕添加了很多InputWidget's,那麼哪一個正在收集所有的數據?

爲了解決這個問題,我相信你可以創建一個列表

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

是的,'self.input_widgets中的小部件'被稱爲列表理解。有時候這很有用 –