株式会社インデペンデンスシステムズ横浜

システム開発エンジニアの西田五郎が運営しております。Raspberry Pi や Arduino その他新規開発案件のご依頼をお待ちしております。

Raspberry Pi

Raspberry PiでKivy2.0.0を導入する

投稿日:2021年5月20日 更新日:

Raspberry PiでKivy2.0.0を導入してみます。Kivyとは、PythonのNUI(Natural User Interface)開発のためのオープンソースライブラリです。(個人的にはNUI開発という表現は説明する時にはGUI開発という表現でもいいかなと思っていますのでGUIという表現を使わせて下さい。)動作環境がマルチプラットフォームになっていて、Raspberry Piだけではなく、様々なOS、プラットフォームに対応しています。

Kivy公式は以下です。

例えばですが、以下のようなGUIが作成出来ます。

このサイトでも以下で取り上げたのですが、随分と時間が経過しました。
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ライブラリはもちろん他にもあります。そのあたりも含めてまた書きたいと思います。今回はここまでです。

AdSense

AdSense

-Raspberry Pi

執筆者:

関連記事

温度センサADT7410(その1)i2C通信とは

温度センサのADT7410を使ってみます。ADT7410はアナログ・デバイセズ社の製品ですが、実際には以下の秋月さんのモジュールを使います。 ADT7410使用 高精度・高分解能 I2C・16Bit …

Raspberry Piでタッチスクリーン付3.5インチTFTを使ってみた

Raspberry Piでタッチスクリーン付モニタを使ってみました。PiScreenという商品名で3.5インチTFT(480×320) でタッチスクリーン付です。以下の商品です。以下は完成品 …

Raspberry Piをモニターとキーボードなしで導入する(その2)初期設定とリモートデスクトップ

(※2021/05/02追記 現時点で最新版のRaspberry PI OSでモニターとキーボードなしで導入する手順を書きました。ぜひこちらを見て下さい。) Raspberry Piをモニターとキーボ …

Raspberry PiでIoT(MQTTで遠隔操作編 その4)Raspberry PiのGPIOとHeroku連動Pub編

Raspberry PiでIoT MQTTで遠隔操作編の4回目です。2台のRaspberry Piでインターネット経由でGPIOを操作するというテーマで書いています。 前回はMQTTのSub側となるR …

Raspberry PiでAC100V(ソリッド・ステート・リレー)制御

Raspberry PiでAC100VのON/OFF制御を試してみました。今回そのために以下のソリッド・ステート・リレーキットを利用しました。この製品を選んだ理由としては「扱いが簡単」かなと思ったから …