当前位置: 首页 > 知识库问答 >
问题:

无法调用canvas.show()

劳通
2023-03-14

错误:

/usr/bin/python3.5 /root/PycharmProjects/Capstone2/main.pyTraceback(最近调用的最后一次):File"/root/PycharmProjects/Capstone2/main.py",第62行,在canvas.show()File"/usr/lib/python3/dist-pack/matplotlib/backend/backend_tkagg.py",第353行,在绘制自己中。_master.update_idletasks()属性错误:'NoneType'对象没有属性'update_idletasks'进程完成,退出代码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)

我的理解:

每秒钟应该增加一个数据点。图应该每秒钟更新一次以反映这一点。

我的想法:

  1. 从一些谷歌搜索提示,属性错误弹出,因为我正在尝试调用canvas.show和画布是什么,但我认为我的行"画布=图形CanvasTkAgg(图)"是正确的,早期的行,如"canvas.get_tk_widget(). pack(side=BOTTOM,填充=BOTH,扩展=True)"不会导致错误
  2. 如果我省略了canvas.show(),则错误发生在后面Tkinter回调异常
  3. 如果我修改我的代码,使画布=菲格雷卡瓦斯TkAgg(图,主=ROOT)并匹配我找到的一些示例,不会发生错误,但动画永远不会做任何事情。我在菲格雷卡瓦斯TkAgg上找不到任何留档,只有示例,所以我不太确定修改这一行是在做什么

这里可以看到完整的代码(警告:这太恶心了):https://github.com/AdamVen/Capstone/blob/fasterGraph/main.py

我基于的代码如下:https://pythonprogramming.net/how-to-embed-matplotlib-graph-tkinter-gui/

我不知道我错在哪里。如有任何建议,将不胜感激

共有1个答案

强保臣
2023-03-14

我不清楚代码的某些部分:画布的使用。show()(甚至不应该存在)和plt的使用。show()(这没有意义,因为您根本没有创建任何pyplot图形)

考虑到大多数示例中都使用了canvas=figurecavastkagg(图,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()
 类似资料:
  • 我正在设置我的Laravel环境,安装了composer和Laravel。我无法调用 我已经尝试过安装和更新,但是仍然返回错误。 C:\Users\Pat\personal 警告:require(C:\Users\Pat\personal/vendor/autoload.php):未能打开流:第18行的C:\Users\Pat\personal\artisan中没有此类文件或目录php致命错误:r

  • 我试图在点击事件上使用ajax调用servlet。从那个servlet,我称之为谷歌身份验证endpoint。我尝试将标头设置为我正在调用的servlet,但我无法摆脱此错误 XMLHttpRequest 无法加载 https://accounts.google.com/o/oauth2/auth?client_id=2536-a...nid 个人资料电子邮件 这是代码 在servlet上,我将其

  • 问题内容: 我正在尝试使用在Android手机上创建本地数据库。 我有一个帮助器类,如下所示,该类用于创建数据库并提供“帮助”。 我想在我的代码的主要部分中创建此类的对象,并在其中创建数据库和表。 问题: 每当我创建该类的对象时,它似乎都不会在助手中调用该方法。我以为这应该发生。我认为这基本上是该类的构造函数。(我相信我错了) 那么,为什么不调用该方法呢? 或者如何在创建类对象的地方创建数据库和表

  • 我们需要与GSuite API集成,通过日常作业检索组成员和他们的用户详细信息。 null ;“API引用/LI> 但是,当我尝试调用时得到的响应是:-https://www.googleapis.com/admin/directory/v1/groups/group id/members,或-https://www.googleapis.com/admin/directory/v1/users/