Raspberry PiでKivy2.0.0を導入してみます。Kivyとは、PythonのNUI(Natural User Interface)開発のためのオープンソースライブラリです。(個人的にはNUI開発という表現は説明する時にはGUI開発という表現でもいいかなと思っていますのでGUIという表現を使わせて下さい。)動作環境がマルチプラットフォームになっていて、Raspberry Piだけではなく、様々なOS、プラットフォームに対応しています。
Kivy公式は以下です。
このサイトでも以下で取り上げたのですが、随分と時間が経過しました。
Raspberry Piでタッチアプリ開発(その1)ハードウェア構成・開発環境等
Raspberry Piでタッチアプリ開発(その2)Kivyの導入と動作確認
Raspberry Piでタッチアプリ開発(その3)Kivyでレイアウト・ボタン作成
Raspberry Piでタッチアプリ開発(その4)ボタンとGPIOの連動
まあ大きな概念は変わってはいないと思いますが、上記の記事ではKivyのバージョンは、1.9.2でした。今回は、Raspberry Pi4でKivy2.0.0を導入してみます。
Raspberry Pi4の環境は以下から始まる一連の投稿で作成した環境です。
あと、Kivy2.0.0はPython3.6からPython3.9で利用できるようですが、ここでは、現段階でRaspbery PiでのデフォルトのPython3.7を使いました。
今回の導入の手順について
以下のマニュアルページのpipでの最新安定版のインストールを使いました。(やはりソースからビルドするより早いと思いました。)
Installing Kivy using pip
但しですが、このマニュアルではVirtualenvを導入して開発環境を切り分けるようにとありましたが、ここではそのままインストールしました。実際にいろいろな開発環境を構築する際にはVirtualenvを導入するということにします。
もしいろいろな環境が混在する場合は、ぜひこのマニュアルのようにVirtualenvの導入を検討して下さい。
あと、Raspberry Piでの環境設定ということで以下を行いました。
SDL2関連ライブラリの導入
公式タッチパネル用の入力設定(オプション)
それでは、この手順で順番に書きます。動作確認は後にして先にコマンドラインのみで導入作業を全てやります。
Kivy2.0.0のpipでのインストールとアップグレード
ここでは以下のようにインストールしました。現段階の安定版でサンプル関連も含めてです。
$ python -m pip install kivy[base] kivy_examples
無事に完了したら以下でアップグレードをします。
$ sudo apt update
$ sudo apt upgrade
SDL2関連ライブラリの導入
他のLinux環境であれば、以上で完了になるかもしれないですが、Raspberry Pi OSで必要な導入を続けます。(※この段階でRaspberry PiでKivyを実行したら動作しなかったです。)
以下のページを見ながらの作業です。このSDL2関連のライブラリは、Raspberry Pi OSのデスクトップを利用する際に必要なようです。
Installation Raspberry Pi 1-4 Desktop environment
これに従って、以下のようにインストールしました。
$ sudo apt install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
問題なく完了しました。
公式タッチパネル用の入力設定(オプション)
タッチパネルは使っていないという場合は不要です。とばして下さい。
以下に従って作業をしました。
Using Official RPi touch display
以下のファイルを編集します。ここまででの作業が問題なく完了していれば以下のファイルが存在しているはずです。
~/.kivy/config.ini
このファイルの[input] セクションを以下のように変更します。
mouse = mouse
mtdev_%(name)s = probesysfs,provider=mtdev
hid_%(name)s = probesysfs,provider=hidinpu
以上で完了です。
ここから実際にKivyの動作確認を行います。
Kivyの導入確認
まだコマンドライン環境です。
python3の配下で、import kivy で確認しました。Pythonのバージョンが、v3.7.3でKivyが、v2.0.0と確認出来ました。
デモアプリの起動
ここからGUI環境です。デモアプリを実行します。以下、フルパスで実行します。
$ python3 ~/.local/share/kivy-examples/demo/showcase/main.py
以下のようなKivyのデモアプリが起動されました。
マウス操作も出来ました。
自分のHello Worldアプリを作成して実行してみます。
hellokv.kvというファイル名で以下を記述します。
Label: font_size:'32sp' text: 'Hello KV World!'
hellokv.pyというファイル名で以下を記述します。
from kivy.app import App class HelloKVApp(App): pass if __name__ == '__main__': HelloKVApp().run()
以上のファイルを同一のディレクトリで作成して以下で実行します。
$ python3 hellokv.py
日本語の表示
以下で書いた方法をまた使います。
Takaoフォント(IPA フォントからの派生フォント)のインストール
以下でインストールします。
$ sudo apt-get install fonts-takao
インストールされた場所を確認します。
$ fc-list | grep takao
この中でTakao Pゴシックを使ってみます。kvファイルでこのフォントを指定します。
Label: font_size:'32sp' font_name: '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' text: '日本語を表示'
Widgetのデフォルトのフォントという意味で以下の指定が出来ます。
<Widget>: font_name: '/usr/share/fonts/truetype/takao-gothic/TakaoPGothic.ttf' <MyWidget>: Label: font_size:'36sp' text: '日本語を表示'
タッチパネルでの動作確認
最後に(公式ではないですが)タッチパネルでの動作確認を行います。
以下のようなテストプログラムを用意しました。Pythonファイルへ全て記述する書き方です。BoxLayoutを使ってテキストとボタン2個を配置しています。
from kivy.config import Config Config.set('graphics', 'width', '450') Config.set('graphics', 'height', '300') from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.label import Label from kivy.uix.button import Button class MainApp(App): def __init__(self): super().__init__() self.label = Label(text="", font_size=32) self.button1 = Button(text="button1", font_size=24, on_press=self.pressed) self.button2 = Button(text="button2", font_size=24, on_press=self.pressed2) def pressed(self, *args): self.label.text = "Hello World" def pressed2(self, *args): self.label.text = "Hello All" def build(self): boxlay = BoxLayout(orientation="vertical") boxlay.add_widget(self.label) boxlay.add_widget(self.button1) boxlay.add_widget(self.button2) return boxlay if __name__ == '__main__': MainApp().run()
ボタンをタッチするとラベルの表示が変わるというテストプログラムです。
静止画像ですが以下は7インチのタッチパネルです。実際に動作してタッチで表示が変わりました。タッチの精度を上げるにはキャリブレーションが必要になりますが、少なくともタッチに反応しました。
以上で動作確認完了です。
最後にまとめ的に
Kivy2.0.0を導入して動作確認まで出来ました。バージョン2.0.0となりましたが、基本的な部分はそれ程変わっていないと思いました。実際にレイアウトを作成してみて、GUIを使うとどうかなというところです。
Raspberry PiでPythonでのGUIライブラリはもちろん他にもあります。そのあたりも含めてまた書きたいと思います。今回はここまでです。