2012-08-28 10 views
7

Sto provando a costruire una trama interattiva. Questo dovrebbe cancellare la figura se cliccato all'interno degli assi e disegnare un cerchio in un luogo casuale. Il codice è il seguente:Come eliminare l'errore di profondità massima di ricorsione mentre si esegue il tracciamento interattivo?

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() 

Dopo aver cliccato per 42 volte, le pause del programma e ottengo il seguente traceback:

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 

A questo punto, io non sono certo in cui si verifica la ricorsione e come per alleviare questo errore.

Capisco (da altro Q & As) che potrei migliorare il mio limite di stack e aggirare il problema. Tuttavia, non lo considero una soluzione in questo caso particolare e vorrei arrivare a fondo.

Qualsiasi aiuto sarebbe gradito.

Grazie in anticipo.

Informazioni aggiuntive:

  • La funzionalità principale che conta includono aprendo la figura e disegno qualcosa di nuovo clic sulla tela.
  • Il clic non genera questo errore, se non sto cercando di tracciare qualcosa. Quindi, sospetto, mi manchi qualcosa nella gestione di matplotlib.

risposta

7

Invece di plt.show(), dalla chiamata di richiamata plt.draw(). Il problema è che plt.show esegue un mainloop della libreria della GUI; vuoi solo aggiornare ciò che è mostrato all'interno del mainloop esistente. Usando il backend Qt, il tuo codice mostrerebbe l'errore QCoreApplication::exec: The event loop is already running.

Vedere What is interactive mode? per ulteriori indicazioni su come utilizzare Matplotlib in modo interattivo.

+0

Brillante ... Salute. –

Problemi correlati