cx_Freeze で Macアプリを作成する(2)
カスタムアイコンと"Info.plist"のこと
5. 最終的な setupスクリプト
'excludes' で不要なパッケージを取り込まないように指定することで、作成後のアプリのサイズを小さくすることができる。最終的に出来上がった setupスクリプト(例)は次のようになった。
# -*- coding: utf-8 -*-
import sys
from cx_Freeze import setup, Executable
application = 'SimpleTkApp'
includes = []
include_files = [
('/Library/Frameworks/Tcl.framework/Resources/Scripts', 'tcl8.5'),
('/Library/Frameworks/Tk.framework/Resources/Scripts', 'tk8.5')
]
packages = ['os', 'sys', 'tkinter']
excludes = ['email', 'html', 'http', 'urlib',
'logging', 'ctypes', 'distutils',
'multiprocessing', 'pydoc_data',
'test', 'unittest',
'xml', 'xmlrpc'
]
build_exe_options = {
'includes': includes,
'include_files': include_files,
'packages': packages,
'excludes': excludes,
'optimize': 2
}
bdist_mac_options = {
'bundle_name': application,
'iconfile': 'icon_file.icns',
'include_frameworks': []
}
exe = [
Executable(script='SimpleTkApp.py',
base=None,
targetName=application)
]
setup(name=application,
version='1.0.0',
description='Simple tkinter application',
options={
'build_exe': build_exe_options,
'bdist_mac': bdist_mac_options
},
executables=exe)
上記の setupファイルで作成すると、サイズは 24.7MB程度に抑えられた。(それでも大きいが・・・)
また、bdist_mac のiconfile オプション(上ではbdist_mac_options 辞書の'iconfile' 項目)でカスタムアイコンを指定している。ここに Macのアイコンファイル(.icns )を指定することで、作成するアプリケーションにカスタムアイコンを付けることができる。ただ、アプリ内にアイコンファイルを取り込む際、必ず"icon.icns" というファイル名に変更されてしまうようだ。これで注意しなければいけないのは、「情報を見る」で表示されるアプリの情報をカスタマイズする場合だ。
「情報を見る」で表示される情報は、アプリ内の"Info.plist" にXML形式で記述されている。py2app では辞書形式で項目毎にカスタマイズできた(Tweaking your Info.plistを参照)が、cx_Freeze では事前にカスタマイズした"Info.plist" ファイルを作成し、bdist_mac の'custom_info_plist' オプションで指定しなければならない。例えば、
bdist_mac_options = {
'bundle_name': application,
'iconfile': 'icon_file.icns',
'custom_info_plist': 'tkapp_info.plist',
'include_frameworks': []
}
といった具合になる。ここで指定した"tkapp_info.plist" ファイル内にアプリの情報を記述するのだが、その中にはカスタムアイコンに関する情報(CFBundleIconFile キー項目)もある。このキー項目の値は必ずicon.icns にしておかないとカスタムアイコンが設定されなくなってしまうので、注意が必要だ。
例えば"tkapp_info.plist" ファイルは以下のようになる。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleDisplayName</key>
<string>Simple_Tk_Application</string>
<key>CFBundleExecutable</key>
<string>SimpleTkApp</string>
<key>CFBundleName</key>
<string>SimpleTkApp</string>
<key>CFBundleGetInfoString</key>
<string>Simple Tk application 1.0.0</string>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>CFBundleIdentifier</key>
<string>jp.ddo.y-naito.SimpleTkApp</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright (C) 2016 N@i, All Rights Reserved</string>
</dict>
</plist>
このように"Info.plist" ファイルを自力で作成しなければならない事も cx_Freeze のハードルを高くしている。やはり py2app の方が扱いやすい。
|