Почему FuncAnimation не повторяется, когда я использую параметр repeat = True?
import matplotlib.image as mpimg
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib.widgets import Button
from matplotlib.widgets import Slider
fig = plt.figure()
image_list = ['downloads/20120831_194836_aia.lev1_euv_12s_4k.jpg', 'downloads/20120831_194936_aia.lev1_euv_12s_4k.jpg', 'downloads/20120831_195036_aia.lev1_euv_12s_4k.jpg']
list = []
for raw_image in image_list:
image1 = mpimg.imread(raw_image)
real_image1 = plt.imshow(image1)
list.append([real_image1])
def update_plot(t):
print(t)
return list[t]
anim = animation.FuncAnimation(fig, update_plot, repeat = True, interval=1, blit=False,
repeat_delay=200)
plt.show()
Я пытаюсь создать анимацию func с 3 изображениями jpg в списке. После того, как программа запускает 3 изображения 1 раз, это дает мне ошибку. Когда я печатаю t, он никогда не сбрасывается до 0.
Ошибка:
Traceback (most recent call last):
File "/Users/jamisenma/opt/anaconda3/lib/python3.7/site-packages/matplotlib/backend_bases.py", line 1194, in _on_timer
ret = func(*args, **kwargs)
File "/Users/jamisenma/opt/anaconda3/lib/python3.7/site-packages/matplotlib/animation.py", line 1447, in _step
still_going = Animation._step(self, *args)
File "/Users/jamisenma/opt/anaconda3/lib/python3.7/site-packages/matplotlib/animation.py", line 1173, in _step
self._draw_next_frame(framedata, self._blit)
File "/Users/jamisenma/opt/anaconda3/lib/python3.7/site-packages/matplotlib/animation.py", line 1192, in _draw_next_frame
self._draw_frame(framedata)
File "/Users/jamisenma/opt/anaconda3/lib/python3.7/site-packages/matplotlib/animation.py", line 1755, in _draw_frame
self._drawn_artists = self._func(framedata, *self._args)
File "/Users/jamisenma/Library/Application Support/JetBrains/PyCharmCE2020.1/scratches/scratch_59.py", line 19, in update_plot
return list[t]
IndexError: list index out of range
Кто-нибудь знает, в чем проблема?
2 ответа
Решил это. Мне пришлось добавитьframes = len(list)
как параметр FuncAnimation
Вы не смогли обеспечить ожидаемую MRE и не выполнили ожидаемую работу по начальной отладке. Поэтому я не могу быть уверен.
Однако больше всего я подозреваю, что я вернулся из update_plot
, который использует аргумент, который вы не смогли нам показать, и использует его как индекс в глобальной последовательности, которая скрывает заранее определенный тип.
Попробуйте отладить эту простую технику:
def update_plot(t):
print("ENTER update_plot; t =", t, "\n list =", list)
print(t)
return list[t]
Я ожидаю, что прямо перед вашей точкой отказа вы увидите, что t >= len(list)
.
Общий совет: не давайте переменной то же имя, что и встроенное или предопределенное имя. В частности, изменитьlist
.