尝试在使用类时在Tkinter中运行实时matplotlib图。无法解决TypeError

时间:2017-11-21 23:17:56

标签: python python-2.7 matplotlib tkinter tkinter-canvas

我正在尝试使用类结构在Tkinter中使用实时matplotlib图。我正在使用此stackoverflow question中的代码,该代码在Tkinter中成功运行matplotlib图(不使用类结构)。每当我尝试运行我改变的代码时,我都会得到一个

TypeError: __init__ takes exactly 2 arguments (1 given)

我知道之前已经问过这个TypeError类型的问题。我尝试使用this,但提供的答案并没有解决我的问题。

似乎是问题的代码行是:

ani = animation.FuncAnimation(Window().fig, Window().animate(), interval=1000, blit=Fals

我尝试改变我称之为无花果和动画的方式,但似乎没有任何效果。

import Tkinter as Tk
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
xar = []
yar = []

class Window:
    def __init__(self,master):
        frame = Tk.Frame(master)
        fig = plt.figure(figsize=(14, 4.5), dpi=100)

        self.ax = fig.add_subplot(1,1,1)
        self.ax.set_ylim(0, 100)
        self.line, = self.ax.plot(xar, yar)

        self.canvas = FigureCanvasTkAgg(fig,master=master)
        self.canvas.show()
        self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
        frame.pack()
    def animate(self,i):
        yar.append(99-i)
        xar.append(i)
        self.line.set_data(xar, yar)
        self.ax.set_xlim(0, i+1)

root = Tk.Tk()
ani = animation.FuncAnimation(Window().fig, Window().animate(),interval=1000, blit=False)
app = Window(root)
root.mainloop()

2 个答案:

答案 0 :(得分:1)

我不确定你要做什么,但你可能想要这样的事情:

animate

这不能完全解决问题,因为/candidate/all_jobs函数也没有参数。

答案 1 :(得分:1)

你有很多错误:

正如Paul Comelius所说,你必须创建实例

app = Window(root)
ani = animation.FuncAnimation(app.fig, app.animate, interval=1000, blit=False)

-

您必须在课堂内使用self.fig以便app.fig

获取它

-

animation.FuncAnimation期望回调 - 它表示没有()的函数名称 在您的代码中,它将是app.animate

ani = animation.FuncAnimation(app.fig, app.animate, interval=1000, blit=False)

-

完整的工作代码

import Tkinter as Tk
from matplotlib import pyplot as plt
import matplotlib.animation as animation
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class Window:

    def __init__(self,master):
        frame = Tk.Frame(master)

        self.fig = plt.figure(figsize=(14, 4.5), dpi=100)

        self.ax = self.fig.add_subplot(1,1,1)
        self.ax.set_ylim(0, 100)
        self.line, = self.ax.plot(xar, yar)

        self.canvas = FigureCanvasTkAgg(self.fig, master=master)
        self.canvas.show()
        self.canvas.get_tk_widget().pack(side='top', fill='both', expand=1)
        frame.pack()

    def animate(self,i):
        yar.append(99-i)
        xar.append(i)
        self.line.set_data(xar, yar)
        self.ax.set_xlim(0, i+1)

xar = []
yar = []

root = Tk.Tk()
app = Window(root)
ani = animation.FuncAnimation(app.fig, app.animate, interval=1000, blit=False)
root.mainloop()