Python传递基类的参数

时间:2017-06-20 19:13:04

标签: python class tkinter arguments tkinter-canvas

我试图创建一个子类,Square of tkinter.Canvas,左键单击时会出现一条线。我已经让那部分工作了,但是当我尝试将宽度和高度传递到我的Square类时,我得到了错误:

Traceback (most recent call last):
  File "tictac.py", line 16, in <module>
    square = Square(master=root, width=200, height=200)
  File "tictac.py", line 5, in __init__
    super().__init__(master, width, height)
TypeError: __init__() takes from 1 to 3 positional arguments but 4 were given

我之前遇到过类似的问题,其中&#34; self&#34;作为一个论点被传递。那是什么发生在这里?有人可以向我解释一下这是如何运作的吗?

代码在下面,如果删除对宽度和高度的所有引用,它可以正常工作,显然不是我想要的宽度和高度。

import tkinter as tk

class Square(tk.Canvas):
        def __init__(self, master=None, width=None, height=None):
                super().__init__(master, width, height)
                self.pack()
                self.bind("<Button-1>", self.tic)


        def tic(self, event):
                """"This will draw a nought or cross on the selected Square."""
                self.create_line(0, 0, 200, 100)


root = tk.Tk()
square = Square(master=root, width=200, height=200)
root.mainloop()

1 个答案:

答案 0 :(得分:3)

该错误中的关键词是“位置”。您将参数作为位置传递,应作为关键字参数传递。改变这一行:

super().__init__(master, width, height)

super().__init__(master, width=width, height=height)

作为旁注,Canvas.__init__的呼叫签名是:

__init__(self, master=None, cnf={}, **kw)

因此,三个可能的位置参数是self(在调用绑定方法时自动提供),mastercnfmastercnf是可选的。