Embedding a matplotlib animation into a tkinter frame Embedding a matplotlib animation into a tkinter frame tkinter tkinter

Embedding a matplotlib animation into a tkinter frame


I modified your code:

#---------Importsfrom numpy import arange, sin, pifrom matplotlib.backends.backend_tkagg import FigureCanvasTkAggfrom matplotlib.figure import Figureimport Tkinter as Tkimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animation#---------End of importsfig = plt.Figure()x = np.arange(0, 2*np.pi, 0.01)        # x-arraydef animate(i):    line.set_ydata(np.sin(x+i/10.0))  # update the data    return line,root = Tk.Tk()label = Tk.Label(root,text="SHM Simulation").grid(column=0, row=0)canvas = FigureCanvasTkAgg(fig, master=root)canvas.get_tk_widget().grid(column=0,row=1)ax = fig.add_subplot(111)line, = ax.plot(x, np.sin(x))ani = animation.FuncAnimation(fig, animate, np.arange(1, 200), interval=25, blit=False)Tk.mainloop()


This answer will hopefully be allowed. It is an answer to what I was actually interested in, when I initially found this question, that is, 'Embedding a Matplotlib animation into a tkinter based GUI'.

The code that gave the previous screenshot has been extended, in this code the canvas has been placed inside a class definition, together with some code for two command buttons, these buttons don't actually do "anything" but the structure is there for possible further development.

The following screenshot was produced with the aid of the extended code

A screenshot of the SHM animation running from within a tkinter based GUI

The extended code used for the above screenshot is given below.

from matplotlib.backends.backend_tkagg import FigureCanvasTkAggimport tkinter as tkfrom tkinter import Frame,Label,Entry,Buttonimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animationclass Window(Frame):    def __init__(self, master = None):        Frame.__init__(self, master)        self.master = master        self.init_window()    def Clear(self):        x=0#    def Plot(self):#        x=0    def init_window(self):        def animate(i):           self.line.set_ydata(np.sin(self.x+i/10.0))  # update the data           return self.line,        self.master.title("Use Of FuncAnimation in tkinter based GUI")        self.pack(fill='both', expand=1)     #Create the controls, note use of grid        self.labelSpeed = Label(self,text="Speed (km/Hr)",width=12)        self.labelSpeed.grid(row=0,column=1)        self.labelAmplitude = Label(self,text="Amplitude",width=12)        self.labelAmplitude.grid(row=0,column=2)        self.textSpeed = Entry(self,width=12)        self.textSpeed.grid(row=1,column=1)        self.textAmplitude = Entry(self,width=12)        self.textAmplitude.grid(row=1,column=2)#        self.buttonPlot = Button(self,text="Plot",command=self.Plot,width=12)        self.buttonPlot = Button(self,text="Plot",width=12)        self.buttonPlot.grid(row=2,column=1)        self.buttonClear = Button(self,text="Clear",command=self.Clear,width=12)        self.buttonClear.grid(row=2,column=2)#        self.buttonClear.bind(lambda e:self.Plot)        self.buttonClear.bind(lambda e:self.Clear)        tk.Label(self,text="SHM Simulation").grid(column=0, row=3)        self.fig = plt.Figure()        self.x = np.arange(0, 2*np.pi, 0.01)        # x-array        self.ax = self.fig.add_subplot(111)        self.line, = self.ax.plot(self.x, np.sin(self.x))                self.canvas = FigureCanvasTkAgg(self.fig, master=self)        self.canvas.get_tk_widget().grid(column=0,row=4)        self.ani = animation.FuncAnimation(self.fig, animate, np.arange(1, 200), interval=25, blit=False)root = tk.Tk()root.geometry("700x400")app = Window(root)tk.mainloop()


Based on the answer of user151522 that didnt work for me at the first try, i made a few modifications to work in python 3.7:

#---------Importsfrom matplotlib.backends.backend_tkagg import FigureCanvasTkAggimport tkinter as tkimport numpy as npimport matplotlib.pyplot as pltimport matplotlib.animation as animation#---------End of importsfrom tkinter import Frame,Label,Entry,Buttonclass Window(Frame):    def __init__(self, master = None):        Frame.__init__(self, master)        self.master = master        self.init_window()    def Clear(self):              print("clear")        self.textAmplitude.insert(0, "1.0")        self.textSpeed.insert(0, "1.0")           def Plot(self):        self.v = float(self.textSpeed.get())        self.A = float(self.textAmplitude.get())    def animate(self,i):        self.line.set_ydata(self.A*np.sin(self.x+self.v*i))  # update the data        return self.line,    def init_window(self):        self.master.title("Use Of FuncAnimation in tkinter based GUI")        self.pack(fill='both', expand=1)             #Create the controls, note use of grid        self.labelSpeed = Label(self,text="Speed (km/Hr)",width=12)        self.labelSpeed.grid(row=0,column=1)        self.labelAmplitude = Label(self,text="Amplitude",width=12)        self.labelAmplitude.grid(row=0,column=2)        self.textSpeed = Entry(self,width=12)        self.textSpeed.grid(row=1,column=1)        self.textAmplitude = Entry(self,width=12)        self.textAmplitude.grid(row=1,column=2)        self.textAmplitude.insert(0, "1.0")        self.textSpeed.insert(0, "1.0")        self.v = 1.0        self.A = 1.0        self.buttonPlot = Button(self,text="Plot",command=self.Plot,width=12)                self.buttonPlot.grid(row=2,column=1)        self.buttonClear = Button(self,text="Clear",command=self.Clear,width=12)        self.buttonClear.grid(row=2,column=2)        self.buttonClear.bind(lambda e:self.Clear)        tk.Label(self,text="SHM Simulation").grid(column=0, row=3)        self.fig = plt.Figure()        self.x = 20*np.arange(0, 2*np.pi, 0.01)        # x-array        self.ax = self.fig.add_subplot(111)        self.line, = self.ax.plot(self.x, np.sin(self.x))                self.canvas = FigureCanvasTkAgg(self.fig, master=self)        self.canvas.get_tk_widget().grid(column=0,row=4)        self.ani = animation.FuncAnimation(self.fig, self.animate, np.arange(1, 200), interval=25, blit=False)root = tk.Tk()root.geometry("700x400")app = Window(root)tk.mainloop()