tkinter python函数接受1个参数,给定2

时间:2016-08-12 00:17:34

标签: python tkinter

我在尝试运行代码时收到此错误:

File "./countdown.py", line 36, in <module>
    app = Application(root)
File "./countdown.py", line 16, in __init__
    self.create_buttons(self)
TypeError: create_buttons() takes exactly 1 argument (2 given)

这是我的代码:

import Tkinter as tk

class Application(tk.Frame):
  """Countdown app - simple timer"""

  def __init__(self, master):
    """initialize frame"""
    tk.Frame.__init__(self, master)
    #super(Application, self).__init__(master)
    self.grid()
    self.create_buttons(self)

  def create_buttons(self):
    self.startBttn = Button(app, text = "Start")
    self.startBttn.grid()
    self.stopBttn = Button(app, text = "Stop")
    self.stopBttn.grid()
    self.resetBttn = Button(app, text = "Reset")
    self.resetBttn.grid()


### Main Code ###

# create the root window using Tk - an object of tkinter class
root = tk.Tk()

# modify the prog. window (set size, title, etc.)
root.title("Countdown")
root.geometry("200x100")
#instantiate Application
app = Application(root)

我一直在寻找这个问题的答案,但是还没有能够将其他人的解决方案应用到我的代码中 - 任何想法?如果我删除tk。在类应用程序声明中的Frame之前我收到一条错误,指出找不到Frame。如果我使用 super(应用程序,自我).__ init __(master)而不是上面的行,我得到的类型错误必须是class而不是class对象。

1 个答案:

答案 0 :(得分:3)

调用绑定方法时,不要显式传递self。这样称呼:

self.create_buttons()

通过使用self.create_buttons(self)调用该方法,该函数接收两个参数:调用绑定方法时传递的隐式self(Python自动执行此操作),以及您在方法调用中传递的显式self

create_buttons()还存在一些其他问题,您可以使用此代码修复此问题:

  def create_buttons(self):
    self.startBttn = tk.Button(self, text = "Start")
    self.startBttn.grid()
    self.stopBttn = tk.Button(self, text = "Stop")
    self.stopBttn.grid()
    self.resetBttn = tk.Button(self, text = "Reset")
    self.resetBttn.grid()

更改是您需要使用tk.Button来引用Button类,并将self传递给tk.Button,这是对父框架的引用。此处selfApplication实例,它是tk.Frame的子类 - 因此self是一个框架。

最后,您需要添加对mainloop()的调用:

#instantiate Application
app = Application(root)
root.mainloop()

关于super的问题,tkinter类属于&#34;旧式&#34;输入并且不支持super()。因此,您必须使用tk.Frame.__init__(self, master)调用基类。

通过使用多重继承并包含object作为基类,有一种解决方法。如果您将Application声明为:

class Application(tk.Frame, object):
    def __init__(self, master):
        """initialize frame"""
        super(Application, self).__init__(master)

然后你可以使用super(),但它几乎不值得努力。