【问题标题】:How to get text from dynamically created buttons?如何从动态创建的按钮中获取文本?
【发布时间】:2019-04-09 17:43:22
【问题描述】:

我希望我的按钮在单击它们时返回它们的文本属性。

我使用 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 个按钮: Image of buttons

但是,无论我按什么按钮 btn['text'] 都会返回 Bike。我希望输出是按钮本身的输出,例如当我单击汽车时,我希望 btn['text'] 返回汽车。

【问题讨论】:

  • 你知道如何使用list 并在列表中保留许多元素(即按钮)吗?
  • 删除 , command=getdef 并更改为 btn.bind('<Button-1>', text)。输出def text(event): print(event.widget['text'])

标签: python tkinter


【解决方案1】:

您可以在command= 中使用lambda 来分配带有参数的函数 - 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()

您可以将btn 发送到函数而不是word,这样您就可以从按钮获取文本,还可以更改按钮上的文本或更改其颜色等。

但它需要一些不同的方法

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()

【讨论】:

    猜你喜欢
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 2015-08-13
    • 2019-09-05
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多