8

我正在为 Python 2.7 使用最新版本的 PyGTK All-in-One 安装程序 (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 的某个地方。正如评论者所指出的,这可能是这个错误 (685959) 。

我尝试使用 objgraph 来查看是否有任何额外的 Python 对象与调用次数成正比,gtk.Label.set_markup()但没有多余的对象。随之而来的是呼吁gc.collect()不要帮助,我尝试确定。Python 似乎不知道负责内存消耗的对象。

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

我应该注意这个应用程序以 Windows 为目标,因此使用 PyGObject 来获取 GTK 3 不是一种选择——GObject 内省在 Windows 上仍然不可用。

4

2 回答 2

3

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

将此补丁应用到 2.24.10 并成功编译结果。使用我的新运行时文件,它似乎可以正常工作。

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

除非您以管理员身份运行 msys shell,否则 gtk-update-icon-cache 32 位构建将失败。对于 64 位构建,您需要在运行 make 之前 rm gtk/gtk.def。通过执行以下命令构建和安装 gtk+:

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。焦油.xz | tar xv && \ cd gtk+-2.24.10 && \ ./configure --prefix=$LOCALDESTDIR --with-gdktarget=win32 \ --with-included-immodules=ime --disable-debug --disable-gtk-doc && \ 制作 && \ 制作安装

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

于 2013-12-14T19:29:20.090 回答
1

如果您需要用于 Windows 的固定 Gtk+2 运行时,您可以使用适用于 Windows 的 Gnome Glade Gtk+ 3.8.5,其中包括固定的 Gtk+ 2.24.23 运行时。http://ftp.gnome.org/pub/GNOME/binaries/win32/glade/3.8/glade-3-8-5-installer.exe

或者从 Windows 源代码构建最新的 Gtk+2,这也很容易使用 gtk+ 教程。https://www.gtk.org/download/windows.php

在构建和安装程序时将 dll 复制到您的程序或添加到 PATH。

(PyGTK 保持相同的 API 版本 2.24.0,它只是 python 到 Gtk+2 运行时的链接。)

于 2018-04-06T16:20:28.043 回答