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中删除其本身及其相应的标签。我可以在Button的回调中创建这两个小部件并删除其中任何一个,但要打包这两个,我认为我需要def一个函数。我认为我的问题在于传递对def-removeStep的正确引用。用例如下所示:。。。。[如果这能解决我的RTF,请随时告诉我,我就是找不到它]

测试:制作一个PB&J

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

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

步骤2:涂抹果冻[去除步骤]

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

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)

然后只需创建名为"Step0:GetBread"的RemovableTask实例,并将它们网格化或打包在一列中。其他一切都将自动处理。

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

第二种选择是在创建按钮(并引用它)后使用config方法来销毁小部件——或者至少将其从显示中删除(widget.pack_forget实际上并没有销毁小部件!它可以稍后重新打包。要真正销毁小部件,您需要调用widget.destroy)…:

import Tkinter as tk
root = tk.Tk()
def add_new():
    b = tk.Button(root,text="Click to destroy")
    b.pack()
    b.config(command=b.pack_forget) 
b = tk.Button(root,text="Add_new",command=add_new)
b.pack()
root.mainloop()

相关内容

  • 没有找到相关文章

最新更新