python - 如何更新事件驱动的情节?

标签 python events matplotlib plot

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

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

当前状态: 似乎没有办法手动更新绘图。 当我多次调用 plot() 函数时,将添加新的绘图。与 MATLAB 或 Octave 类似,当您使用“hold on”选项时。 大约 10 次通话后,此过程结束。然后它被卡住。 当我在更新之前清除数字时,整个情节就会消失。 至少,当绘图嵌入到窗口中时。 draw()show() 都没有提供补救措施。

当我使用单个绘图时,没有简单的方法来更新,因为在调用 show() 后,程序流程会停留在这一行,直到窗口关闭。因此更新必须在单独的线程中完成。

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

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 读入。

非常感谢。 费边

最佳答案

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

似乎可以运行,但剧情内容没有更新。 该情节没有 Canvas 。 (虽然它应该有一个,否则我现在不知道当我命令它时它正在绘制什么。)

说实话,我还不理解 GUI 和plot foo 的概念。失踪的 Canvas 被其养育人物覆盖。我真的不明白。当有一个图形时,什么可以处理多个图,每个图不应该有自己的 Canvas 吗?

但我认为,问题就在这里。

非常感谢。

关于python - 如何更新事件驱动的情节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622537/

相关文章:

jquery-ui - 将 jQuery UI 事件添加到 Meteor 模板

android - 在将事件添加到 Android 日历之前检查事件是否存在

python - 像 plt.tight_layout() 这样的函数改变图形大小而不是轴大小

python - 在 C 和 Python 之间传递 C++ 指针

python - matplotlib plt.figsize() 参数不适用于 pandas DataFrame 图

python - 配置 Pyscripter 以管理不同的 python 发行版(Anaconda 和 ArcGIS)

javascript - 使组件相互通信的集中式系统

matplotlib - 在一个程序中使用交互式和非交互式后端

python - 手动创建颜色图

python - `data` 数据集(scikit learn)中的 "Labelled Faces in the Wild"字段的性质是什么?