Pythonのkivyモジュールを使ってPythonでAndroidアプリを実装する方法

スポンサーリンク

PythonでAndroidアプリを作りませんか?この世界では30億台以上のデバイスがアンドロイドで動いています。

これは、世界で最も重要なスマートフォンOSの1つ、またはおそらく最も重要なOSであることを意味します。

アンドロイドの重要性を仮定すると、Android StudioやKotlinなど、多くのアンドロイドビルドツールが存在します。

しかし、Pythonでもandroidアプリが作れるのか疑問に思ったことはありませんか?

この記事では、Pythonでandroidアプリを作成する方法を説明し、読者に実演することを目的としています。

このタスクのためのフレームワークはKivyとして採用され、APKのパッケージングはBuildozerによって実行されることになります。

スポンサーリンク

Using Kivy To Build Android Apps in Python

Kivy はモバイルアプリを作成するために使用され、通常 Python のフレームワークとして採用されています。

このソフトウェアは、MITライセンスに認定されており、無料で使用することができます

まずは、Kivyのインストール方法から理解しましょう。

pip3 install virtualenv

Kivy のセットアップと設定

Kivyのインストールは、使い勝手の良いPyCharmで開始します。


注意:以下のすべてのステップでLinuxディストリビューションが必要で、アプリをandroidにパックする時点では、Linuxに大きく依存するBuildozerを使用することになります。

Windowsであれば、仮想マシンをインストールしてLinux環境を構築できますし、Windows10であれば、Microsoftストアから直接ubuntuディストリビューションをダウンロードできますので、心配は要りません。

WSL(Windows Subsystem to Linux)の設定に関する参考文献はこちら

インストールまでの手順

  • 最初のステップでは、WindowsユーザはLinuxディストリビューションのセットアップが必要ですが、Linuxユーザはこのステップをスキップできます。
  • 最初のステップでは、PyCharmで新しいプロジェクトを作成し、PyCharmのターミナルに移動します(Windowsユーザの場合、ターミナルのドロップダウンで’local’の代わりにUbuntuを選択します)。
  • 仮想環境を構築する必要があります。仮想環境とは、必要なライブラリやスクリプトを一箇所に集めたPythonのディレクトリの集合体です。すでに仮想環境が有効な場合は、それを無効にして、Kivyをインストールするための新しい仮想環境を作成します。ターミナルで「deactivate」と入力します。次に、次のように入力します。
virtualenv -p python3.8 venv

virtualenvのインストールは、上記のコマンドで開始されます。

source ./venv/scripts/activate

上記のコマンドで、プロジェクト用の仮想環境が構築されます。

venvはこのvirtualenvに付けた名前ですが、適当な名前を付けてください。

  • この仮想環境をプロジェクト用に有効化する必要があります。一度有効化すれば、どのライブラリをインストールしても、このプロジェクトで有効化されます。

Windowsの場合、次のように入力します。

source venv/bin/activate

Windowsの場合、scriptディレクトリはvirtualenvディレクトリの中に存在します。

Linuxの場合

pip install kivy

上記のように実行すると、仮想環境が有効になり、virtualenvのパスが括弧で囲まれた状態で表示されます。

下図では、赤色のハイライトが起動後のvenvのパスの位置を示しています。

from kivy.app import App
from kivy.uix.label import Label
 
 
class TrialApp(App):
    def build(self):
        return Label(
            text="Making an android app"
        )
 
demo=TrialApp()
demo.run()

仮想環境の設定に失敗しましたか?リファレンスセクションを参照してください。

すべての設定が完了したら、次のコマンドを入力します。

