py2exeでwxPythonアプリをカッコ良い見た目でパッケージ化。
シングルファイルとしてパッケージ化するときの注意点
以前Python GUIツールキット個人的な比較のまとめという記事でwxPythonアプリをpy2exeでシングルファイルとして実行ファイルにパッケージ化すると、ソフトの見た目がWindows Classicな感じ(右図)になってしまう問題をちょっと書きました。とくにゲージとかボタンがしょぼいです。
まあ、見た目は見た目、使えればいいということでずっとほっておいた問題なんですが、ちょっとググったらThe Python Havenというブログにズバリな解決法を書いた記事を見つけました。長年のウヤムヤが解決されてスッキリして感激中です。
原因はマニフェストにありまして、昔試したときはマニフェストはXMLファイルだからファイルとしてother_resourcesに渡してみたらダメだったんですが、上記の記事によると実はなんとファイルじゃなくて文字列としてpy2exeに渡す必要があったみたいです。なぜに文字列?と小一時間問いつめたいところです。
gui2exeを使った場合の実際の手順
当方は楽なのでいつもgui2exe経由でpy2exeを使っているのでgui2exeでの手順を書きます。まず、一度gui2exeでシングルファイルとしてパッケージ化します(可能な限りOptimize=2, Compressed=2, Bundle Files=1でコンパクトな実行ファイルを作る)。次にgui2exeが自動生成したsetup.pyの中身をBuildsメニューからView setup scriptを選ぶか、またはショートカットのCtrl+Pで表示します。これを全部コピペしてソースがあるフォルダーにsetup.pyとして保存します。
次にsetup.pyファイル中に以下の内容をstringオブジェクトとして渡します。場所は「# Ok, let's explain why I am doing that.」のコメントの上あたりがいいとおもいます。要はother_resources = []の行の上であればいいです。
manifest = '''
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level='asInvoker' uiAccess='false' />
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity
type='win32'
name='Microsoft.VC90.CRT'
version='9.0.21022.8'
processorArchitecture='*'
publicKeyToken='1fc8b3b9a1e18e3b' />
</dependentAssembly>
</dependency>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="*"
publicKeyToken="6595b64144ccf1df"
language="*" />
</dependentAssembly>
</dependency>
</assembly>
'''
次にother_resources = [] のところを
other_resources = [(24, 1, manifest)]
のようにします。24と1に関してはデルファイについてのAllAboutの記事に
The WindowsXP.RC contains our instructions to include the WindowsXP.Manifest (XML) document as line item 1 bound to group 24. The contents of the WindowsXP.RC looks like this:
1 24 "WindowsXP.Manifest"
とあるので、まあウィンドウズのお約束なんでしょう。
あとはソースがあるフォルダーにコンソール上で移動して
python setup.py py2exe
のコマンドでパッケージ化を行います。
« wxpythonで長いタスク中でもレスポンシブなGUI。 | トップページ | Brown Dog Gadgetsの携帯・タブレット用USBソーラーパネルを使ってみた。 »
「パソコン・インターネット」カテゴリの記事
- Linuxのデスクトップ環境にログインした時にxmodmapコマンド実行(2023.12.30)
- youtube-dlでrumbleをダウンロード(2023.12.06)
- Pop!_OSのアプデがfcitxを繰り返し葬る件(2023.05.22)
- vue.jsで遊んでみる(2023.01.02)
- 『将棋神やねうら王』のオープンソース版MyShogiをLinux Mint 19.1でビルドしてみた件(2019.03.24)
「Python」カテゴリの記事
- Noteの記事をPythonでバックアップしといた。(2021.05.05)
- JupyterLabでも好きな外部エディターを使いたい!(2018.05.02)
- ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。(2018.05.02)
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
- Juliaやってみよう。四日目。@timeでプロファイリング(2017.07.16)
« wxpythonで長いタスク中でもレスポンシブなGUI。 | トップページ | Brown Dog Gadgetsの携帯・タブレット用USBソーラーパネルを使ってみた。 »
コメント