2013-10-15 13 views
2

아래의 MWE에서와 같이 matplotlib에 onpick() 조치가있는 분산 형 그림이 있습니다.순간 순간 matplotlib 그림 업데이트

포인트가 선택 될 때마다 나는 그 포인트에서 계산을 실행하는데, 대략 30 초가 걸립니다. 사용자가 클릭하자마자 동일한 지점의 그림에 빨간색 원을 그려서 사용자에게 알리고 싶습니다.

다음 MWE 작동하지만, 그것은 단지 30초 후 빨간색 원을 그립니다

from numpy import take 
from numpy.random import randn 
from time import sleep 
import matplotlib.pylab as plt 

fig, ax = plt.subplots() 
X, Y = randn(2, 10) 
ax.scatter(X, Y, picker=True) 
def onpick(event): 
    ax.scatter(take(X, event.ind), take(Y, event.ind), s=40, facecolors='none', edgecolors='red') 
    fig.canvas.draw() 
    sleep(30)#here I have MyLongComputation() in my code 

fig.canvas.mpl_connect('pick_event', onpick) 
plt.show() 

즉각적인 효과와 함께 그림 그리기 작업을 요청하는 방법이 있나요? 문제가되는 경우 대화 형 모드에서 Ipython 파일을 호출합니다.

fig.canvas.draw()에 대한 내 전화는 matplotlib에 의해 무시되지 않지만, onpick()이 반환하는 경우에만 연기됩니다.

답변

2

숨겨진 메인 루프는 줄거리를 업데이트하는 시간 사이에 실행됩니다, 당신은 작업에 GUI 캐리을 할 수있는 방식으로 긴 계산을 시작하는 데 필요한,이 될 수 있습니다

  • 을 별도의 스레드에서 , mpi4pypyro를 사용 가능한 원격 서버에서 외부 물체와 같이 multiprocessing를 사용하여, (서브 프로세스 모듈 참조), 외부 프로세스로서
  • 를 다른 코어에서
  • 을 (파이썬 스레드 모듈 참조) , 또는 비 차단 모드 인 celery 일 경우 서버는 동일한 시스템에있을 수 있습니다.

그런 다음 알림을 표시하면 결과가 표시됩니다. 좋은 소식은 결과에 대한 요청을 대기열에 넣을 수 있으므로 사용자가 여러 점 (각 항목을 즉시 강조 표시), 점심 식사 또는 주말에 가능한 멀리 클릭 할 수 있습니다.

python에서 sleep 블록을 사용합니다.