如何从动态创建的按钮中获取文本?

2024-10-03 09:16:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望我的按钮当我点击它们时返回它们的文本属性

我已经使用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']将始终返回自行车。我希望输出是按钮本身的,例如,当我点击car时,我希望btn['text']返回car


Tags: text文本forvartraincar按钮word
1条回答
网友
1楼 · 发布于 2024-10-03 09:16:01

您可以在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()

代替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)来分配click to Button或其他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()

相关问题 更多 >