イントロダクション
Kivyは、Pythonでモバイルやデスクトップ向けのマルチタッチ対応アプリケーションを簡単に開発できるオープンソースのGUIライブラリです。クロスプラットフォーム対応であり、Windows、macOS、Linux、iOS、Androidなど、複数の環境で同じコードを動かすことが可能です。
他のGUIライブラリと比較すると、特にKivyの特徴として注目されるのは、モバイルデバイスでのタッチ操作やマルチタッチに強い点です。また、グラフィカルなアニメーションや、カスタムデザインのウィジェットを容易に実装できる柔軟性もあります。これにより、エンターテインメントアプリやゲーム、教育アプリ、ビジネス向けのインタラクティブなツールなど、幅広いアプリケーションが開発可能です。

「Pythonでモバイルアプリやデスクトップアプリを作ってみたいけれど、どこから始めればいいのか分からない…」そんな方に、Kivyを使ったアプリ開発の入門ガイドをご紹介します。このガイドでは、Kivyの特徴やインストール方法、基本的な使い方から、実際のアプリケーションの作成手順まで、初心者にもわかりやすく解説しています。クロスプラットフォーム対応のアプリ開発に興味がある方は、ぜひチェックしてみてくださいね!
Kivyの特徴と利点
なぜKivyを選ぶのか?
Pythonを使ったGUIアプリケーション開発には他にもツールがありますが、Kivyはその柔軟性とクロスプラットフォーム対応が大きな魅力です。特に、モバイルデバイス向けのアプリ開発を視野に入れる場合、Kivyのシンプルな構造と強力な機能は非常に有利です。また、Pythonの使いやすさを活かしながら、インタラクティブで動的なアプリを簡単に構築できる点も開発者にとって魅力的なポイントです。
Kivyのインストールとセットアップ

Kivyを使ってPythonアプリケーションを開発するためには、まずKivy自体をインストールし、開発環境を整える必要があります。この章では、Kivyのインストール手順と基本的なセットアップについて解説します。
必要な環境
Kivyを使用するためには、以下のものが必要です。
- Python 3.7〜3.10: KivyはPython 3.11以上には対応していませんので、対応バージョンのPythonをインストールしてください。
- pip: Pythonのパッケージ管理ツールであるpipが必要です。通常、Pythonをインストールするとpipも一緒にインストールされますが、確認しておきましょう。
- 仮想環境(オプション): プロジェクトごとに依存パッケージを管理したい場合は、Pythonの仮想環境を利用すると便利です。
Kivyのインストール方法
Kivyをインストールするには、Pythonが正しくインストールされていることを確認した上で、以下の手順を実行します。
- Pythonのバージョンを確認する
python --version- 仮想環境を作成(オプション) 仮想環境を使いたい場合は、以下のコマンドで仮想環境を作成し、アクティブにします。
python -m venv kivy_env
source kivy_env/bin/activate # Windowsの場合は kivy_env\Scripts\activate- Kivyのインストール 次に、pipを使ってKivyをインストールします。以下のコマンドをターミナルやコマンドプロンプトで実行します。
pip install kivy- 依存ライブラリのインストール KivyにはOpenGLなどの依存ライブラリが必要です。インストール時に自動でインストールされますが、問題が発生する場合には公式ドキュメントに従って手動でインストールすることもできます。
開発環境の設定
Kivyプロジェクトを開発する際には、統合開発環境(IDE)を使用すると効率的です。Pythonに対応している有名なIDEには、次のようなものがあります。
- Visual Studio Code (VS Code): 無料で使える軽量のエディタで、Python用のプラグインも豊富です。VS Codeを使ってKivyの開発を進めることができます。
- 必要に応じて、Pythonプラグインをインストールします。
- PyCharm: こちらもPythonに特化したIDEで、無料版(Community Edition)があります。仮想環境の管理も容易で、デバッグ機能も充実しています。
どちらのIDEでも、Kivyプロジェクトを簡単に作成して実行することが可能です。
簡単な確認コード
Kivyが正しくインストールされたかを確認するために、次のようなシンプルなアプリケーションを作成してみましょう。
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text="Hello, Kivy!")
if __name__ == '__main__':
MyApp().run()このコードは、”Hello, Kivy!”と表示されるシンプルなラベルを持つアプリケーションです。IDEでこのコードを実行することで、Kivyが正しくインストールされているか確認できます。
Kivyの基本構造
Kivyを使ってアプリケーションを作成する際、その基本的な構造を理解することは非常に重要です。Kivyアプリケーションは、他のGUIライブラリと同様に「ウィジェット」と呼ばれるUI要素をベースに構築され、イベント駆動型のアーキテクチャを採用しています。
Kivyアプリケーションの基本構造
Kivyアプリは通常、Pythonのクラスを使って定義されます。このクラスはkivy.app.Appクラスを継承し、アプリケーション全体のロジックを管理します。基本構造は以下のようになります。
from kivy.app import App
from kivy.uix.label import Label
class MyApp(App):
def build(self):
return Label(text="Hello, World!")
if __name__ == '__main__':
MyApp().run()この基本構造には、以下の要素が含まれています。
- Appクラス
Kivyアプリケーションのエントリーポイントであり、アプリケーション全体を制御します。AppクラスはKivyのコアクラスで、buildメソッドを通してアプリケーションのUIを構築します。 - buildメソッド
Appクラスにおける最も重要なメソッドです。buildメソッドは、ウィジェットの階層構造を返し、それがアプリのUIとして表示されます。ここでは、単純なLabelウィジェットを返して「Hello, World!」というテキストを画面に表示しています。 - ウィジェット
ウィジェットは、KivyアプリケーションのUIを構成する基本要素です。ボタン、ラベル、テキスト入力フィールドなど、Kivyには多種多様なウィジェットが用意されています。上記のコードでは、Labelウィジェットを使用しています。 - アプリケーションのライフサイクル
Kivyアプリケーションは、run()メソッドを呼び出すことで起動し、終了するまでイベントループが実行されます。buildメソッドはアプリケーション起動時に一度だけ呼ばれ、UIの初期設定が行われます。
Appクラスとbuildメソッドの詳細
KivyアプリケーションのエントリーポイントであるAppクラスは、他のクラスやモジュールと組み合わせることで、柔軟にアプリケーションの機能を拡張できます。例えば、buildメソッドの代わりに、KV言語(次章で詳しく説明します)を用いてUIを構築することもできます。
from kivy.app import App
from kivy.uix.button import Button
class MyApp(App):
def build(self):
# ボタンウィジェットを返す
return Button(text="Click me!")この例では、アプリケーションを起動すると「Click me!」と書かれたボタンが表示されます。このボタンをクリックした時に発生するイベントについては、次の章で詳しく説明します。
ウィジェットとレイアウトの基本
Kivyのウィジェットは、単独で使用されることもあれば、レイアウトと組み合わせて複雑なUIを構築することもあります。Kivyのレイアウトシステムを使用することで、ウィジェットを効率よく画面上に配置することができます。
例えば、複数のボタンを水平に並べたい場合、BoxLayoutを使用することで簡単にレイアウトを作成できます。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
class MyApp(App):
def build(self):
layout = BoxLayout(orientation='horizontal')
layout.add_widget(Button(text="Button 1"))
layout.add_widget(Button(text="Button 2"))
layout.add_widget(Button(text="Button 3"))
return layoutこのコードでは、BoxLayoutを使って3つのボタンを横一列に並べています。Kivyではこのようなレイアウトシステムが非常に強力で、画面サイズや解像度に関係なく、柔軟なUI設計が可能です。
レイアウトシステムの詳細

