我是 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' 我明白这意味着什么,但我无法找到正确的方法。我的搜索也无法启发我。 我尝试了很多不同的东西,但我无法让它发挥作用。有人可以解释一下如何做到这一点吗?
提前致谢。
答案 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