私は、ユーザが特定のキーを押すたびに起動したいアニメーションを持っています。アニメーションプロット(フレームごとに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
を設定するとクラッシュは停止しますが、イベントをトリガーすると何も起こりません。
mpl +バックエンドのどのバージョンですか? – tacaswell
@tacaswell:Windows用の64ビットAnacondaパッケージ。これには、Python 3.5、Matplotlib 1.5.3が含まれます。 – Javier
どのバージョンのqt? – tacaswell