如何更新情节事件?

时间:2016-01-05 22:39:37

标签: python events matplotlib plot

如何更新matplotlib绘图事件驱动?

背景: 我想编写一个工具,显示我通过串口接收的测量值。 这些值将在串行连接设备具有测量值时发送,而不是在主机请求时发送。

现状: 似乎无法手动更新绘图。 当我多次调用plot() - 函数时,将添加新图。与MATLAB或Octave类似,当您使用“hold on”-Option时。 大约10次通话后结束。然后冻结了。 当我在更新前清除数字时,整个情节消失。 至少,当绘图嵌入窗口时。 draw()show()都不提供补救措施。

当我使用单个情节图时,没有简单的更新方法,因为在调用show()之后,程序流程停留在此行,直到Window关闭。所以更新必须在一个单独的线程中完成。

当我使用动画时,这两个问题都将得到解决:

import sys
from PyQt4.QtGui import QApplication, QMainWindow, QDockWidget, QVBoxLayout,QTabWidget, QWidget
from PyQt4.QtCore import Qt
from matplotlib import pyplot, animation
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from random import randint

a = QApplication(sys.argv)
w = QMainWindow()
t = QTabWidget(w)
Tab1 = QWidget()
t.addTab(Tab1, '1st Plot')
t.resize(1280, 300)

x = [1, 2, 3]
Fig1 = pyplot.Figure();
Plot =  Fig1.add_subplot(111);
Plot.plot(x)
Plot.grid();

layout = QVBoxLayout();
layout.addWidget(FigureCanvasQTAgg(Fig1));
Tab1.setLayout(layout);

def UpdateFunction(i):
    x.append(randint(0, 10));
    Plot.clear();
    Plot.plot(x);
    Plot.grid();

Anim = animation.FuncAnimation(Fig1, UpdateFunction, interval=500)

w.showMaximized()
sys.exit(a.exec_())

但这样的动画是时间触发的。 是否有更新事件触发的解决方案?

该事件应该是已完成的UART读入。

非常感谢你。 费边

1 个答案:

答案 0 :(得分:2)

@tcaswell

谢谢!

这是我的实际代码:

import sys
from PyQt4.QtGui import QApplication, QMainWindow, QVBoxLayout,QTabWidget, QWidget
from PyQt4.QtCore import SIGNAL
from matplotlib import pyplot
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from random import randint
import time
from threading import Thread

a = QApplication(sys.argv)
w = QMainWindow()
t = QTabWidget(w)
Tab1 = QWidget()
t.addTab(Tab1, '1st Plot')
t.resize(1280, 300)

x = [];
x.append(randint(0, 10));
x.append(randint(0, 10));
x.append(randint(0, 10));
Fig1 = pyplot.Figure();
Plot =  Fig1.add_subplot(111);
Line, = Plot.plot(x)
Plot.grid();

layout = QVBoxLayout();
layout.addWidget(FigureCanvasQTAgg(Fig1));
Tab1.setLayout(layout);

def triggerUpdate():
    while True:
        a.emit(SIGNAL('updatePlot()'));
        time.sleep(2);
        print('update triggered!\n')

def updateFunction():
    x.append(randint(0, 10));
    #Plot.clear();
    Line.set_data(range(len(x)), x);
    Fig1.canvas.draw_idle();
    print('update done!\n')

a.connect(a, SIGNAL('updatePlot()'), updateFunction)

t = Thread(target=triggerUpdate);
t.start();
w.showMaximized()

sys.exit(a.exec_())

它好像在运行,但是剧情的内容没有更新。 情节没有画布。 (虽然它应该有一个,否则我现在不知道它在我命令它时的绘图。)

老实说,我已经不了解GUI的概念和情节foo了。缺少的画布由其育儿图覆盖。我真的没有得到它。如果有一个数字,什么可以处理多个情节,每个情节应该有自己的画布吗?

但我想,这就是问题所在。

非常感谢你。