我正在尝试将每秒更新的matplotlib图表嵌入到PyQt GUI主窗口中。在我的程序中,我使用
threading.Timer
通过下面的timer
函数每秒调用一次更新函数。我有一个问题:我的程序每秒都会增加约1k,大约4秒钟。我的初步想法是,update_figure
函数中返回一个新数组的append
函数没有删除旧数组?这可能是我的问题的原因吗?请注意,保留HTML标记。def update_figure(self):
self.yAxis = np.append(self.yAxis, (getCO22()))
self.xAxis = np.append(self.xAxis, self.i)
# print(self.xAxis)
if len(self.yAxis) > 10:
self.yAxis = np.delete(self.yAxis, 0)
if len(self.xAxis) > 10:
self.xAxis = np.delete(self.xAxis, 0)
self.axes.plot(self.xAxis, self.yAxis, scaley=False)
self.axes.grid(True)
self.i = self.i + 1
self.draw()
这是我的计时器函数 - 它由我PyQt GUI中一个按钮的单击触发,然后会像你所看到的那样调用自己:
def timer(self):
getCH4()
getCO2()
getConnectedDevices()
self.dc.update_figure()
t = threading.Timer(1.0, self.timer)
t.start()
编辑:我无法发布完整的代码,因为它需要很多.dll文件。所以我会尽力解释这个程序的作用。
在我的GUI中,我想展示我的CO2值随时间变化的情况。我的get_co22
函数仅返回浮点数值,我非常确定它可以正常工作。使用上面显示的计时器,我想将一个值附加到一个matplotlib图形中 - Axes
对象对我可用,像这样:self.axes
。我试着绘制数据的最后10个值。
编辑2:经过一些聊天讨论,我尝试将对update_figure()
的调用放在一个while
循环中,并使用一个线程调用它,并成功地创建了这个最小示例http://pastebin.com/RXya6Zah。这改变了调用update_figure()
的代码结构,如下所示:
def task(self):
while True:
ui.dc.update_figure()
time.sleep(1.0)
def timer(self):
t = Timer(1.0, self.task())
t.start()
但是现在程序在运行5个循环后会崩溃。
np.delete
调用的目的是什么?文档 表明,它可以删除子数组。因此,似乎你的数组增长速度比缩小速度快。 - Gill Batesself.draw()
或self.axes.plot(...
注释掉,看看是否仍然存在内存泄漏。如果没有 - 您就有了一个线索,可以确定问题出在哪里。 - J Richard Snape