2013-05-03 53 views
6

我使用Python 2.7的最新版PyGTK一体化安装程序(2.24.2),其中包括开罗1.10.8,Pango 1.29.4 ,PyGTK 2.24.0和PyGobject 2.28.3(我认为)。在重绘标签时解决GTK中的大内存泄漏

下面的代码泄漏〜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自省是仍然在Windows上不可用。

+0

那是缩进正确?只要每次设置标签后都有事件发生,您是否正在运行gtk.main_iteration()? – pcurry 2013-05-03 20:17:46

+0

是的,那是正确的做法。这基本上将主循环从内部转出。 – 2013-05-03 20:19:04

+0

@ Series8217什么是for循环? – jadkik94 2013-05-03 20:25:50

回答

1

Bug (685959)确实是这个问题。该错误在gtk + 2.24.14中修复。然而,2.24.14不能编译为win32(我希望任何读过我的问题和答案的人都明白,GTK不再是合理的选择或跨平台开发)。

我将this patch应用到2.24.10并成功编译了结果。有了我的新运行时文件,它似乎正在工作。

我使用的说明,将在Windows上建立GTK使用MinGW:除非你运行 的MSYS Shell作为管理员 http://ingar.satgnu.net/devenv/mingw32/gtk.html

32位版本将围绕GTK更新图标缓存失败。对于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.tar.xz | tar xv & & \ cd gtk + -2.24.10 & & \ 。/配置前缀= $ LOCALDESTDIR --with-gdktarget =的Win32 \ --with-包括-immodules = IME - 禁用调试 - 禁用GTK-DOC & & \使& & \使安装

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