Как импортировать 3D-анимацию matplotlib в кадре tkinter в python? - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь импортировать 3D-анимацию matplotlib в окне Tkinter, но застряла на ошибке.В моем окне Tkinter много кадров, и я пытаюсь нанести анимацию на один из этих кадров.Наконец, я создаю все элементы внутри функции инициализации класса.Итак, вот упрощенная версия моего кода:

from tkinter import *
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import  FigureCanvasTkAgg
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.animation as anim
import random

class UI:
    def __init__(self):
        self.back = Frame(master=self.window, width=1200, height=800, bg='white')
        self.rightBack = Frame(master=self.back, width=300, height=800)
        self.rightBack.pack(side='right',padx=2,pady=2)
        self.fig = Figure()
        self.axes = Axes3D(self.fig)

        self.ani = anim.FuncAnimation(self.fig, self.updateDisplay, interval=100, blit=False) #  Creating animation

        self.canvas = FigureCanvasTkAgg(self.fig, master=self.displayBack)
        self.canvas.get_tk_widget().pack(side=TOP,fill=BOTH,expand=True)


        # Starting application
        self.window.mainloop()

    def updateDisplay(self,num):
        self.axes.clear()
        self.axes.plot([0,1,random.random()],[0,1,random.random()],[0,1,random.random()],'o',color='k',markersize='5')

Но когда я запускаю следующее на python

self.ani = anim.FuncAnimation(self.fig, self.updateDisplay, interval=100, blit=False)

, я получаю эту ошибку

File "matplotlib/animation.py", line 1703, in __init__
TimedAnimation.__init__(self, fig, **kwargs)

File "matplotlib/animation.py", line 1465, in __init__
event_source = fig.canvas.new_timer()

AttributeError: 'NoneType' object has no attribute 'new_timer'

ТакЯ думаю, что понял ошибку, поскольку анимация нуждается в таймере, но я не знаю, как ее исправить.Любая помощь?Спасибо заранее

1 Ответ

0 голосов
/ 20 ноября 2018

Анимация должна располагаться на фигуре с холстом.В вашем коде вы определяете холст только после анимации.Я полагаю, что это будет работать, как и ожидалось, если вы измените порядок анимации и холста.

# First define the canvas
self.canvas = FigureCanvasTkAgg(self.fig, ...)
# only then define the animation
self.ani = anim.FuncAnimation(self.fig, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...