2011-10-25 19 views
11

私は、Windows XP上でall-in-one installerからPython 2.6とPyGTK 2.22.6を使用しています。私のアプリケーション用の単一ファイル実行ファイル(py2exe経由)をビルドしようとしています。py2exeでGTKリソースをバンドルする

私のアプリをスクリプトとして実行すると(.exeファイルに組み込まれていない、まったく同じような.pyファイルのコレクション)、それはネイティブな外観のWindowsテーマを使用しますが、私はデフォルトのGTKのテーマを参照してください。

py2exeで作成されたdistディレクトリに複数のファイルをコピーすることでこの問題を解決できることは知っていますが、これはビルドの自動部分プロセス。さらに、トピックのすべて(the FAQを含む)は古いです。PyGTKはファイルをC:\Python2x\Lib\site-packages\gtk-2.0\runtime\...に保存し、libetcというディレクトリをコピーしても問題は解決されません。

私の質問は以下のとおりです。

  1. 私はプログラムではなく、ハードコーディングのパスよりもsetup.pyでGTKランタイムデータを見つけることができるようにしたいと思います。これはどうすればいいですか?

  2. 私は含める必要がある最小限のリソースは何ですか?

アップデート:私はほとんど試行錯誤によって#2に答えている可能性があります。 distディレクトリに直接座って、それ以外は同じディレクトリ構造を持つ、runtime接頭辞なし...

runtime\lib\gtk-2.0\2.10.0\engines\libwimp.dll 
runtime\etc\gtk-2.0\gtkrc 
runtime\share\icons\* 
runtime\share\themes\MS-Windows 

:「弱虫」(。つまり、MS Windowsの)仕事をするテーマについて、私からのファイルが必要py2exeによって生成されます。しかし2.10.0はどこから来たのですか?gtk.gtk_version(2,22,0)です。

答えて

9

ここに自分の質問に答えますが、誰もが分かりやすく答えることができます。その中にはかなり壊れやすいもの(パスのバージョン番号など)があるので、より良い方法を知っていればコメントや編集が可能です。ファイル

を見つける

1.まず、私は実際にはGTKランタイムのルートを見つけるために、このコードを使用します。これはしかし、あなたはランタイムをインストールする方法に非常に具体的で、おそらく一般的な場所のためのチェックの数を改善することができます。

を含めるように

#gtk file inclusion 
import gtk 
# The runtime dir is in the same directory as the module: 
GTK_RUNTIME_DIR = os.path.join(
    os.path.split(os.path.dirname(gtk.__file__))[0], "runtime") 

assert os.path.exists(GTK_RUNTIME_DIR), "Cannot find GTK runtime data" 

2.何のファイルこれが依存(A)関心の大きさの大きさ、および(b)アプリケーションの展開のコンテキスト。つまり、誰もが任意のロケール設定を持つことができる広い世界全体に展開しているのですか、翻訳された文字列を必要としない社内でのみ使用していますか?

あなたは、Windowsのテーマをしたい場合、あなたは含める必要があります:

GTK_THEME_DEFAULT = os.path.join("share", "themes", "Default") 
GTK_THEME_WINDOWS = os.path.join("share", "themes", "MS-Windows") 
GTK_GTKRC_DIR = os.path.join("etc", "gtk-2.0") 
GTK_GTKRC = "gtkrc" 
GTK_WIMP_DIR = os.path.join("lib", "gtk-2.0", "2.10.0", "engines") 
GTK_WIMP_DLL = "libwimp.dll" 

あなたはタンゴのアイコンたい場合:

GTK_ICONS = os.path.join("share", "icons") 

を私は省略ローカライズデータは(もありますが、あなた)したくない場合があります。

GTK_LOCALE_DATA = os.path.join("share", "locale") 

3.それを一緒に組み合せる

を3210

まず、与えられた点でファイルシステムツリーを歩き、data_filesオプションに適した出力を生成する関数を次に示します。

def generate_data_files(prefix, tree, file_filter=None): 
    """ 
    Walk the filesystem starting at "prefix" + "tree", producing a list of files 
    suitable for the data_files option to setup(). The prefix will be omitted 
    from the path given to setup(). For example, if you have 

     C:\Python26\Lib\site-packages\gtk-2.0\runtime\etc\... 

    ...and you want your "dist\" dir to contain "etc\..." as a subdirectory, 
    invoke the function as 

     generate_data_files(
      r"C:\Python26\Lib\site-packages\gtk-2.0\runtime", 
      r"etc") 

    If, instead, you want it to contain "runtime\etc\..." use: 

     generate_data_files(
      r"C:\Python26\Lib\site-packages\gtk-2.0", 
      r"runtime\etc") 

    Empty directories are omitted. 

    file_filter(root, fl) is an optional function called with a containing 
    directory and filename of each file. If it returns False, the file is 
    omitted from the results. 
    """ 
    data_files = [] 
    for root, dirs, files in os.walk(os.path.join(prefix, tree)):   
     to_dir = os.path.relpath(root, prefix) 

     if file_filter is not None: 
      file_iter = (fl for fl in files if file_filter(root, fl)) 
     else: 
      file_iter = files 

     data_files.append((to_dir, [os.path.join(root, fl) for fl in file_iter])) 

    non_empties = [(to, fro) for (to, fro) in data_files if fro] 

    return non_empties 

だから今はそうのようなsetup()を呼び出すことができます。

setup(
    # Other setup args here... 

    data_files = (
        # Use the function above... 
        generate_data_files(GTK_RUNTIME_DIR, GTK_THEME_DEFAULT) + 
        generate_data_files(GTK_RUNTIME_DIR, GTK_THEME_WINDOWS) + 
        generate_data_files(GTK_RUNTIME_DIR, GTK_ICONS) + 

        # ...or include single files manually 
        [ 
         (GTK_GTKRC_DIR, [ 
          os.path.join(GTK_RUNTIME_DIR, 
           GTK_GTKRC_DIR, 
           GTK_GTKRC) 
         ]), 

         (GTK_WIMP_DIR, [ 
          os.path.join(
           GTK_RUNTIME_DIR, 
           GTK_WIMP_DIR, 
           GTK_WIMP_DLL) 
         ]) 
        ] 
       ) 
) 
関連する問題