_tkinter.TclError:这不是matplotlib条形图中的Tk应用程序

时间:2018-07-29 01:12:10

标签: python numpy matplotlib

我有一个程序,可以分析某些视频并根据视频内容每秒分配一个“分数”。我有一个示例,该程序会产生一些原始数据(x表示秒,y表示分数)。

0 0
1 27
2 48
3 78
4 92
5 72

等。我的目标是创建一个与视频一起播放的动画图。例如,当播放1秒的视频时,将绘制点(1、27)。经过2秒后,将绘制点(2,48)。我现在不关心视频和动画图形的合并;现在,我只关心让图形每秒绘制1条。

from matplotlib import pyplot as plt
import numpy as np
import numpy
from matplotlib import animation

fig = plt.figure()
ax = plt.axes(xlim=(0, 10), ylim=(0, 100)) #a 0 to 10 x axis and a 0 to 100 y
line, = ax.plot([], [], lw=2)

def init():
    line.set_data([], [])
    return line,

def animate(i):
    with open('E:\PYTHON\data.txt') as f:
        lines = f.readlines()
        x = [float(line.split()[0]) for line in lines]
        y = [float(line.split()[1]) for line in lines]

    ax.bar(x,y, width=0.7)
    plt.show()
    plt.draw()

ani = animation.FuncAnimation(fig, animate, interval=1000)

plt.show()

但是,此代码最终将我的所有数据发送到一个图像而不是动画中,然后出现此错误。我想“将所有数据发送到一个图像中”部分的原因是我没有在x和y值中使用“ i”,但是老实说,我不知道如何在动画代码中实现“ i”。 / p>

Traceback (most recent call last):
  File "E:\PYTHON\lib\site-packages\matplotlib\cbook\__init__.py", line 388, in process
    proxy(*args, **kwargs)
  File "E:\PYTHON\lib\site-packages\matplotlib\cbook\__init__.py", line 228, in __call__
    return mtd(*args, **kwargs)
  File "E:\PYTHON\lib\site-packages\matplotlib\animation.py", line 1030, in _start
    self.event_source.add_callback(self._step)
AttributeError: 'NoneType' object has no attribute 'add_callback'
Exception in Tkinter callback
Traceback (most recent call last):
  File "E:\PYTHON\lib\site-packages\matplotlib\backends\tkagg.py", line 26, in blit
    dataptr, colormode, bboxptr)
_tkinter.TclError: this isn't a Tk application

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:\PYTHON\lib\tkinter\__init__.py", line 1702, in __call__
    return self.func(*args)
  File "E:\PYTHON\lib\site-packages\matplotlib\backends\_backend_tk.py", line 227, in resize
    self.draw()
  File "E:\PYTHON\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 13, in draw
    tkagg.blit(self._tkphoto, self.renderer._renderer, colormode=2)
  File "E:\PYTHON\lib\site-packages\matplotlib\backends\tkagg.py", line 34, in blit
    dataptr, colormode, bboxptr)
_tkinter.TclError: this isn't a Tk application

有人可以帮助我为该条形图制作动画吗?

1 个答案:

答案 0 :(得分:0)

我的代码也发生了类似的情况。我在主线程中运行了matplotlib GUI,它使用TkAgg作为其后端。在另一个线程中,我有一些函数可以经常更新GUI视觉。关闭GUI窗口后,出现您所描述的错误,但另一个线程仍在运行,并进行了调用以更新不再存在的图形。我已经找到了其他一些帮助,也许会对您有用。您可以做的第一件事是确保matplotlib使用TkAgg后端

import matplotlib print(matplotlib.get_backend())

如果没有,您可以按照此处(https://askubuntu.com/questions/785505/how-to-ensure-matplotlib-in-a-python-3-virtualenv-uses-the-tkagg-backend)的说明操作,该说明说明如何使matplotlib使用TkAgg。

我还没有解决自己的问题,但是希望这可以将您推向正确的方向。