类型错误:generatecode() 采用 0 个位置参数,但给出了 1 个[重复]

问题描述 投票:0回答:3

我有以下代码:

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():
        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 个

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

python class tkinter arguments self
3个回答
109
投票

当您调用类上的方法时(例如本例中的

generatecode()
),Python 会自动将
self
作为函数的第一个参数传递。所以当你打电话给
self.my_func()
时,它更像是在打电话给
MyClass.my_func(self)

因此,当 Python 告诉您“generatecode() 接受 0 个位置参数,但给出了 1 个”时,它是在告诉您,您的方法已设置为不接受任何参数,但在调用该方法时仍会传递

self
参数,所以事实上它正在接收一个参数。

self
添加到方法定义中应该可以解决问题。

def generatecode(self):
    pass  # Do stuff here

或者,您可以将该方法设置为静态,在这种情况下,Python 将不会

self
作为第一个参数传递:

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

6
投票

我遇到了同样的错误:

TypeError:test() 采用 0 个位置参数,但给出了 1 个

定义没有

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中的“实例方法”?,并解释了@staticmethod@classmethod我的答案中,@classmethod vs @staticmethod in Python


0
投票

以防万一有人在 jupyternotebook 中执行此操作。您必须重新启动 jupyternotebook 的内核才能在笔记本中更新更改

© www.soinside.com 2019 - 2024. All rights reserved.