Как изменить значение всех объектов в классе?

В первый раз тут задаю вопрос... Совсем недавно начал пробовать работать с классами, но у меня возникают проблемы с пониманием их работы.

Что я хотел сделать? Создание n-го количества кнопок в виде объектов класса. После этого я захотел сделать перемещение всех кнопок по команде вниз/вверх. Но передвигается только последняя созданная кнопка. Что я делаю не так?

from tkinter import ttk
from tkinter import * 
import tkinter

class new(object):

 def __init__(self, plant, date):
    self.plant = plant
    self.date = date
    
 def delit(self):
    print(self.date)

 def up(self):
    self.date = int(self.date) - 10
    self.butt.place(x='10',y=self.date) 
 
 def down(self):
    self.date = int(self.date) + 10
    self.butt.place(x='10',y=self.date)     

 def state(self):
    self.butt = Button(windows, text = self.date, command = self.delit)
    self.butt.place(x='10',y=self.date)


windows = Tk()  
windows.geometry('600x600')

L = ['50','100','150','200','250']
for n in L:
    Butto = new(n,n)
    Butto.state()

Up = Button(windows, text = "Вверх", command = Butto.up)
Up.place(x='100',y='10')
Down = Button(windows, text = "Вниз", command = Butto.down)
Down.place(x='100',y='40')    
wind_run.mainloop()

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

Автор решения: S. Nick

Вы создаете экземпляры класса в цикле, перетирая их. Т.е. в итоге по выходу из цикла у вас остается ОДИН объект butto, который вы и перемещаете.

Создайте список объектов и прокручивайте их в цикле Вверх или Вниз.

from tkinter import ttk
from tkinter import * 
import tkinter


class New(object):
    def __init__(self, plant, date):
        super().__init__()
        self.plant = plant
        self.date = date
        self.state()                                                        # +++
    
    def delit(self):
        print(self.date)

    def up(self):
        self.date = int(self.date) - 10
        self.butt.place(x='10', y=self.date) 
 
    def down(self):
        self.date = int(self.date) + 10
        self.butt.place(x='10', y=self.date)     

    def state(self):
        self.butt = Button(windows, text = self.date, command = self.delit)
        self.butt.place(x='10',y=self.date)

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
def clickButtonUp(list_butto, up_down):
    for btn in list_butto:
        if up_down == 'up':
            btn.up()
        elif up_down == 'down':
            btn.down()
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

windows = Tk()  
windows.geometry('600x600')

L = ['50', '100', '150', '200', '250']
list_butto = []                                                                     # +++

for n in L:
    butto = New(n, n)
#    butto.state()
    list_butto.append(butto)                                                        # +++

#Up = Button(windows, text="Вверх", command=butto.up)
Up = Button(windows, text="Вверх", command=lambda: clickButtonUp(list_butto, 'up'))
Up.place(x='100', y='10')


#Down = Button(windows, text = "Вниз", command = butto.down)
Down = Button(windows, text="Вниз", command=lambda: clickButtonUp(list_butto, 'down'))
Down.place(x='100', y='40') 
   
windows.mainloop()

введите сюда описание изображения

→ Ссылка