gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:21:24 26 4
gpt4 key购买 nike

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

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

当前状态:似乎没有办法手动更新情节。当我多次调用 plot() 函数时,将添加新的绘图。类似于 MATLAB 或 Octave,当您使用“保持”选项时。这在大约 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_())

似乎运行了,但是情节的内容没有更新。Plot 没有 Canvas 。 (虽然它应该有一个,否则当我命令它时,我现在不知道它在密谋什么。)

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

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

非常感谢。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com