Как узнать какую именно кнопку нажал пользователь. 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 шт):
Можно подключить все кнопки к одной функции и передавать туда при нажатии её 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()
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])
Как вариант
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()

