どうも、Novです。
この記事は前回作成した記事の続きになります。
今回は、
- 作成したアプリの実行ファイル化(exe化)
- ウィンドウに表示するアイコンの設定
- アプリ実行中に表示されるタスクバーのアイコン変更方法
の3本立てでお送りします。では早速内容に入っていきましょう!
作成したアプリのexe化
今回の内容は、すべて実行ファイル絡みの内容になります。アイコンの設定の話も、実行ファイルのアイコンをどう変更するか、実行ファイルに画像データをどう埋め込むかという内容になります
pyinstallerの使い方
pythonスクリプトの実行ファイル化には、pyinstallerを使用します。
なお、環境によっては以下のようなエラーに遭遇します。この場合は仮想環境でexe化用の環境を作ってしまうと良いかと思います。
C:\Users\....\hoge> pyinstaller --onefile --noconsole hogehoge.py
126 INFO: PyInstaller: 3.5
126 INFO: Python: 3.7.9
127 INFO: Platform: Windows-10-10.0.19041-SP0
129 INFO: wrote C:\Users\....\hogehoge.spec
134 INFO: UPX is not available.
140 INFO: Extending PYTHONPATH with paths
['C:\\Users\\....\\hoge', 'C:\\Users\\....\\hoge']
140 INFO: checking Analysis
142 INFO: Building Analysis because Analysis-00.toc is non existent
143 INFO: Initializing module dependency graph...
149 INFO: Initializing module graph hooks...
153 INFO: Analyzing base_library.zip ...
2006 INFO: Processing pre-find module path hook distutils
3285 INFO: running Analysis Analysis-00.toc
Traceback (most recent call last):
File "C:\Users......
#### コールスタック表示 中略 ####
raise error(exception.winerror, exception.function, exception.strerror)
win32ctypes.pywin32.pywintypes.error: (1920, 'LoadLibraryExW', 'ファイルにアクセスできません。')
今回は以下の環境を用意して作成しました。
- 仮想環境:miniconda(anacondaの軽量版)
- Pythonのバージョン:3.7
- 手動でインストールしたライブラリ:PySimpleGUI, PyInstaller
関係するライブラリをインストールする際のコマンドは以下です
conda install -c conda-forge pysimplegui
conda install pyinstaller
exe化のやり方
miniconda propmtで、exe化したいファイルが存在するディレクトリまで移動して、以下を実行します。
> pyinstaller hoge.py --onefile
これで、同じディレクトリ内にdist
ディレクトリが生成されるので、この中へ移動すると、exeファイルが生成されています。ダブルクリックで問題なく動作します。
コンソールを表示したくないときは
> pyinstaller hoge.py --onefile --noconsole
のように、--noconsole
オプションを付けます。なお、この方法で生成する実行ファイルは簡単な内容でも10MB程度あります。重い。
本格的に使えるアプリケーションにしたい場合はC++&Qtを使うなど、コンパイラ言語を使用した方が良いかと思われます。
exe化の際、アイコンを埋め込む方法
実行ファイルそのもののアイコン
exeファイルそのものをアイコンで表示させるには
pyinstaller hoge.py --icon=path_to_hoge\\hoge.ico
とすればよいです。こうすると、エクスプローラーに表示されるアイコンが設定したものに変更されます。
ちなみに、icoファイルは下記サービスなどを使用すれば簡単に作れます。もとになる画像はpngやjpegであればOKです。
実行ファイルへのアイコンの組み込み
以下のサイトを参考にしました。
pyinstallerで実行ファイル化する際に、pythonスクリプトファイルと同じ階層に、そのpythonスクリプトと同じ名前の”spec”ファイルが生成されています(hoge.pyならhoge.spec)。
これに、以下のようにa.datas += [...]
の1行を追加します。
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['hoge.py'],
pathex=['C:\\Users\\..path_to_project..\\fuga'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
a.datas += [("hoge.ico", ".\\path_to_hoge\\hoge.ico", "Data")] # この行を追加
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='sample_memo',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False , icon='path_to_hoge//hoge.ico')
これを書き込んだ後で、以下のコマンドを実行します。
> pyinstaller hoge.spec
これで、”hoge.ico”ファイルが実行ファイルに組み込まれます。
組み込んだアイコンの読み出し
起動するウィンドウや、タスクバーに表示されるアイコンを変更したい場合は、上記参考URLに書かれているresource_path()
といった関数を組み合わせて、展開先のファイルから読み出せるようにします。
import os
import sys
def resource_path(relative):
if hasattr(sys, '_MEIPASS'):
return os.path.join(sys._MEIPASS, relative)
return path.join(path.abspath('.'), relative)
なお、組み込まれたファイルは、自分の環境ではC:\Users\User_Name\AppData\Local\Temp
以下に展開されるようです。
上記の関数を使って、PySimpleGUIで生成されるウィンドウにTemp以下へ展開されたicon情報を紐づけるには、以下のように記述します。
import PySimpleGUI as sg
### 中略 ###
# `C:\Users\User_Name\AppData\Local\Temp`以下に展開された hoge.icoファイルへのパスを取得
icon_path = resource_path("hoge.ico")
window = sg.Window("title", layout, ..., icon=icon_path) # icon=icon_pathの指定が必要
while True:
event, values = window.read()
if event == sg.WIN_CLOSED:
break
### その他イベント処理 ###
window.close()
こうすることで、exe化したファイルから起動したアプリのウィンドウ・タスクバーのアイコンが指定したものに変更可能です。
まとめ
2回に渡って、
- PySimpleGUIでメモ帳アプリを作った際のTips
- Pythonスクリプトのexe化 & アイコンの埋め込み方
についてまとめてきました。
今回まとめた内容だけでも結構本格的なアプリケーションが作れると思います。
自分で何か作ってみるのは楽しいので、比較的敷居の低いPythonでGUIアプリを作ってみるというのも面白いと思います。
では、今回は以上です。ちょっとしたことで引っかかっている人の助けになれば幸いです♪
コメント