プログラムでおかえしできるかな

定年を過ぎて何かの役に立てないかなと始めた元SEのブログです

TkinterタイトルバーアイコンとEXEアイコンの設定方法【Python】

このエントリーをはてなブックマークに追加

Python でアプリを作成した時に独自アイコンを表示させる方法を紹介します。
Tkinter のウィンドウのタイトルバーに独自アイコンを表示させる方法と
Pyinstaller で EXE にしたファイルに独自アイコンを表示させる方法です。

あわせて、GIMP を使ったアイコン画像の作り方を紹介します。

目次

◆アイコンは2種類

Python でアプリを作成した時に独自のアイコンを表示させたい場合、必要なアイコン設定は2つあります。

これらは別々に設定する必要があります。それぞれの設定方法を説明します。

更にアイコンファイルの作成方法(説明⤵)も説明します。

タイトルバーアイコン

EXEアイコン

◆タイトルバーアイコンの設定方法

Tkinter を使ったアプリでは、そのウィンドウに独自のアイコンを設定することができます。
タイトルバーアイコンと呼んでいます。

設定には、iconphoto() メソッドを使用します。

  • 【構文】iconphoto(default=False, image1, image2 ...)
  • よく使う使い方(サンプル)
    【構文】iconphoto(False, tk.PhotoImage(file="icon.png"))
  • 引数

    • default:False:アイコン画像を現在の特定のウィンドウにのみ適用
            True:アイコン画像を今後作成されるすべての toplevels ウィンドウにも適用
    • image:PhotoImage オブジェクト
      PhotoImage オブジェクトは PGM、PPM、GIF、PNGを扱えます
      サイズの異なる画像を提供できるように複数画像を受け付けます(詳細は未調査)
  • 例:

   import tkinter as tk  
    root = tk.Tk()  
    photo = tk.PhotoImage(file = "Any image file path")  
    root.iconphoto(False, photo)

Tkinter には、iconbitmap() メソッドも用意されています。こちらは ICO ファイルしか扱えないので今回は使用しませんでした。

◆アイコンをコードに埋め込む

前節の説明でタイトルバーアイコンは表示できます。
このままでもよいのですが、このままだとアイコンファイルを提供しなければなりません。
提供しなくてすむ方法を捜しました。

アイコンファイルは、base64エンコードすればコード内に埋め込めます。
アイコンファイルをエンコードするには、PowerShell を使うのが便利です。

【手順】

  1. GIF ファイルを用意
  2. PowerShell で GIF ファイルをエンコードしてテキストファイルに出力 1
    certutil -encode icon.gif icon.txt
  3. 出力されたテキストファイルからエンコードデータを取得
  4. コードに貼り付け

PowerShellエンコード

Windows PowerShell で次のコマンドを実行します。

 powershell
    certutil -encode icon.gif icon.txt

certutil コマンドに -encode パラメータを指定するとファイルを Base64エンコードします。

▽出力結果(icon.txtの中身)

-----BEGIN CERTIFICATE-----
R0lGODlhAAIAAuf/AAABAAcAAAwGBBAHABYGAAkMCBcJAgwOChMODBsOACAOAiIP
ABgTDCMRABYXFBwXESgWACAbFjAYACwaAB0eHDMaACMeGTYdACciHSIkITshACgk
...中略...
IAYzqMENcrCDHvwgCEMowhGSsIQmPCEKU6jCFbKwhS58IQxjKMMZ0rCGNrwhDnOo
wx3ysIc+/CEQgyjEIRLxZQEBADs=
-----END CERTIFICATE-----

「-----BEGIN CERTIFICATE-----」と「-----END CERTIFICATE-----」の間をコピーします。
py ファイルに data = """文字列""" としてペーストして埋め込みます。(改行されたまま扱えるように)

Pythonコード

エンコードしたデータを使って PhotoImage オブジェクトを作成します。

プログラムの主要コードとアイコンのコードは分けたかったので、ファイルを別にしました。
やっていることは、アイコン画像をbase64エンコードしたデータを PhotoImage() コンストラクタで読み込んでPhotoImage オブジェクトを作成します。
以後に、iconphto() メソッドでタイトルバーアイコンに設定します。

import my_icon  # アイコン

    root = Tkinter.Tk()      # トップレベルウィンドウの作成
    photo = my_icon.get_photo_image4icon()  # PhotoImageオブジェクトの作成
    root.iconphoto(False, photo)         # アイコンの設定

