2012-08-28 9 views
7

Estoy tratando de construir una trama interactiva. Se supone que este debe borrar la figura si se hace clic dentro de los ejes y dibujar un círculo en un lugar al azar. El código es el siguiente:¿Cómo deshacerse del máximo error de profundidad de recursividad al trazar de forma interactiva?

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

Después de pulsar durante 42 horas, el programa de las pausas y me sale el siguiente rastreo:

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 

En este punto, no estoy seguro de que se produce la recursividad y cómo para aliviar este error

Entiendo (de otro Q & As) que puedo mejorar mi límite de pila y solucionar el problema. Sin embargo, no lo considero una solución en este caso particular y me gustaría llegar al fondo de esto.

Cualquier ayuda sería apreciada.

Gracias de antemano.

Información adicional:

  • La principal funcionalidad que los asuntos incluyen la limpieza de la figura y dibujar algo nuevo al hacer clic en el lienzo.
  • El clic no genera este error, si no estoy tratando de trazar algo. Por lo tanto, sospecho, me falta algo en el manejo de matplotlib.

Respuesta

7

En lugar de plt.show(), dentro de su devolución de llamada plt.draw(). El problema es que plt.show ejecuta un enlace principal de la biblioteca GUI; solo quiere actualizar lo que se muestra dentro del mainloop existente. Usando el backend de Qt, su código mostraría el error QCoreApplication::exec: The event loop is already running.

Consulte What is interactive mode? para obtener más información sobre cómo utilizar Matplotlib de forma interactiva.

+0

Brilliant ... Cheers. –

Cuestiones relacionadas