Python だけでスマホ・PC 両対応アプリを作る!クロスプラットフォームGUIフレームワーク「Kivy」入門
Python だけでスマホ・PC 両対応アプリを作る!クロスプラットフォームGUIフレームワーク「Kivy」入門
ひとことでいうと
Kivy は、Python で書いたコードを Windows・macOS・Linux・Android・iOS の5つの環境 で動かせる GUI(画面付きアプリ)フレームワークです。スマホアプリを作るために Java や Swift を一から勉強しなくても、Python の知識だけで始められます。タッチ操作に最初から対応しており、スマホらしい操作感もそのまま実現できます。商用プロジェクトにも無償で使える MIT ライセンスで提供されており、個人開発から業務システムまで幅広く活用できます。
こんな人におすすめ
1. Python でスマホアプリを作ってみたい人 Android や iOS 向けのアプリを、慣れ親しんだ Python でそのまま開発できます。Java や Swift を新しく覚える必要がないため、既存の Python スキルをそのまま活かせます。
2. 同じコードで複数の OS に対応したい人 デスクトップ(Windows・macOS・Linux)とモバイル(Android・iOS)を一本のコードで賄いたい場合に最適です。プラットフォームごとの細かな差異を Kivy 側が吸収してくれるので、開発者が個別対応を書く手間がぐっと減ります。
3. タッチ操作を使った画面をすばやく試作したい人 Kivy のすべての UI 部品(ウィジェット)はマルチタッチに対応して設計されています。タッチジェスチャーを活かした画面を短期間で試作できるため、教育アプリ・研究デモ・展示コンテンツの制作にも向いています。
インストール・使い方
Kivy は PyPI(Python の公式パッケージ配布サービス)から、pip(パッケージをインストールするコマンド)で入れられます。Python 3.12 を含む幅広いバージョンに対応しています。
Step 1: 仮想環境を用意する
仮想環境とは、プロジェクトごとにパッケージを分けて管理できる「独立した作業部屋」のようなものです。他のプロジェクトへの影響を防ぐために作成することをおすすめします。ターミナル(文字を入力してパソコンに命令を送る画面)で以下のコマンドを実行してください。コピー&ペーストで構いません。
python -m venv kivy_env
source kivy_env/bin/activate # Windows の場合: kivy_env\Scripts\activate
実行後、ターミナルの行頭に (kivy_env) と表示されれば仮想環境が有効になっています。
Step 2: Kivy をインストールする
pip install kivy[base] # 最小構成でインストールする場合
# または、すべての依存ライブラリも含めてインストールする場合
pip install kivy[full]
Ubuntu・Debian 系の Linux を使っている場合は、先に以下のコマンドでシステムライブラリを追加しておいてください。このライブラリは画像・音声・フォントの描画に必要です。
sudo apt-get install python3-dev libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
Step 3: 最初のアプリを動かす
以下のコードを main.py という名前のファイルに保存してください。
# main.py
from kivy.app import App
from kivy.uix.label import Label
class HelloApp(App):
def build(self):
return Label(text='Hello, Kivy!')
if __name__ == '__main__':
HelloApp().run()
python main.py
これだけでウィンドウが開き、「Hello, Kivy!」という文字が表示されます。App クラスを継承して build() メソッドで表示したい部品を返す、という最小構成は非常にシンプルです。
Step 4: KV 言語でレイアウトを書く
Kivy には「KV 言語」という独自のレイアウト記述言語があります。HTML と CSS の関係に近いイメージで、画面の構成を Python コードとは別ファイルに書けます。デザインとロジックを分けて管理しやすくなります。
# main.py
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class RootWidget(BoxLayout):
pass
class MyApp(App):
def build(self):
return RootWidget()
if __name__ == '__main__':
MyApp().run()
# my.kv(アプリ名に合わせて自動でロードされます)
<RootWidget>:
orientation: 'vertical'
Button:
text: 'Click Me'
on_press: root.ids.label.text = 'Clicked!'
Label:
id: label
text: 'Hello'
KV ファイルにレイアウトとイベントの動作を宣言的に書くことで、デザイン担当とプログラム担当が役割分担しやすくなります。
動かしてみた
Python 3.12 の環境で Kivy リポジトリのファイル構成を確認したところ、kivy/ ディレクトリの中に event.py・factory.py・animation.py・metrics.py・parser.py・cache.py・resources.py など、多数のコアモジュールが揃っていることを確認できました。フレームワーク本体がしっかり作り込まれている様子がよく分かります。
また .ci/ ディレクトリには Ubuntu・macOS・Windows・ARM(Raspberry Pi などで使われるチップ向け)それぞれの CI スクリプトと Dockerfile が整備されており、マルチプラットフォーム対応が自動テストのレベルからきちんとカバーされています。
パッケージ構成は setup.py と setup.cfg を用いる標準的な Python パッケージの形式です。Kivy は内部に C 言語の拡張コード(Cython ビルド)を含むため、ディスプレイ出力のない純粋なサーバー環境で動かす場合は、環境変数の追加設定が必要になることがあります。ローカルの PC 環境であれば Step 3 のコードをそのまま動かせます。
試す前に知っておくとよいこと
- Python のバージョン: Python 3.8 以上が対象です。3.12 でも動作確認されています。
- ディスプレイ環境: Kivy は OpenGL ES 2.0 を使う GUI フレームワークのため、画面出力のある環境(一般的なデスクトップ PC・ノートPC)が必要です。
- Linux の場合: SDL2 などのシステムライブラリを事前にインストールしておく必要があります(Step 2 参照)。
- モバイル向けビルド: Android・iOS 向けのパッケージを作る場合は、別途 Buildozer などのツールが必要です。
デモについて
Kivy は OpenGL ES 2.0 を使う GUI フレームワークのため、ブラウザ上でそのままインタラクティブに動かすデモの提供はできません。ただし、ローカルの PC に Python をインストールすれば、Step 3 のコード例をそのままコピー&ペーストして試すことができます。数行のコードで動く画面が確認できるので、まずは「Hello, Kivy!」から始めてみてください。
はじめの一歩:すぐ試せる実践のコツ
- 仮想環境を必ず作る:
pip installの前にpython -m venvで仮想環境を用意しておくと、他のプロジェクトとの干渉を防げます。 kivy[base]から始める: 最初はオプション少なめのkivy[base]で入れて動作確認し、必要に応じてkivy[full]に切り替えると問題の切り分けがしやすいです。- KV ファイルのファイル名に注意する:
MyAppというクラス名なら KV ファイルはmy.kvと小文字にする必要があります。自動ロードの仕組みを使うときはここを見直しましょう。 - 公式サンプルを動かしてみる: リポジトリの
examples/ディレクトリにはすぐ動く多数のサンプルが入っています。まずサンプルをそのまま実行して、コードを少しずつ書き換えると理解が早まります。 - ウィジェットの重ね方を体で覚える:
BoxLayout(縦または横に並べる)・GridLayout(格子状に並べる)・FloatLayout(自由配置)の3つを使いこなすと、たいていの画面が作れます。
活用例
- 教育用タッチアプリ: Raspberry Pi に Kivy を入れて、タッチ操作で動く数学・理科の学習教材を作ることができます。Kivy は Raspberry Pi OS に対応しているため、組み込み教育端末での展開も容易です。
- 業務用タブレットアプリ: Android タブレット向けの在庫管理・受付・POS アプリを Python で内製開発できます。Buildozer を使えば、そのまま apk ファイル(Android アプリのパッケージ形式)への変換も自動化できます。
- インタラクティブアート・展示コンテンツ: マルチタッチ対応の展示作品やミュージアムのインタラクティブコンテンツの開発に活用されています。OpenGL ベースのため、カスタムシェーダーや滑らかなアニメーションも実現できます。
- 研究・プロトタイピング: UI のプロトタイプを素早く作って検証したい研究者や学生にも向いています。Python 一本で動く画面が作れるため、他の Python 製ライブラリ(データ処理・機械学習など)との組み合わせも容易です。
- Raspberry Pi を使ったIoTダッシュボード: センサーの値をリアルタイムに画面表示するダッシュボードアプリを、Python と Kivy で一気通貫に作れます。小型ディスプレイ付きのラズパイ端末に最適です。
用語とポイント解説
GUI(グラフィカルユーザーインターフェース) かんたんに言うと、「ボタンや画像がある、クリックで操作できる画面」のことです。文字だけで命令するコマンドラインとは対照的に、見た目を持つアプリを指します。Kivy はこの GUI を Python で作るためのフレームワークです。
フレームワーク かんたんに言うと、「よく使う機能をまとめて用意してくれた土台」のことです。ゼロから書かなくても済む共通部分を提供してくれるため、開発者はアプリ固有のロジックに集中できます。
OpenGL ES 2.0 かんたんに言うと、「スマホやタブレットの GPU(画像処理チップ)を使って画面を描くための標準的な仕組み」です。Kivy はこの仕組みを使って描画するため、滑らかなアニメーションやカスタム描画が得意です。
KV 言語 かんたんに言うと、「Kivy 専用の画面レイアウト記述言語」です。HTML でウェブページの構造を書くのに似た感覚で、ボタンやラベルの配置・見た目・イベントを宣言的に書けます。Python コードから UI の定義を分離できるため、コードが整理しやすくなります。
ウィジェット(Widget) かんたんに言うと、「ボタン・ラベル・テキスト入力欄などの UI 部品ひとつひとつ」のことです。Kivy のウィジェットはすべてマルチタッチ対応で設計されており、画面に配置するだけでタッチ操作に反応します。
Buildozer かんたんに言うと、「Kivy アプリを Android や iOS 向けの配布ファイルに変換してくれるツール」です。コマンド一本でビルドからパッケージングまでを自動化できるため、アプリストアへの公開準備も効率よく進められます。
Plyer かんたんに言うと、「カメラ・GPS・加速度センサーなどスマホのハードウェア機能を、プラットフォームを問わず同じコードで呼び出せるライブラリ」です。Android でも iOS でも同じ書き方でセンサーにアクセスできるため、切り替えコードを書く手間が省けます。
Python for Android(p4a) かんたんに言うと、「Python で書いたコードを Android 上で動かせる形式に変換する低レイヤーのツール」です。Buildozer はこの p4a を内部的に使っており、普段の開発では Buildozer を通して間接的に利用することが多いです。
仮想環境(venv) かんたんに言うと、「プロジェクトごとにパッケージを独立して管理できる専用の作業スペース」のことです。Kivy をインストールしても他のプロジェクトに影響しないよう、仮想環境を作ってから作業することをおすすめします。
MIT ライセンス かんたんに言うと、「個人利用・商用利用を問わず、ほぼ自由に使えるオープンソースのライセンス」です。著作権表示を残す必要がありますが、製品への組み込みや販売も許可されているため、ビジネス用途でも安心して利用できます。
まとめ
Kivy は「Python でモバイル・デスクトップ両対応のアプリを作る」というニーズをしっかりカバーするフレームワークです。OpenGL ES 2.0 ベースの描画エンジン・KV 言語による宣言的な UI 設計・マルチタッチファーストの設計思想が組み合わさり、Tkinter や PyQt など他の Python GUI ツールには真似できないクロスプラットフォーム性能を実現しています。MIT ライセンスで商用利用も無償、Buildozer・Plyer・Python for Android などの充実したエコシステム、そして活発なコミュニティにも支えられています。ぜひ業務用タブレットアプリの内製開発や、Raspberry Pi を活用した教育・IoTダッシュボードの制作などに活用してみてはいかがでしょうか。