2016-12-27 11 views
0

私は、ユーザが特定のキーを押すたびに起動したいアニメーションを持っています。アニメーションプロット(フレームごとに1つの異なるプロット)と空のプロットを表すデータがあるので、R(たとえば)を押すとアニメーションプロットが実行され、Rを再度押すと再び実行されます。次のコードは動作します:イベントハンドラ内でのMatplotlibアニメーションの使用

animate
### Lots of code before 

fig = plt.figure() 
anim = animation.FuncAnimation(fig, animate, repeat=True) 
plt.show() 

は、私が書いた関数です。これを実行すると、Matplotlibウィンドウがポップアップし、アニメーションが繰り返し実行されます。これは結構ですが、私は、コマンドで起動するようにアニメーションのようにしたいので、私はこれをしなかった:

### Lots of code before 

def press(event): 
    if event.key == "r": 
     print("r") # for debugging purposes 
     anim = animation.FuncAnimation(fig, animate) 

fig = plt.figure() 
fig.canvas.mpl_connect("key_press_event", press) 
plt.show() 

printによって証明されるようにイベントが登録されますが、何も起こりません、ちょうど空のプロットウィンドウ。アニメーションオブジェクトを作成する前にイベントハンドラにglobal animを追加しました。今度はRを押すと、単にプログラムが停止し、プロットウィンドウが閉じます。

def f(): 
    global anim 
    anim = animation.FuncAnimation(fig, animate) 

f() 

ではなく、イベントハンドラ内:FuncAnimation呼び出しはこのように、いくつかの関数内であれば

globalアプローチが正常に動作します。

どうすればよいですか?イベントハンドラの中にアニメーションオブジェクトを作成し、それを生き残るにはどうすればいいですか?

更新:明らかに、クラッシュの原因は、FuncAnimationコールでblit=True(これは無関係だと思ったので私の例では含まれていませんでした)のものです。 blit=Falseを設定するとクラッシュは停止しますが、イベントをトリガーすると何も起こりません。

+0

mpl +バックエンドのどのバージョンですか? – tacaswell

+0

@tacaswell:Windows用の64ビットAnacondaパッケージ。これには、Python 3.5、Matplotlib 1.5.3が含まれます。 – Javier

+0

どのバージョンのqt? – tacaswell

答えて

1

アニメーションオブジェクトをライブ参照する必要があります。またはアニメーションオブジェクト(およびそのタイマー)がガベージコレクションされます。これではありません

class AnimManager: 
    def __init__(self): 
     self.anim = None 

    def __call__(self, event): 
     fig = make_a_figure_function() 
     self.anim = animation.FuncAnimation(fig, animate) 

am = AnimManager() 
fig.canvas.mpl_connect("key_press_event", am) 
+0

あなたの答えをありがとうが、悲しいことにそれは役に立たなかった。私の編集を参照してください:コードはもはやクラッシュしませんが、それでも何もしません。 – Javier

0

global技術はイベントコールバックでは動作しないことが奇妙であるが、そのような場合には、最善のアプローチは、小さなヘルパークラスを作るために、おそらくですhttp://matplotlib.org/devdocs/api/animation_api.html#animation

を参照してください。完全な答えですが、うまくいけば、同じ問題を抱えている人には助けになるかもしれません。上の@ tacaswellのコメントに触発されて、私はTkAggにバックエンドを切り替えようとしました。多分QTのバグでしょうか?

関連する問題