Kivyのレイアウトシステムは、ウィジェットを効率的に画面上に配置するための重要なツールです。複数のウィジェットを一度に扱う場合、レイアウトを利用することで、画面のサイズや解像度に応じて柔軟にUIを構築できます。この章では、主要なレイアウトクラスをいくつか紹介し、どのように利用できるかを具体的に説明します。
主なレイアウトクラス
Kivyには、ウィジェットを整理して配置するためのいくつかのレイアウトクラスが用意されています。以下は、代表的なレイアウトクラスです。
BoxLayout
BoxLayoutは、ウィジェットを水平(横)または垂直(縦)に整列させるレイアウトです。orientationプロパティで配置の方向を指定します。
orientation='horizontal': 水平方向にウィジェットを並べる。orientation='vertical': 垂直方向にウィジェットを並べる。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
class MyApp(App):
def build(self):
layout = BoxLayout(orientation='horizontal')
layout.add_widget(Button(text="Button 1"))
layout.add_widget(Button(text="Button 2"))
layout.add_widget(Button(text="Button 3"))
return layoutこのコードでは、BoxLayoutを使って3つのボタンを水平方向に配置しています。これを垂直に並べたい場合は、orientation='vertical'に変更します。
GridLayout
GridLayoutは、ウィジェットをグリッド(格子状)に配置するレイアウトです。行と列の数を指定して、均等にウィジェットを並べます。
cols: 列数を指定します(例えば、cols=2で2列)。rows: 行数を指定しますが、colsの指定と組み合わせて使うことが多いです。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.gridlayout import GridLayout
class MyApp(App):
def build(self):
layout = GridLayout(cols=2)
layout.add_widget(Button(text="Button 1"))
layout.add_widget(Button(text="Button 2"))
layout.add_widget(Button(text="Button 3"))
layout.add_widget(Button(text="Button 4"))
return layoutこの例では、2列のグリッドに4つのボタンを配置しています。ボタンは自動的に上から順に配置されます。
AnchorLayout
AnchorLayoutは、ウィジェットを画面の特定の位置(左上、右下、中央など)に配置するレイアウトです。ウィジェットを特定の位置に固定したい場合に便利です。
anchor_x: ウィジェットの水平方向の位置(left,center,rightのいずれか)。anchor_y: ウィジェットの垂直方向の位置(top,center,bottomのいずれか)。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.anchorlayout import AnchorLayout
class MyApp(App):
def build(self):
layout = AnchorLayout(anchor_x='center', anchor_y='center')
layout.add_widget(Button(text="Centered Button"))
return layoutこの例では、ボタンが画面の中央に配置されます。AnchorLayoutを使うことで、簡単にウィジェットを特定の場所に固定することができます。
FloatLayout
FloatLayoutは、ウィジェットを自由に配置できるレイアウトで、ウィジェットの位置を指定するために座標を使用します。pos_hintプロパティを使って、ウィジェットの位置を相対的に決定します。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
class MyApp(App):
def build(self):
layout = FloatLayout()
layout.add_widget(Button(text="Button 1", size_hint=(.2, .1), pos_hint={'x': .1, 'y': .7}))
layout.add_widget(Button(text="Button 2", size_hint=(.2, .1), pos_hint={'x': .7, 'y': .1}))
return layoutこの例では、Button 1が画面の左上に、Button 2が右下に配置されます。FloatLayoutを使うことで、ウィジェットの正確な位置を指定できます。
StackLayout
StackLayoutは、ウィジェットを積み重ねるように配置するレイアウトで、方向やサイズに応じてウィジェットを自動で並べ替えます。指定された方向に合わせてウィジェットが配置され、画面のサイズに応じて再配置されます。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.stacklayout import StackLayout
class MyApp(App):
def build(self):
layout = StackLayout()
for i in range(10):
layout.add_widget(Button(text=f"Button {i+1}", size_hint=(.2, .2)))
return layoutこのコードでは、10個のボタンが画面に適応する形で自動的に積み重ねられます。StackLayoutは複数のアイテムを動的に配置したい場合に便利です。
複数のウィジェットを組み合わせたUIの構築
レイアウトを組み合わせることで、より複雑なUIを作ることが可能です。例えば、BoxLayoutやGridLayoutをネストして使用することで、ウィジェットを柔軟に配置することができます。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.gridlayout import GridLayout
class MyApp(App):
def build(self):
root_layout = BoxLayout(orientation='vertical')
grid = GridLayout(cols=2)
grid.add_widget(Button(text="Grid Button 1"))
grid.add_widget(Button(text="Grid Button 2"))
grid.add_widget(Button(text="Grid Button 3"))
grid.add_widget(Button(text="Grid Button 4"))
root_layout.add_widget(grid)
root_layout.add_widget(Button(text="Another Button"))
return root_layoutこのコードでは、GridLayoutをBoxLayoutに組み込んで、グリッド上に配置されたボタンと、別のボタンを縦方向に並べています。こうした組み合わせを活用することで、複雑で多機能なアプリケーションを作成できます。
インタラクションの追加
Kivyでは、アプリケーションにユーザーとのインタラクションを簡単に追加できます。ボタンのクリックやテキスト入力といった基本的な操作だけでなく、タッチジェスチャーやドラッグ&ドロップといった複雑なインタラクションもサポートしています。この章では、Kivyアプリにインタラクションを追加するための基本的な方法を解説します。
基本的なイベント処理
Kivyのウィジェットは、ユーザーの操作に応じてイベントを発生させることができます。代表的なイベントの一つが「ボタンのクリックイベント」です。ボタンに対してイベントハンドラを設定し、ユーザーがボタンをクリックした時に特定の動作を実行させることが可能です。
ボタンのクリックイベント
ボタンのクリックイベントは、on_pressやon_releaseといったイベントを使って処理します。on_pressはボタンが押された時、on_releaseはボタンが押された後に離された時に発生します。
from kivy.app import App
from kivy.uix.button import Button
class MyApp(App):
def build(self):
btn = Button(text="Click me!")
btn.bind(on_press=self.on_button_press)
return btn
def on_button_press(self, instance):
print("Button pressed!")
if __name__ == '__main__':
MyApp().run()この例では、Buttonウィジェットがクリックされた時にon_button_pressメソッドが呼び出され、コンソールに「Button pressed!」と表示されます。bindメソッドを使用して、イベントとその処理メソッドを関連付けます。
テキスト入力とイベント
もう一つのよく使われるウィジェットがTextInputです。これは、ユーザーがテキストを入力できるフィールドを提供します。TextInputには、テキストが変更された際に呼び出されるイベントを追加できます。
from kivy.app import App
from kivy.uix.textinput import TextInput
class MyApp(App):
def build(self):
text_input = TextInput()
text_input.bind(text=self.on_text)
return text_input
def on_text(self, instance, value):
print(f"Text input changed: {value}")
if __name__ == '__main__':
MyApp().run()このコードでは、TextInputにテキストが入力されるたびにon_textメソッドが呼び出され、入力されたテキストがコンソールに表示されます。bindメソッドにより、textプロパティが変更された時にon_textメソッドが実行されるようになっています。
タッチイベントの処理
Kivyは、タッチイベントをサポートしており、タッチジェスチャー(スワイプ、ピンチなど)やマルチタッチインタラクションを簡単に実装できます。Widgetクラスを拡張して、独自のタッチイベントを処理することが可能です。
シングルタッチの処理
タッチイベントの基本は、on_touch_down、on_touch_move、およびon_touch_upメソッドをオーバーライドすることで行います。これらはそれぞれ、画面をタッチしたとき、タッチしたまま指を動かしたとき、タッチを離したときに呼び出されます。
from kivy.app import App
from kivy.uix.widget import Widget
class TouchWidget(Widget):
def on_touch_down(self, touch):
print(f"Touch down at {touch.pos}")
def on_touch_move(self, touch):
print(f"Touch moved to {touch.pos}")
def on_touch_up(self, touch):
print(f"Touch up at {touch.pos}")
class MyApp(App):
def build(self):
return TouchWidget()
if __name__ == '__main__':
MyApp().run()このコードでは、on_touch_down、on_touch_move、on_touch_upがそれぞれのタッチイベントに応じて実行され、タッチの座標がコンソールに表示されます。touch.posはタッチされた位置の座標を表します。
マルチタッチの処理
Kivyは、マルチタッチ(複数の指での操作)もサポートしています。これにより、2本指のピンチやスワイプといったジェスチャー操作が可能になります。各タッチには、ユニークなID(touch.id)が付与されているため、複数のタッチポイントを管理できます。
from kivy.app import App
from kivy.uix.widget import Widget
class MultiTouchWidget(Widget):
def on_touch_down(self, touch):
if touch.is_double_tap:
print("Double tap detected!")
if touch.is_mouse_scrolling:
print("Mouse scrolling detected!")
return super().on_touch_down(touch)
class MyApp(App):
def build(self):
return MultiTouchWidget()
if __name__ == '__main__':
MyApp().run()このコードでは、ダブルタップやスクロールを検知しています。Kivyのtouchオブジェクトには、is_double_tapやis_mouse_scrollingのような便利なプロパティがあり、さまざまなインタラクションを簡単に実装することができます。
ドラッグ&ドロップの実装
Kivyを使うと、ドラッグ&ドロップのインタラクションも簡単に実装できます。タッチイベントを使って、ウィジェットをドラッグして動かす機能を追加する例を見てみましょう。
from kivy.app import App
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
class DraggableButton(Button):
def on_touch_move(self, touch):
if self.collide_point(*touch.pos):
self.pos = touch.pos
class MyApp(App):
def build(self):
layout = FloatLayout()
btn = DraggableButton(text="Drag me")
layout.add_widget(btn)
return layout
if __name__ == '__main__':
MyApp().run()この例では、DraggableButtonクラスを作成し、on_touch_moveメソッドをオーバーライドして、ボタンがドラッグされた時にその位置を更新しています。collide_pointメソッドを使って、タッチがボタン上で行われたかどうかを確認します。
Kivy言語(KVファイル)の活用

