2024/05/29(水) [n年前の日記]
#1 [python] Pythonスクリプトをexe化したファイルのアイコンを変更したい
_先日、
Python + tkinterを使った色管理ツールを作成したけれど、せっかくだからexe化したファイルのアイコンを変更してみたい。Nuitka と py2exe を使った場合、どういう指定をすればいいのだろう。
環境は Windows10 x64 22H2 + Python 3.10.10 64bit + tkinter。Nuitka 2.2.3。py2exe 0.13.0.1。
環境は Windows10 x64 22H2 + Python 3.10.10 64bit + tkinter。Nuitka 2.2.3。py2exe 0.13.0.1。
◎ Nuitkaの場合 :
Nuitka の場合は、--windows-icon-from-ico=icon.ico といった感じのオプションをつければいいらしい。
_Nuitkaでpythonをexe化(メモ) #Python - Qiita
_Nuitkaを使ってスクリプトをバイナリ化してみよう - PythonOsaka
_【python】nuitkaでpythonコードからexeファイルを作成する方法|星杜なぎさ
たしかにアイコンが変わってくれた。
ただ、これはエクスプローラでファイル一覧を表示した際に使われるアイコンを指定しているそうで…。出来上がったexeを実行してみると、ウインドウのタイトルバーに表示されるアイコンと、Windows10のタスクバーに表示されるアイコンについては、tkinter のアイコンのままだった。
ウインドウのタイトルバーに表示されるアイコンを変更するには、Pythonスクリプト内で iconbitmap("icon.ico") を呼べばいいらしい。その場合は .exeと一緒に icon.ico も配布することになる。
_Tkinter でウィンドウアイコンを設定する方法 | Delft スタック
_TkinterタイトルバーアイコンとEXEアイコンの設定方法【Python】 - プログラムでおかえしできるかな
_Embed icon in python script - Stack Overflow
試してみたところ、たしかに反映された。
しかし、タイトルバー上のアイコンは変わったものの、Windows10のタスクバー上のアイコンは変化が無かった。PythonからPythonスクリプトが呼び出されると、タスクバー上のアイコンは python.exe か pythonw.exe のアイコンになるということだろうか。いや、だとしたら、tkinter のアイコンになっているのも妙だな…。
その後、何度かexeを作り直していたら、いつのまにか Windows10のタスクバー上も指定したアイコンになってくれた。何故。もしかして、アイコンキャッシュが絡んでいて、キャッシュが古いままになっていて更新されなかっただけだろうか…。だとしても、一体どちらの指定が関係してくるのか…。
何にせよ、Nuitka でexeに変換する分には、アイコンを変更することも可能、ということは分かった。
python -m nuitka --standalone --enable-plugin=tk-inter --windows-disable-console --windows-icon-from-ico=icon.ico pyrgbfloatviewer.pyw
_Nuitkaでpythonをexe化(メモ) #Python - Qiita
_Nuitkaを使ってスクリプトをバイナリ化してみよう - PythonOsaka
_【python】nuitkaでpythonコードからexeファイルを作成する方法|星杜なぎさ
たしかにアイコンが変わってくれた。
ただ、これはエクスプローラでファイル一覧を表示した際に使われるアイコンを指定しているそうで…。出来上がったexeを実行してみると、ウインドウのタイトルバーに表示されるアイコンと、Windows10のタスクバーに表示されるアイコンについては、tkinter のアイコンのままだった。
ウインドウのタイトルバーに表示されるアイコンを変更するには、Pythonスクリプト内で iconbitmap("icon.ico") を呼べばいいらしい。その場合は .exeと一緒に icon.ico も配布することになる。
_Tkinter でウィンドウアイコンを設定する方法 | Delft スタック
_TkinterタイトルバーアイコンとEXEアイコンの設定方法【Python】 - プログラムでおかえしできるかな
_Embed icon in python script - Stack Overflow
試してみたところ、たしかに反映された。
root = tk.Tk() root.iconbitmap(default="./icon.ico")
しかし、タイトルバー上のアイコンは変わったものの、Windows10のタスクバー上のアイコンは変化が無かった。PythonからPythonスクリプトが呼び出されると、タスクバー上のアイコンは python.exe か pythonw.exe のアイコンになるということだろうか。いや、だとしたら、tkinter のアイコンになっているのも妙だな…。
その後、何度かexeを作り直していたら、いつのまにか Windows10のタスクバー上も指定したアイコンになってくれた。何故。もしかして、アイコンキャッシュが絡んでいて、キャッシュが古いままになっていて更新されなかっただけだろうか…。だとしても、一体どちらの指定が関係してくるのか…。
何にせよ、Nuitka でexeに変換する分には、アイコンを変更することも可能、ということは分かった。
◎ py2exeの場合 :
py2exeでexe化する際にアイコンを指定するには、setup.py 内で icon_resources を設定すればいいらしいのだけど…。手元の環境で試したところ、そのあたりの指定をするとexe化する際にエラーが出て、exe化が失敗するようになってしまった。おそらく自分が記述の仕方を間違えてそうな気がする。
py2exe は、昔の仕様が解説されてることが多いようで、最近の仕様ではどう指定すればいいのか、そこが分からない…。
諦めた。そもそもアイコンをカスタマイズしたところで、ツールの処理内容が変わるわけでもないし。元々のアイコンが表示されていたとしても、実用上は何も困らないのだよな…。
py2exe は、昔の仕様が解説されてることが多いようで、最近の仕様ではどう指定すればいいのか、そこが分からない…。
諦めた。そもそもアイコンをカスタマイズしたところで、ツールの処理内容が変わるわけでもないし。元々のアイコンが表示されていたとしても、実用上は何も困らないのだよな…。
◎ 余談。色管理ツールの機能を一つ増やした :
先日作成した色管理ツールに機能を追加してみた。既に RGB Float値が書かれてる箇所を、色選択ダイアログで選んだ色で置換する機能をつけた。Edit color ボタンを押せば利用できる。
ただ、正規表現で置換すべき箇所の判定をしているので、正規表現の記述が甘くて誤検出して変なところを置換してしまう可能性が高い…。正しい正規表現になってるか、ちょっと自信がない。
もっとも、編集ウインドウ内で数値を直接書き換えても色は変わっていくので…。今回追加した機能は、所詮はオマケみたいなもの、かもしれない…。
ついでに、バグを一つ修正。編集ウインドウ内(textウィジェット内)の全文字列を取得する際、今までは全文字列の一番最後に余分な改行をつけながら取得していたらしい。そのせいで、Coloringボタンを押すたびに、最後に改行が無駄に追加されてしまう状態になっていた。.get() で文字列を取得する際、.strip() で改行を除去するようにしてみたら、余計な改行がつかない状態になった。
_python - Get string from tkinter text object without line break - Stack Overflow
ただ、正規表現で置換すべき箇所の判定をしているので、正規表現の記述が甘くて誤検出して変なところを置換してしまう可能性が高い…。正しい正規表現になってるか、ちょっと自信がない。
もっとも、編集ウインドウ内で数値を直接書き換えても色は変わっていくので…。今回追加した機能は、所詮はオマケみたいなもの、かもしれない…。
ついでに、バグを一つ修正。編集ウインドウ内(textウィジェット内)の全文字列を取得する際、今までは全文字列の一番最後に余分な改行をつけながら取得していたらしい。そのせいで、Coloringボタンを押すたびに、最後に改行が無駄に追加されてしまう状態になっていた。.get() で文字列を取得する際、.strip() で改行を除去するようにしてみたら、余計な改行がつかない状態になった。
_python - Get string from tkinter text object without line break - Stack Overflow
[ ツッコむ ]
以上です。