【備忘録】PySimpleGUIでメモ帳を作ってみる【アイコン設定・exe化編】

IT関連

どうも、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です。

半透過マルチアイコン作成。
半透過マルチアイコン作成。無料で半透明マルチアイコンやファビコン(favicon.ico)が作れます。ギザギザの無い美しい影を持ったアイコンが作成できます。

実行ファイルへのアイコンの組み込み

以下のサイトを参考にしました。

PyInstaller+PyQtでアイコン対応 - Qiita
はじめに Pythonを使ってちょっとしたGUIアプリを作るときに,よくPyQtで書いてそれをPyInstallerでexeにパッケージングしています. その時にお気に入りのアプリはアイコンもつけておきたいので,その方法について...

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アプリを作ってみるというのも面白いと思います。

では、今回は以上です。ちょっとしたことで引っかかっている人の助けになれば幸いです♪

コメント

タイトルとURLをコピーしました