Matplotlib - анимация слайдера зависает - PullRequest
1 голос
/ 27 февраля 2020

Я сделал простой анимационный слайдер для просмотра фрагментов 3D-изображений. Я адаптировал его из этого поста. Одна небольшая проблема, хотя, после небольшого скольжения вокруг это всегда замерзает. После некоторой возни я понял, что остановка не произойдет, если я добавлю инструкцию print в свой метод обновления. Поэтому я подумал, что это как-то связано с тем, что потоки переходят друг в друга (я не эксперт, просто догадываюсь), поэтому вместо уродливого выражения print я попытался включить вместо него сон. Но т не работает! Единственное, что останавливает его от замерзания - это заявление о печати. Почему это может быть?

def animate(img, cmap='viridis', clim=None):
    fig, _ = plt.subplots()
    index = 0
    max_index = len(img)

    plot = plt.imshow(img[index])
    plt.set_cmap(cmap)
    if clim is not None: plt.clim(clim[0], clim[1])

    ax = plt.axes([0.25, .03, 0.50, 0.02])
    slider = Slider(ax, "Index", 0, (max_index - 1), valinit=index, valfmt='%d')

    def update(i):
        print("Hello World!")  # Delay to stop freeze. Only thing that seems to work, not even sleep works.
        i = int(slider.val)
        plot.set_data(img[i])
        fig.canvas.draw_idle()

    slider.on_changed(update)

    plt.show()

РЕДАКТИРОВАТЬ: После некоторых дальнейших исследований я заметил, что если изображение глубже (больше срезов), даже утверждение печати недостаточно. Из-за этого я начинаю полагать, что это как-то связано с тем, что метод обновления вызывается слишком много раз за короткий промежуток времени.

РЕДАКТИРОВАТЬ 2: Вызов функции из консоли python с animate ([np.random.rand (300,300) для _ в диапазоне (20)], clim = [0,1]) выдает ошибку на моей машине. Вам нужно быстро провести ползунком назад и вперед.

РЕДАКТИРОВАТЬ 3: Я использую TkAgg версии 3.1.2

...