Отображение изображений в программе PyGTK py2exe'd - PullRequest
0 голосов
/ 11 декабря 2010

Я написал приложение с графическим интерфейсом на Python, используя PyGTK, и хочу распространять его как исполняемый файл, для которого я использую 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 голосов
/ 28 апреля 2011

Стандартный ответ о копировании каталога GTK + bin, etc, share и lib в каталог dist проекта правильный (но я вижу, что кто-то вандализировал [1] и bin отсутствует в списке), в конце концов:

  • PyGTK - не более чем тонкий слой клея, делающий GTK + доступным для Python
  • PyGObject - это не что иное, как тонкий слой клея, делающий GObject, GIO, ... доступным для Python
  • PyCairo - не что иное, как тонкий слой клея, делающий Cairo доступным для Python

Как минимум, вам нужны все 3 из этих пакетов привязок и из-за их природа они бесполезны, если базовая платформа недоступна (файлы .dll, файлы конфигурации, короче говоря: весь шебанг). Вот почему GTK + bin, etc, share и lib необходимо скопировать в каталог dist вашего проекта.

Фрагмент setup.py, который я опубликовал пару лет назад в [1], очень тонок неполный. Правильная версия должна была быть:

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 все созданы в Папка dist / bin для py2exe. Затем, когда вы копируете каталоги 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 '.

0 голосов
/ 12 декабря 2010

Если вы используете 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

У вас есть такая структура каталогов?

...