hotch-potch, Note to self

いろいろ作業記録

KivyをPython on Windows(VisualStudio)で動かす

はじめに

Raspberry PiGUI付きの組み込み制御をするのに、以前は「Windows 10 IoT Core」を好んで使っていましたが、ここ最近はめっきりサポートも減ってしまい、今後の活用がし難くなってきました。

そこで、PythonGUIライブラリ「Kivy」を使い始めました。

kivy.org

ぱっと見、UWPみたいな画面が作れるなーと思って触り始めたのですが、結構使いやすい印象なので、Windows上でも試したくなりました。

Pythonなので、あっさり入るかな・・・と思って試したところ、変なハマリどころがあったので、最終的に上手くいった手順をまとめました。

実行環境

  • Visual Studio 2019 Commuinity Edition
    • インストール時に Python 3.7 を選択して同時にインストール済

もちろん、VSCodeでも同じように実行できます。

VSCodeにはkvファイルの構文に色を付けられる拡張機能があるので、実際は編集・デバッグVSCodeの方を使ってます。(Python環境だけ、VisualStudioでインストールしたものを使ってます)

インストール

(1)

とりあえずVisualStudioで、Python3のプロジェクトを作っておきます。

(2)

ソリューションエクスプローラから、「Python環境」のなかの、Python3.7を右クリックします。 f:id:hotch-potch:20200411221457p:plain

「ここでコマンドプロンプトを開く」をクリックします。 f:id:hotch-potch:20200411221644p:plain

コマンドプロンプトが出てきます。 f:id:hotch-potch:20200411233407p:plain

インストール・前半戦

(3)

先ほどのコマンドプロンプトから、pipで順番にインストール1していきます。

C:\...\KivyPrac\kv13> pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew --user

C:\...\KivyPrac\kv13> pip install kivy.deps.gstreamer --user

C:\...\KivyPrac\kv13> pip install kivy.deps.angle --user

C:\...\KivyPrac\kv13> pip install kivy --user

で、このままサンプルファイルを実行すると、後述の「ハマリどころ」のような事態になってしまします。

インストール・後半戦

(4)

一旦、Kivyをアンインストールします。

C:\...\KivyPrac\kv13>pip uninstall kivy
Found existing installation: Kivy 1.11.1
Uninstalling Kivy-1.11.1:
  Would remove:
    c:\users\...\appdata\roaming\python\python37\site-packages\kivy-1.11.1.dist-info\*
    c:\users\...\appdata\roaming\python\python37\site-packages\kivy\*
Proceed (y/n)? y
  Successfully uninstalled Kivy-1.11.1
ERROR: Exception:
Traceback (most recent call last):
  File "c:\program files (x86)\microsoft visual studio\shared\python37_64\lib\site-packages\pip\_internal\cli\base_command.py", line 186, in _main
    status = self.run(options, args)
(・・・省略・・・)
  File "c:\program files (x86)\microsoft visual studio\shared\python37_64\lib\shutil.py", line 398, in _rmtree_unsafe
    os.unlink(fullname)
PermissionError: [WinError 5] アクセスが拒否されました。: 'c:\\users\\...\\appdata\\roaming\\python\\python37\\site-packages\\~ivy\\properties.cp37-win_amd64.pyd'

アンインストールの際に、Kivyのバージョンが表示されていますので、これを覚えておきます。

(5)

次に、Pythonのバージョンを確認します。

C:\...\KivyPrac\kv13>python --version
Python 3.7.5

(6)

ここまで、自分の動作環境を整理します。

対象 バージョン
kivy 1.11.1
Python 3.7.5
CPU 64bit(amd64)

(7)

下記のサイトから、動作環境にあったwhlファイルをダウンロードします。

Python Extension Packages for Windows - Christoph Gohlke

私の環境の場合は、Kivy‑1.11.1‑cp37‑cp37m‑win_amd64.whlをダウンロードすることになります。 ここは、それぞれの環境に応じて読み替えてください。

(8)

ダウンロードしたwhlファイルを、コマンドプロンプトを開いているカレントディレクトリにコピーします。

(9)

whlファイルをインストールします。

C:\...\kv13>python -m pip install Kivy-1.11.1-cp37-cp37m-win_amd64.whl --user
Processing c:\...\kv13\kivy-1.11.1-cp37-cp37m-win_amd64.whl
Requirement already satisfied: Kivy-Garden>=0.1.4 in c:\users\...\appdata\roaming\python\python37\site-packages (from Kivy==1.11.1) (0.1.4)
Requirement already satisfied: docutils in c:\users\...\appdata\roaming\python\python37\site-packages (from Kivy==1.11.1) (0.16)
Requirement already satisfied: pygments in c:\users\...\appdata\roaming\python\python37\site-packages (from Kivy==1.11.1) (2.6.1)
Requirement already satisfied: requests in c:\users\...\appdata\roaming\python\python37\site-packages (from Kivy-Garden>=0.1.4->Kivy==1.11.1) (2.23.0)
Requirement already satisfied: idna<3,>=2.5 in c:\users\...\appdata\roaming\python\python37\site-packages (from requests->Kivy-Garden>=0.1.4->Kivy==1.11.1) (2.9)
Requirement already satisfied: chardet<4,>=3.0.2 in c:\users\...\appdata\roaming\python\python37\site-packages (from requests->Kivy-Garden>=0.1.4->Kivy==1.11.1) (3.0.4)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\users\...\appdata\roaming\python\python37\site-packages (from requests->Kivy-Garden>=0.1.4->Kivy==1.11.1) (1.25.8)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\...\appdata\roaming\python\python37\site-packages (from requests->Kivy-Garden>=0.1.4->Kivy==1.11.1) (2019.11.28)
Installing collected packages: Kivy
Successfully installed Kivy-1.11.1

