首页 > 解决方案 > _tkinter.TclError:这不是 matplotlib 条形图中的 Tk 应用程序

问题描述

我有一个程序可以分析某些视频并根据视频的内容每秒分配一个“分数”。我有一个程序生成的一些原始数据的示例(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”。

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

谁能帮我制作这个条形图的动画?

标签: pythonnumpymatplotlib

解决方案


我的代码也发生了类似的事情。我在主线程中运行 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。

我还没有解决我自己的问题,但希望这能把你推向正确的方向。


推荐阅读