▽my_icon.py

"""
ICON
"""
import tkinter as tk

icon_data = """R0lGODlhAAIAAuf/AAABAAcAAAwGBBAHABYGAAkMCBcJAgwOChMODBsOACAOAiIP
ABgTDCMRABYXFBwXESgWACAbFjAYACwaAB0eHDMaACMeGTYdACciHSIkITshACgk
...中略...
IAYzqMENcrCDHvwgCEMowhGSsIQmPCEKU6jCFbKwhS58IQxjKMMZ0rCGNrwhDnOo
wx3ysIc+/CEQgyjEIRLxZQEBADs=
"""

def get_photo_image4icon():
    return tk.PhotoImage(data=icon_data)  # PhotoImageオブジェクトの作成

◆EXEアイコンの設定方法

アプリを Pyinstaller で EXE ファイルにする場合、ファイルのアイコンを指定することができます。

pyinstallerで EXE を作成する時に --icon オプションを付加します。

  • オプション:-i または --icon
  • 値:file.ico または file.exe,ID または file.icons または Image または None
    • file.icoICO ファイルを指定
    • file.exe,ID:EXE ファイルから ID のアイコンを抽出 (?)
    • file.icos:Mac OS 用 (?)
    • Image:ICO 以外の画像。Pillow が必要 (?)
    • None:デフォルトアイコン(pyinstallerのアイコン) (?)
    • (?):動かして確認していません
  • 例:pyinstaller -F -w --icon icon.ico ソースファイル名

◆アイコン用画像の作り方

まず、アイコンのサイズですが、いろいろ調べたのですがよく分かりませんでした。
一応、512×512ピクセルにしました。

GIMP を使ったアイコン作成を紹介します。
GIMP の場合、同じ画像から ICO ファイルと GIF ファイルが作れます。

GIMP による画像作成の手順】

  1. GIMP 起動
  2. 新しい画像を作成(ファイル⇒新しい画像)
    キャンパスサイズを幅512、高さ512にして作成
    背景のレイヤーができる
  3. 新しいレイヤーグループを作成(レイヤー⇒新しいレイヤーグループ)
  4. レイヤーグループに背景のレイヤーを含める
    背景のレイヤーをレイヤーグループのレイヤーにドラッグ
    レイヤーグループが選択された状態でドロップ
  5. 画像の作成 レイヤーグループの中にレイヤーを作って画像を作成します
    意図しない場所にレイヤーができてもドラッグして移動できます
  6. GIF のエクスポート(ファイル⇒名前を付けてエクスポート)
    名前を付けてエクスポートで拡張子を「gif」にします
  7. ICO のエクスポート(ファイル⇒名前を付けてエクスポート)
    名前を付けてエクスポートで拡張子を「ico」にします

※既に画像ファイルがある場合は、GIF のエクスポートと ICO のエクスポートを実行するだけです。

ICO 作成時の注意 ICO ファイルを作るにはレイヤーをグループ化します。
そうしないとそれぞれのレイヤーを別々の画像にしたマルチな ICO としてエクスポートされます。

▽私が作成したアイコンです。すべて文字だけで作りました。
 文字の回転や、レイヤーグループの状況が見て取れます。

◆さいごに

Python の勉強を始めて、諸先輩のサイトを参考にいろいろコードを試してみます。
それだけだと、「あっ、こうなるんだ」というだけで終わってしまい、記憶に残らないこともあります。
それなので、自分としてはきちんと動くものにして勉強してきたつもりです。
その結果を公開もしました。
せっかく作ったアプリなので少し自分を主張してみようかなと独自アイコンの設定方法を勉強したので紹介しました。

アイコンの設定方法が分かっても、アイコン自体にセンスがないので、そこをなんとかしないと・・・

あわせて読みたい 📄スクロールバー付Frameで作るフォント一覧の作り方【Python】 🔗

◇ご注意

本記事は次のバージョンの下で動作した内容を基に記述しています。

◇免責事項

ご利用に際しては、『免責事項』をご確認ください。
お気づきの点がございましたら『お問い合わせ』からお問い合わせください。

◆参考

投稿:

  1. サイト『tkinterのタイトル横のアイコンをコードに埋め込む方法 - Qiita』で「gifファイルがいいらしい」と言及されています。