蟒蛇。使用animation.FuncAnimation时出错

时间:2017-03-15 16:21:29

标签: python matplotlib tkinter python-3.4

我是python的新手,我想在点击按钮后在新窗口中显示图形,但我不知道当我按照文档操作时出现了什么错误。我一直得到同样的错误。

 Traceback (most recent call last):
  File "C:\Users\User\Desktop\IMPORTANT NOTES\python to firebase\GUI\increment.py", line 88, in <module>
    ani = animation.FuncAnimation(f, animate, interval=1000)
  File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\animation.py", line 1462, in __init__
    TimedAnimation.__init__(self, fig, **kwargs)
  File "C:\Users\User\AppData\Local\Programs\Python\Python35-32\lib\site-packages\matplotlib\animation.py", line 1225, in __init__
    event_source = fig.canvas.new_timer()
AttributeError: 'NoneType' object has no attribute 'new_timer'

这是我的代码。

from tkinter import *
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,    NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
import matplotlib.pyplot as plt
from matplotlib import style

style.use("ggplot")

f = Figure(figsize = (5,5), dpi = 100)
a = f.add_subplot(111)
#a.plot([1,2,3,4,5,6,7,8],[5,4,8,6,3,2,7,9])


def animate(i):
    pullData = open ("sampleData.txt","r").read()
    datalist = pullData.split('\n')
    xList = []
    yList = []
    for eachLine in dataList:
        if len (eachLine)>1:
            x,y=eachLine.split(',')
            xList.append(int (x))
            yList.append(int (y))

    a.clear()
    a.plot(xList,yList)



class Application(Frame):
    """A GUI app with some buttons."""

    def __init__(self, master):
        """ Initialze frame"""
        Frame.__init__(self, master)
        self.grid()
        self.button_clicks=0 #count the number of button click
        self.create_widgets()

    def create_widgets(self):
        """Create button which displays number of clicks."""

        #Button1
        self.button1 = Button(self)
        self.button1 ["text"]="in"
        self.button1["command"] = self.update_news
        self.button1.grid()



    def update_news(self):
        toplevel = Toplevel()



        canvas = FigureCanvasTkAgg(f,toplevel)
        canvas.show()
        canvas.get_tk_widget().pack()

        toolbar = NavigationToolbar2TkAgg(canvas,toplevel)
        toolbar.update()
        canvas._tkcanvas.pack()


#Building the window
root = Tk()
root.title("Buttons")
root.geometry("200x300")

app = Application(root)

#MainLoop

ani = animation.FuncAnimation(f, animate, interval=1000)
root.mainloop()

1 个答案:

答案 0 :(得分:0)

一旦将图形添加到画布,您需要确保仅启动动画。然后保持对FuncAnimation实例的引用也很重要。

这样做的一种直观方法是在update_news方法中创建图形,并仅在将图形绑定到画布后创建动画。对图形使用类变量(self),轴和画布确保不会丢失引用。

from tkinter import *
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg,    NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import matplotlib.animation as animation
import matplotlib.pyplot as plt
from matplotlib import style
import numpy as np

style.use("ggplot")


class Application(Frame):
    """A GUI app with some buttons."""

    def __init__(self, master):
        """ Initialze frame"""
        Frame.__init__(self, master)
        self.grid()
        self.button_clicks=0 #count the number of button click
        self.create_widgets()

    def create_widgets(self):
        """Create button which displays number of clicks."""

        #Button1
        self.button1 = Button(self)
        self.button1 ["text"]="in"
        self.button1["command"] = self.update_news
        self.button1.grid()

    def update_news(self):
        toplevel = Toplevel()

        self.f = Figure(figsize = (5,5), dpi = 100)
        self.a = self.f.add_subplot(111)


        self.canvas = FigureCanvasTkAgg(self.f,toplevel)
        self.canvas.show()
        self.canvas.get_tk_widget().pack()

        toolbar = NavigationToolbar2TkAgg(self.canvas,toplevel)
        toolbar.update()
        self.canvas._tkcanvas.pack()

        self.ani = animation.FuncAnimation(app.f, app.animate, frames=100,interval=100)

    def animate(self,i):
        """
        pullData = open ("sampleData.txt","r").read()
        datalist = pullData.split('\n')
        xList = []
        yList = []
        for eachLine in dataList:
            if len (eachLine)>1:
                x,y=eachLine.split(',')
                xList.append(int (x))
                yList.append(int (y))
        """
        xList = np.arange(i+1)
        yList = np.sin(xList/10.)
        self.a.clear()
        self.a.plot(xList,yList)


#Building the window
root = Tk()
root.title("Buttons")
root.geometry("200x300")

app = Application(root)

#MainLoop
root.mainloop()

注意:在较新版本的matplotlib中,您应使用NavigationToolbar2Tk代替NavigationToolbar2TkAgg