python - _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
谁能帮我制作这个条形图的动画?
解决方案
我的代码也发生了类似的事情。我在主线程中运行 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。
我还没有解决我自己的问题,但希望这能把你推向正确的方向。
推荐阅读
- css - SVG - CSS - 在某些 svg 路径上绘制动画
- mysql - 如何计算mysql中的子查询
- javascript - 一定间隔后的Javascript旋转动画
- javascript - 如何在php中动态获取特定的行数据
- java - 有没有办法在一行中将数字添加到 ArrayList 中的现有数字?
- java - Xmlgregoriancalendar 不允许在 ddMMyyyy 中前导零
- c# - SQL Server 返回没有十进制值的小数的奇怪行为
- xamarin - 如何使用自定义渲染器默认设置开关的颜色?
- c# - 如何使用使用 StreamWriter 保存的文本文件加载 datagridview
- ocaml - reasonml 记录 vs JS 对象