Windows10のPythonでGUIアプリをEXEにビルドする

このページでやりたいこと

  • 新規のPythonプロジェクトを作成
  • GUIアプリケーションのとっかかり
  • EXEとしてビルドする

アプリを作成する

サンプルとして、ボタン1つを持つGUIアプリを作ります。

venv3113 フォルダが作成されていると思いますので、同じ階層に app フォルダを作成し、main.py というテキストファイルを用意します。

main.py には次のように書きます。

import tkinter as tk
import tkinter.messagebox as messagebox

def hello():
    messagebox.showinfo("メッセージ", "ハローだよ!")

root = tk.Tk()

# 画面の中央にボタンを配置
button = tk.Button(root, text="ボタン", command=hello)
button.place(relx=0.5, rely=0.5, anchor=tk.CENTER)

root.mainloop()

アプリを実行する

PowerShell から実行します。

# プロジェクトのあるフォルダに移動しているものとします
cd D:\projects\aulta-python\multi_video_viewer
python ./app/main.py

これでボタンを1つもつ画面が表示され、ボタンを押すと「ハローだよ!」とダイアログが出てくるかと思います。

Pythonアプリを EXE にする

インストーラ作成の準備

初めてのときに1回だけ行います
PyInstallerをインストール

pip install pyinstaller

myapp.specファイルを作成

pyinstaller --name=myapp --onefile app/main.py

myapp.spec が作成されるので、追加の編集を行います。

テキストエディタで myapp.spec を開きます。

# -*- mode: python ; coding: utf-8 -*-

block_cipher = None

a = Analysis(['main.py'],
             pathex=['path/to/directory/containing/main.py'],
             binaries=[],
             datas=[],
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

# VLCモジュールを含める
a.hiddenimports += ['vlc']

# メッセージボックスを使う場合
a.datas += [("tkinter/messagebox","C:/path/to/tcl/tk/library/tkinter/messagebox", 'DATA')]

pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas + [('tkinter/messagebox', 'C:/path/to/tcl/tk/library/tkinter/messagebox', 'DATA')],
          [],
          name='myapp',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          upx_include=[],
          runtime_tmpdir=None,
          console=True )

2カ所ある下記のコードを追加します。

[('tkinter/messagebox', 'C:/path/to/tcl/tk/library/tkinter/messagebox')]

C:/path/to の部分だけでなく全体的に、Python のインストール方法によって微妙にパスが異なります。
ここまでの手順通りにやってきているなら次の場所に見つかると思います。

C:\Users\aulta\.pyenv\pyenv-win\versions\3.11.3\Lib\tkinter\messagebox.py

Pythonのexeでプロンプトを表示しない

ここまでの手順で exe を作ると、GUIアプリとともに真っ黒なプロンプトが出現します。
このプロンプトを表示させない方法です。
myapp.spec をテキストエディタで開いて、次のように変更します。

# console=True, を探して False に変更
console=False,

ビルドする

ビルドして exe ファイルを作成

pyinstaller myapp.spec

クリーンする

pyinstaller --clean app/main.py