首页 文章

无法调用canvas.show()

提问于
浏览
2

Error:

/usr/bin/python3.5 /root/PycharmProjects/Capstone2/main.py Traceback(最近一次调用最后一次):文件“/root/PycharmProjects/Capstone2/main.py”,第62行,在canvas.show()中文件“/usr/lib/python3/dist-packages/matplotlib/backends/backend_tkagg.py”,第353行,在绘图中self._master.update_idletasks()AttributeError:'NoneType'对象没有属性'update_idletasks'进程已完成退出代码1

Relevant Code:

# 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)

My Understanding:

应该每隔一秒添加一个数据点 . 每一秒情节应该更新以反映这一点 .

My Thoughts:

  • 从一些谷歌搜索暗示AttributeError弹出,因为我试图调用canvas.show和画布是什么,但我认为我的行"canvas = FigureCanvasTkAgg(fig)"是正确的,像"canvas.get_tk_widget().pack(side=BOTTOM, fill=BOTH, expand=True)"之类的早期行不会导致错误

  • 如果我省略"canvas.show()",则错误会在以后发生"Exception in Tkinter callback "

  • 如果我修改我的代码所以canvas = FigureCanvasTkAgg(fig,master = ROOT)并且匹配一些示例我've found, no errors occur but the animation never does anything. I couldn't找到关于FigureCanvasTkAgg的任何文档,只有示例所以我通过修改这一行做了'm not too sure what I'm

这里可以看到完整的代码(警告:它非常粗略):https://github.com/AdamVen/Capstone/blob/fasterGraph/main.py

我所依据的代码在这里:https://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/

我不确定我哪里出错了 . 任何意见,将不胜感激

1 回答

  • 2

    代码的某些部分对我来说不清楚:使用 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()
    

相关问题