2026/01/04(日) [n年前の日記]
#1 [python][windows] Pythonで作ったスクリーンセーバを修正中
_昨日、
Pythonを使ってWindows用のスクリーンセーバを作成したけれど、起動が遅い点が気になってどうにかできないものかと試してた。環境は Windows10 x64 22H2 + Python 3.10.10。
◎ 展開ファイル数の削減 :
Nuitka を使って1つのexeファイルにしているけれど、実行するたびにテンポラリフォルダ上に1000ファイル以上のファイル群を展開しているのが気になる。そこが遅いのではないか…?
ファイル群の中身を確認したら、tkinter を使うと大量のファイルが必要とされてしまうことが分かった。tclという名前のフォルダが展開されるけれど、そこだけで800ファイル以上ある。
ということは、tkinter を使わない作りにすれば展開ファイル数を激減できるのではないかな…?
ファイル群の中身を確認したら、tkinter を使うと大量のファイルが必要とされてしまうことが分かった。tclという名前のフォルダが展開されるけれど、そこだけで800ファイル以上ある。
ということは、tkinter を使わない作りにすれば展開ファイル数を激減できるのではないかな…?
◎ 別のGUIライブラリを試した :
試しに、tkinter で表示していた部分を、DearPyGui というライブラリ(モジュール)で置き換えてみた。以下でインストールできる。
tkinter を DearPyGui に置き換えたところ、展開ファイル数が、1010ファイル → 89ファイルと圧倒的に少なくなった。
しかし、喜んだのも束の間、奇妙な動作になった。Windowsの「スクリーンセーバーの変更」ウインドウ上で「設定」ボタンをクリックすれば、DearPyGuiによる設定ウインドウ相当が表示されるはずだけど、表示されない…。
不思議なことに、以下の操作をした場合は DearPyGui によるウインドウが表示される。
.scr を右クリックして操作した場合でも表示されるのだから、スクリーンセーバとして利用する場合も表示されそうな気がするのだけど…。どうしてこんな動作になるのか…。原因がさっぱり分からない…。
python -m pip install dearpygui
tkinter を DearPyGui に置き換えたところ、展開ファイル数が、1010ファイル → 89ファイルと圧倒的に少なくなった。
しかし、喜んだのも束の間、奇妙な動作になった。Windowsの「スクリーンセーバーの変更」ウインドウ上で「設定」ボタンをクリックすれば、DearPyGuiによる設定ウインドウ相当が表示されるはずだけど、表示されない…。
不思議なことに、以下の操作をした場合は DearPyGui によるウインドウが表示される。
- 生成された .exe に「/c」をつけて実行。
- .exe をリネームコピーした .scr を右クリックして「構成」を選ぶ。
.scr を右クリックして操作した場合でも表示されるのだから、スクリーンセーバとして利用する場合も表示されそうな気がするのだけど…。どうしてこんな動作になるのか…。原因がさっぱり分からない…。
◎ メッセージボックスで置き換えることにした :
考えてみたら、現状では「設定」ボタンをクリックした際にアプリ名とバージョン名を表示しているだけなので、只のメッセージボックスでもいいのではないかと思えてきた。
もし、スクリーンセーバの設定項目をちゃんと用意して設定できるようにしたい場合は、フルスクリーン表示時に設定操作ができる仕様を追加する形でいいだろう…。そういう仕様のスクリーンセーバを今までもいくつか目にしているので、それで全然OKのはず。
さておき、Pythonでメッセージボックスを表示する方法は以前試してある。今回は ctypes を利用して表示する方法を選んでみた。
_mieki256's diary - Pythonスクリプトでメッセージボックスを表示したい
ついでに、Pillow を使ってpng画像を読み込んで縮小している処理も省いてみた。最初から 152 x 112 のbmp画像を用意しておけば、pywin32 だけで、というかWindowsのAPIで画像を読み込めるし、描画もできる。これで Pillow も組み込まずに済む。
ちなみに、「スクリーンセーバーの変更」ウインドウのプレビュー画面のサイズは 152 x 112。Windows95 のデスクトップ画面も調べてみたけれど、Windows11 に至るまでサイズは変わってないように見える。
そんな感じにしてみたけれど、展開ファイル数は82ファイルになった。1000ファイル以上展開していた状態と比べたら、展開時間は圧倒的に短くて済むはず…。
もし、スクリーンセーバの設定項目をちゃんと用意して設定できるようにしたい場合は、フルスクリーン表示時に設定操作ができる仕様を追加する形でいいだろう…。そういう仕様のスクリーンセーバを今までもいくつか目にしているので、それで全然OKのはず。
さておき、Pythonでメッセージボックスを表示する方法は以前試してある。今回は ctypes を利用して表示する方法を選んでみた。
_mieki256's diary - Pythonスクリプトでメッセージボックスを表示したい
ついでに、Pillow を使ってpng画像を読み込んで縮小している処理も省いてみた。最初から 152 x 112 のbmp画像を用意しておけば、pywin32 だけで、というかWindowsのAPIで画像を読み込めるし、描画もできる。これで Pillow も組み込まずに済む。
ちなみに、「スクリーンセーバーの変更」ウインドウのプレビュー画面のサイズは 152 x 112。Windows95 のデスクトップ画面も調べてみたけれど、Windows11 に至るまでサイズは変わってないように見える。
そんな感じにしてみたけれど、展開ファイル数は82ファイルになった。1000ファイル以上展開していた状態と比べたら、展開時間は圧倒的に短くて済むはず…。
◎ 相変わらず遅い :
しかし、それでも起動に時間がかかる。
正確には、プレビュー画面を表示するときだけ異様に時間がかかる。5秒ぐらい経たないと画像が表示されない。
「設定」や「プレビュー」をクリックした時は、.exe に「/c」「/s」をつけて実行した時と同様、体感で1秒前後でメッセージボックスやフルスクリーン表示になってくれるのだけど…。
ウイルス対策ソフト Microsoft Defender が何かしていて遅くなっているのかなと、試しにリアルタイム保護を無効にして試してみた。変化無し。ということは、ウイルス対策ソフトが動作を遅くしているわけではないのだろうな…。そもそも、/c や /s をつけて実行する時はサクッと起動しているのだし…。
正確には、プレビュー画面を表示するときだけ異様に時間がかかる。5秒ぐらい経たないと画像が表示されない。
「設定」や「プレビュー」をクリックした時は、.exe に「/c」「/s」をつけて実行した時と同様、体感で1秒前後でメッセージボックスやフルスクリーン表示になってくれるのだけど…。
ウイルス対策ソフト Microsoft Defender が何かしていて遅くなっているのかなと、試しにリアルタイム保護を無効にして試してみた。変化無し。ということは、ウイルス対策ソフトが動作を遅くしているわけではないのだろうな…。そもそも、/c や /s をつけて実行する時はサクッと起動しているのだし…。
◎ Nuitkaのオプションについて :
Pythonスクリプトをexeファイル化してくれる Nuitka について、色々なオプションがあることが分かってきたのでついでにメモ。
作者名等を付加したい時は以下を指定できる。exeファイルに指定内容が含まれて、プロパティ → 詳細、を選べばある程度反映された状態になっていることがわかる。
_We Love Python (7) Nuitkaさんはマルウェアじゃない!&来年に向けて|明日太
_Python Nuitkaでウイルス誤判定を回避しつつ実行ファイル「exe」をつくる方法
_nuitkaで作ったexeがウイルス扱いされないための方法 - shikaku's blog
起動が遅いのはウイルス対策ソフトが何かしているのではないかと予想して、このあたりを指定してみたけれど変化はなかった…。
その他のオプションもメモ。
ドキュメントを読んでいたら、Pythonスクリプトのソース内にコメントの形でこれらのオプションを書いておくことでも反映される、といった内容を目にしたような記憶もあるけれどちょっと自信なし。
作者名等を付加したい時は以下を指定できる。exeファイルに指定内容が含まれて、プロパティ → 詳細、を選べばある程度反映された状態になっていることがわかる。
--copyright="YOUR NAME" --windows-product-name="YOUR SOFT NAME" --file-description="DESCRIPTION" --windows-file-description="DESCRIPTION" --windows-product-version=0.0.1.0 --windows-product-version=0.0.1.0 --windows-file-version=0.0.1.0 --windows-company-name="YOUR COMAPNY"
_We Love Python (7) Nuitkaさんはマルウェアじゃない!&来年に向けて|明日太
_Python Nuitkaでウイルス誤判定を回避しつつ実行ファイル「exe」をつくる方法
_nuitkaで作ったexeがウイルス扱いされないための方法 - shikaku's blog
起動が遅いのはウイルス対策ソフトが何かしているのではないかと予想して、このあたりを指定してみたけれど変化はなかった…。
その他のオプションもメモ。
- --remove-output : 作業用として作成されたファイル群を自動削除。
- --mingw64 : MinGW64でコンパイル。つけなければ Visual C++ (cl.exe) でコンパイル。cl.exe のほうが省メモリで動くが、コンパイル速度は MinGW64 のほうが速いらしい。
- --include-data-dir="./res=res" : 含めるデータディレクトリを指定
- --enable-plugin=tk-inter : tkinterを含める。
- --follow-imports --onefile : 1ファイルのexeを生成。
- --standalone : exe以外に必要なdll等をそのまま置く。--follow-imports は自動でしてくれるらしい。
ドキュメントを読んでいたら、Pythonスクリプトのソース内にコメントの形でこれらのオプションを書いておくことでも反映される、といった内容を目にしたような記憶もあるけれどちょっと自信なし。
[ ツッコむ ]
以上です。