kivyMDチュートリアル其の参 Themes - Material App篇

みなさん、おはこんばんは(おはようこんにちはこんばんは)でございます。
今週もめげずにやっております。

昨日の地震はどうだったでしょうか。
自分の方はビビりまくってようやくメンタルが正常になりましたが、
みなさんのところは無事であることを祈るのみです。

ということで今日もコピペで1千万!を合言葉でkivyMDを触っていきたいと思います。

## Material App

冒頭ではこのような説明があります。
早速いつものように依頼してみましょう。

> This module contains MDApp class that is inherited from App. 
> MDApp has some properties needed for KivyMD library (like theme_cls).

> You can turn on the monitor displaying the current FPS value in your application:

> このモジュールには、Appから継承されたMDAppクラスが含まれています。 
> MDAppには、KivyMDライブラリに必要ないくつかのプロパティ（theme_clsなど）があります。

> アプリケーションの現在のFPS値を表示するモニターをオンにすることができます。

先週の振り返りか?とも思えるほどの説明ですね。
その辺りに関してはこちらの方が詳しいのでこちらを参照ということで。
[kivyMDチュートリアル其の弐 Themes - Theming篇](https://qiita.com/virty/items/e3789fd1b0d1b2f9a50d)

その下には説明でもある通り現在のFPS値を表示するサンプルコードが書いてあります。

```python:iii/framerate.py
KV = '''
Screen:

    MDLabel:
        text: "Hello, World!"
        halign: "center"
'''

from kivy.lang import Builder

from kivymd.app import MDApp


class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        self.fps_monitor_start()


MainApp().run()
```

これもこれまで見てきたものだと、説明がいらないくらいですが
しいていうならon_startメソッドでfpsの値を取るためのfps_monitor_startを
書いているくらいでしょうか。これはMDApp側で用意してあるメソッドなのでしょうかね。
あとはbuildとon_startってどう違うんや・・・また詳細が分かればお伝えするかもしれません。

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82826/57c0be41-5742-5bff-a1c1-46caf8dd52f6.png)

実際の様子はこちらです。
値低っとかいうツッコミはなしで。。デスクトップ型なのですがこれはどうなのでしょうかね。
マニュアルでもあるスマホと値が変わらないのですが、この辺知識がなく判断がしにくい・・・

とまぁそんなことはどうでもよくてですね、こちらもちゃんと動いています。

### API - kivymd.app

####  class kivymd.app.MDApp(**kwargs)

> Application class, see module documentation for more information.

##### Events:

`on_start:`

> Fired when the application is being started (before the runTouchApp() call.

> アプリケーションの起動時（runTouchApp（）呼び出しの前）に発生します。

`on_stop:`

> Fired when the application stops.

> アプリケーションが停止したときに発生します。

`on_pause:`

> Fired when the application is paused by the OS.

> アプリケーションがOSによって一時停止されたときに発生します。 

`on_resume:`

> Fired when the application is resumed from pause by the OS. 
> Beware: you have no guarantee that this event will be fired 
> after the on_pause event has been called.

> アプリケーションがOSによって一時停止から再開されたときに発生します。 
> 注意：on_pauseイベントが呼び出された後にこのイベントが発生するという保証はありません。 

で、いきなりAPIの説明ですが先ほどの
> あとはbuildとon_startってどう違うんや・・・

っていうのはちゃんと説明がありましたねw

あとは、これくらいであれば依頼せずともと思ってましたが、微妙に翻訳結果に差分が
生じていたので結局依頼しちゃいました。firedって発生って訳すんですね。覚えとこっと。
あとはプログラム的にいうと「fired」=「呼び出される」ってことなのかな。まぁ、でもここは
英語のプロでもなんでもないのでgoogle先生に従います。

使用方法としてはアプリケーションの起動・停止・一時停止・一時停止から再開するタイミングに
よってこれらのメソッドを指定するということでしょうかね。buildメソッドについては全然
kivyMDと関係なくkivyと共通して呼び出すものでしたね。やばい、これでkivy力がどんなものか
バレる・・・

少し危機感を覚えたので、buildメソッドについて調べてみました。
説明はこれもkivyの公式マニュアルを見た方がいいので、以下が適切なのかなと思います。

> 上の`Kivy Appのライフサイクル` で披露した図で強調したように、
> Root Widgetを初期化して返す関数です。8行目は実際に動作する内容:


> 「Programming Guide(翻訳済み) » Kivy Basics(翻訳済み)」
> https://pyky.github.io/kivy-doc-ja/guide/basic.html

上のコードやこれまで見てきた通りのコードでもそうでしたが、kvで定義したものが
このメソッドの返り値として定められています。これがいわゆるRoot Widgetを初期化して
返すということなのかな。

というわけで、ここばっかりを見てるといつまでも終わらなくなるので
この辺りにしておいて次に進みます。

`theme_cls`

> Instance of ThemeManager class.

ThemeManagerクラスのインスタンスだよという説明があり次のように注意点も書かれています。

> Warning

> The theme_cls attribute is already available in a class 
> that is inherited from the MDApp class. The following code will result in an error!

> theme_cls属性は、MDAppクラスから継承されたクラスですでに使用可能です。 
> 次のコードはエラーになります！ 

念の為、依頼しておきます。このWarningは依頼しねぇーよ！1単語なんだから・・・
という謎のモノマネをしながら(これだけでわかった人は聖人かと)次のコードを示しておくと、

```python
class MainApp(MDApp):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = "Teal"
```

というようにMDAppで継承してそのまま使えるのだから変にThemeManagerクラスを
生成するようなバカなことはしないでおくれよと警告が出されています(言い過ぎ)。
素直に次のような書き方をしましょう。

> Note

> Correctly do as shown below!

```
class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Teal"
```

さらには次のようにtheme_clsはオブジェクトプロパティだよという締め方で
説明を終わっています。

> theme_cls is an ObjectProperty.

## まとめ

さて、今回はいかがだったでしょうか。似たようなところもありでkivymdの説明は・・・？
という方ももしかするといらっしゃるかもしれませんが私はほぇーと思うことが多々ありました。
今更？みたいなことを思われるかもですが。。。というわけで今週はこの辺りにしようかと思います。

あ、あと大事なこと忘れていた・・・これまでやってきたコードの方を整理してgithubにあげておき
ましたので、いちいちコピペするのめんどくさと思われる方がいましたら以下の方適当にcloneとか
して動かしてみると効率的かもしれません。
https://github.com/Quiet396/kivymd-app
\# あまり人に見せられるアカウントではないのですが

もちろんちゃんと全て動いたもので手元の環境でも動くはずです。また、ファイルの分け方としては
章ごとというよりかは節、さしおいてはページのタイトル通りに分けたって言った方がいいかもしれません。
\# 漢数字をアルファベットにしているのでもしかすると分かりにくいかもですが
\# ドキュメントの方でどのファイルかを示せてないですがまたそれは後ほどということで

※動作を保証するという意味ではありません→あくまで動作は自己責任ということで

今日はこの辺りで。
それでは、ごきげんよう。

## 参照

> Themes » Material App
> https://kivymd.readthedocs.io/en/latest/themes/material-app/