@Durilka96

Как узнать индекс динамического виджета tkinter?

Создаю на форме несколько фреймов, как мне узнать индекс необходимого чтобы кнопка выполнила необходимое действие в нужных виджетах? выглядит вот так..
61cde9f8ca943607014730.png
как прописать код чтобы нужная кнопка удаляла или забирала данные с нужных edit?
код примерно такой для создания
def test_dinamic():
    global widgets
    global frames
    doth=tix.Tk()
    frames = []
    widgets = []
    for i in range(2):
        frame = Frame(doth, borderwidth=2, relief="groove")
        frames.append(frame)
        frame.pack(side="top", fill="x")
        for i in range(3):
            widget = Entry(frame)
            widgets.append(widget)
            widget.pack(side="left")
        buttonFrame_update=Button(frame,text="Добавить", command=update_main_db)
        buttonFrame_update.pack(side="right")
        buttonFrame_update = Button(frame, text="Удалить", command=delet_frame)
        buttonFrame_update.pack(side="right")

    doth.mainloop()

def update_main_db():
    global widgets
    print(widgets[0].get())

def delet_frame():
    global frames
    frames[0].destroy()
  • Вопрос задан
  • 274 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Есть два подхода. Один основан на лямбдах:
for i in range(2):
    buttonFrame_update=Button(frame,text="Добавить", command= lambda arg=i: update_main_db(arg))

Приём с аргументом лямбды необходим, чтобы сохранить текущее значение i - иначе в момент вызова лямбды она прочитает последнее значение i, а оно будет указывать на последнюю строку.

Второй способ, которя я бы выбрал - написать свой виджет - строку таблицы. Тогда обработчик нажатия на кнопку сможет брать данные из экземплярной переменной.
class MyTableRow(Frame):
    def __init__(self, master, *args, **kwargs):
        super().__init__(master, *args, **kwargs)
        self.widgets = []
        for i in range(3):
            widget = Entry(frame)
            widget.pack(side="left")
            self.widgets.append(widget)
        self.update_btn = Button(self, text = "Добавить", command = self.update_clicked)
        self.update_btn.pack(side="right")
        self.delete_btn = Button(self, text = "Удалить", command = self.delete_clicked)
        self.delete_btn.pack(side="right")
  
    def update_clicked(self):
        print(self.widgets[0].get())
    
    def delete_clicked(self):
        print("whatever")


for i in range(2):
    item = MyTableRow(doth, borderwidth=2, relief="groove")
    frames.append(item)
    item.pack(side="top", fill="x")
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
SpectrumData Екатеринбург
от 150 000 до 200 000 ₽
Гринатом Москва
от 150 000 ₽
DIGITAL SECTOR Краснодар
от 150 000 до 250 000 ₽