Kivyでは、Pythonコードで直接UIを構築する方法に加えて、Kivy専用のマークアップ言語である「Kivy言語(KV言語)」を使ってUIを定義することができます。KV言語を使用することで、UIとロジックを分離でき、コードの保守性や再利用性が向上します。この章では、KVファイルの基本的な使い方や、Pythonコードとの連携方法について解説します。
Kivy言語とは?
Kivy言語(KV言語)は、KivyアプリケーションのUIを宣言的に定義するための軽量なマークアップ言語です。Pythonコードに比べてシンプルで読みやすい構文を持っており、複雑なUIを簡潔に表現できます。KVファイルを使うと、ウィジェットのレイアウトやプロパティの設定、イベントのバインドなどをわかりやすく記述できます。
KVファイルの基本構造
KVファイルは、Kivyアプリケーションで使われるウィジェットやレイアウトを階層的に定義します。基本的な構文は、次のようになります。
BoxLayout:
orientation: 'vertical'
Button:
text: 'Button 1'
Button:
text: 'Button 2'このKVファイルでは、垂直方向のBoxLayoutに2つのボタンが追加されています。KVファイルを使うと、Pythonコードで同じUIを作成するよりも、はるかに簡潔な記述が可能です。
Pythonコードとの連携
KVファイルは、Pythonコードと連携させることでアプリケーション全体のUIを管理します。KVファイルを使用するための基本的な流れは次の通りです。
- KVファイルの命名規則
KVファイルは、通常、対応するAppクラスの名前に基づいて命名します。例えば、MyAppというクラスがある場合、KVファイルはmyapp.kvと名付けられます。この規則に従うことで、Pythonコード側で特に指定しなくても、自動的にKVファイルが読み込まれます。 - KVファイルとPythonコードの連携
Appクラスのbuildメソッドは通常、KVファイルを自動的に利用してUIを構築します。例えば、以下のPythonコードに対して、対応するmyapp.kvファイルが適用されます。
from kivy.app import App
class MyApp(App):
pass
if __name__ == '__main__':
MyApp().run()PythonとKVファイルの例
以下は、PythonコードとKVファイルを連携させたシンプルな例です。
Pythonコード (main.py):
from kivy.app import App
class MyApp(App):
pass
if __name__ == '__main__':
MyApp().run()KVファイル (myapp.kv):
BoxLayout:
orientation: 'vertical'
Button:
text: 'Button 1'
on_press: app.button_pressed(1)
Button:
text: 'Button 2'
on_press: app.button_pressed(2)このコードでは、BoxLayoutに2つのボタンを配置し、各ボタンがクリックされた時にPythonのAppクラスのbutton_pressedメソッドが呼び出される仕組みになっています。KVファイルから直接appオブジェクトにアクセスすることができ、イベントハンドリングを行います。
PythonコードでKVファイルの内容を操作
KVファイルを使ってUIを定義した後、Pythonコードで動的にUIの要素にアクセスしたり、プロパティを変更したりすることが可能です。これには、idsを利用します。
idsによるウィジェットの参照
KVファイル内で、ウィジェットにid属性を指定することで、Pythonコードからそのウィジェットにアクセスできます。例えば、以下のKVファイルを見てください。
BoxLayout:
orientation: 'vertical'
TextInput:
id: input_box
hint_text: 'Enter something here'
Button:
text: 'Submit'
on_press: app.print_input_text()この例では、TextInputにidとしてinput_boxを指定しています。このidを使って、Pythonコード内からテキスト入力フィールドにアクセスできます。
Pythonコード (main.py):
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
class MyApp(App):
def build(self):
return BoxLayout()
def print_input_text(self):
text_input = self.root.ids.input_box
print(f"Input text: {text_input.text}")
if __name__ == '__main__':
MyApp().run()このコードでは、print_input_textメソッドが呼び出されると、input_boxにアクセスして、そのテキスト内容をコンソールに表示します。self.root.idsを使って、KVファイル内のウィジェットを参照するのがポイントです。
KVファイルでのルールとプロパティの拡張
KVファイルは、ウィジェットのプロパティやカスタムルールの設定に非常に便利です。例えば、ウィジェットのデフォルトのスタイルや動作を一括して変更することが可能です。
カスタムウィジェットの定義
KVファイルを使うと、カスタムウィジェットを簡単に定義できます。以下は、MyButtonというカスタムボタンを定義し、それをKVファイルで使う例です。
Pythonコード (main.py):
from kivy.app import App
from kivy.uix.button import Button
class MyButton(Button):
pass
class MyApp(App):
def build(self):
return MyButton()
if __name__ == '__main__':
MyApp().run()KVファイル (myapp.kv):
<MyButton>:
text: 'I am a custom button'
font_size: 32この例では、MyButtonというクラスに対してKVファイルでカスタムのスタイルを適用しています。これにより、すべてのMyButtonインスタンスは、指定されたプロパティ(textやfont_sizeなど)を自動的に適用されます。
KVファイルの利点
KV言語を使うことで、次のような利点があります。
実践: シンプルなアプリケーションの作成
ここまでKivyの基本的な構造やKV言語の使い方を学んできましたが、この章では、実際にKivyを使ってシンプルなアプリケーションを作成してみます。今回の例として、「簡単な電卓アプリケーション」を作ってみましょう。このアプリは、基本的な四則演算(加算、減算、乗算、除算)を行う機能を持ちます。
電卓アプリの要件
電卓アプリケーションには以下の機能を実装します。
- 数字と演算子(+, -, *, /)を入力できるボタン。
- 結果を表示するテキストフィールド。
- 計算の実行ボタンと、入力をクリアするボタン。
アプリの全体構成
このアプリケーションは、以下のように構成します。
BoxLayoutとGridLayoutを使って、ボタンを整列させます。- KVファイルでUIを定義し、Pythonコードでロジックを実装します。
Pythonコード
まずはPythonコードを準備します。電卓のロジックは、このPythonコード内に記述します。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import StringProperty
class Calculator(BoxLayout):
display_text = StringProperty("0") # 表示部分のテキストを管理
def clear_display(self):
self.display_text = "0"
def button_press(self, value):
if self.display_text == "0":
self.display_text = value
else:
self.display_text += value
def calculate_result(self):
try:
# eval関数を使って数式を計算
self.display_text = str(eval(self.display_text))
except Exception:
self.display_text = "Error"
class CalculatorApp(App):
def build(self):
return Calculator()
if __name__ == '__main__':
CalculatorApp().run()ロジックの説明
KVファイル
次に、KVファイルで電卓のUIを定義します。このファイル名は、PythonのCalculatorAppに合わせてcalculator.kvとします。
<Calculator>:
orientation: "vertical"
BoxLayout:
size_hint_y: 0.2
Label:
text: root.display_text
font_size: 32
halign: "right"
valign: "middle"
text_size: self.size
GridLayout:
cols: 4
rows: 5
Button:
text: "7"
on_press: root.button_press(self.text)
Button:
text: "8"
on_press: root.button_press(self.text)
Button:
text: "9"
on_press: root.button_press(self.text)
Button:
text: "/"
on_press: root.button_press(self.text)
Button:
text: "4"
on_press: root.button_press(self.text)
Button:
text: "5"
on_press: root.button_press(self.text)
Button:
text: "6"
on_press: root.button_press(self.text)
Button:
text: "*"
on_press: root.button_press(self.text)
Button:
text: "1"
on_press: root.button_press(self.text)
Button:
text: "2"
on_press: root.button_press(self.text)
Button:
text: "3"
on_press: root.button_press(self.text)
Button:
text: "-"
on_press: root.button_press(self.text)
Button:
text: "C"
on_press: root.clear_display()
Button:
text: "0"
on_press: root.button_press(self.text)
Button:
text: "="
on_press: root.calculate_result()
Button:
text: "+"
on_press: root.button_press(self.text)KVファイルの構成説明
アプリケーションの動作
このアプリケーションは、電卓として基本的な機能を備えています。ユーザーがボタンを押すたびに、数字や演算子が表示され、イコールボタンを押すと計算が実行されます。また、Cボタンを押すことでディスプレイをクリアできます。
アプリケーションのパッケージ化と配布

