Matplotlib – Tcl_AsyncDelete: controlador async eliminado por el hilo incorrecto?

Estoy haciendo esta pregunta porque no puedo resolver un problema en Python/Django (en realidad en Python puro, está bien) que lleva a RuntimeError: tcl_asyncdelete async handler deleted by the wrong thread . Esto está relacionado de alguna manera con la forma en que renderizo los gráficos de matplotlib en Django. La forma en que lo hago es:

 ... import matplotlib.pyplot as plt ... fig = plt.figure() ... plt.close() 

Minimicé extremadamente mi código. Pero el problema es, incluso si solo tengo una línea de código:

 fig = plt.figure() 

Veo que este RuntimeError está sucediendo. Espero poder resolver el problema, si supiera la forma correcta de cerrar / limpiar / destruir plots en Python / Django.

De forma predeterminada, matplotlib usa el kit de herramientas GUI de TK, cuando está renderizando una imagen sin usar el kit de herramientas (es decir, en un archivo o una cadena), matplotlib crea una instancia de una ventana que no se muestra, causando todo tipo de problemas. Para evitar eso, debes usar un backend de Agg. Se puede activar así …

 import matplotlib matplotlib.use('Agg') from matplotlib import pyplot 

Para obtener más información, consulte la documentación de matplotlib – http://matplotlib.org/faq/howto_faq.html#matplotlib-in-a-web-application-server

La respuesta anterior (aceptada) es una solución en un entorno de terminal. Si depura en un IDE, es posible que TkAgg utilizar ‘ TkAgg ‘ para mostrar los datos. Para evitar este problema, aplique estas dos reglas simples:

  1. cada vez que muestre sus datos, inicie un nuevo fig = plt.figure()
  2. no cierre las cifras antiguas manualmente (por ejemplo, cuando se utiliza un modo de depuración)

Código de ejemplo:

 import matplotlib matplotlib.use('TkAgg') from matplotlib import pyplot as plt fig = plt.figure() plt.plot(data[:,:,:3]) plt.show() 

Esto demuestra ser una buena solución intermedia bajo MacOS y PyCharm IDE.