2016-11-02 3 views
0

Я хочу прочитать данные и построить динамический граф, поэтому я изучаю matplotlib с PyQt5. Я нахожу пример, но это для PyQt4 there. Я изменить его PyQt5 но это была какая-то проблема, когда я нажимаю кнопку запуска он говорит об ошибкесделать динамический граф с PyQt5 и 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

Это мой код, может кто-нибудь мне помочь ??

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_()) 

ответ

0

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

Один из способов решить эту проблему (не вдаваясь в детали анимированных сюжетов) состоит в том, чтобы предотвратить запуск кнопок «Старт» и «Стоп», если они не должны.

Способ сделать это - добавить атрибут класса AnimationWidget, который записывает, играет ли анимация. Так что ставьте это где-то в __init__ методе AnimationWidget:

self.playing = False 

Затем измените on_start и on_stop методы

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 
     ) 

и

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

Это делает его таким образом анимация выиграл» t запустить дважды и дать ошибки и графические сбои.

Смежные вопросы