在Python中动态删除Tkinter中的小部件

时间:2014-08-18 14:11:43

标签: python button tkinter

我在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行显示小部件列表,单击中间按钮,我将删除函数中打印的最后一个按钮和标签名称作为最后两行。

我点击的任何按钮,只有最后一个标签和按钮消失。如何纠正?

1 个答案:

答案 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))