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

Я хочу, чтобы мои кнопки, когда я нажимаю на них, возвращали их текстовый атрибут.

Я использовал цикл 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'] возвращал автомобиль.

Вы знаете, как использовать list и сохранять много элементов (например, кнопок) в списке?

furas 09.04.2019 20:12

Удалите , command=getdef и замените на btn.bind('<Button-1>', text). Вывод с помощью def text(event): print(event.widget['text'])

stovfl 09.04.2019 20:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
417
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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()

Другие вопросы по теме