-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 を使用している場合は、プロジェクト内の 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

そのディレクトリ構造はありますか?

于 2010-12-11T22:03:37.483 に答える
0

結局のところ、GTK+ のbin など、share および libディレクトリをプロジェクトの dist ディレクトリにコピーするという標準的な答えは正しいです (しかし、誰かが破壊行為を行って [1]、 binがリストに表示されていません)。

  • PyGTK は、Python で GTK+ を利用できるようにする接着剤の薄い層にすぎません
  • PyGObject は、GObject、GIO などを Python で利用できるようにする接着剤の薄い層にすぎません
  • PyCairo は、Cairo を Python で利用できるようにする接着剤の薄い層にすぎません

少なくとも、これら 3 つのバインディング パッケージすべてが必要であり、その性質上、基盤となるプラットフォーム (.dll ファイル、構成ファイル、要するに: シバン全体) が利用できない場合は役に立ちません。そのため、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 の includes オプションを修正しました。PyGObject 2.28 のみを使用している場合は、includes オプションに 'glib, gio, gobject' を含める必要があります。PyGTK を使用している場合は、'glib, gio, gobject, cairo, atk, pango, pangocairo, gtk' が必要です。

于 2011-04-28T13:14:40.140 に答える