Tkinter: Как я могу динамически создавать виджет, который можно затем уничтожить или удалить?

Я ищу метод создания виджета (скорее всего, ярлык) ad nauseam, с оговоркой, что они могут быть удалены или распакованы позже.

Я могу сгенерировать виджеты просто отлично, но им не присвоено имя. Я не понимаю, как бы я мог, если возможно, удалить определенный анонимный виджет.

Мой первый инстинкт состоял в том, чтобы динамически создавать имена переменных со стабильным соглашением, но это может необоснованно открыть банку червей. Идея выражается ниже. Я хотел бы иметь возможность удалить определенный виджет 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) 

EDIT: Мой запрос функции был, по общему признанию, близоруким. Моя конечная цель – иметь виджет Label и Button side-by-side, оба из которых состоят в том, что должно быть «шагом» в тестовом пусковом устройстве. Щелчок по кнопке приведет к удалению как самого, так и соответствующего ярлыка из графического интерфейса. Я могу создать оба виджета и удалить один из них при обратном вызове Button, но для pack_forget я считаю, что мне нужно определить функцию. Я считаю, что моя проблема заключается в передаче правильной ссылки на def removeStep. Пример использования приведен ниже: …. [Если это можно решить, мой RTFM, пожалуйста, сообщите мне, я просто не смог его найти]

ИСПЫТАНИЕ: Сделайте 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) 

Затем просто создайте экземпляры RemovableTask с именами типа «Шаг 0: Получить хлеб» и сеткой или упакуйте их в столбце. Все остальное будет обрабатываться автоматически.

У вас есть несколько вариантов. Первый вариант – сохранить ваши динамически созданные кнопки в списке . Затем вы можете добавлять / удалять кнопки, когда захотите, – и вы сохраняете ссылку на все кнопки. Чистый и простой.

Второй вариант – использовать метод 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()