python matplotlib: FuncAnimation kann nicht innerhalb einer Funktion aufgerufen werden

8

Ich versuche eine Funktion zu implementieren, die ein animiertes Diagramm ausgibt.

Wenn ich simple_anim.py (aus Matplotlib-Beispielen) als Basis nehme:

%Vor%

Effektiv funktioniert es.

ABER, wenn ich diesen Code innerhalb einer Funktion schließe (um veränderliche Parameter zur Verfügung zu stellen und eine explizite Datei für jeden möglichen Parameterwert zu vermeiden):

%Vor%

und rufen Sie dann die Funktion, das Figurplot bleibt weiß. Tatsächlich kommt es nie dazu, in die Animationsfunktion einzutreten.

Ich weiß, dass mir einige Informationen fehlen und deshalb funktioniert es nicht. Kann mir jemand Hinweise geben?

Vielen Dank

Andrés

    
Andres Perez-Lopez 13.01.2014, 18:56
quelle

2 Antworten

15

Der Grund dafür ist, dass die Timer und Callbacks, die das Fenster aktualisieren, Attribute des Objekts ani sind. Wenn Sie keinen Verweis darauf haben, wird ani in Garbage gesammelt und Ihre Timer / Callbacks verschwinden.

Die Lösung ist, dass Ihre Funktion ani zurückgibt und in Ihrem Code eine Referenz darauf steht:

%Vor%

Dieses Problem (siehe github # 1656 ) wurde besprochen, aber nicht gelöst.

    
tacaswell 14.01.2014 14:52
quelle
1

Wie die gute Antwort von tcaswell andeutet, ist das Verhalten des Problemcodes undefiniert, da er auf einem Objekt beruht, das gelöscht wurde und für die Garbage Collection verfügbar ist.

In der Praxis manifestiert sich dieses undefinierte Verhalten bei verschiedenen GUI-Backends unterschiedlich. Für einige Nutzer (zB diese "doppelte" Frage ), mit dem Wx-Backend in IDLE oder in der Standard-Pylab-Verknüpfung unter Windows scheint der undefinierte Code zu funktionieren (ich sage "scheint", weil es wirklich nicht funktioniert, sondern eher die gewünschten Ergebnisse durch Glück erzeugt). Wenn der Code in der Canopy-GUI mit seinem Standard-Qt-Backend ausgeführt wird, funktioniert der Code nicht. Qt und Wx haben sehr unterschiedliche Architekturen und Speicherbereinigung. (In Canopy kann das GUI-Backend auf der Registerkarte Python im Menü Einstellungen geändert werden; wenn es in Wx geändert wird, scheint auch der undefinierte Code zu funktionieren, aber das macht ihn nicht korrekt.)

    
Jonathan March 29.08.2014 17:53
quelle

Tags und Links