简体   繁体   中英

Python TypeError: __init__() got multiple values for argument 'master'

Trying to build a GUI in Python at the moment, and I'm stuck at this part in particular. Every time I try to run my code it just throws the error TypeError: __init__() got multiple values for argument 'master' . I can't seem to find where I'm passing it more than one value, and it's got me scratching my head. I tried searching the error but the fixes other people had listed I can't see how to make them work with this one. Any guidance would be much appreciated. See code sample below:

class Plotter(tk.Canvas):
    """Creates a canvas for use in a GUI
    Plotter() -> Canvas
    """
    def __init__(self, master, **kwargs):
        super().__init__(self, master = master, **kwargs)
        self.bind("<Configure>", self.on_resize)
        self.height = self.winfo_reqheight()
        self.width = self.winfo_reqwidth()
        self.bg = 'white'
        self.relief = 'raised'

class AnimalDataPlotApp(object):
    """This is the top level class for the GUI, and is hence responsible for
    creating and maintaining instances of the above glasses
    """

    def __init__(self, master):
        """Initialises the window and creates the base window for the GUI.
        __init__() -> None
        """
        master.title('Animal Data Plot App')
        self._master = master
        self._text = tk.Text(master)
        self._text.pack
        menubar = tk.Menu(master)
        master.config(menu = menubar)
        filemenu = tk.Menu(menubar) #puts filemenu into the menubar
        menubar.add_cascade(label = 'File', menu = filemenu)
        filemenu.add_command(label = 'Open', command = self.open_file)

        #frame for canvas
        plotter_frame = tk.Frame(master, bg = 'red')
        plotter_frame.pack(side = tk.RIGHT, anchor = tk.NW, fill = tk.BOTH, expand = True)

        #frame for buttons
        button_frame = tk.Frame(master, bg = 'yellow')
        button_frame.pack(side=tk.TOP, anchor=tk.NW, ipadx=50, fill = tk.X)

        #Label on the top left
        left_label = tk.Label(button_frame, text='Animal Data Sets', bg='orange')
        left_label.pack(side=tk.TOP, anchor=tk.N, fill=tk.X)

        #second frame, for selection list
        selection_frame = tk.Frame(master, bg = 'blue')
        selection_frame.pack(side = tk.LEFT, anchor=tk.NW, fill = tk.BOTH, expand = True)

        #draw buttons in frame
        select = tk.Button(button_frame, text ='Select')
        select.pack(side=tk.TOP, anchor=tk.N)
        deselect = tk.Button(button_frame, text='Deselect')
        deselect.pack(side=tk.TOP, anchor=tk.N)

        self.selectionbox = SelectionBox(selection_frame)
        self.selectionbox.pack(side = tk.TOP, expand = True, fill=tk.BOTH)
        #self._selectionbox.show_animals(self._data)

        self.plotter = Plotter(plotter_frame)
        self.plotter.pack(side = tk.TOP, expand = True, fill=tk.BOTH)
super().__init__(self, master = master, **kwargs)

If you're using super() , you don't need to specify self explicitly.

You are getting that error because self is being interpreted as the argument for master . So it's like if you were calling __init__(master=self, master=master, **kwargs) .

The issue is in the following line in Plotter.__init__() -

super().__init__(self, master = master, **kwargs)

When calling the parent's __init__ method, you do not need to pass the self argument, when you do that, it is getting treated as the master argument for the parent, and then when you try to pass master as master=master , it causes your error.

You should simply do -

super().__init__(master = master, **kwargs)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM