从类中调用python中的另一个类

时间:2015-09-22 06:35:26

标签: python class inheritance

我是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个被赋予了

请问任何想法?

3 个答案:

答案 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