-1

我已经使用 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 并使用这些想象?

4

2 回答 2

0

如果您使用的是 py2exe,则必须将 gtk+ (etc, shared, lib) 打包到您的项目中,与您的 exe 处于同一级别:

示例目录结构:

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

你有那个目录结构吗?

于 2010-12-11T22:03:37.483 回答
0

将 GTK+ 的bin 等、share 和 lib目录复制到项目的 dist 目录的标准答案是正确的(但我看到有人破坏了 [1] 并且 列表中缺少bin),毕竟:

  • PyGTK 只不过是一层薄薄的胶水,使 Python 可以使用 GTK+
  • PyGObject 只不过是一层薄薄的胶水,使 GObject、GIO、……可用于 Python
  • PyCairo 只不过是一层薄薄的胶水,让 Python 可以使用 Cairo

至少,您需要所有 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'}
              }
)

记下zipfiledest_base的值。使用这些选项,您的 .exe、一堆 .pyd 文件和 library.zip 都在 py2exe 的 dist/bin 目录中创建。然后,当您将 GTK+ 的目录复制到 py2exe 的 dist 目录时,您的可执行文件就在 libgtk-win32-2.0.0.dll 等旁边。如果您不执行上述操作,错误配置的 PATH 环境变量可能会干扰您的 py2exe 可执行文件加载的(有时不兼容的).dll 文件。

所以对于上面的 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)

当您使上述工作正常时,您会发现加载图像就可以了,您可以开始考虑省略 share/ 的某些部分(例如您不需要/不需要的翻译文件)等。

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'。

于 2011-04-28T13:14:40.140 回答