3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

KivyによるGUIのアプリケーション化(matplotlib含む)

Last updated at Posted at 2020-09-02

今回はKivyによるGUIにてグラフを表示する機能を実装したアプリを配布しようとして、
少し引っかかったので忘備録として。環境はWindows10

1. 必要ライブラリのインポート

matplotlibをKivy内で有効化する為、Kivy-Gardenをインポートする。
後にpyinstallerにてexe化するが、その際にgardenのディレクトリを見失うようなので、
matplotlibは--kivyを使用してインストールする。

$ pip install kivy-garden
$ garden install matplotlib --kivy

2. pyinstallerにてexe化

仮想環境にてpipで必要最低限のライブラリのみインストールする。
(anacondaだったりpyenvだったり仮想環境構築については省略)
不要なものが多いと200~300Mbの巨大exeファイルが誕生する...

$ pip install pyinstaller pypiwin32 #この二つは必須

#こいつらはkivyのインストールについてこないのでインストールが済んでいなければ忘れずに。
$ pip install kivy_deps.sdl2 kivy_deps.glew 
$ pip install 必要なライブラリ          #pyファイルに必要なライブラリ全て

3. パッケージ化

準備完了です。作業ディレクトリをpythonファイルに移動して以下を実行。
pyinstallerには色々とパッケージングの便利機能がありますがここでは
ファイルを一つにまとめてくれる--onefileを使用。

$ pyinstaller ***.py --onefile

作業ディレクトリに色々と生成されるが、とりあえずdistないにexeファイルが生成。
この状態だとまだGUIは立ち上がらない。

# 作業ディレクトリ内
***.py
***.kv
***.spec
dist
pycache
build

4. specファイルの編集

次にGUIを有効化するためにSPECファイルに依存関係などを記述していく。

#以下specファイル
> ***.spec

from kivy_deps import sdl2, glew  # 追加箇所①
block_cipher = None
a = Analysis(['***.py'],
             pathex=['c:\\パッケージ化したディレクトリ'],
             binaries=[],
             datas=[],
             hiddenimports=[]
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],  # 追加箇所②
          name='main',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

# 追加箇所③
coll = COLLECT(exe, Tree('c:\\kivyファイルのディレクトリ'),
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               name='main')

自分の場合は、pythonファイルと同ディレクトリに***.kv用にフォルダ(Layoutなどのフォルダ)を作成して入れてあげた。(あまり意味ないかもだが、collect処理で不要なものも拾わないように)

# 最後に以下を実行
$ pyinstaller ***.spec --onefile

5. 完成

下記のディレクトリにmainフォルダが生成しており、その中に新たなexeファイルが生成している。
この中には依存関係全てのファイルが存在していて、アプリ配布の際にはこのmainフォルダごと
必要になる。(もっと単一化できるとおもう。つーか今の自分にはこれが限界。)
どこかのディレクトリに隠しつつ、exeファイルのショートカットだけ上手いこと使ってもらえれば
それっぽくなると思い妥協した。

dist
|_main    # ←この中に新しいexeファイル
|_***.exe

特にmatplotlib==3.1.1を使用したが、最新だとできないような情報も見かけた。

とりあえず、これでGUIアプリケーションを配布可能になった。

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?