plt.show()
ユーザーがウィジェット/ウィンドウを閉じるまで戻りません。多くの場合、この動作は問題ありません。とにかくユーザーが素晴らしいグラフを見るのに時間を費やしている間に、スクリプトを続行する必要があるのはなぜですか?:-)ただし、プログラムを続行する必要がある場合は、threading
モジュールを使用してください。メインスレッドを終了させる前plt.show()
に、新しいスレッドとこのスレッドを呼び出します。join()
編集:
物事はそれほど単純ではないようです。私は以下を作成しましたtest.py
:
import threading
from matplotlib import pyplot as p
import time
p.plot([_ for _ in xrange(5)])
t = threading.Thread(target=p.show)
t.start()
for i in xrange(5):
print "lala %s" % i
time.sleep(1)
print "Waiting for plot thread to finish..."
t.join()
print "Finished."
テストすると、次のエラーが発生します。
14:43:42 $ python test.py
lala 0
lala 1
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.6/threading.py", line 532, in __bootstrap_inner
self.run()
File "/usr/lib/python2.6/threading.py", line 484, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_tkagg.py", line 73, in show
manager.show()
File "/usr/lib/pymodules/python2.6/matplotlib/backends/backend_tkagg.py", line 385, in show
if not self._shown: self.canvas._tkcanvas.bind("<Destroy>", destroy)
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 988, in bind
return self._bind(('bind', self._w), sequence, func, add)
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 938, in _bind
needcleanup)
File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 1101, in _register
self.tk.createcommand(name, f)
RuntimeError: main thread is not in main loop
p.show()
これから、メインスレッドから呼び出す必要があると推測します。多分あなたはそれを逆にやらなければならないでしょう:あなたのユーザー入力を別のスレッドで取得してください。