はじめに
Python3とtkinterを使ってとあるアプリを作成しています。
.appで配布したかったのでcx_Freezeを使ってパッケージ化させた際にいざ実行すると
あれ?画面汚くね?と思って色々調べた時のメモです。
作っている最中に普通にビルドしているときは普通に表示されていたのに、まるで解像度の低い画像のようだった、、
原因
あれやこれやと調べていると、作成された.appの情報をFinderで見てみると、「低解像度で開く」にチェックが付いていた。しかもチェックが外せない、、
tkinterがRetinaディスプレイに対応していないのか?とも思ったがコーディング中は問題なかったのでそんなことあるかと思って調べていてもほとんど情報がない、、
Tkinter/cx_Freezeに関連した記事では全くなかったのだがたまたま見つけたものにInfo.plistで低解像度で開くのチェックを外すようなことができそうなオーラがある記事を見つけた。
記事ではInfo.plistでNSHighResolutionCapableにTrueを設定するとのこと。
確かにcx_Freezeで生成されたappファイル内のInfo.plistには何も設定されていない。
解決方法
では、cx_FreezeでどうやってInfo.plistに値を設定すればいいのか?
まず元々生成されたappファイルを右クリックして「パッケージの内容を表示」を選択し、その中身にあるInfo.plistをPythonモジュールのあるディレクトリにコピーしましょう。
コピーしたらInfo.plistをエディタで開いてdict要素に以下を追加します。
1 2 | <key>NSHighResolutionCapable</key> <true/> |
そう、これがRetinaディスプレイに対応するためのものです。
追加後は以下のようになります。XXXXはそれぞれの環境に合わせたものが入っていると思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?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>CFBundleExecutable</key> <string>XXXX</string> <key>CFBundleIconFile</key> <string>XXXX</string> <key>CFBundleIdentifier</key> <string>XXXX</string> <key>NSHighResolutionCapable</key> <true/> </dict> </plist> |
これをパッケージ化した時に反映させるためにcx_Freezeのsetup.pyを編集します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import sys from cx_Freeze import setup, Executable base = None if sys.platform == 'win32': base = 'Win32GUI' executables = [ Executable('XXXX.py', base=base) ] # appにパッケージ化するときのInfo.plistを指定する bdist_mac_options = { 'custom_info_plist': 'Info.plist', } setup(name='XXXX', version='0.1', description='XXXX', options={ 'bdist_mac': bdist_mac_options # ここでbdist_macコマンド時のオプションとして適用する }, executables=executables) |
重要な部分はコメントに書いてあります。
その他の部分は各々の環境に合わせてください。
この状態でパッケージ化すればRetinaディスプレイでも綺麗に表示されるようになります!!
以上です。