【问题标题】:Passing 3 arguments but trackback says I am passing 4 [duplicate]传递 3 个参数,但引用说我传递了 4 个 [重复]
【发布时间】:2018-06-02 01:35:15
【问题描述】:

几个小时以来,我一直试图在这里找到问题。从我在网上可以找到的情况来看,对于我能找到的与此 TypeError 相关的所有帖子,人们实际上传递的参数比他们想象的要多。由于某种原因,这个问题似乎只发生在我创建一个继承自 Toplevel 的类时。

回击:

Tkinter 回调异常

Traceback (most recent call last):
  File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1699, in __call__
    return self.func(*args)
  File "C:\Users\Makin Bacon\workspace\stuff\MINT-master\test3.py", line 12, in fake_error
    topErrorWindow(self, message, detail)
  File "C:\Users\Makin Bacon\workspace\stuff\MINT-master\test3.py", line 17, in __init__
    tk.Toplevel.__init__(self, master, message, detail)
TypeError: __init__() takes from 1 to 3 positional arguments but 4 were given

我什至尝试将我的参数发送到一个只打印所有参数并且只打印 3 个参数的虚拟函数。

这是我用来测试传递的参数的代码。

import tkinter as tk

class MintApp(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        tk.Button(self, text="test error", command=self.fake_error).pack()

    def fake_error(self):
        message = "test"
        detail = "test detail"
        topErrorWindow(self, message, detail)

def topErrorWindow(*items):
        for item in items:
            print("TEST:  ", item)

if __name__ == "__main__":
    App = MintApp()
    App.mainloop()

结果如下:

TEST:   .
TEST:   test
TEST:   test detail

现在我不确定为什么我会为参数 self 得到一个 .,我认为这可能是问题的一部分,但我在网上找不到任何相关问题。

这是我的代码,我认为应该创建一个带有简单标签的顶级窗口。相反,我得到了上面列出的引用错误。

import tkinter as tk

class MintApp(tk.Tk):

    def __init__(self):
        tk.Tk.__init__(self)
        tk.Button(self, text="test error", command=self.fake_error).pack()

    def fake_error(self):
        message = "test"
        detail = "test detail"
        topErrorWindow(self, message, detail)


class topErrorWindow(tk.Toplevel):
    def __init__(self, master, message, detail):
        tk.Toplevel.__init__(self, master, message, detail)
        tk.Label(self, text = "{}, {}".format(message, detail)).grid(row=0, column=0, sticky="nsew")        

if __name__ == "__main__":
    App = MintApp()
    App.mainloop()

【问题讨论】:

  • 你为什么要明确传递self?
  • @StephenRauch 好吧,我在我作为控制器制作的许多程序中一直在传递自我,它们都可以按预期工作。传递 self 有什么问题吗?我在这里的使用一定是严重误会了。
  • self 在实例上调用实例方法时被隐式传递。
  • tk.Toplevel.__init__() 采用一个可选参数,master。您还将message 和detail 参数传递给它,它不知道如何处理 - 因此出现错误。
  • @chrisz:在这种特定情况下,传递self 是正确的做法,因为它是不 隐式传递的。在子类的__init__ 中调用超类的__init__ 是正确的做法。

标签: python tkinter toplevel


【解决方案1】:

当你这样做时:

tk.Toplevel.__init__(self, master, message, detail)

您将四个参数传递给__init__:self、master、message、detail。但是,正如错误明确指出的那样,Toplevel.__init__ 需要一到三个参数。

我不知道您期望 tkinter Toplevel 类与 message 和 detail 有什么关系,但它们不映射到 Toplevel 的任何参数。

解决方案是不要将无用的参数传递给超类构造函数,因为它们对您的子类有意义,但对超类没有意义:

tk.Toplevel.__init__(self, master)

【讨论】:

  • 谢谢布莱恩。这是我需要摆脱并回来才能看到明显问题的问题之一。我应该能够看到这一点,但由于某种原因,无论我多么盯着代码,它都没有击中我。
  • 您可以对我的测试代码部分发表任何评论吗?它打印 3 行,第一行是一个句点。我想我希望在第一行看到 self 对象打印,那么这个时期是什么时候来的?
  • @Mike-SMT:句号是根窗口的内部名称,就是你得到窗口的字符串表示时得到的。
  • 哦。有趣的。我想我需要找到更多关于类和自我的文档。我刚刚发现有几件事我不清楚。再次感谢您的意见具有教育意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-01
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2015-10-10
  • 2017-03-21
  • 1970-01-01
相关资源
最近更新 更多