2012-08-28 5 views
7

私は対話的なプロットを作成しようとしています。これは、軸の中をクリックしてランダムな場所に円を描くと、図をクリアするはずです。再帰が発生し、どのようにどこ私は確かではないよ、この時点で対話形式でプロットしているときに最大再帰深度エラーを取り除くにはどうすればよいですか?

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__ 
    return self.func(*args) 
    File "/usr/lib/pymodules/python2.7/matplotlib/backends/backend_tkagg.py", line 286, in button_press_event 
    FigureCanvasBase.button_press_event(self, x, y, num, guiEvent=event) 
    File "/usr/lib/pymodules/python2.7/matplotlib/backend_bases.py", line 1632, in button_press_event 
    self.callbacks.process(s, mouseevent) 
    File "/usr/lib/pymodules/python2.7/matplotlib/cbook.py", line 262, in process 
    proxy(*args, **kwargs) 
    File "/usr/lib/pymodules/python2.7/matplotlib/cbook.py", line 192, in __call__ 
    return mtd(*args, **kwargs) 
    File "/home/almarahat/Dropbox/python/GUI/Testing site/test_rt/baud_test.py", line 8, in draw_circle 
    plt.cla() 
    File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2784, in cla 
    ret = gca().cla() 
    File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 842, in cla 
    spine.cla() 
    File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 157, in cla 
    self.axis.cla() 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 731, in cla 
    self.reset_ticks() 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 744, in reset_ticks 
    self.majorTicks.extend([self._get_tick(major=True)]) 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 1553, in _get_tick 
    return XTick(self.axes, 0, '', major=major, **tick_kw) 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 141, in __init__ 
    self.tick2line = self._get_tick2line() 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 401, in _get_tick2line 
    l.set_transform(self.axes.get_xaxis_transform(which='tick2')) 
    File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 586, in get_xaxis_transform 
    return self.spines['top'].get_spine_transform() 
    File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 374, in get_spine_transform 
    self._ensure_position_is_set() 
    File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 140, in _ensure_position_is_set 
    self.set_position(self._position) 
    File "/usr/lib/pymodules/python2.7/matplotlib/spines.py", line 365, in set_position 
    self.axis.cla() 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 731, in cla 
    self.reset_ticks() 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 744, in reset_ticks 
    self.majorTicks.extend([self._get_tick(major=True)]) 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 1553, in _get_tick 
    return XTick(self.axes, 0, '', major=major, **tick_kw) 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 140, in __init__ 
    self.tick1line = self._get_tick1line() 
    File "/usr/lib/pymodules/python2.7/matplotlib/axis.py", line 383, in _get_tick1line 
    zorder=self._zorder, 
    File "/usr/lib/pymodules/python2.7/matplotlib/lines.py", line 195, in __init__ 
    self._marker = MarkerStyle() 
    File "/usr/lib/pymodules/python2.7/matplotlib/markers.py", line 112, in __init__ 
    self.set_marker(marker) 
    File "/usr/lib/pymodules/python2.7/matplotlib/markers.py", line 171, in set_marker 
    self._recache() 
    File "/usr/lib/pymodules/python2.7/matplotlib/markers.py", line 116, in _recache 
    self._path = Path(np.empty((0,2))) 
    File "/usr/lib/pymodules/python2.7/matplotlib/path.py", line 112, in __init__ 
    if ma.isMaskedArray(vertices): 
    File "/usr/local/lib/python2.7/dist-packages/numpy-1.6.2-py2.7-linux-x86_64.egg/numpy/ma/core.py", line 5683, in isMaskedArray 
    return isinstance(x, MaskedArray) 
RuntimeError: maximum recursion depth exceeded while calling a Python object 

次のようにコードは次のとおりです。

import matplotlib.pyplot as plt 
import random 


def draw_circle(event): 
    if event.inaxes: 
     print(event.xdata, event.ydata) 
     plt.cla() 
     a = random.randint(0,100) 
     b = random.randint(0,100) 
     s, = plt.plot(a,b,'o', ms=100, color="blue",visible=True) 
     plt.show() 


fig = plt.figure() 
ax = plt.subplot(111) 
s, = plt.plot(1,2,'o', ms=100, color="blue",visible=True) 
plt.connect("button_press_event", draw_circle) 
plt.show() 

42回、プログラムの休憩のためにクリックした後、私は、次のトレースバックを得ますこのエラーを緩和する。

私はスタック制限を強化して問題を回避できることを(他のQ &として)理解しています。しかし、私はこれをこの特定のケースでの解決策とはみなしておらず、これの底に到達したいと考えています。

助けていただければ幸いです。

ありがとうございます。

追加情報:

  • 事項は数字をクリアしてキャンバスをクリックする上で何か新しいものを描くなどが主な機能。
  • 私が何かをプロットしようとしていない場合、このエラーは発生しません。したがって、私はmatplotlibを扱う際に何か不足していると思います。

答えて

7

plt.show()の代わりに、コールバックコールplt.draw()から。問題は、plt.showがGUIライブラリのメインループを実行していることです。既存のメインループ内に表示されているものを更新したいだけです。 Qtバックエンドを使用すると、コードにエラーQCoreApplication::exec: The event loop is already runningが表示されます。

Matplotlibを対話形式で使用する方法の詳細については、What is interactive mode?を参照してください。

+0

ブリリアント...乾杯。 –

関連する問題