python - 无法调用canvas.show()

标签 python python-3.x matplotlib tkinter

错误:

/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)这一点。

我的想法:

  1. 根据一些谷歌搜索提示,由于我试图调用canvas.show而canvas什么也没有,所以会弹出AttributeError,但我认为我的行“canvas = FigureCanvasTkAgg(fig)”是正确的,早期的行如“canvas.get_tk_widget()” .pack(side=BOTTOM, fill=BOTH, Expand=True)"不会导致错误
  2. 如果我省略“canvas.show()”,则稍后会出现错误“Tkinter 回调中的异常”
  3. 如果我修改代码,使 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/

相关文章:

python - TextEdit 以编程方式设置文本而不触发 textChanged 事件?

python - 将 cumcount() 与重复项一起使用

java - 在某些条件下最大化 GCD

python - Matplotlib 到 Django 模板

python - Matplotlib - 在极坐标图中画一个光滑的圆

python - 为什么 Python 在不应该的时候给我 "an integer is required"?

python - 如何学习在 deeplab v3 plus 上使用我的数据集

python 子类

python - 列表迭代和编辑列表的项目,请改进我的代码

python - 重新绘制 matplotlib 之前清除图形