Есть два подхода. Один основан на лямбдах:
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")