Tkinter添加command参数后出现KeyError: 0错误求解决
解决Tkinter中KeyError: 0的问题
问题原因
你遇到的KeyError: 0是因为**command=click(name)会在创建Button时立即执行click函数**,而此时button[name]还没有被添加到字典中(button[name] = Button(...)是下一行才执行的代码)。当click函数试图访问button[number]时,这个键还不存在,所以抛出了KeyError。
解决方案
使用lambda来延迟函数的执行,只有当按钮被点击时才会调用click函数。修改command参数的写法:
from tkinter import * window = Tk () window.title(" ") button = {} name = -1 def click(number): button[number].config(bg="gray") print(number) for x in range(15): for y in range(15): name = name + 1 # 使用lambda绑定参数,注意要把name设为默认参数避免闭包问题 button[name] = Button(window, command=lambda num=name: click(num), bg="white") button[name].config(height=2, width=4) button[name].grid(column=x, row=y) window.mainloop()
补充说明
这里给lambda的num设置默认参数num=name是为了避免闭包陷阱——如果直接写lambda: click(name),所有按钮的command都会引用最后一次循环的name值,点击任何按钮都会触发最后一个按钮的操作。通过默认参数的方式,会把当前循环的name值绑定到lambda内部,确保每个按钮点击时传递的是正确的编号。
内容的提问来源于stack exchange,提问作者Sebastian Bardoff
相关产品推荐
相关产品推荐

