Как получить текст из динамически созданных кнопок? - PullRequest
0 голосов
/ 09 апреля 2019

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

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

1 Ответ

0 голосов
/ 09 апреля 2019

Вы можете использовать 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), чтобы назначить нажатие кнопки или другого Windget, и он запустит функцию с аргументом 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...