WindowsでKivyのアプリをパッケージ(EXEファイル)にする手順はKivyのドキュメンテーションを見れば何とかなると思いますが、

一つのEXEファイルにまとめるためには少し工夫が必要です。

一つのEXEファイルにまとめるとき、PyInstallerはファイルを一つに圧縮して、

起動するとき、Tempディレクトリに展開します。

その時、必要なファイルが見つからないのが多いです。

そのTempディレクトリは環境変数で保存されています。

 

まず、必要なデータファイルはどこに保存されているか、

正しいパスを得るために、スクリプト内にこの関数が必要です。

def resource_path(relative_path):
    try:
        base_path = sys._MEIPASS
    except Exception:
        base_path = os.path.abspath(".")
    return os.path.join(base_path, relative_path)

 

使い方はこれ。

例えば、アイコンを使うとき、

        self.icon = "icon.png"

ではなく、

        self.icon = resource_path("icon.png")

でアイコンのパスを得ます。

 

次に、実際にPyInstallerを使うとき、

必要なファイルを--add-dataというオプションで追加します。

例えば、

 pyinstaller -F -w --icon icon.ico --add-data "icon.png;." myapp.py

 

これでPyInstallerは一回起動しますが、おそらく出来上がりのEXEファイルは実行できません。

なぜかというと、Kivyに必要なインポートはされていませんから。

そこで、specファイルを編集する必要があります。

実際の手順はKivyのドキュメンテーションにありますが、

簡単に言うと、specファイルの冒頭に

 from kivy.deps import sdl2, glew

を入れて、COLLECT()のところのa.datasのすぐあとに

 *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)]

を入れます。

 

この感じになります。

coll = COLLECT(exe,
               a.binaries,
               a.zipfiles,
               a.datas,
               *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
               strip=False,
               upx=True,
               name='myapp')

 

これができたら、再度PyInstallerを実行します。

 pyinstaller myapp.spec

これでdistというサブディレクトリのEXEファイルが動くはずです。

やってみてくださいチョキ