(10)

サンプルファイルを動かして動作確認します。

ここでは、下記を参考にしました。

qiita.com

VisualStudioでソースファイルを準備します。 f:id:hotch-potch:20200411225450p:plain

実行ボタンを押すと、下記のウィンドウが表示されました。

f:id:hotch-potch:20200411230131p:plain

ハマリどころ

kivyを公式のマニュアル通りにインストールしてから、kivyのサンプルを実行すると、以下のようなエラーが出ます。

C:\...\KivyPrac\kv13>python ./kv13.py -d
[INFO   ] [Logger      ] Record log in C:\Users\...\.kivy\logs\kivy_20-04-11_17.txt
[INFO   ] [deps        ] Successfully imported "kivy_deps.gstreamer" 0.2.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.angle" 0.2.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.glew" 0.2.0
[INFO   ] [deps        ] Successfully imported "kivy_deps.sdl2" 0.2.0
[INFO   ] [Kivy        ] v1.11.1
[INFO   ] [Kivy        ] Installed at "C:\Users\...\AppData\Roaming\Python\Python37\site-packages\kivy\__init__.py"
[INFO   ] [Python      ] v3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [MSC v.1916 64 bit (AMD64)]
[INFO   ] [Python      ] Interpreter at "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\python.exe"
[INFO   ] [Factory     ] 184 symbols loaded
[DEBUG  ] [Cache       ] register <kv.lang> with limit=None, timeout=None
[DEBUG  ] [Cache       ] register <kv.image> with limit=None, timeout=60
[DEBUG  ] [Cache       ] register <kv.atlas> with limit=None, timeout=None
[DEBUG  ] [image       ] Failed trying to import the "sdl2" provider from "C:\Users\...\AppData\Roaming\Python\Python37\site-packages\kivy\core\image\_img_sdl2.cp37-win_amd64.pyd". This error is often encountered when a dependency is missing, or if there are multiple copies of the same dependency dll on the Windows PATH and they are incompatible with each other. This can occur if you are mixing installations (such as different python installations, like anaconda python and a system python) or if another unrelated program added its directory to the PATH. Please examine your PATH and python installation for potential issues. To further troubleshoot a "DLL load failed" error, please download "Dependency Walker" (64 or 32 bit version - matching your python bitness) from dependencywalker.com and set the environment variable KIVY_SDL2_DEPENDENCY_WALKER to the full path of the downloaded depends.exe file and rerun your application to generate an error report
[INFO   ] [Image       ] Providers: img_tex, img_dds, img_gif (img_sdl2, img_pil, img_ffpyplayer ignored)
[DEBUG  ] [Cache       ] register <kv.texture> with limit=1000, timeout=60
[DEBUG  ] [Cache       ] register <kv.shader> with limit=1000, timeout=3600
[DEBUG  ] [App         ] Loading kv <.\test.kv>
[DEBUG  ] [window      ] Failed trying to import the "sdl2" provider from "C:\Users\...\AppData\Roaming\Python\Python37\site-packages\kivy\core\window\_window_sdl2.cp37-win_amd64.pyd". This error is often encountered when a dependency is missing, or if there are multiple copies of the same dependency dll on the Windows PATH and they are incompatible with each other. This can occur if you are mixing installations (such as different python installations, like anaconda python and a system python) or if another unrelated program added its directory to the PATH. Please examine your PATH and python installation for potential issues. To further troubleshoot a "DLL load failed" error, please download "Dependency Walker" (64 or 32 bit version - matching your python bitness) from dependencywalker.com and set the environment variable KIVY_SDL2_DEPENDENCY_WALKER to the full path of the downloaded depends.exe file and rerun your application to generate an error report
[DEBUG  ] [Window      ] Ignored <sdl2> (import error)
[CRITICAL] [Window      ] Unable to find any valuable Window provider. Please enable debug logging (e.g. add -d if running from the command line, or change the log level in the config) and re-run your app to identify potential causes
sdl2 - ImportError: DLL load failed: 指定されたモジュールが見つかりません。
  File "C:\Users\...\AppData\Roaming\Python\Python37\site-packages\kivy\core\__init__.py", line 63, in core_select_lib
    fromlist=[modulename], level=0)
  File "C:\Users\...\AppData\Roaming\Python\Python37\site-packages\kivy\core\window\window_sdl2.py", line 27, in <module>
    from kivy.core.window._window_sdl2 import _WindowSDL2Storage

[CRITICAL] [App         ] Unable to get a Window, abort.

いろいろサイトを漁りましたが、コレと言って解決策もなく(泣 で最終的に、参考資料1の「iatlex.com」さんのページにたどり着きました。

理由については、参考資料3の「dario_okazaki」さんの資料に書かれています。(ホントならVisualStudio15のランタイムが必要なところを、非公式のパッケージで回避する方法)

私がPythonを始めたのは1年ほど前で、たまたま最初から3系を意識して使うようにしていたのですが、やはり2系を想定した資料は、まだまだ多いですね・・・

参考資料

  1. Kivy 超入門(1):インストールからHello, World! まで
  2. Python Extension Packages for Windows - Christoph Gohlke
  3. Python3系 + Visual StudioでKivyの開発環境(Windows)を作成する - Qiita
  4. pip installでエラーになりインストールできない場合(Windows) | ガンマソフト株式会社
  5. 【Kivy】WindowsでKivyのインストールの仕方【Python】 - Qiita
  6. Python Kivyの使い方① ~Kv Languageの基本~ - Qiita

  1. ここでは、ユーザのホームディレクトリにインストールしています。インストール先は、C:\Users\<ユーザ名>\AppData\Roaming\Python\Python37\site-packagesになります。