Python Matplotlib-Tcl\u AsyncDelete:异步处理程序被错误的线程删除?

Python Matplotlib-Tcl\u AsyncDelete:异步处理程序被错误的线程删除?,python,django,matplotlib,Python,Django,Matplotlib,我问这个问题是因为我无法解决Python/Django中的一个问题(实际上在纯Python中这是可以的),这会导致运行时错误:tcl\u asyncdelete async handler被错误的线程删除。这与我在Django中渲染matplotlib绘图的方式有关。我的做法是: ... import matplotlib.pyplot as plt ... fig = plt.figure() ... plt.close() 我极大地减少了我的代码。但问题是——即使我只有一行代码: fig

我问这个问题是因为我无法解决
Python/Django
中的一个问题(实际上在纯Python中这是可以的),这会导致
运行时错误:tcl\u asyncdelete async handler被错误的线程删除
。这与我在Django中渲染
matplotlib
绘图的方式有关。我的做法是:

...
import matplotlib.pyplot as plt
...
fig = plt.figure()
...
plt.close()
我极大地减少了我的代码。但问题是——即使我只有一行代码:

fig = plt.figure()

我看到这个运行时错误正在发生。如果我知道在Python/Django中关闭/清理/销毁绘图的正确方法,我希望我能够解决这个问题

默认情况下,matplotlib使用TK gui toolkit,当您在不使用该toolkit的情况下渲染图像(即渲染到文件或字符串中)时,matplotlib仍会实例化一个无法显示的窗口,从而导致各种问题。为了避免这种情况,您应该使用Agg后端。它可以像这样激活--

有关更多信息,请参阅matplotlib文档--

上述(公认)答案是终端环境中的解决方案。如果在IDE中进行调试,您可能仍然希望使用“
TkAgg
”来显示数据。为了防止此问题,请应用以下两个简单规则:

  • 每次显示数据时,启动一个新的
    fig=plt.figure()
  • 不要手动关闭旧图形(例如,使用调试模式时)
  • 示例代码:

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

    这被证明是MacOS和PyCharm IDE下的一个很好的中间解决方案。

    如果在调试时不需要显示绘图,以下方法可以工作:

    import matplotlib
    matplotlib.use('Agg')
    from matplotlib import pyplot as plt
    
    但是,如果要在调试时打印,则需要执行3个步骤:

    1.将后端保存到“TKAgg”,如下所示:

    import matplotlib
    matplotlib.use('TKAgg')
    from matplot.lib import pyplot as plt
    
    或者干脆

    import matplotlib.pyplot as plt
    
    2.如前所述,您需要为每个图i添加图(编号i)=plt图(编号i)。作为第1号地块的以下示例,添加:


    3.添加断点。您至少需要添加两个断点,一个断点位于代码的开头(第一个绘图之前),另一个断点位于希望所有绘图(第二个断点之前)都被绘图的位置。所有图形都已打印,您甚至不需要手动关闭任何图形。

    对我来说,这是因为在Tensorboard的服务器连续运行一周后,Matplotlib和Tensorboard都并行访问了数据


    重新启动tensorboard
    tensorboard--logdir--samples_per_plugin images=100
    为我解决了这个问题。

    在tkinter应用程序中使用matplotlib实时绘制图形时,我遇到了这个问题

    我找到的最简单的解决办法是总是删除子地块。我发现你不需要实例化一个新的图形,你只需要删除旧的子图(使用del子图),然后重新制作它

    绘制新图形之前,请确保删除旧的子地块。 例如:


    找到这个简单的解决方案来修复这个“异步处理程序错误”是非常痛苦的,我希望这能帮助其他人:)

    你能发布回溯吗?我对Pyramid 1.3.4/Python 2.7也有同样的问题,没有回溯,只有这个——异常RuntimeError:RuntimeError('主线程不在主循环中',)在被忽略的Tcl_AsyncDelete中:异步处理程序被错误的线程删除否,我不会将它们渲染到图像。我用base64对它们进行编码并在浏览器中渲染。我的意思是,您没有使用TK工具包,我将澄清我的答案。虽然有点晚,但这解决了一个非常微妙和恼人的错误。谢谢pyplot的错误消息在这方面肯定会更有帮助。@AlexVolkov thxs如此之多,为我解决了这样一个神秘的错误。没有什么,只是
    Tcl\u AsyncDelete:async处理程序被错误的线程删除了,我使用的是flask、matplotlib、python-pptx。我甚至不知道是matplotlib引起的。我照你说的做了。不过,同样的问题。我使用的是Pycharm Pro 2020。另外,如果您想在先前的绘图上绘图,该怎么办?您不想实例化一个新图形,那么我如何关闭该图形?我正在使用控制台,经常在使用tab completion时出现此错误。
    
    import matplotlib.pyplot as plt
    
    fig1 = plt.figure(1)
    plt.plot(yourX,yourY)
    plt.show()
    
    f = Figure(figsize=(5,5), dpi=100)
    a = f.add_subplot(111)
    (For Loop code that updates graph every 5 seconds):
        del a #delete subplot
        a = f.add_subplot(111) #redefine subplot