我在Tkinter框架中有一些小部件,我想在用户点击时删除它。有一些标签,每个标签都有一个相应的按钮可以将其删除。这是制作框架的代码。
def delFav(): win2 = Tk() widgets = [] for url in urls: label = Label(win2, text = url) button = Button(win2, text = "Delete") widgets.append({"url" : url, "label" : label, "button" : button}) for w in widgets: print w["url"], w["label"], w["button"] w["button"].configure(command = lambda : delete(w["url"], widgets)) w["label"].pack() w["button"].pack()
删除功能如下所示:
def delete(url, widgets): for w in widgets: if w["url"] == url: print w["label"] print w["button"] w["label"].pack_forget() w["button"].pack_forget() return
当我想要删除URL时,我按下相关按钮,但总是删除最后一个按钮。例如,这是通过单击3个按钮中的第二个删除按钮生成的输出。
entry/13394 .44877224 .44877384 entry/13277 .44877464 .44877544 entry/8166 .44877624 .44877704 .44877624 .44877704
前3行显示小部件列表,单击中间按钮,我将删除函数中打印的最后一个按钮和标签名称作为最后两行。
我点击的任何按钮,只有最后一个标签和按钮消失。如何纠正?
答案 0 :(得分:1)
这是旧的“在循环中声明的函数的后期绑定”问题。
w["button"].configure(command = lambda : delete(w["url"], widgets))
在这一行中,命令delete(w["url"], widgets)
假定w
在循环结束时具有w
的最终值,而不是调用{{1}时的值configure
}。因此,单击任何按钮始终会删除最后一个标签。
你可以通过将w作为默认参数来强制lambda“先绑定”。
w["button"].configure(command = lambda w=w: delete(w["url"], widgets))