You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Tkinter中修改指定按钮的文本?

解决Tkinter循环创建按钮时点击仅修改最后一个按钮文本的问题

嘿,这个坑我之前也踩过!你猜的没错,问题确实出在变量i的绑定上。

为什么会出现这个问题?

你在循环里定义的lambda: update_btn_text(i)并没有“捕获”循环当时的i值,而是引用了循环变量i本身。当循环结束后,i的值已经变成了9(因为range(10)最后一个数是9),所以不管你点击哪个按钮,lambda都会用最后这个i=9去调用函数,自然只会修改最后一个按钮的文本。

两种修复方法

方法1:给lambda添加默认参数

这是最简单的解决方式,通过给lambda设置默认参数,把当前循环的i值“固定”下来:

import tkinter as tk
list1 = []
def update_btn_text(index):
    list1[index].set('new')

root = tk.Tk()
for i in range(10):
    btn_text = tk.StringVar()
    list1.append(btn_text)
    # 这里给lambda添加i=i的默认参数,绑定当前循环的i值
    btn = tk.Button(root, textvariable=list1[i], command=lambda i=i: update_btn_text(i))
    btn_text.set('button' + str(i+1))
    btn.pack()
root.mainloop()

方法2:使用functools.partial

如果你觉得lambda的写法不够直观,也可以用functools.partial来包装你的回调函数,明确传递当前的i值:

import tkinter as tk
from functools import partial

list1 = []
def update_btn_text(index):
    list1[index].set('new')

root = tk.Tk()
for i in range(10):
    btn_text = tk.StringVar()
    list1.append(btn_text)
    # 用partial把当前的i绑定到update_btn_text的参数上
    btn = tk.Button(root, textvariable=list1[i], command=partial(update_btn_text, i))
    btn_text.set('button' + str(i+1))
    btn.pack()
root.mainloop()

这两种方法都能让每个按钮的回调函数记住自己对应的索引值,点击时就会修改正确的按钮文本啦!

内容的提问来源于stack exchange,提问作者zhmff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:07:28