Выдаёт: TypeError: function() missing 1 required positional argument: 'self'

from tkinter import Button, Tk

class Anything(Button):
    
     def function(self):
            self['bg'] = "red"
    
w = Tk()
a = Anything(w, text=0, bd=5, font=2, command=Anything.function)
a.pack()
w.mainloop()

Ответы (1 шт):

Автор решения: insolor

function - это метод объекта, если его передать в command как метод класса, то при нажатии на кнопку оно будет вызвано как без передачи параметра self.

Т.е. сейчас при нажатии происходит такое:

from tkinter import Button, Tk


class Anything(Button):
    
    def function(self):
        self['bg'] = "red"


w = Tk()
a = Anything(w, text=0, bd=5, font=2)
command = Anything.function
command()  # TypeError: function() missing 1 required positional argument: 'self'

А должно быть так:

from tkinter import Button, Tk


class Anything(Button):
    
    def function(self):
        self['bg'] = "red"


w = Tk()
a = Anything(w, text=0, bd=5, font=2)
command = a.function
command()  # Выполнится без ошибок

В данном случае можно переопределив метод __init__, и в нем уже добавить параметр command с передачей метода function как метода самого объекта (self):

from tkinter import Button, Tk


class Anything(Button):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs, command=self.function)

    def function(self):
        self['bg'] = "red"


w = Tk()
a = Anything(w, text=0, bd=5, font=2)
a.pack()
w.mainloop()

Или установить значение command уже после создания объекта, и передать туда a.function:

from tkinter import Button, Tk


class Anything(Button):
    
    def function(self):
        self['bg'] = "red"

    
w = Tk()
a = Anything(w, text=0, bd=5, font=2)
a.config(command=a.function)
a.pack()
w.mainloop()
→ Ссылка