类型错误:generatecode()需要0个位置参数,但提供了1个。

42

我有以下代码:

from tkinter import *

class Window(Frame): 
    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()

    
    def init_window(self):
        self.master.title("COD:WWII Codes")
        self.pack(fill=BOTH, expand=1)
        codeButton = Button(
                        self, 
                        text="Generate Code", 
                        command=self.generatecode
                     )
        codeButton.place(x=0, y=0)

    def generatecode(self):
        f = open("C:/Programs/codes.txt", "r")
        t.insert(1.0. f.red())

root = Tk()
root.geometry("400x300")
app = Window(root)
root.mainloop()

然后,我收到了以下错误:

TypeError: generatecode()需要0个位置参数,但给出了1个

那么,我该如何解决这个错误呢?


4
请修正您的缩进。您有两个 generatecode() 的定义。self.generatecode() 是一个绑定方法,这意味着 self 将作为第一个参数传递。 - AChampion
3个回答

102
当你在一个类上调用方法(例如这里的 generatecode()),Python 会自动将 self 作为第一个参数传递给函数。所以当你调用 self.my_func() 时,更像是调用 MyClass.my_func(self)
因此,当 Python 告诉你 "generatecode() takes 0 positional arguments but 1 was given" 时,它告诉你的是你的方法设置不需要任何参数,但是在调用该方法时仍然传递了 self 参数,所以实际上它收到了一个参数。
在你的方法定义中添加 self 应该解决这个问题。
def generatecode(self):
    pass  # Do stuff here

或者,你可以将该方法设为静态方法,在这种情况下Python 不会self作为第一个参数传递:

另外,您可以使该方法成为静态方法,在这种情况下Python不会将self作为第一个参数传递:

@staticmethod
def generatecode():
    pass  # Do stuff here

1
非常感谢。这个有效了,但是当我点击生成代码时,它显示t.insert未定义?我已经发布了新代码。 - Jason Martin
你需要在你的方法中引用那个文本框。我没有看到在你展示的代码中定义任何文本框。 - Nikolas Stevenson-Molnar
1
无论如何,最好还是开一个新问题,因为这个问题已经解决了。并且将原始问题更改回显示导致错误的原始代码。否则,这会让阅读该问题的人感到困惑(因为您现在拥有的代码不会产生错误)。 - Nikolas Stevenson-Molnar
2
经过几个小时的挣扎,我终于找到了你 :} - 1UC1F3R616
2
我也尝试了100种其他方法...现在,多亏了你和stackoverflow,我终于可以安心完成我的代码了。 - Shravya Mutyapu
显示剩余2条评论

3
我得到了相同的错误:
``` TypeError: test() takes 0 positional arguments but 1 was given ```
当定义一个没有 `self` 的实例方法,并且我像下面这样调用它时。
class Person:
          # ↓↓ Without "self"     
    def test(): 
        print("Test")

obj = Person()
obj.test() # Here

所以,我将self放入实例方法中并调用它:
class Person:
            # ↓↓ Put "self"     
    def test(self): 
        print("Test")

obj = Person()
obj.test() # Here

然后,错误被解决了:
Test

此外,即使使用self定义实例方法,我们也不能直接通过类名调用它,如下所示:
class Person:
            # Here     
    def test(self): 
        print("Test")

Person.test() # Cannot call it directly by class name

然后,出现以下错误:

TypeError: test()缺少1个必需的位置参数:'self'

但是,如果定义一个没有self的实例方法,我们可以通过类名直接调用它,如下所示:
class Person:
          # ↓↓ Without "self"     
    def test(): 
        print("Test")

Person.test() # Can call it directly by class name

然后,我们可以得到以下结果,没有任何错误:
Test

详细来说,我在我的回答中解释了Python中的实例方法,并在Python中的“实例方法”是什么?中进行了说明,同时在我的回答中解释了@staticmethod@classmethod,并在Python中的@classmethod vs @staticmethod中进行了说明。

0

最受欢迎的答案确实解决了这个问题,

如果有人在jupyternotebook中进行此操作,只需重新启动jupyternotebook的内核即可使更改更新到notebook中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接