Kivyで開発したアプリケーションは、ローカル環境で実行するだけでなく、他のユーザーに配布するためにパッケージ化する必要があります。Kivyでは、デスクトップアプリケーションやモバイルアプリケーションとしてパッケージ化し、配布することができます。この章では、デスクトップ向けとモバイル向けのパッケージ化の手順を解説します。
デスクトップアプリとしてのパッケージ化
デスクトップアプリケーションとしてKivyアプリを配布するには、PyInstallerというツールを使用します。PyInstallerを使うことで、Pythonスクリプトを実行ファイル(Windowsでは.exeファイル、Macでは.appファイル)に変換し、Pythonがインストールされていない環境でもアプリを実行できるようにします。
PyInstallerのインストール
まず、PyInstallerをインストールします。pipを使用して簡単にインストールできます。
pip install pyinstallerPyInstallerを使って実行ファイルを作成
次に、PyInstallerを使って実行ファイルを作成します。以下のコマンドを実行します。
pyinstaller --onefile main.pyこのコマンドでは、main.pyというファイルを単一の実行可能ファイル(--onefileオプション)に変換します。実行後、distフォルダに実行ファイルが生成されます。Windowsであれば、main.exeというファイルが生成され、これを他のWindowsユーザーに配布することができます。
実行ファイルの配布
生成された実行ファイルは、通常のアプリケーションと同様に、他のユーザーに配布できます。ファイルが大きくなる可能性があるので、圧縮して配布するか、インストーラを作成することも検討してください。
モバイルアプリとしてのパッケージ化
Kivyを使ってモバイルアプリ(AndroidやiOS)を作成することも可能です。Kivyでモバイルアプリをビルドするには、以下のツールを使用します。
- Androidアプリケーション:
Buildozerを使用します。Buildozerは、KivyアプリケーションをAndroid用のAPKファイルに変換するツールです。 - iOSアプリケーション:
XcodeとKivy-iOSを使用します。Appleのエコシステムに基づくビルド環境が必要です。
Buildozerを使ったAndroidアプリのビルド
Androidアプリを作成するには、Buildozerというツールを使います。Buildozerは、KivyアプリをAndroid用のAPKにパッケージ化するために必要な環境を自動で整備し、ビルドプロセスを簡素化します。
Buildozerのインストール
まず、UbuntuやmacOSなどのLinux環境が必要です。Windowsを使っている場合は、WSL(Windows Subsystem for Linux)などを利用します。Buildozerをインストールするには、以下のコマンドを実行します。
sudo apt update
sudo apt install -y python3-pip
pip install --user buildozer
sudo apt install -y build-essential libssl-dev libffi-dev python3-devBuildozerプロジェクトの初期化
次に、Buildozerプロジェクトを初期化します。プロジェクトディレクトリに移動して、以下のコマンドを実行します。
buildozer initこれにより、buildozer.specという設定ファイルが生成されます。このファイル内で、アプリの設定(アプリ名、パッケージ名、依存パッケージなど)を編集します。
APKファイルのビルド
設定ファイルを編集したら、以下のコマンドを使ってAPKファイルをビルドします。
buildozer -v android debugこのコマンドにより、binディレクトリにdebug用のAPKファイルが生成されます。このAPKファイルをAndroidデバイスにインストールして、アプリをテストすることができます。
iOSアプリのビルド
iOS向けのアプリをビルドするには、XcodeとKivy-iOSを使用します。iOSアプリをビルドするには、Appleの開発者アカウントやmacOS環境が必要です。
Kivy-iOSのセットアップ
iOSアプリをビルドするには、まずKivy-iOSをインストールします。以下のコマンドを使用してインストールを行います。
git clone https://github.com/kivy/kivy-ios
cd kivy-ios
python3 -m pip install -r requirements.txt次に、KivyプロジェクトをビルドしてXcodeプロジェクトを生成します。
python3 toolchain.py build kivy
python3 toolchain.py create myapp ../myappこのコマンドでmyappという名前のXcodeプロジェクトが生成されます。生成されたプロジェクトをXcodeで開き、iOSシミュレータまたは実機でテストします。
モバイルアプリの配布
APKファイル(Android用)やIPAファイル(iOS用)は、アプリストア(Google PlayやApple App Store)に公開するために使用できます。公開には、各ストアの開発者アカウントが必要で、特定のガイドラインに従う必要があります。
パッケージ化時の考慮点
アプリケーションをパッケージ化する際、いくつかの注意点があります。
Kivyでの高度なカスタマイズ
Kivyを使うと、デフォルトのウィジェットやレイアウトだけでなく、アプリケーションに独自のカスタム機能やデザインを追加することが可能です。この章では、カスタムウィジェットの作成、アニメーション、グラフィックスの操作、サウンドやビデオの統合といった高度なカスタマイズ方法について解説します。
カスタムウィジェットの作成
Kivyは、多数の組み込みウィジェットを提供していますが、プロジェクトに応じて独自のウィジェットを作成することもできます。カスタムウィジェットを作ることで、より個別の機能を持つUI要素を作成し、アプリに独自のデザインや機能を追加できます。
カスタムウィジェットの例
以下の例では、特定の背景色を持つカスタムボタンを作成します。KivyのButtonウィジェットを継承してカスタマイズしています。
Pythonコード (main.py):
from kivy.app import App
from kivy.uix.button import Button
from kivy.graphics import Color, Rectangle
class CustomButton(Button):
def __init__(self, **kwargs):
super().__init__(**kwargs)
with self.canvas.before:
Color(1, 0, 0, 1) # 赤い背景色
self.rect = Rectangle(size=self.size, pos=self.pos)
self.bind(pos=self.update_rect, size=self.update_rect)
def update_rect(self, *args):
self.rect.pos = self.pos
self.rect.size = self.size
class MyApp(App):
def build(self):
return CustomButton(text="Custom Button")
if __name__ == '__main__':
MyApp().run()カスタムウィジェットの説明
これにより、ボタンの位置やサイズが動的に変更されても、背景色が常にボタンの後ろに適切に表示されるようになります。
アニメーションの活用
Kivyは、簡単にアニメーションを実装できる仕組みを提供しています。Animationクラスを使うことで、ウィジェットの位置、サイズ、色、透明度などをスムーズに変化させることが可能です。
アニメーションの例
以下のコードでは、ボタンがクリックされた際に、ボタンのサイズがアニメーションで変化する動作を実装しています。
from kivy.app import App
from kivy.uix.button import Button
from kivy.animation import Animation
class AnimatedButton(Button):
def on_press(self):
# ボタンが押されたときにサイズを変化させるアニメーションを作成
animation = Animation(size=(200, 200), duration=0.5) + Animation(size=(100, 100), duration=0.5)
animation.start(self)
class MyApp(App):
def build(self):
return AnimatedButton(text="Press me!")
if __name__ == '__main__':
MyApp().run()アニメーションの説明
グラフィックスの操作
Kivyの描画システムを使えば、独自の図形やカスタムデザインをアプリに追加できます。CanvasとInstructionクラスを使って、ウィジェットの背後にグラフィック要素を描画したり、動的なグラフィックスを生成することができます。
グラフィックスの例
次のコードでは、円形の描画を行います。
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color, Ellipse
class MyWidget(Widget):
def __init__(self, **kwargs):
super().__init__(**kwargs)
with self.canvas:
Color(0, 1, 0, 1) # 緑色の円
self.ellipse = Ellipse(pos=(100, 100), size=(200, 200))
def on_touch_down(self, touch):
# タッチされた位置に円を移動
self.ellipse.pos = (touch.x - 100, touch.y - 100)
class MyApp(App):
def build(self):
return MyWidget()
if __name__ == '__main__':
MyApp().run()グラフィックスの説明
サウンドやビデオの統合
Kivyでは、サウンドやビデオなどのメディアを簡単にアプリケーションに統合できます。SoundLoaderを使ってサウンドを再生したり、Videoウィジェットを使ってビデオを表示することが可能です。
サウンドの再生
次のコードでは、ボタンがクリックされたときにサウンドを再生します。
from kivy.app import App
from kivy.uix.button import Button
from kivy.core.audio import SoundLoader
class MyApp(App):
def build(self):
return Button(text="Play Sound", on_press=self.play_sound)
def play_sound(self, instance):
sound = SoundLoader.load('mysound.mp3')
if sound:
sound.play()
if __name__ == '__main__':
MyApp().run()サウンドの説明
ビデオの再生
ビデオファイルの再生には、Videoウィジェットを使用します。
from kivy.app import App
from kivy.uix.video import Video
class MyApp(App):
def build(self):
video = Video(source='myvideo.mp4')
video.state = 'play' # 自動再生
video.options = {'eos': 'loop'} # ループ再生
return video
if __name__ == '__main__':
MyApp().run()ビデオの説明
Kivyでの高度なカスタマイズの利点
Kivyでのカスタマイズは、アプリケーションに独自性を加え、ユーザー体験を向上させる大きな力となります。アニメーションやカスタムウィジェット、メディア統合によって、より魅力的でインタラクティブなアプリを構築することができます。
まとめと今後の学習
まとめ
Kivyを使ったPythonアプリケーション開発の基本から高度なカスタマイズまでを一通り学びました。Kivyは、クロスプラットフォーム対応の強力なフレームワークであり、Pythonのシンプルさを活かしてモバイルやデスクトップ向けのインタラクティブなアプリケーションを構築するのに最適です。これまでの内容を振り返ると、以下のような点が重要でした。
- Kivyの基本構造とセットアップ
PythonのAppクラスとbuildメソッドを使ったKivyアプリの基本構造を学び、Kivyのインストールと開発環境のセットアップを行いました。 - レイアウトシステムの理解
BoxLayoutやGridLayoutなどのレイアウトを使って、ウィジェットを効率的に配置し、柔軟なUIを構築しました。 - インタラクションの追加
ユーザーとのインタラクションを追加する方法を学び、ボタンのクリックやテキスト入力、タッチジェスチャーの処理を実装しました。 - KV言語の活用
KVファイルを使ってUIを宣言的に定義し、Pythonコードとの連携を学びました。KVファイルを使うことで、UIとロジックの分離が可能になり、コードの保守性が向上します。 - アプリケーションのパッケージ化と配布
デスクトップ向けのアプリケーションをPyInstallerでパッケージ化し、モバイル向けアプリケーションはBuildozerを使ってAndroidアプリとしてビルドする手法を紹介しました。 - 高度なカスタマイズ
カスタムウィジェット、アニメーション、グラフィックス、サウンドやビデオなどのメディア統合によるKivyアプリの高度なカスタマイズを学び、アプリのデザインと機能をさらに拡張しました。
今後の学習
Kivyを使ったアプリケーション開発は、非常に多様で柔軟です。これまで学んだ基礎とカスタマイズ方法をさらに深め、より高度なアプリケーション開発を進めていくために、以下のステップをおすすめします。
Kivyの公式ドキュメントを活用する
Kivyの公式ドキュメントは、詳細なチュートリアルやリファレンスが豊富に揃っています。具体的なウィジェットや機能について深く知りたい場合は、公式サイトでの情報収集が役立ちます。
プロジェクトベースでの開発
実際のプロジェクトを通じて学んだ内容を実践しましょう。例えば、Kivyを使って次のようなアプリケーションを作成することでスキルを強化できます。
- タスク管理アプリ
- ゲーム(シンプルなパズルやアクションゲーム)
- ソーシャルメディアアプリやチャットアプリ
- モバイルデバイス向けのエンターテインメントアプリ
Kivy Gardenの活用
Kivy Gardenは、コミュニティによって作成された追加ウィジェットや機能を提供するプラットフォームです。これを利用することで、自分で一から開発することなく、高機能なコンポーネントを使うことができます。
モバイルアプリ開発の深化
モバイルアプリ開発に興味がある場合は、Buildozerをさらに活用してAndroidアプリを商用レベルで開発したり、iOSアプリ開発に挑戦することができます。また、Kivyアプリをモバイルストアに公開するための手続きやベストプラクティスも学んでおくと良いでしょう。
他のPython GUIライブラリとの比較
Kivyは非常に強力ですが、他にもPythonにはTkinterやPyQtといったGUIライブラリがあります。これらのライブラリと比較して、どのプロジェクトにどのライブラリが最適かを判断できるようになると、開発者としての柔軟性がさらに増します。
最後に
Kivyは、Pythonでモバイルやデスクトップアプリケーションを開発するための素晴らしいツールです。このガイドを通じて、Kivyの使い方を学び、基本的なアプリケーションの作成から高度なカスタマイズまで多くのことを理解できたはずです。ぜひ、実際のプロジェクトでこれらのスキルを活用し、独自のアプリケーションを開発してみてください。

ここまで読んでいただきありがとうございます!
UdemyのPythonコースにはオンラインで学習ができる動画コンテンツがたくさんあります。
当ブログのような文章メインの説明では足りない箇所を補えると思うので、もっと詳しく勉強したいという方はぜひチェックしてみてください!



コメント