我是python的新手,我正在尝试做类似的事情:我有两个类,一个用于构建GUI表单,另一个用于处理请求。提交按钮位于GUI表单上,句柄操作位于句柄类中。
所以我尝试从GUI类调用handle类,所以我做了类似的事情:
class Appview:
def __init__(self, master):
master.title("Simple EXCEL")
master.resizable(False, False)
self.filename = ""
self.input_file = ttk.Entry(self.frame_content, textvariable = self.filename, width = 24)
self.input_file.grid(row = 2, column = 1, pady = 5, padx = 5)
ttk.Button(self.frame_content, text = "choose file", command = self.browse_file).grid(row = 2, column = 2)
#ADDING#
a = HandleData(self)
ttk.Button(self.frame_content, text = "add", command = HandleData.submit).grid(row = 3, column = 0 ,columnspan = 3, pady = 5)
"""
Choosing a file to browse
"""
def browse_file(self):
self.filename = filedialog.askopenfilename(title = 'Choose a ffffile')
self.input_file.insert(0, self.filename) #updating the file entry
这是Handle类:
class HandleData:
def __init__(self):
self.the_file = Appview.filename.get()
def submit(self):
messagebox.showinfo(title = "Okie Dokie", message = "well done: {}".format(self.the_file))
但我一直收到这个错误:
追踪(最近的呼叫最后):
文件“C:\ Users \ Amir \ workspace \ Python Workout \ main.py”,第91行,如果__ name__ ==“__ main__”:main()
在主文件中输入文件“C:\ Users \ Amir \ workspace \ Python Workout \ main.py”,第88行 appview = Appview(root)
文件“C:\ Users \ Amir \ workspace \ Python Workout \ main.py”,第60行,在__ init__中 a = HandleData(self)
TypeError:__ init __()需要1个位置参数,但是2个被赋予了
请问任何想法?
答案 0 :(得分:1)
当你这样做时 -
a = HandleData(self)
您正在尝试创建HandleData
的实例(对象),在创建实例时,调用__init__()
(在创建对象之后),第一个参数作为创建的实例本身,所以当您发送self
时,它会成为__init__()
的第二个参数,但__init__()
中的HandleData
只接受一个参数,因此会出现问题。
您可以让HandleData
接受可能是AppView的第二个参数,然后在HandleData.submit
中,您可以从此对象获取文件名。示例 -
HandleData -
class HandleData:
def __init__(self, appview):
self.appview = appview
def submit(self):
filename = self.appview.filename
messagebox.showinfo(title = "Okie Dokie", message = "well done: {}".format(filename))
这会从filename
中的实例变量filename
获取AppView
的数据,如果您想要条目input_file
中的数据,则可以使用 -
filename = appview.input_file.get()
为什么需要对submit()
和HandleData
进行更改是因为我们在执行__init__()
时无法获取文件名,因为您在HandleData
中为AppView.__init__()
创建了对象{1}},所以在此之前你还没有选择任何文件名。因此,您要将appview
对象保存在self.appview
中,单击submit
按钮时,您将访问设置为它的filename
属性并执行逻辑。
AppView类的更改 -
self.datahandler = HandleData(self)
ttk.Button(self.frame_content, text = "add", command = self.datahandler.submit).grid(row = 3, column = 0 ,columnspan = 3, pady = 5)
答案 1 :(得分:0)
max-height:" ";
看看这个,你通过自己经过什么?你所在的类的引用。但a = HandleData(self)
需要它所属的类的引用,它会自动获取它。
所以,它基本上得到2个参数,其中1应该得到。
尝试:
HandleData
答案 2 :(得分:0)
您需要__init__
函数中的额外参数来保存第二个类:
def __init__(self, other_class):
self.the_file = other_class.filename.get()
然后你可以这样称呼它:
a = HandleData(self)
因为在这种情况下self
引用了AppView
类。在HandleData
班级时#39; __init__
函数指的是HandleData
类。
在这里查看关于课程的docs。