【Kivy修行①】Pythonを用いて愉快にアプリ開発ができる「Kivy」を体験。

- 偶然的に遭遇してしまった「Kivy」のある紹介文言の、「Pythonを用いた***先端的なアプリ開発***」の部分だけを理由に、習得を目指す記事第一弾。
- 「先端的」「革新的」という美薬から、一生離れられない宿命を背負う私は、「これらの最新技術の開発者がいるからこその人生」であることを、深く実感。
- 今回は、Pythonを用いてアプリ開発ができる「Kivy」を体験して、「Pythonとアプリ開発の知識」の両方を同時に学ぶことにしよう。

## 今回の目的・ゴール
- 「Kivy」の概要や特徴を把握する。
- 導入手順や実行手順を把握する。
- 最初の出力プログラムを作成・実行する
- サンプルプログラムを写経により作成して、実行する。
    - 最初は文法や仕組み等は理解せずに、ただ写経して動かして、ある程度のイメージの把握に努める。

## 概要
- Pythonのオープンソースライブラリの一つ。
- マルチタッチ操作に対応したアプリの開発が行える。
- 「KV言語」という独自言語を用いることにより、下記が可能になる。
    - 機能とデザインに関する記述を分けて書くことができる。
    - CSSのように、直感的にデザインを指定できる。
    - つまり、「機能面をPython」「デザイン面をKV言語」で記述することができる。