class Format_layout_Grid(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.rows=3
        self.cols=3
 
        self.label=Label(
            text="Click ---->"
        )
        self.add_widget(self.label)
        self.but0n=Button(
                text="Tap Here",
                size_hint = (0.3, 0.3),
                background_color = (0.6, 25.7, 1.9),
                color = (1, 0, 1, 1)
                )
        self.add_widget(self.but0n)

インストールに成功したかどうかを確認するために、pythonコマンドを入力し、Enterキーを押します。

pythonの中で、’import kivy’とタイプしてください。

ターミナルでエラーが出なければ、kivyのインストールに成功したことになります。

インストールが完了したら、Kivy の基礎と Python での実装方法を理解することになります。

以下は、変数’text’に格納された文字列を生成し、新しいダイアログボックスに表示する初歩的なPythonプログラムです。

コード

class DemoApp(App):
    def build(self):
        layout=AnchorLayout(
            anchor_x="left",anchor_y="top"
        )
        but0n=Button(
            text="This box anchors",
            size_hint=(0.3,0.3),
            background_color=(0.4,25.8,3),
            color=(0,0,0,1)
        )
        layout.add_widget(but0n)
        return layout

インポートパッケージ: kivy.app import App, kivy.uix.label import Label
TrialApp = クラスの名前です。

text = 変数
demo=オブジェクトを作成
def build(self): ウィジェットが呼び出されるメソッドです。

ウィジェットを理解する

ウィジェットは、特定のイベント(ユーザーがクリックやキーストロークを入力したときなど)が発生したときに応答を開始する、単純な選択項目です。

これにより、ユーザーは多くのコードやイベント固有のコマンドを毎回入力することなく、特定のタスクを実行することができます

Kivyには、ラベル、テキストボックス、ボタンなど、使用するウィジェットが多数用意されています。

主に2種類のウィジェットがあります。

プロパティイベントウィジェット。

  スケール、アウトライン、カラーの変更など、ウィジェットの特性が変更されたときにレスポンスが発生します。

ウィジェット定義イベント。

ウィジェット定義イベント:テキストボックスに何かを書き、その出力を得るなど、ウィジェットに変更が加えられたときにレスポンスが発生します。

Kivyのレイアウトを理解する

グリッドレイアウト

グリッドレイアウトは、マトリックスを形成し、そこに行と列を追加してテーブルのような構造でウィジェットを配置することができます

ウィジェットの配置は、このレイアウトによって、行と列に特化して行うことができます。

以下のプログラムは、グリッドレイアウトを実装してウィジェットを追加する例です。

class Format_float(FloatLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
 
        self.label = Label(
            text="Tap on Blue",
            size_hint=(0.1, -0.1),
            pos_hint = {"x": 0.3, "y": 0.7},
        )
        self.add_widget(self.label)
 
        self.button = Button(
            text="Press here",
            size_hint=(0.4, 0.1),
            pos_hint={"x":0.4,"y":0.5},
            background_color=(0.6, 25.3, 2),
            color=(1, 0, 1, 2)
        )
        self.add_widget(self.button)

アンカーレイアウト

アンカーレイアウトは、ウィジェットを出力画面の4隅または中央に配置(アンカー)することができます

アンカーレイアウトは、anchor_xとanchor_yのコードで設定することができます

class page_format_layout(PageLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
 
        self.but0ni = Button(
            text="Slide I"
        )
        self.add_widget(self.but0ni)
 
        self.but0ni2 = Button(
            text="Slide II"
        )
        self.add_widget(self.but0ni2)
 
        self.but0ni3 = Button(
            text="Slide III"
        )
        self.add_widget(self.but0ni3)

フロートレイアウト

このレイアウトは、ウィジェットを好きな場所に配置することができます


行と列が必要なグリッドレイアウトや、角や中央にしかウィジェットを配置できないアンカーレイアウトとは異なり、フロートレイアウトでは好きな位置にウィジェットを配置することができます

ただし、このレイアウトではデフォルトですべてのウィジェットが左下隅に配置され、すべてのウィジェットを適切に調整するには適切な x,y 値を指定する必要があります。

from kivy.app import App
from kivy.uix.anchorlayout import AnchorLayout
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
import webbrowser
 
search_api="www.google.com/search=?source=jv&fdf_njg64gfjf=hello"
class Format_float(FloatLayout):
    def __init__(self,**kwargs):
        super().__init__(**kwargs)
 
        self.l = Label(
            text="Place your search query below",
            size_hint=(1.0, 0.6),
            pos_hint = {"x": 0.0, "y": 0.2},
        )
        self.add_widget(self.l)
 
        self.t = TextInput(
            size_hint=(0.8, 0.06),
            pos_hint={"x": 0, "y": 0}
        )
        self.add_widget(self.t)
        self.bt0n = Button(
            text='send',
            size_hint=(0.2,0.05),
            pos_hint={"x":0.8,"y":0}
        )
        self.bt0n.fbind("on press", lambda x: self.search_api())
        self.add_widget(self.bt0n)
 
    def search_api(self):
        msg=self.t.text
        print(msg)
        webbrowser.open(search_api.format(msg))
 
 
 
class DemoApp(App):
    def build(self):
        layout = AnchorLayout(
            anchor_x="left",
            anchor_y="top",
        )
        button = Button(
            text="Send",
            size_hint=(0.2, 0.1),
            background_color=(0.1, 25.86, 1),
            color=(0, 0, 0, 1)
        )
        layout.add_widget(button)
        return Format_float()
 
 
demo=DemoApp()
demo.run()

ページレイアウト

このレイアウトは、これまで説明してきた他のレイアウトとは少し異なります。

このレイアウトでは、異なるページを作成し、異なるページに複数のウィジェットを配置し、さらにユーザーがページをスライドして移動することができます

このレイアウトでは、ページのサイズやその他のプロパティを変更することはできません。

PYTHON_KIVY_LIFE_CYCLE..png

アプリの作成

これまでKivyの基本を説明し、広く利用されているレイアウトやウィジェットについて解説してきました。

次に、アンドロイド携帯で動作するスタンドアロンアプリを作成する方法について見ていきます。

以下の例では、ユーザーの入力を受けて、google APIを使用して結果を出力する検索エンジンを作成する予定です。

virtualenv_activation.png

注:ここで使用されているAPIは、ユーザー固有のAPIであり、これ以上機能しない。

機能的なAPIを取得するには、ここをクリックしてください。

アプリのパッケージ化

コードが完成したら、最後のステップは、アプリケーションをバンドルし、Android APKにパッケージすることです。

そのために、Buildozerを採用することになります。

BuildozerはLinuxベースのアプリケーションパッケージングソフトウェアで、アプリをAndroidパッケージ(APK)またはIOSベースのアプリケーションにバンドルしてくれます。

BuildozerはWindowsでは動作せず、LinuxマシンとMac OSマシンのみで動作します。

Buildozerをインストールするには、Buildozerの公式ドキュメントに記載されている手順に従う必要があります。

インストールが完了したら、2つの方法でパッケージングを行うことができます。

  • Mac/Linux マシンの場合は、公式ドキュメントに記載されている手順で、パッケージのターゲットとなるアプリのビルドを行うことができます。
  • Mac/Linuxマシンであれば、公式ドキュメントに記載されている手順に従って、パッケージをターゲットとし、アプリをビルドすることができます。この状況を打開するために、google Collabを使用することができます。これは、あなたのために仕事をする共有Linuxサーバーです。

いくつかの注意点があります。

    1. ソースコードが書かれているファイル名を ‘main.py’ に変更し、他の同名のファイルを削除する必要があります。
    1. buildozer initコマンドは、アプリのビルドに必要なデータを含むgradleファイルを作成します。タイトル、パッケージ名、パッケージドメインの行は、自分で記入する必要があります。
    1. buildozer -v android debugコマンドは、アプリケーションの構築プロセスを開始します。これは17-20分かかる長いプロセスで、その間に’y’をタイプしてエンターキーを押すことでパーミッションを与える必要があります。
    1. ビルドプロセスが完了すると、アプリが「lib」フォルダに作成されます。

まとめ

この記事では、Pythonでandroidアプリが書けることを学びました。

Kivyの初歩的な基礎、つまり、様々なレイアウトやウィジェット、ウィンドウズでのWSL設定、Buildozerを使ったアプリケーションのパッケージングについて学びました。

この記事があなたのお役に立てれば幸いです。

参考文献

Pythonファイルをapkに変換する: https://towardsdatascience.com/3-ways-to-convert-python-app-into-apk-77f4c9cd55af

アプリ構築のリファレンス: https://youtube.com/playlist?list=PLtFHvora00y-6UmADZBOhYxFHYyJ3c25O

.py を apk に変換するチュートリアル。

仮想環境構築のチュートリアル。

タイトルとURLをコピーしました