我想暂停在自己的事件循环中运行的动画。这是代码的简化版本:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button
from mpl_toolkits.mplot3d import proj3d
import time
def main():
global paused
paused = False
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_ylim(-100, 100)
ax.set_xlim(-10, 10)
ax.set_zlim(-100, 100)
plt.ion()
plt.show()
def pause_anim(event):
global paused
paused = not paused
pause_ax = fig.add_axes((0.7, 0.03, 0.1, 0.04))
pause_button = Button(pause_ax, 'pause', hovercolor='0.975')
pause_button.on_clicked(pause_anim)
x = np.arange(-50, 51)
line = ax.plot([], [], [], c="r")[0]
y_range = list(np.arange(1, 60, 3))
y_len = len(y_range)
idx = 0
while True:
if not paused:
idx += 1
if idx >= y_len:
break
y = y_range[idx]
z = - x**2 + y - 100
line.set_data(x, 0)
line.set_3d_properties(z)
plt.draw()
plt.pause(0.2)
else:
time.sleep(1) # this stops button events from happening
#input("Shoop?") # prompting for input works
# I've also tried putting a mutex here
if __name__ == '__main__':
main()
正如我在代码中提到的,我尝试了 time.sleep
和 Lock
,但是一旦暂停,这些就会阻止我取消暂停。如何暂停循环而不破坏恢复动画的能力?
最佳答案
您可以将 else
部分中的 time.sleep(1)
替换为 plt.pause
,就像您所做的那样在 if
部分。
....
plt.draw()
plt.pause(0.2)
else:
plt.pause(0.2)
另一种选择当然是使用 matplotlib 动画,例如 FuncAnimation
,它具有方法 .event_source.stop()
和 .event_source.start ()
。 (如该问题的两个答案所示:stop / start / pause in python matplotlib animation)
关于python - 暂停 matplotlib 自定义动画循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43383093/