我有一个tkinter按钮的列表,创建一个对话框窗口,并允许用户输入文本,这将是按钮的新文本。然而,我似乎想不出如何让每个按钮自动更新。我有的代码如下
myButtons = []
timeSlots = []
while startH < endH:
timeSlots.append(str(startH) + ":00")
timeSlots.append(str(startH) + ":15")
timeSlots.append(str(startH) + ":30")
timeSlots.append(str(startH) + ":45")
startH += 1
for x in range(len(timeSlots)):
Label(frame, text=timeSlots[x]).grid(row=x, column=0)
z = Button(frame, text="Nothing Scheduled", command=lambda: dialogMain(myButtons[x]))
z.grid(row=x, column=1)
myButtons.append(z)
对dialogMain的调用将打开一个窗口,供用户输入文本,而参数就是要更新的按钮。当然,问题是,虽然所有的按钮都出现在正确的位置,但当我单击任何按钮时,它只会更新最后一个按钮,即x的当前值。在command=lambda: dialogMain(myButtons[x])
行中,是否可以只存储x的值,而不是指向x的指针,我认为这是问题所在。我曾尝试添加一个辅助函数,该函数只接受x,将其赋给一个新变量,并在dialogMain的命令调用中将其作为索引返回,但该函数似乎直到单击按钮时才被调用,这给我留下了同样的问题。如果有一种方法可以引用按钮本身,那么它也可以工作,我已经尝试了类似下面的代码,但它仍然只更新最后一个按钮。
z = Button(frame, text="Nothing Scheduled")
z["command"] = lambda: dialogMain(z)
z.grid(row=x, column=1)
myButtons.append(z)
该窗口运行良好,看起来像this,但只会更新底部的按钮
发布于 2018-06-25 00:49:48
你的问题是关于binding lambda in a loop的。
一个很好的解决方案是创建一个返回绑定函数的lambda:
on_click = lambda button: lambda : DialogMain(button)
for x in range(len(timeSlots)):
... command = onclick(myButtons[x])
https://stackoverflow.com/questions/51011756
复制相似问题