gpt4 book ai didi

python - 在重绘标签时解决 GTK 中的大内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 21:07:30 26 4
gpt4 key购买 nike

我正在使用适用于 Python 2.7 的最新版本的 PyGTK 一体化安装程序 (2.24.2),其中包括 Cairo 1.10.8、Pango 1.29.4、PyGTK 2.24.0 和 PyGobject 2.28.3 (我认为)。

以下代码泄漏了大约 55 MB 的内存:

import gtk

window = gtk.Window()
label = gtk.Label()
window.add(label)
window.show_all()
for _ in range(100000):
label.set_markup('Leaking memory!')
while gtk.events_pending():
gtk.main_iteration()

注意:我的测试脚本中有 for 循环,这样我就可以在任务管理器中看到内存消耗增加。这基本上也是我实际应用程序中发生的事情,除了标签文本每秒至少更改一次,而不是每次都使用相同的文本重新绘制。

问题行是 label.set_markup(),每次调用会泄漏大约 0.5kB,所以我怀疑问题出在 GTK 或 Cairo 的某个地方。可能是 this bug (685959) ,正如一位评论者所指出的。

我尝试使用 objgraph 查看是否有任何额外的 Python 对象与调用 gtk.Label.set_markup() 的次数成比例地显示,但没有多余的对象。因此,调用 gc.collect() 没有帮助,我尝试了它以确保。 Python 似乎并不知道负责内存消耗的对象。

如何找到此内存泄漏和/或解决它?我需要使用标记来为此应用程序设置一些文本样式,但我尝试使用 gtk.Label.set_text() 作为解决方法,但它也泄漏了内存。

我应该注意到这个应用程序是针对 Windows 的,所以使用 PyGObject 获取 GTK 3 不是一个选项——GObject 内省(introspection)仍然在 Windows 上不可用。

最佳答案

Bug (685959)确实是问题所在。该错误已在 gtk+ 2.24.14 中修复。但是,2.24.14 不会为 win32 编译(我希望阅读我的问题和答案的任何人此时都意识到 GTK 不再是一个合理的选择或跨平台开发)。

我申请了 this patch到 2.24.10 并成功编译结果。使用我的新运行时文件,它似乎可以正常工作。

我使用此处的说明使用 MinGW 在 Windows 上构建 GTK: http://ingar.intranifty.net/devenv/mingw32/gtk.html

The 32-bit build will fail around gtk-update-icon-cache unless you run the msys shell as administrator. For the 64-bit build, you need to rm gtk/gtk.def before running make. Build and install gtk+ by executing the following commands:

cd $LOCALBUILDDIR && \ wget -c http://ftp.gnome.org/pub/gnome/sources/gtk+/2.24/gtk+-2.24.10.tar.xz && \ xz -d -c gtk+-2.24.10.tar.xz | tar xv && \ cd gtk+-2.24.10 && \ ./configure --prefix=$LOCALDESTDIR --with-gdktarget=win32 \ --with-included-immodules=ime --disable-debug --disable-gtk-doc && \ make && \ make install

我知道这不是我在问题中要求的“解决方法”,但是超过 6 个月没有答案告诉我除了修复运行时中的错误之外没有解决方法...

关于python - 在重绘标签时解决 GTK 中的大内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16366845/

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