Я хочу, чтобы мои кнопки, когда я нажимаю на них, возвращали их текстовый атрибут.
Я использовал цикл for для динамического создания кнопок, но когда я это делаю, переменная btn застревает на последней созданной кнопке, что означает, что каждая кнопка возвращает одно и то же текстовое значение.
listWords = ("Car","Train","Bus","Bike")
var = 0
def getdef():
print(btn['text'])
for word in listWords:
btn = Button(window, text=word,command=getdef)
btn.grid(column=var, row=0)
var = var + 1
Этот код создает 4 кнопки: Изображение кнопок
Однако независимо от того, какую кнопку я нажимаю, btn['text'] всегда будет возвращать Bike. Я хочу, чтобы на выходе была сама кнопка, например, когда я нажимаю автомобиль, я хочу, чтобы btn['text'] возвращал автомобиль.
Удалите , command=getdef
и замените на btn.bind('<Button-1>', text)
. Вывод с помощью def text(event): print(event.widget['text'])
Вы можете использовать lambda
в command=
для назначения функции с аргументом - word
- и функция должна получить этот аргумент - def get_text(text)
import tkinter as tk
def get_text(text):
print(text)
list_words = ("Car","Train","Bus","Bike")
var = 0
root = tk.Tk()
for word in list_words:
btn = tk.Button(root, text=word, command=lambda txt=word:get_text(txt))
btn.grid(column=var, row=0)
var += 1
root.mainloop()
Вместо word
вы можете отправить btn
в функцию, чтобы вы могли получить текст с кнопки, а также изменить текст на кнопке или изменить ее цвет и т. д.
Но для этого нужен немного другой метод
import tkinter as tk
def get_widget(widget):
print(widget["text"])
widget["text"] = "DONE"
widget["bg"] = "green"
list_words = ("Car","Train","Bus","Bike")
var = 0
root = tk.Tk()
for word in list_words:
btn = tk.Button(root, text=word)
btn["command"] = lambda widget=btn:get_widget(widget)
btn.grid(column=var, row=0)
var += 1
root.mainloop()
Вы также можете использовать bind('<Button-1>', callback)
для назначения нажатия на кнопку или другой виджет, и он запустит функцию с аргументом event
, которая дает доступ к нажатому виджету - event.widget
import tkinter as tk
def get_event(event):
print(event.widget["text"])
event.widget["text"] = "DONE"
event.widget["bg"] = "green"
list_words = ("Car","Train","Bus","Bike")
var = 0
root = tk.Tk()
for word in list_words:
btn = tk.Button(root, text=word)
btn.bind('<Button-1>', get_event)
btn.grid(column=var, row=0)
var += 1
root.mainloop()
Вы знаете, как использовать
list
и сохранять много элементов (например, кнопок) в списке?