这是一个非常简单的示例,说明如何做到这一点,通过列出所有 25 种颜色,然后使用传统的矩阵循环并将项目分配给按钮,例如:
from tkinter import *
root = Tk()
colors = ['Red','Orange','Yellow','Green','Blue','Purple','Brown','Magenta',
'Tan','Cyan','Olive','Maroon','Navy','Aquamarine','Turquoise','Silver',
'Lime','Teal','Indigo','Violet','Pink','Black','White','Gray','crimson']
colors = list(reversed(colors)) # Reversing list bc pop returns last item
def color_changer(btn,color):
btn.config(fg=color) # Change the color of the corresponding button
for i in range(5): # Number of rows
for j in range(5): # Number of column
color = colors.pop() # First color
btn = Button(root,text=color,fg='black',width=25)
btn.grid(row=i,column=j) # Place the widget
btn['command'] = lambda btn=btn,color=color: color_changer(btn,color) # Assign a command
root.mainloop()
这里有一个警告,你应该准确定义 25 种颜色,否则,你应该使用 try 捕捉出现的 IndexError 并忽略它。
函数是如何工作的?:
您正在使用lambda 创建一个新的nameless 函数,该函数接受btn 和color 并将btn 和color 传递给color_changer()。这样我们就可以存储对应的btn 和color,不像你通常会像lambda: color_changer(btn,color) 那样分配它,它只会传递最后一个弹出的项目。这通常是我们为循环内的按钮分配命令的方式。
替代方案(至lambda):
您还可以使用嵌套函数(避免使用lambdas)。所以函数应该是:
def nester(btn,color):
def color_changer():
btn.config(fg=color)
return color_changer
命令如下:
btn['command'] = nester(btn,color)
这类似于functools.partial 所做的。