Выходная рекурсия для событий matplotlib - PullRequest
0 голосов
/ 16 января 2020

У меня есть маленькая фигура matplotlib с button_press_event. Внутри слушателя я использую plt.pause, чтобы сделать короткую анимацию для каждого клика. Это работает нормально и, как и ожидалось. Однако, если я нажимаю еще раз, прежде чем анимация закончится, я ввожу рекурсию, и остальные анимации воспроизводятся в конце. Если вы нажмете достаточно быстро, вы сможете достичь RecursionError.

Что мне нужно изменить, поэтому новый щелчок отбрасывает все оставшиеся шаги в методе on_click?

import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.subplots()

ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

xy = np.random.random(2)*10
h1 = ax.plot(xy[0], xy[1], marker='x', color='k')[0]
h2 = ax.plot(xy[0], xy[1], marker='o', color='r')[0]

def on_click(event):
    h1.set_xdata(event.xdata)
    h1.set_ydata(event.ydata)
    for i in range(10):
        h2.set_xdata(event.xdata+np.random.random()-0.5)
        h2.set_ydata(event.ydata+np.random.random()-0.5)
        plt.pause(0.1)

cid_click = fig.canvas.mpl_connect('button_press_event', on_click)

1 Ответ

2 голосов
/ 16 января 2020

Вы можете использовать FuncAnimation. Затем обязательно остановите и удалите предыдущие анимации перед началом новой анимации.

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()

ax.set_xlim(0, 10)
ax.set_ylim(0, 10)

xy = np.random.random(2)*10
h1 = ax.plot(xy[0], xy[1], marker='x', color='k')[0]
h2 = ax.plot(xy[0], xy[1], marker='o', color='r')[0]

anis = []
def on_click(event):
    h1.set_xdata(event.xdata)
    h1.set_ydata(event.ydata)
    def animate(i):
        h2.set_xdata(event.xdata+np.random.random()-0.5)
        h2.set_ydata(event.ydata+np.random.random()-0.5)
    for ani in anis:
        ani.event_source.stop()
        anis.remove(ani)
        del ani
    anis.append(FuncAnimation(fig, animate, frames=10, repeat=False))
    fig.canvas.draw_idle()

cid_click = fig.canvas.mpl_connect('button_press_event', on_click)

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...