错误:
/usr/bin/python3.5 /root/PycharmProjects/Capstone2/main.py Traceback (most recent call last): File "/root/PycharmProjects/Capstone2/main.py", line 62, in canvas.show() File "/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py", line 353, in draw self._master.update_idletasks() AttributeError: 'NoneType' object has no attribute 'update_idletasks' Process finished with exit code 1
相关代码:
# GUI imports
from tkinter import *
# Graph imports
import matplotlib.pyplot as plt
import matplotlib
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
from matplotlib import style
# Time imports
import time
def animate(i):
a.clear()
a.plot(data)
data = []
# GUI Set-Up
ROOT = Tk()
ROOT.attributes("-fullscreen", True)
matplotlib.use("TkAgg")
style.use('ggplot')
f = Frame(ROOT)
fig = Figure(figsize=(12, 7), dpi=100)
a = fig.add_subplot(221)
a.set_title("Data")
canvas = FigureCanvasTkAgg(fig)
canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)
canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=True)
canvas.show()
Frame.pack(f)
LOOP_ACTIVE = True
ROOT.config(cursor="none")
ani = animation.FuncAnimation(fig, animate, interval=1000)
plt.show()
for x in range(0, 10):
data.append(x)
ROOT.update()
time.sleep(1)
我的理解:
每一秒都应该添加一个数据点。每秒绘图都会更新以反射(reflect)这一点。
我的想法:
- 根据一些谷歌搜索提示,由于我试图调用canvas.show而canvas什么也没有,所以会弹出AttributeError,但我认为我的行“canvas = FigureCanvasTkAgg(fig)”是正确的,早期的行如“canvas.get_tk_widget()” .pack(side=BOTTOM, fill=BOTH, Expand=True)"不会导致错误
- 如果我省略“canvas.show()”,则稍后会出现错误“Tkinter 回调中的异常”
- 如果我修改代码,使 canvas = FigureCanvasTkAgg(fig, master=ROOT) 并匹配我发现的一些示例,则不会发生错误,但动画不会执行任何操作。我找不到有关 FigureCanvasTkAgg 的任何文档,只有示例,所以我不太确定修改此行要做什么
完整代码可以在这里看到(警告:这非常恶心):https://github.com/AdamVen/Capstone/blob/fasterGraph/main.py
我所基于的代码在这里:https://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/
我不知道我哪里错了。任何建议将不胜感激
最佳答案
代码的某些部分我不清楚: canvas.show()
的使用(甚至不应该存在)和 plt.show()
的使用(鉴于您根本没有创建任何 pyplot 图形,这没有意义)
鉴于canvas = FigureCanvasTkAgg(fig, master=ROOT)
在大多数例子中都使用了,我不知道为什么不使用它。
文件末尾的循环似乎没有用。相反,您可以使用动画循环来更改数据。
最后,您忘记实际启动该程序,即 ROOT.mainloop()
.
from Tkinter import *
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
# Data simulation imports
import time
def animate(i):
a.clear()
data.append(i)
a.plot(data)
data = []
# GUI Set-Up
ROOT = Tk()
f = Frame(ROOT)
plt.style.use('ggplot')
fig = Figure(figsize=(12, 7), dpi=100)
a = fig.add_subplot(221)
a.set_title("Data")
canvas = FigureCanvasTkAgg(fig, master=ROOT)
canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)
canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=True)
Frame.pack(f)
ani = animation.FuncAnimation(fig, animate, interval=1000)
ROOT.mainloop()
关于python - 无法调用canvas.show(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50165115/