2017-04-13 2 views
1

내 이벤트 루프에서 실행중인 애니메이션을 일시 중지하고 싶습니다. 여기에 코드의 단순화 된 버전입니다 : 내가 코드에 언급, 나는이 time.sleepLock을 시도했습니다matplotlib 사용자 정의 애니메이션 루프 일시 중지

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() 

,하지만이 내가 일시 중지하면 일시 중지 상태를 해제에서 저를 중지합니다. 애니메이션을 다시 시작하지 않고 루프를 일시 중지하려면 어떻게합니까?

답변

1

당신은 당신은 또한 if part의 그것을 그랬던 것처럼, plt.pause으로 else part의에서 time.sleep(1)을 대체 할 수 있습니다.

 .... 
     plt.draw() 
     plt.pause(0.2) 
    else: 
     plt.pause(0.2) 

다른 옵션

는 방법 .event_source.stop().event_source.start()을 가지고 FuncAnimation,처럼하기 matplotlib 애니메이션을 사용하는 것이 물론이다. (이 질문에 대한 답변 중 두 가지로 표시 : stop/start/pause in python matplotlib animation)

관련 문제