使用for循环批量创建Tkinter按钮时的取值问题求助
解决Tkinter循环创建按钮时点击无法获取对应值的问题
你的代码里有两个关键问题导致所有按钮点击都输出red:
- 错误调用了字符串的
index方法:col.index(col)是对当前颜色字符串(比如'red')调用index,找自身在字符串里的位置,结果永远是0,所以color[c]永远取列表第一个元素red。 - 即便改用列表的
color.index(col),如果列表存在重复颜色,这个方法会返回第一个匹配项的索引,导致重复按钮行为一致,存在隐患。
修正方案一:直接绑定颜色值(推荐)
用enumerate遍历列表同时拿到索引和颜色,在lambda里把当前颜色作为默认参数传递,确保每个按钮绑定的都是循环时的对应值:
from tkinter import Tk, Button color = ['red','green', 'blue'] def createbutton(): for idx, col in enumerate(color): Button(win, text=f'{col} button', bg='green', command=lambda c=col: print(c)).grid(row=idx, column=0) win = Tk() win.geometry('750x1000') createbutton() win.mainloop()
修正方案二:绑定列表索引
如果需要通过索引操作列表,同样用enumerate获取可靠的索引值,传递给lambda:
from tkinter import Tk, Button color = ['red','green', 'blue'] def createbutton(): for idx, col in enumerate(color): Button(win, text=f'{col} button', bg='green', command=lambda i=idx: print(color[i])).grid(row=idx, column=0) win = Tk() win.geometry('750x1000') createbutton() win.mainloop()
这两种写法都能解决问题,第一种更直接,避免后续列表修改可能带来的索引偏移问题。
内容的提问来源于stack exchange,提问作者Hao Gia
相关产品推荐
相关产品推荐

