2

onpick()以下のMWEのように、matplotlibに散布図があり、それらにアクションがあります。

ポイントが選択されるたびに、そのポイントで計算を実行します。これには約30数秒かかります。ユーザーがクリックするとすぐに、図の同じポイントに赤い円を描いてユーザーに通知したいと思います。

30次の MWE は機能しますが、数秒後にのみ赤い円を描画します。

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 からファイルを呼び出しています。

への私の呼び出しは matplotlib によって無視されず、返さfig.canvas.draw()れたときにのみ延期されることに注意してください。onpick()

4

1 に答える 1

2

非表示のメイン ループは、プロットを更新する間だけ実行されます。GUI が作業を続行できるように、長い計算を開始する必要があります。これは次のようになります。

  • 別のスレッドで (python スレッド モジュールを参照)、
  • 外部プロセスとして (subprocess モジュールを参照)、
  • マルチプロセッシングを使用する他のコアでは、
  • 非ブロッキングモードでpyrompi4py、またはceleryを使用して、おそらくリモートサーバー上にある外部オブジェクトとして、サーバーが同じマシン上にある可能性があることに注意してください。

次に、終了したことを通知すると、結果が表示されます。幸いなことに、ユーザーがいくつかのポイント (それぞれがすぐにハイライト表示されます) をクリックしたり、ランチに行ったり、週末に出かけたりできるように、結果のリクエストをキューに入れることができる可能性があります。

Python ではスリープがブロックされることに注意してください。

于 2013-10-15T14:46:23.267 に答える