如何从对象

时间:2016-12-10 20:55:39

标签: python class object

我是 python 的新手,在学习我正在研究一个项目时。这很有趣,在这个例子中,我发现自己对使用面向对象编程可以节省多少工作感到困惑。好东西!

与此同时,这就是让我陷入困境的原因。

这个想法是创建一个 MainApp ,它从用户那里收集几组数据。 每组都以一行预设显示。

例子如下:

SET1:姓名_____,年龄___,身高___,体重_,......

SET2: SurfaceArea ___,Levels __,Cost __,Staffmembers __,...

SETX: ...

用户可以按“添加Set1”“添加Set2”“添加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 个答案:

答案 0 :(得分: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,那么哪一个正在收集所有数据?

为了解决这个问题,我相信你可以创建一个列表

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

现在,关于错误,我认为__main__类中的InputWidget函数不应该创建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