mieki256's diary



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。

Nuitkaの場合 :

Nuitka の場合は、--windows-icon-from-ico=icon.ico といった感じのオプションをつければいいらしい。
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 は、昔の仕様が解説されてることが多いようで、最近の仕様ではどう指定すればいいのか、そこが分からない…。

諦めた。そもそもアイコンをカスタマイズしたところで、ツールの処理内容が変わるわけでもないし。元々のアイコンが表示されていたとしても、実用上は何も困らないのだよな…。

余談。色管理ツールの機能を一つ増やした :

先日作成した色管理ツールに機能を追加してみた。既に RGB Float値が書かれてる箇所を、色選択ダイアログで選んだ色で置換する機能をつけた。Edit color ボタンを押せば利用できる。

ただ、正規表現で置換すべき箇所の判定をしているので、正規表現の記述が甘くて誤検出して変なところを置換してしまう可能性が高い…。正しい正規表現になってるか、ちょっと自信がない。

もっとも、編集ウインドウ内で数値を直接書き換えても色は変わっていくので…。今回追加した機能は、所詮はオマケみたいなもの、かもしれない…。

ついでに、バグを一つ修正。編集ウインドウ内(textウィジェット内)の全文字列を取得する際、今までは全文字列の一番最後に余分な改行をつけながら取得していたらしい。そのせいで、Coloringボタンを押すたびに、最後に改行が無駄に追加されてしまう状態になっていた。.get() で文字列を取得する際、.strip() で改行を除去するようにしてみたら、余計な改行がつかない状態になった。

_python - Get string from tkinter text object without line break - Stack Overflow

以上です。

過去ログ表示

Prev - 2024/05 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project