在py2exe的PyGTK程序中显示图像

时间:2010-12-10 21:25:43

标签: python gtk pygtk py2exe pixbuf

我使用PyGTK在Python中编写了一个GUI应用程序,并希望将其作为可执行文件分发,我正在使用py2exe。当我运行我的程序时,我收到以下警告

GdkPixbuf-WARNING **: Cannot open pixbuf loader module file 'gtk-2.0\gdk-pixbuf.loaders': No such file or directory

并且即使存在dist\etc\gtk-2.0\gdk-pixbuf.loaders,我的图片也不会显示。

如何将程序打包为Windows exe并使用这些想法?

2 个答案:

答案 0 :(得分:0)

如果您使用的是py2exe,则必须在您的项目中以与exe相同的级别打包gtk +(etc,shared,lib):

示例目录结构:

PROGRAM.exe
LOT_OF_PYD_AND_LIB_FILES...
etc
etc\fonts
etc\gtk-2.0
etc\pango
lib
lib\gtk-2.0
share
share\aclocal
share\glib-2.0
share\locale
share\themes

你有那个目录结构吗?

答案 1 :(得分:0)

将GTK +的 bin等,共享和lib 目录复制到 project的dist目录是正确的(但我看到有人破坏了[1]和 毕竟, bin 在列表中缺失了):

  • PyGTK只不过是一层薄薄的胶水,使得GTK +可供Python使用
  • PyGObject只不过是一层薄薄的胶水,使得GObject,GIO,...可供Python使用
  • PyCairo只不过是一层薄薄的胶水,使Cairo可用于Python

至少,您需要所有这3个绑定包并由于它们 如果底层平台不可用,它们是无用的(.dll文件, 配置文件,简而言之:整个shebang)。这就是GTK +的原因 需要将 bin等,share和lib 复制到项目的dist目录中。

几年前我发布到[1]的setup.py片段是巧妙的 不完整的。正确的版本应该是:

from distutils.core import setup
import py2exe

setup(
    name = 'handytool',
    description = 'Some handy tool',
    version = '2.0',
    zipfile = 'bin/library.zip',
    windows = [{'script': 'handytool.py',
                'dest_base': 'bin/handytool'}
              ],

    options = {'py2exe': {'packages':'encodings',
                          'includes': 'glib, gio, gobject, cairo, atk, pango, pangocairo, gtk'}
              }
)

记下 zipfile dest_base 的值。有了这些选择 你的.exe,一堆.pyd文件和library.zip都是在 py2exe的dist / bin目录。然后当你将GTK +的目录复制到py2exe的时候 dist目录你的可执行文件就在libgtk-win32-2.0.0.dll等旁边 应该如此。如果您不执行上述操作,则配置错误的PATH环境 变量可能会干扰你的.dll文件(有时是不兼容的) py2exe'd可执行加载。

因此对于上面的setup.py文件,dist的正确目录结构应该如此 看起来像这样:

bin/handytool.exe
bin/library.zip
bin/*.pyd (all .pyd files py2exe deemed needed)
bin/* (complete copy of GTK+ runtime bin dir)
etc/* (complete copy of GTK+ runtime etc dir)
share/* (complete copy of GTK+ runtime share dir)
lib/* (complete copy of GTK+ runtime lib dir)

如果上述工作正常,您会发现加载图片 只是工作,你可以开始考虑遗漏一些部分 分享/(就像你不想要/不需要的翻译文件)等。

MVG, 迪特

[1] http://www.py2exe.org/index.cgi/Py2exeAndPyGTK

编辑2011/07/05:修复了PyGObject 2.28 / PyGTK 2.24的包含选项。 如果您只使用PyGObject 2.28,则包含选项 包含'glib,gio,gobject'。如果您正在使用PyGTK,那么它需要: 'glib,gio,gobject,cairo,atk,pango,pangocairo,gtk'。