gpt4 book ai didi

python - 在 PyQt GUI 中嵌入和更新 matplotlib 图形时出现内存泄漏

转载 作者:行者123 更新时间:2023-12-01 23:54:55 25 4
gpt4 key购买 nike

我正在尝试将每秒更新一次的 matplotlib 图形嵌入到 PyQt GUI 主窗口中。

在我的程序中,我通过下面所示的 timer 函数使用 threading.Timer 每秒调用一个更新函数。我有一个问题:我的程序每秒都在变大——大约每 4 秒 1k。我最初的想法是追加函数(在 update_figure 中返回一个新数组)不会删除旧数组?这可能是我的问题的原因吗?

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 函数仅返回一个浮点值,我 100% 确定它工作正常。通过我的计时器(如上所示),我想继续向 matplotlib 图表附加一个值 - Axes 对象可以作为 self.axes 来使用。我尝试绘制数据的最后 10 个值。

编辑2:经过一些discussion in chat ,我尝试将对 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 次迭代左右后崩溃了。

最佳答案

问题绝对不在于如何附加到 numpy 数组或截断它。

这里的问题在于你的线程模型。将计算循环与 GUI 控制循环集成起来很困难。

从根本上讲,您需要 GUI 线程来控制何时调用更新代码(如有必要,生成一个新线程来处理它) - 这样

  1. 您的代码不会阻止 GUI 更新,
  2. GUI 更新不会阻止您的代码执行,并且
  3. 您不会产生大量持有对象多个副本的线程(这可能是内存泄漏的来源)。

在这种情况下,因为您的主窗口是由 PyQt4 控制的,您想要使用 QTimer (请参阅 simple example here )

所以 - 将您的计时器代码更改为

def task(self):
getCH4()
getCO2()
getConnectedDevices()
self.dc.update_figure()

def timer(self):
self.t = QtCore.QTimer()
self.t.timeout.connect(self.task)
self.t.start(1000)

这应该可行。保留对 QTimer 的引用至关重要 - 因此 self.t = QtCore.QTimer() 而不是 t = QtCore.QTimer(),否则 QTimer 对象将被垃圾回收。

<小时/>

注意:

这是 long thread in chat 的摘要澄清问题并研究几种可能的解决方案。特别是 - OP 设法在这里模拟了一个更简单的可运行示例:http://pastebin.com/RXya6Zah

完整的可运行示例的固定版本在这里:http://pastebin.com/gv7Cmapr

相关代码和解释在上面,但是这些链接可能会帮助任何想要复制/解决问题的人。请注意,它们需要安装 PyQt4

关于python - 在 PyQt GUI 中嵌入和更新 matplotlib 图形时出现内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29766341/

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