- [公式サイト](https://kivy.org)は`https://kivy.org`である。
- [日本語翻訳サイト](https://pyky.github.io/kivy-doc-ja/)は`https://pyky.github.io/kivy-doc-ja/`である。

## 利点
### Fresh
- 「新鮮」。マルチタッチなど、近年現れた新しい入力方法に特化して、作られている。

### Fast
- 「高速」。計算に時間がかかってしまう難しい部分には、C言語を用いて実装されている。
- グラフィックス機能は、OpenGL ES2を用いて実装されているため、描画が高速。

### Flexible
- 「柔軟」。様々なOSに対応しており（クロスプラットフォーム）、同じように動作させることができる。

### Focused
- 「集中」。アプリの開発に集中することができ、余事（コンパイラの設定）に煩わされることはない。

### Funded
- 「援助」。プロのソフトウェア開発者を中心としたコミュニティによって運営されている。

### Free
- 「無償」。PythonもKivyも、無償でダウンロードして、使うことができる。
- ビルドしたアプリは、MITライセンスの下で、他の権利関係に抵触しない限り、商用配布することも可能である。

### その他
- 特定のIDE（統合開発環境）を必要としない。

## インストール手順
- ※既にPythonがインストールされた状態で行う。
- ※今回は、Macを用いて学習していくが、WindowsでもPythonやpipが扱えれば、ほぼ変わらない。

### Windows
- WindowsのPythonのインストール手順は[こちら](https://qiita.com/zkangaroo/items/4bb48b405e1651f2e273)の参考ページがわかりやすいです。

```bash
# pip,wheel,setuptoolsを状態に更新
$ python -m pip install --upgrade pip wheel setuptools
# 依存関係のインストール
$ python -m pip install docutils pygments pipwin32 kivy.deps.sd12 kivy.deps.glew
# kivyのインストール
$ python -m pip install kivy
```
### macOS

- Homebrewを用いて、依存関係をインストール。

```bash
$ brew install pkg-config sdl2_image sdl2_ttf sdl2_mixer gstreamer
```

- Cythonとkivyのインストール

```bash
$ pip3 install -U Cython

$ pip3 install kivy
```

## 作成プログラム
- 今回、最初のチュートリアルプログラムとして、作成するのは下記の2つ。
    - Hello出力プログラム
    - ストップウォッチプログラム

## 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/77d50685-201a-f1e1-2590-bb5147879335.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/42fec5e5-4b9f-4f70-b0c2-bfb9857f0f97.png)

## 手順
- ※ここからは、macを用いての流れ。

### Hello出力プログラム
- 下記のコマンドを、ターミナルにうち、「main.py」ファイルを作成する。

```bash
# ホームフォルダの「work」フォルダに移動。なければmkdirで作成する。
$ cd ~/work
# 作業用として、「python-practice」フォルダを作成
$ mkdir python-practice
# 作業フォルダに「main.py」ファイルを作成
$ touch main.py
```

- 「main.py」ファイルを、任意の開発エディタで開き、下記を記述。

```python
from kivy.app import App
from kivy.uix.button import Button

class MyApp(App):
    def build(self):
        return Button(text='Hello from t_o_d')

MyApp().run()
```

- 記述して保存後、ターミナルで下記のコマンドをうち、実行する。

```bash
$ cd ~/work/python-practice
$ python3 main.py
```

- 実行後、下記の画面が開き、きちんと表示されていれば完了。
- 画面を消せば、自動的にpythonの実行は停止される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/77d50685-201a-f1e1-2590-bb5147879335.png)

### ストップウォッチプログラム
- 先程の「main.py」ファイルの記述を下記に変更して、保存する。

```python
from kivy.app import App
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.properties import NumericProperty

class MyLabel(Label):
    time = NumericProperty(0)
    def on_time(self, *args):
        self.text = str(self.time)

class MyButton(Button):
    evt = None
    def on_press(self):
        if self.text == 'start':
            self.evt = Clock.schedule_interval(self.cb, 0.2)
            self.text = 'stop'
        else:
            self.evt.cancel()
            self.text = 'start'
    def cb(self, dt):
        self.parent.lbl.time = round(self.parent.lbl.time+0.2, 1)

class StopWatchApp(App):
    def build(self):
        layout = BoxLayout()
        layout.lbl = MyLabel(text='0')
        layout.btn = MyButton(text='start')
        layout.add_widget(layout.lbl)
        layout.add_widget(layout.btn)
        return layout
StopWatchApp().run()
```

- 記述して保存後、ターミナルで下記のコマンドをうち、実行する。

```bash
$ cd ~/work/python-practice
$ python3 main.py
```

- 実行後、下記の画面が開き、「start」をクリックして、時間が動きだせば完了。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/336499/42fec5e5-4b9f-4f70-b0c2-bfb9857f0f97.png)

## 補足
- 基本的に、標準のままでの日本語表示は不可能。
- 日本語表示手順の参考として、[こちらのサイト](https://qiita.com/Kernel_OGSun/items/44eb5b5f6e7bbfb9fc6a)が非常にわかりやすい。

## まとめ
- 今回は、Pythonを用いたアプリ作成の一回目ということで、「現代のほとんどの飛んでいる鳥を落とした」と、個人的に勝手に言っている言語での作成に、感動を覚えながら、記事を書く。
- 「日本語の情報が少ないため、すごく苦労したな」という、技術者として一度は言ってみたい人気台詞を、時期尚早もはなはだしく、自分にとことん染み込ます。
- これからの良い趣味になりそうなものを発見できたので、じっくり学んでいくことにしよう。

## 参考
- http://iatlex.com/python/kivy_1  
→こちらの記事を参考にいたしました。大変お世話になりました。
- https://qiita.com/dario_okazaki/items/7892b24fcfa787faface  
→こちらの記事も参考にいたしました。大変お世話になりました。
- https://qiita.com/Kernel_OGSun/items/44eb5b5f6e7bbfb9fc6a  
→日本語表示手順の紹介に載せさせていただきました。大変お世話になりました。

## 写経文献
- [Kivyプログラミング ―Pythonで作るマルチタッチアプリ](https://www.amazon.co.jp/Kivy%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E2%80%95Python%E3%81%A7%E4%BD%9C%E3%82%8B%E3%83%9E%E3%83%AB%E3%83%81%E3%82%BF%E3%83%83%E3%83%81%E3%82%A2%E3%83%97%E3%83%AA%E2%80%95-%E5%AE%9F%E8%B7%B5Python%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%83%BC-%E5%8E%9F%E5%8F%A3-%E5%92%8C%E4%B9%9F/dp/4254128967)  
→こちらの文献で勉強しています。内容はこちらの文献の写経がほとんどです。大変お世話になりました。