Выдаёт: 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()