QuickIRを py2exeでWindowsのEXEファイルにする(2)
GUIプログラムをEXEファイル化してみます
6. GUIプログラムをEXE化する
先のサンプルプログラムはコマンドプロンプト上で動作するコンソールプログラムのため、EXEファイル
をダブルクリックして実行させるとコマンドプロンプトが起動します。(実行は一瞬で終わってコマンドプロンプトも終了するので、何が表示されたか判別できないけれど正常に実行されているはずです。)
GUIプログラムの場合、コマンドプロンプトが立ち上がるようだと鬱陶しいので、コマンドプロンプトが立ち上がることなく GUIプログラムが起動するようにしたいですね。と言うことで、次は GUIプログラムのEXE化を試してみます。
先ずはサンプルプログラム。cx_freeze でも使った tkinterの簡単なプログラム"SimpleTkApp.py" を用意します。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from tkinter import Tk, Label, Button, BOTTOM
def main():
root = Tk()
root.title('Button')
Label(text='I am a button').pack(pady=15)
Button(text='Button').pack(side=BOTTOM)
root.mainloop()
if __name__ == '__main__':
main()
setupスクリプトは以下のようにします。setupスクリプトのファイル名も必ず"setup.py" でなければならないというわけではないので、今回は"setup_tkapp.py" という名前で保存。
from distutils.core import setup
import py2exe
option = {
'bundle_files': 2,
'includes': ['tkinter']
}
setup(
options={
'py2exe': option
},
windows=[
{'script': 'SimpleTkApp.py'}
]
)
EXE化してみます。
C:¥> C:¥Python34¥python setup_tkapp.py py2exe
|
今度は"dist" フォルダ配下に以下のファイル、フォルダが作成されるようになりました。tkinterを使った GUIプログラムでは Tcl/Tk が必要になるので、さすがにファイルが増えるようです。ファイルサイズも大きく、総サイズは20MB程度になりました。
"dist¥SimapleTkApp.exe" をダブルクリックすると、正常に起動し、ボタンが1つあるウィンドウが表示されました。
ここで、bundle_files オプションを 1にしたところ、エラーが出て EXE化が失敗してしまいました。
C:¥> C:¥Python34¥python setup_tkapp.py py2exe
running py2exe
1 missing Modules
------------------
? readline imported from cmd, code, pdb
The following modules require a minimum bundle_files option,
otherwise they will not work (currently bundle_files is set to 1):
tkinter: 2
Please change the bundle_files option and run the build again.
Build failed.
|
tkinter を使ったプログラムの場合、bundle_files オプションは 2(または 3)である必要があるようです。
7. setup()への引数キーワード(*1)
setupスクリプトのsetup() 関数に指定する引数について、(良く使うものだけ)ざっと調べてみました。以下は既に登場したキーワードです。
console :
- コンソールアプリに変換するスクリプトのリストを指定する
windows :
- GUIアプリに変換するスクリプトのリストを指定する
options :
- py2exeのオプションを辞書形式で指定する
上記以外に py2exe固有のものとして、
service :
- win32サービスクラスを含んでいるモジュール名のリストを指定する
com_server :
- comサーバークラスを含んでいるモジュール名のリストを指定する
ctypes_com_server :
- comサーバークラスを含んでいるモジュール名のリストを指定する
zipfile :
- 生成する共有zipファイルの名前を指定する。デフォルトは
"library.zip" 。
zipfile にNone が設定されると、ファイルは"library.zip" の代わりに実行可能プログラムの中にバンドルされる。
がありますが、良く使われるのはzipfile=None でしょうね。生成されるEXEファイルのサイズは大きくなりますが、その代わり"library.zip" は作られなくなるので、"dist" フォルダ配下がほんの少しスッキリします。
それ以外にも Distutils のキーワードが使用できます。良く使われるのは、
name :
- プログラム名
version :
- プログラムのVersion
description :
- プログラム概要(1行以内で)
data_files :
- 取り込むファイルリストの指定
と言ったところでしょうか。data_file は、EXE化したいプログラムで使用しているため"dist" フォルダ配下に取り込みたい画像やフォントといったファイルのリストを以下の形式で指定します。
data_files=[
('複写先ディレクトリ名1', [複写するファイル名のリスト]),
('複写先ディレクトリ名2', [複写するファイル名のリスト]),
...
]
8. その他のオプション(*1)
py2exeへのオプションはbundle_files, includes 以外にも以下のものがあります。
dist_dir :
- EXEファイルを作成するディレクトリ名を指定する。(デフォルトは
"dist" )
excludes :
- dist配下に入れない(除外する)モジュール、パッケージのリストを明示的に指定する。通常は、py2exe がEXE化するプログラムが使用している物を追跡して distフォルダ配下にコピーするが、時に冗長なモジュール、パッケージがコピーされることがある。明らかに使用しないモジュールやパッケージをコピー対象から除外したい場合に、それらをリストで指定する。
packages :
- サブパッケージとして dist配下に入れるパッケージのリストを指定する。
(includes との違いが良く分らないのだがけど、includes はimport で追跡可能なモジュールで、明示しなくても py2exeが自動的に"dist" フォルダ配下にコピーしてくれる物を明示指定するのに対し、packages は暗黙のうちに、あるいは動的に importされるモジュールやパッケージを明示して"dist" フォルダ配下にコピーさせるという事かな?)
compressed :
- 圧縮したライブラリファイル(デフォルトのファイル名は
"library.zip" )を作成するか否かをTrue/Falseで指定する。デフォルトはFalse(圧縮しない)。
GUIのサンプルプログラムの場合、圧縮しない"library.zip" のサイズは 6.6MB あったところ、圧縮した"library.zip" は 2.8MB ほどになった。
optimize :
- 最適化のレベルを 0, 1, 2 で指定する。デフォルトは 0(最適化しない)。1 は通常の最適化。2 は最大限に最適化する。
9. EXEファイルにカスタムアイコンを付ける
EXE化されたアプリなら、それらしいアイコンを付けたいと思いますよね。そのためには、先ずアイコンファイルを用意しなければなりません。アイコンファイルは 16*16, 24*24, 32*32, 48*48, 64*64, 72*72, 96*96, 128*128, 256*256 と言った複数のサイズの画像を一つの.icoファイルにまとめた Windows独自のファイル形式です。ネットで検索すれば、著作権フリーのアイコンを多く見つけることができ、.icoファイルとしてダウンロード可能なものもあります。.icoファイルの中には複数の解像度だけでなく、16色、256色と言った複数の色深度のアイコン画像も含んだものもありますが、py2exe はあまり多くのアイコン画像を扱えないようなので、32bitフルカラーで 16*16, 24*24, 32*32, 48*48, 64*64, 72*72, 96*96, 128*128, 256*256の 9種類が入った.icoファイルであれば充分です。(9種類全部ある必要もなく、特定のサイズの画像が無ければ無いでも構わない様子です。大きなアイコン画像が無くてもエクスプローラで表示されるアイコンの大きさが小さくなるとか、自動的に拡大縮小されてジャギーが目立つとか、問題あってもそんな程度。)
アイコンファイルは、setup のwindows キーワードに以下のように指定します。
setup(
windows=[
{'script': 'SimpleTkApp.py',
'icon_resources': [(1, 'iconfile.ico')]
}
]
)
icon_resources キーワードの値にはタプルのリストを指定するそうで、タプルには整数値とアイコンファイル名を指定するのですが、この整数値の意味は良く分りません。(申し訳ない。)まぁアイコン付けば別に意味など知らなくても構わないのですが・・・
10. 良く使うキーワード、オプションを盛り込んだGUI用setupスクリプトの雛型
# -*- coding: utf-8 -*-
"""
This is a py2exe setup.py script
Usage:
python setup.py py2exe
"""
from distutils.core import setup
import py2exe
option = {
'compressed': True,
'optimize': 2,
'bundle_files': 2,
'includes': ['tkinter'],
'excludes': [],
'packages': []
}
setup(
name='SimpleTkApp',
version='1.0.0',
description='Simple tkinter application',
options={
'py2exe': option
},
windows=[
{'script': 'SimpleTkApp.py',
'icon_resources': [(1, 'iconfile.ico')]
}
],
zipfile=None
)
|
[続く]
(*1):完全な説明は<http://www.py2exe.org/index.cgi/ListOfOptions> を参照してください。
|