Я пытаюсь создать анимацию, в которой я хочу, чтобы список точек и линий отслеживал значение. Я использую объект ValueTracker и методы обновления для этой цели. Используя ShowCreation, я уже добавил эти объекты на сцену. Я использовал для l oop, чтобы добавить апдейтер для каждой Точки и Линии в списке (оба списка имеют одинаковую длину):
for i in range(len(x_points)):
dots_cos[i].add_updater(
lambda mob: mob.move_to(axes2.c2p(x_points[i], np.cos(omega.get_value()*x_points[i]))),
# call_updater=False
)
dots_sin[i].add_updater(
lambda mob: mob.move_to(axes2.c2p(x_points[i], np.sin(omega.get_value()*x_points[i]))),
# call_updater=False
)
lines_cos[i].add_updater(
lambda mob: mob.become(Line(axes2.coords_to_point(x_points[i], 0),
axes2.coords_to_point(x_points[i], np.cos(omega.get_value()*x_points[i])), color=YELLOW)),
# call_updater=False
)
lines_sin[i].add_updater(
lambda mob: mob.become(Line(axes2.coords_to_point(x_points[i], 0),
axes2.coords_to_point(x_points[i], np.sin(omega.get_value()*x_points[i])), color=RED)),
# call_updater=False
)
Это не сработало, как предполагалось! Случилось так, что только последние элементы в соответствующих списках получили программу обновления и работали нормально, в то время как остальные элементы просто исчезли со сцены! Я попытался запустить для l oop на zip(x_points, dots_cos, dots_sin, lines_cos, lines_sin)
, но результат все тот же.
Интересно, когда я попытался сделать то же самое, используя while l oop вместо последней итерации l oop, код пытался добавить средство обновления к последней + 1 итерации, поэтому возникло исключение IndexOutOfBounds. Несмотря на то, что в то время как доброкачественный оператор, такой как оператор печати, работал нормально, l oop.
Кроме того, в случае его значимости списки точек и линий создаются с помощью пользовательской функции, которая возвращает эти списки. .
Так в чем здесь проблема? Как функция add_updater может сломать что-то настолько фундаментальное, как для l oop?