はじめに
Raspberry Pi でGUI付きの組み込み制御をするのに、以前は「Windows 10 IoT Core」を好んで使っていましたが、ここ最近はめっきりサポートも減ってしまい、今後の活用がし難くなってきました。
そこで、PythonのGUIライブラリ「Kivy」を使い始めました。
ぱっと見、UWPみたいな画面が作れるなーと思って触り始めたのですが、結構使いやすい印象なので、Windows上でも試したくなりました。
Pythonなので、あっさり入るかな・・・と思って試したところ、変なハマリどころがあったので、最終的に上手くいった手順をまとめました。
実行環境
- Visual Studio 2019 Commuinity Edition
- インストール時に Python 3.7 を選択して同時にインストール済
もちろん、VSCodeでも同じように実行できます。
VSCodeにはkvファイルの構文に色を付けられる拡張機能があるので、実際は編集・デバッグはVSCodeの方を使ってます。(Python環境だけ、VisualStudioでインストールしたものを使ってます)
インストール
(1)
とりあえずVisualStudioで、Python3のプロジェクトを作っておきます。
(2)
ソリューションエクスプローラから、「Python環境」のなかの、Python3.7を右クリックします。
「ここでコマンドプロンプトを開く」をクリックします。
コマンドプロンプトが出てきます。
インストール・前半戦
(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)
サンプルファイルを動かして動作確認します。
ここでは、下記を参考にしました。
VisualStudioでソースファイルを準備します。
実行ボタンを押すと、下記のウィンドウが表示されました。
ハマリどころ
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系を想定した資料は、まだまだ多いですね・・・