如何识别Tkinter中基于列表项创建的按钮的点击事件?
解决Tkinter循环生成按钮时无法识别点击按钮的问题
我明白你遇到的困扰了——循环创建的按钮点击后总是输出最后一个按钮的文本,这是因为Tkinter的command绑定的是函数引用,而非循环时变量的实际值。当循环结束后,CPUBUT已经变成了列表的最后一个元素,所以所有按钮点击都会调用同一个buttonClick,打印的自然是最后那个值。
这里有个简单的修复方案,用lambda函数给每个按钮的点击事件传递当前按钮的文本参数:
import tkinter as tk window = tk.Tk() window.title("PC CONFIGURATOR") window.geometry("1280x720") def createNewWindowCPU(): newWindow = tk.Toplevel(window) newWindow.geometry("1280x720") newWindow.title("CPU") AMD = tk.Button(newWindow, text = "AMD", pady = 10, width = 12, command=createNewWindowAMD) AMD.pack() def createNewWindowAMD(): newWindow = tk.Toplevel(window) newWindow.geometry("1280x720") newWindow.title("AMD") CPUF = ["Ryzen 9 5900x", "Ryzen 7 5800x", "Ryzen 5 5600x", "Ryzen 9 3900x", "Ryzen 7 3700x", "Ryzen 5 3600x"] # 修改buttonClick,让它接收一个参数来获取点击的按钮文本 def buttonClick(cpu_model): print(f"你点击了:{cpu_model}") for cpu_model in CPUF: # 用lambda传递当前循环的cpu_model,注意要把它作为默认参数传入 CPU = tk.Button(newWindow, text = cpu_model, pady = 10, width = 12, command=lambda x=cpu_model: buttonClick(x)) CPU.pack() CPU = tk.Button(window,text = "CPU", pady = 10, width = 12, command=createNewWindowCPU) CPU.pack() window.mainloop()
关键细节解释:
- 调整
buttonClick函数,让它接收一个参数来承载点击的按钮文本。 - 循环里用
lambda x=cpu_model: buttonClick(x)绑定命令时,x=cpu_model是核心——它会把当前循环迭代的cpu_model的值复制给lambda的默认参数x,而非绑定变量的引用。如果直接写lambda: buttonClick(cpu_model),所有lambda都会指向同一个cpu_model变量,循环结束后这个变量是列表最后一个元素,点击所有按钮都会打印最后一个值。
修改完成后,每个按钮点击时都会正确输出自己对应的CPU型号啦。
内容的提问来源于stack exchange,提问作者JoshuaKirby17
相关产品推荐
相关产品推荐

