我正在尝试制作多行按钮和变量,当您单击一行中的按钮时,它会更改同一行中的变量。但是我不知道如何将按钮和变量连接在一起。
我尝试过使用 lambda、附加变量,我实现的最接近的结果是通过单击任何按钮将所有变量更改一定数量,但这不是我想要的。
这是我的代码:
rows = 100
m = []
bt = list()
def popo():
for i in range(rows):
m.append(0)
count = lambda x: x+1
w = Button(master, text = "Act", command = count(m[i]))
w.grid(row = i % 40, column = (i // 40) * 6, sticky = W, pady = 2)
bt.append(w)
print(m[i])
l1 = Label(master, text = m[i])
l1.grid(row = i % 40, column = (i // 40) * 6 + 1, sticky = W, pady = 2)
b1 = Button(master, text = "Act", command = popo)
b1.grid(row = 0, column = 0, sticky = W, pady = 2)
每当我单击列表中的任何按钮时,它都不会更改变量,当然也不会执行任何操作。
请注意,
command=count(m[i])
将立即执行count(m[i])
并将结果(即1)分配给command
选项。
当
m[i]
更新时,关联的标签也不会自动更新。
建议:
m
改为 IntVar()
列表textvariable
选项以下是更新后的
popo()
:
def popo():
for i in range(rows):
# create an instance of IntVar() and append to list m
m.append(IntVar())
# lambda to increase the variable by 1
count = lambda x=i: m[x].set(m[x].get()+1)
w = Button(master, text = "Act", command = count) # assign the lambda to command
w.grid(row = i % 40, column = (i // 40) * 6, sticky = W, pady = 2)
bt.append(w)
print(m[i].get())
l1 = Label(master, textvariable = m[-1]) # used textvariable instead
l1.grid(row = i % 40, column = (i // 40) * 6 + 1, sticky = W, pady = 2)
那么当对应的
IntVar
更新时,关联的标签也会自动更新。