2016-11-02 3 views
0

Ich möchte Daten lesen und grafisch darstellen, so dass ich Matplotlib mit PyQt5 lernen. Ich finde Beispiel aber es ist für PyQt4 there. Ich kann es zu PyQt5 ändern, aber es hat ein Problem, wenn ich Schaltfläche Start klicken, sagt er Fehlermachen dynamische Grafik mit PyQt5 und Matplotlib

Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/backend_bases.py", line 1305, in _on_timer ret = func(*args, **kwargs) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 1049, in _step still_going = Animation._step(self, *args) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 855, in _step self._draw_next_frame(framedata, self._blit) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 873, in _draw_next_frame self._pre_draw(framedata, blit) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 886, in _pre_draw self._blit_clear(self._drawn_artists, self._blit_cache) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/animation.py", line 926, in _blit_clear a.figure.canvas.restore_region(bg_cache[a]) KeyError: matplotlib.axes._subplots.AxesSubplot object at 0x1067718d0

Dies ist mein Code, mir jemand helfen könnte ??

import sys, os, random 
from PyQt5 import QtCore 
from PyQt5.QtWidgets import * 

import numpy as np 
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.figure import Figure 
import matplotlib.animation as animation 

class MyMplCanvas(FigureCanvas): 
    """Ultimately, this is a QWidget (as well as a FigureCanvasAgg, etc.).""" 
    def __init__(self, parent=None, width=5, height=4, dpi=100): 
     fig = Figure(figsize=(width, height), dpi=dpi) 
     self.axes = fig.add_subplot(111) 
     # We want the axes cleared every time plot() is called 
     self.axes.hold(False) 

     self.compute_initial_figure() 

     # 
     FigureCanvas.__init__(self, fig) 
     self.setParent(parent) 

    def compute_initial_figure(self): 
     pass 

class AnimationWidget(QWidget): 
    def __init__(self): 
     QMainWindow.__init__(self) 

     vbox = QVBoxLayout() 
     self.canvas = MyMplCanvas(self, width=5, height=4, dpi=100) 
     vbox.addWidget(self.canvas) 

     hbox = QHBoxLayout() 
     self.start_button = QPushButton("start", self) 
     self.stop_button = QPushButton("stop", self) 
     self.start_button.clicked.connect(self.on_start) 
     self.stop_button.clicked.connect(self.on_stop) 
     hbox.addWidget(self.start_button) 
     hbox.addWidget(self.stop_button) 
     vbox.addLayout(hbox) 
     self.setLayout(vbox) 

     self.x = np.linspace(0, 5*np.pi, 400) 
     self.p = 0.0 
     self.y = np.sin(self.x + self.p) 
     self.line, = self.canvas.axes.plot(self.x, self.y, animated=True, lw=2) 




    def update_line(self, i): 
     self.p += 0.1 
     y = np.sin(self.x + self.p) 
     self.line.set_ydata(y) 
     return [self.line] 

    def on_start(self): 
     self.ani = animation.FuncAnimation(self.canvas.figure, self.update_line, 
           blit=True, interval=25) 

    def on_stop(self): 
     self.ani._stop() 



if __name__ == "__main__": 
    qApp = QApplication(sys.argv) 
    aw = AnimationWidget() 
    aw.show() 
    sys.exit(qApp.exec_()) 

Antwort

0

Ich habe Ihren Code ausprobiert und es scheint, dass das einzige echte Problem passiert, wenn Sie zweimal auf Start klicken, ohne die Animation zu stoppen.

Eine Möglichkeit, dies zu lösen (ohne in die Details von animierten Plots zu gehen), besteht darin, zu verhindern, dass die Start- und Stopptasten irgendetwas tun, wenn sie es nicht sollen.

Sie können der Klasse AnimationWidget ein Attribut hinzufügen, das aufzeichnet, ob die Animation wiedergegeben wird. So setzen Sie diese irgendwo in der __init__ Methode von AnimationWidget:

self.playing = False 

Dann ändern Sie die on_start und on_stop Methoden

def on_start(self): 
    if self.playing: 
     pass 
    else: 
     self.playing = True 
     self.ani = animation.FuncAnimation(
      self.canvas.figure, 
      self.update_line, 
      blit=True, interval=25 
     ) 

und

def on_stop(self): 
    if self.playing: 
     self.playing = False 
     self.ani._stop() 
    else: 
     pass 

Das macht es so die Animation gewann‘ t starte zweimal und gib Fehler und grafische Störungen.

Verwandte Themen