2017-06-16 8 views
0

Ich habe ein Objekt A, die ein Objekt B, und ein Objekt B in seinem Konstruktor aufgerufen wirdWodurch wird die FuncAnimation-Funktion aufgerufen?

self.ani = animation.FuncAnimation(
      self.figure, func=self.gen_data, fargs=[self.data_dict], 
      blit=True, repeat=False) 

jedoch die self.gen_method wird nie instanziiert. Was tue ich, um sicherzustellen, dass dies nicht der Fall ist?

Was ich am Ende tut, den obigen Code in einem Rückruf setzen, die A in Objekt ausgelöst wird, die dann ruft eine refresh() Methode auf Objekt B, aber ich will nicht, um die Animation zu rekonstruieren halten. Es sollte einen Weg geben, es nur einmal zu konstruieren, aber wie?

Also was ist die Lösung, wie stelle ich sicher, dass die func regelmäßig aufgerufen wird? Hier

+0

wo ist dein 'self.gen_method' ?? – Ding

+0

Es dauert ein Dictionary von Daten, self.data_dict, und erstellt Diagramme auf der Figur. Seine Signatur ist def gen_data (self, _, data_dict). Das _ steht für den Index des Frames, der nicht verwendet, sondern standardmäßig von FuncAnimation als Argument übergeben wird. –

+0

Alles was man sagen kann ist, dass FuncAnimation korrekt aufgebaut ist. Möglicherweise möchten Sie die Anzahl der Frames oder einen Generator als das Argument Frames hinzufügen, z. 'frames = 40', aber wenn das notwendig ist, würde dies von der gen_data Methode abhängen. – ImportanceOfBeingErnest

Antwort

0

ist ein Minimal, Complete, and Verifiable examplemit genau Code und funktioniert ganz gut:

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
import numpy as np 

class A(): 
    def __init__(self): 
     self.b = B() 

class B(): 
    def __init__(self): 
     self.figure = plt.figure() 
     plt.axis((0,1,0,1)) 
     self.l1, = plt.plot([],[], color="r") 
     self.data_dict = np.random.rand(40,10) 
     self.ani = animation.FuncAnimation(
      self.figure, func=self.gen_data, fargs=[self.data_dict], 
      blit=True, repeat=False) 

    def gen_data(self, _, data): 
     self.l1.set_data(np.linspace(0,1,10), data[_%40,:]) 
     return self.l1, 

a = A() 
plt.show() 
+0

Eigentlich erstellt A B in A-Konstruktor und B erstellt die Animation in einem eigenen Konstruktor. Könntest du bitte so etwas versuchen? –

+0

Es gibt keinen Grund, warum dies nicht funktionieren sollte, aber ich aktualisierte die Antwort auf A creating B. – ImportanceOfBeingErnest

Verwandte Themen