我有一个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的当前值。是否可以在行中仅存储x的值来代替指向x的指针(我认为这是问题所在)
command=lambda: dialogMain(myButtons[x])
。我尝试添加一个仅包含x的辅助函数,将其分配给新变量,并将其作为对dialogMain的命令调用中的索引返回,但是似乎该函数直到单击按钮后才被调用,使我同样的问题。如果有一种方法可以引用该按钮本身,那么我也尝试过类似下面的代码,但是它仍然只会更新最后一个按钮。
z = Button(frame, text="Nothing Scheduled")
z["command"] = lambda: dialogMain(z)
z.grid(row=x, column=1)
myButtons.append(z)
窗口工作正常,看起来像, this,但只会更新底部的按钮
答案 0 :(得分:0)
您的问题与binding lambda in a loop有关。
恕我直言,一个好的解决方案是使一个lambda返回绑定函数:
on_click = lambda button: lambda : DialogMain(button)
for x in range(len(timeSlots)):
... command = onclick(myButtons[x])