#python #tkinter
Вопрос:
Я пишу программу на основе графического интерфейса, используя tkinter
библиотеку Python. Я столкнулся с проблемой: мне нужно удалить все дочерние элементы (без удаления родительского элемента, что в моем случае так и есть colorsFrame
).
Мой код:
infoFrame = Frame(toolsFrame, height = 50, bd = 5, bg = 'white')
colorsFrame = Frame(toolsFrame)
# adding some elements
infoFrame.pack(side = 'top', fill = 'both')
colorsFrame.pack(side = 'top', fill = 'both')
# set the clear button
Button(buttonsFrame, text = "Clear area",
command = self.clearArea).place(x = 280, y = 10, height = 30)
Как мне этого добиться?
Ответ №1:
Вы можете использовать winfo_children
для получения списка всех дочерних элементов определенного виджета, который затем можно повторить:
for child in infoFrame.winfo_children():
child.destroy()
Комментарии:
1. Да! Это работает! Но появилась новая проблема: размер
infoFrame
блока остается таким же, как и у дочерних блоков перед удалением. Знаете, как решить эту проблему?2. @RomanNazarkin: короткий ответ таков: когда вы уничтожаете все дочерние виджеты, pack больше не думает, что он «владеет» окном, так как у него нет детей, которыми можно управлять. Из-за этого он не пытается изменить размер окна. Простой обходной путь состоит в том, чтобы временно упаковать крошечный кадр 1×1 в окне, чтобы заставить пакет изменить размер содержащего кадра.
3. @BryanOakley: Для меня этот метод, похоже, не работает, или, скорее, кажется, что он портит фрейм. После этого я получаю ошибку, когда пытаюсь снова добавить к нему виджеты, как это:
widget.grid(in_=self.frame, sticky=sticky, row=0, column=0)
Ошибка заключается в следующем:_tkinter.TclError: bad window path name <random cryptic numbers here>
Знаете ли вы, как ее исправить?4. Неважно, я обнаружил ошибку, которую совершил. Этот метод работает. Просто убедитесь, что вы не создали виджет и не настроили его мастер на кадр, который вы хотите очистить, прежде чем вы очистите этот кадр. В противном случае вы также уничтожите виджет, и он не будет добавлен в рамку.