我尝试制作一个网格来模拟兰顿蚂蚁。我想要一个可以在模拟开始之前修改的网格,但我无法制作按钮在单击后再次使用功能。
from tkinter import *
window = Tk()
frame = Frame(window).grid()
files = []
btn=[]
status=[]
def btn_color(status):
if status==1:
return("black")
if status==0:
return("white")
def click_update(status,btn):
return(lambda: click_update1(status,btn))
def click_update1(status,btn):
status=abs(status-1)
if status==1:
btn.config(bg="black")
if status==0:
btn.config(bg="white")
for i in range(2500):
files.append("button"+str(1))
for i in range(len(files)):
status.append(int(0))
btn.append(Button(frame,text="k", font=("Arial",3),width=2,height=2,repeatdelay=100,repeatinterval=100))
btn[i].grid(row=int(i//50),column=int(i%50),sticky="we")
for i in range(len(files)):
btn[i].config(bg=btn_color(status[i]), command=click_update(status[i],btn[i]))
window.mainloop()
btn[i] 是直接传递的,但是由于 lambda 内部的函数对局部变量进行操作,因此按钮的引用不正确。 所以我改变了这一点,部分函数将当前循环索引绑定到回调函数,确保每个按钮的单击事件链接到正确的按钮及其状态。