編集:
Bah は、最終的にランタイム エラーに関する議論を見つけましたが、その時点ではインストールしていなかった PythonWin の使用に焦点を当てています。PythonWin をインストールして GTK をセットアップした後 (以前の質問に従って)、まだエラーが発生していました。ここのディスカッション ボードからの解決策は、for ループの後に plt.close() を追加することでした。これはうまくいくようです。
でも:
コマンド ラインからは、プロット中にウィンドウを移動することはできません。終了時に、PyEval_RestoreThread が NULL tstate にならなくなりました。プロット中にウィンドウを移動できるようにするとよいでしょう。
元の投稿:
注: 説明されているすべての問題は、コマンド ラインから実行したときに発生します。IDLE シェル (-n) から実行すると、「関連性のない追加情報」セクションに記載されているように、同様の異常が発生します。
私のコードは線を正しくプロットし、プロットした直後に次のようになります。
「致命的な Python エラー: PyEval_RestoreThread: NULL tstate
このアプリケーションは、ランタイムに異常な方法で終了するように要求しました。詳細については、アプリケーションのサポート チームにお問い合わせください。」
コードは次のとおりです。
import matplotlib as mpl
mpl.use("TKAgg")
import pylab as plt
import numpy as np
Line = mpl.lines.Line2D
x = np.linspace(-1,1,50)
y=np.sin(x*np.pi)
plt.ion()
fig = plt.gcf()
ax = fig.gca()
ax.add_line(Line([x],[y]))
plt.draw()
plt.ion() をコメントアウトすると、コードは問題ありませんが、何も表示されません。
この例では plt.show() が機能しますが、目標はインタラクティブを使用して、次の方法で大雑把なアニメーションを作成することです。
import matplotlib as mpl
mpl.use("TKAgg")
import pylab as plt
import numpy as np
plt.ion()
Line = mpl.lines.Line2D
x = np.linspace(-1,1,50)
for i in xrange(10):
y = (1.0+i/9.0) * np.sin(x*np.pi)
plt.clf()
fig = plt.gcf()
ax = fig.gca()
ax.add_line(Line([x],[y]))
plt.draw()
各反復はそれぞれの行を正しくプロットし、ループの後のコードは致命的なエラーの前に実行されます。これは、for ループの直後に次を追加することで実証できます。
raw_input("no error yet: ")
print "here it comes"
フィギュアを破壊してから新しいフィギュアと新しい軸を作成することは、効率的ではないか、良い習慣でさえないかもしれないことを理解しています. ただし、コメントアウトしてもエラーが発生しないため、問題はまだ plt.ion() にあるようです。
解決策が十分に文書化されていて、検索でそれを通過した場合は、怒ってこれを指摘し、おそらくそのようなリンクを提供してください. 代替手段が新しい問題に遭遇した場合、これは非常に好ましいでしょう。
答えが pylab を使用するよりも直接的にプロットを管理することである場合、私はこのオプションを検討したいと思っています。
追加の、おそらく無関係な情報:
- for ループの後で raw_input() を使用しない場合、2 番目のコードの実行中にウィンドウを移動できません。
- raw_input() を使用する場合、プログラムが raw_input() を待っている間に、ウィンドウをプロット後に移動できます。
- 問題は、IDLE シェル (サブプロセスなし) から実行する場合と同じです。
- プロット中にウィンドウを移動することはできませんが、致命的なエラーは発生しません。
- raw_input() を使用しなくても、プロット後にウィンドウを移動できます
- コマンド ラインまたは IDLE シェルのいずれかから、ウィンドウが移動できないときに各プロットが正しく表示される
提案/アドバイスをお寄せいただきありがとうございます。