为什么用变量指代按钮名称时无法调用按钮的属性方法?
问题原因
你当前传入clickbutton函数的btpressed参数是字符串"btn",并不是你创建的按钮实例对象,字符串本身没有configure方法,所以抛出了属性错误。你尝试修改变量类型的操作不生效,本质是传参时就传错了值,和参数的类型声明无关。
解决方案
1. 直接修正当前单按钮的传参
把lambda里的第二个参数去掉引号,直接传按钮实例即可:
# 把原来command参数里的"btn"改为btn(去掉引号) btn = Button(window, bg=btarray[0, 0], activebackground="blue", height=5, width=10, command= lambda: clickbutton("0, 0", btn))
2. 批量生成多按钮的通用写法
如果你要生成3x3的矩阵按钮,避免重复写代码,可以用循环实现。注意要通过lambda的默认参数绑定每次循环的按钮实例和坐标,避免闭包延迟绑定导致所有按钮都拿到最后一次循环的值:
import numpy as np from tkinter import Button, Tk window = Tk() btarray = np.full((3, 3), "red", dtype="object") def clickbutton(a, b, btn): if btarray[a,b] == "red": btarray[a,b] = "green" else: btarray[a,b] = "red" btn.configure(bg=btarray[a,b]) print(btarray) # 循环生成3x3按钮 for a in range(3): for b in range(3): # 通过默认参数绑定当前循环的a、b和btn实例 btn = Button(window, bg=btarray[a, b], activebackground="blue", height=5, width=10) btn.configure(command=lambda a=a, b=b, btn=btn: clickbutton(a, b, btn)) # 按坐标布局按钮 btn.grid(row=a, column=b) window.mainloop()
所有按钮都会复用同一个clickbutton处理函数,不需要单独为每个按钮写逻辑。
内容的提问来源于stack exchange,提问作者Rayne
相关产品推荐
相关产品推荐

