Python: передача функции в качестве параметра в классе

1

В настоящее время я использую функцию FuncAnimation matplotlib и столкнулся с проблемой. Мой код следует аналогичной логике с кодом ниже

import matplotlib.animation as animation
import matplotlib.pyplot as plt

class Example:
    def __init__(self):
        self.fig = plt.figure()
    def update(self, num):
        print("This is getting called")
    def animate(self):
        ani = animation.FuncAnimation(self.fig, update, interval=100)

def main():
    obj = Example()
    obj.animate()

if __name__ == "__main__":
    main()

На данный момент мой код не печатает "Это вызвано". Я попытался передать в self.update вместо обновления в FuncAnimation, но безрезультатно. Я также попытался написать глобальное обновление перед вызовом функции FuncAnimation, которая также не работает. Мне интересно, может ли кто-нибудь помочь мне.

Теги:
class
matplotlib
parameters
rules

2 ответа

1
Лучший ответ

Ответ @ReblochonMasque верен, говоря, что вам нужно фактически показать фигуру, используя plt.show().

Однако вам не нужно ничего возвращать из анимационной функции (если вы не хотите использовать blitting, и в этом случае вам нужно будет вернуть итерабельность Artists для blit).
А также, если вы сделаете свою FuncAnimation класса FuncAnimation переменной (self.ani), она гарантирует возможность вызова show() в любой точке, а не только внутри функции анимации.

import matplotlib.animation as animation
import matplotlib.pyplot as plt


class Example:
    def __init__(self):
        self.fig, self.ax = plt.subplots()

    def update(self, i):
        print("This is getting called {}".format(i))
        self.ax.plot([i,i+1],[i,i+2])

    def animate(self):
        self.ani = animation.FuncAnimation(self.fig, self.update, interval=100)


def main():
    obj = Example()
    obj.animate()
    plt.show()


if __name__ == "__main__":
    main()
0

Ваш метод анимации (self) должен возвращать кортеж.
Вам также нужно показать сюжет.

import matplotlib.animation as animation
import matplotlib.pyplot as plt


class Example:
    def __init__(self):
        self.fig = plt.figure()

    def update(self, num):
        print(f"This is getting called {num}")
        return num,

    def animate(self):
        ani = animation.FuncAnimation(self.fig, self.update, interval=100)
        plt.show()


def main():
    obj = Example()
    obj.animate()


if __name__ == "__main__":
    main()
  • 0
    В этом случае нет необходимости возвращать что-либо из update . Однако возвращать num не имеет никакого смысла, либо возвращать итерируемое из matplotlib.artist.Artist s, либо ничего, но не случайную вещь. Суть в том, чтобы действительно показать сюжет. Кроме того, я бы посоветовал сделать переменную класса ani , которая позволяет вызывать plt.show() также вне метода экземпляра.
  • 0
    Может быть, это было не ясно. Я дал другой ответ, чтобы показать, что я имел в виду здесь.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню