для цикла
1-я итерация
До цикла for
, children
содержит список из трех областей памяти виджетов кнопок, [Button3, Button2, Button1].
В первой итерации i
ссылается на первый элемент в children
, и он удалил виджет Button3.
2-я итерация
Перед второй итерацией, children
содержит список из двух областей памяти виджетов кнопок, [Button2, Button1].
Во второй итерации я ссылаюсь на второй элемент в children
, и он удалил виджет Button1.
3-я итерация
Перед третьей итерацией, children
содержит список из двух мест в памяти виджетов кнопок, [Button2].
Поскольку в children
нет третьего элемента, цикл for завершается.
Пока цикл
Поскольку i
(индекс) всегда остается на 0, следовательно, он успешно удалил все виджеты с тремя кнопками, поскольку он всегда ссылается на первый элемент в списке, children
. self.root.ids.box.remove_widget(children[i])
эквивалентно self.root.ids.box.remove_widget(children[0])
Решение
Решением для цикла for
является использование reversed(self.root.ids.box.children)
.
Отрывок
def del_button(self):
for child in reversed(self.root.ids.box.children):
self.root.ids.box.remove_widget(child)