Как узнать какую именно кнопку нажал пользователь. Tkinter. Python

У меня создаются кнопки в цикле, их название и прочее берется из списка.
То есть, каждую итерацию цикла все переменные, который были связаны с прошлыми кнопками перезаписываются.

Как после нажатия на одну их них узнать какая именно была?

Вот отрывок кода:

    notes_list = ['one', 'two', 'three']  # по факту имена файлов

    for i in notes_list:
        fp = open(f'user_notes/{i}.txt')  # Путь к файлу
        listt = list(fp.read().split(';')) # Переделываю в список
        fp.close()
        # В listt хранятся имена время, это я и записываю в кнопки
        but_notes = tk.Button(text=f'Имя: {listt[0]} Время: {listt[1]}', 
                         bg='#363636', font=('Arvo', '11', 'bold'),
                         width=100, command=lambda: library_notes.info_notes_try(1))
         but_notes.pack()

вот мое приложение


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

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

Можно подключить все кнопки к одной функции и передавать туда при нажатии её id(индекс) из списка.

import tkinter as tk

def on_button_click(button_id):
    last_button_label.config(text=f"Последняя нажатая кнопка: {button_list[button_id]}")

def create_buttons():
    for i, str_button in enumerate(button_list):
        my_button = tk.Button(root, text=str_button, command=lambda i=i: on_button_click(i))
        my_button.pack()

button_list = ["Кнопка 1", "Кнопка 2", "Кнопка 3"]

root = tk.Tk()
root.title("Генератор кнопок")

last_button_label = tk.Label(root, text="Последняя нажатая кнопка: - None")
last_button_label.pack()

create_buttons()

root.mainloop()
→ Ссылка
Автор решения: dresqd

button в Tkinter поддерживает параметр command. В этот параметр передается имя функции, которая будет вызываться нажатием на кнопку.

def click(): 
    print("Hello")

btn = ttk.Button(text="Click", command=click)

В данном примере при нажатии на кнопку в консоль будет выводиться текст «Hello»

Для того, чтобы передавать параметр функции, которая привязывается к command можно воспользоваться следующим способом:

command = lambda: func(num)

В вашем случае можно попробовать что-то в этом роде:

def num_return(button_text):
    print(button_text)

И при создании кнопки прописать параметр command в виде:

command = lambda: num_return(listt[0])
→ Ссылка
Автор решения: S. Nick

Как вариант

import tkinter as tk


win = tk.Tk()
win.geometry("400x200")

def info_notes_try(btn):                                      # +++ btn
    print(f"{btn['text']}")                                   # +++


#notes_list = ['one', 'two', 'three']       
notes_list = [['one', 'Время1'], ['two', 'Время2'], ['three', 'Время3']]
   
#for i in notes_list:
#    fp = open(f'user_notes/{i}.txt')       # Путь к файлу
#    listt = list(fp.read().split(';'))     # Переделываю в список
#    fp.close()
for listt in notes_list:
        
    # В listt хранятся имена время, это я и записываю в кнопки
    but_notes = tk.Button(
        text=f'Имя: {listt[0]}; Время: {listt[1]}', 
        bg='#998877', font=('Arvo', '11', 'bold'),
        width=100, 
#        command=lambda: library_notes.info_notes_try(1)
    )
    
    but_notes.configure(command=lambda btn=but_notes: info_notes_try(btn))     # +++
    
    but_notes.pack()
        
win.mainloop()        

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

→ Ссылка