Tkinter:我如何动态创建一个可以被销毁或删除的小部件?

时间:2013-02-11 01:33:07

标签: python user-interface tkinter

我正在寻找一种方法来创建小部件(很可能是标签)令人作呕,但需要注意的是,以后可以删除或解压缩它们。

我可以很好地生成小部件,但是没有为它们分配名称。我不明白如果可能的话,我会删除某个匿名小部件。

我的第一直觉是动态创建具有稳定约定的变量名称,但这可能会不必要地打开一堆蠕虫。这个想法如下。我希望能够删除某个Button小部件,同时不知道在运行时我将处理多少。谢谢。

from Tkinter import *
import time
import ttk


def onDoubleClick(event):
    item = t.selection()
 #print "you clicked on", t.item(item,"text")

    if (t.item(item,"text")=="Start IO"):
        Button2 = Button(frame2,text="Button2",command=but).pack()


def but():
    pack_forget()

root=Tk()
root.geometry("800x300")
frame1 = Frame(root)
frame2 = Frame(root)

t=ttk.Treeview(frame1)
t.heading("#0",text="Test steps")
t.insert("",0,"IO",text="IO")
t.insert("IO","end",text="Start")
t.bind("<Double-1>", onDoubleClick)
t.pack()
frame1.pack(side=LEFT)
frame2.pack(side=LEFT)

编辑:我的功能请求无疑是短视的。我的最终目标是并排放置Label小部件和Button,两者都包含测试启动器中的“步骤”。单击该按钮将从GUI中删除其自身及其相应的Label。我可以在Button的回调中创建两个小部件并删除其中一个小部件,但是对于pack_forget我认为我需要 def 一个函数。我相信我的问题在于传递正确的引用 def removeStep 用例如下图所示:.... [如果这可以解决我的RTFM请随时让我知道,我只是不能找不到了]

TEST:制作PB&amp; J

步骤0:获取面包[删除步骤]

步骤1:涂抹PB [删除步骤]

第2步:涂抹果冻[删除步骤]

2 个答案:

答案 0 :(得分:6)

您需要将动态创建的小部件存储在列表中。有像

这样的东西
dynamic_buttons = []

def onDoubleClick(event):
    ...
    button = Button(...)
    dynamic_buttons.append(button)
    button.pack()

然后,您可以使用

访问要删除的按钮
dynamic_buttons[0].destroy()

编辑:有关您的用例的更多信息,我可能会这样做

class RemovableTask(Frame):
    def __init__(self, master, name, **options):
        Frame.__init__(self, master, **options)
        lbl = Label(self, text=name)
        btn = Button(self, text='Remove step', command=self.destroy)
        lbl.grid(row=0, column=0)
        btn.grid(row=0, column=1)

然后只需创建一个名为“Step 0:Get Bread”的RemovableTask实例,并将它们打包或打包成一列。其他一切都将自动处理。

答案 1 :(得分:3)

这里有几个选项。第一个选项是将动态创建的按钮存储在列表中。然后,您可以随时添加/删除按钮 - 并保留对所有按钮的引用。干净简单。

第二个选项是在创建按钮(并引用它)后使用config方法来销毁小部件 - 或者至少将其从显示中移除({{1} } 实际上并不会破坏小部件!以后可能会重新打包。要实际销毁小部件,你想改为调用widget.pack_forget ...:

widget.destroy