KV言語 (1)
今回はKV言語を取り上げます.
以前の記事で取り上げた BoxLayout に関するサンプルプログラムを,KV言語を使って書き換えてみようと思います.まずはサンプルプログラムの再掲です.
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.button import Button class layoutApp(App): def build(self): x1 = Button(text='x1') x2 = Button(text='x2', color=(1,0,0,1)) x3 = Button(text='x3', font_size=32) box = BoxLayout(orientation='vertical') box.add_widget(x1) box.add_widget(x2) box.add_widget(x3) return box layoutApp().run()
続いてスクリーンショットです.
Kivyプログラミング Pythonで作るマルチタッチアプリ [ 久保 幹雄 ] |
上のプログラムをKV言語を使って書き換えてみます.このKV言語は Python スクリプトの中に書くことも,外部ファイルに書くこともできます.また外部ファイルに書く場合は,デフォルトのファイル名が決まっていて,そこに書くのが都合が良いと思います.
今回はデフォルト名の外部ファイルに書くことにします.デフォルト名についてはこの後ですぐ説明します.また,以後このファイルをKVファイルと呼ぶことにします.
さて,デフォルト名のKVファイルを用いる場合の Python スクリプトは以下のようになります.
from kivy.app import App class layoutkvApp(App): pass layoutkvApp().run()
たったの4行です.Appクラスのサブクラスを定義し,そのrunメソッドを実行するというだけのものです.
KVファイルのデフォルト名は,Appクラスのサブクラスの名前から決定されます.その決定ルールは次の通りです.
今回の場合,サブクラスの名前は lauoutkvApp なので,すべてを小文字にすると
- Appクラスのサブクラスの名前をすべて小文字にした文字列とする
- ただし末尾のappは取り除く
- 最後に .kv を付ける
ですが,末尾の app を取り除いて .kv を付けた,
layoutkvapp
がデフォルト名となります.
layoutkv.kv
さてそのKVファイル layoutkv.kv ですが,中身は以下の通りです.
BoxLayout: orientation: 'vertical' Button: text: 'x1' Button: text: 'x2' color: 1,0,0,1 Button: text: 'x3' font_size: 32
Python だけで書いた場合と比べて,きわめて簡潔に書くことができます.また各クラスのインポートも必要ありません.(正確には kivy.uix 以下の基本的なウィジェットクラスについてはインポートは不要です.その他のクラスはインポートの必要があるのですが,ここでは省略.)
Python ではインデントが文法の一部となっており,ネスト構造がインデントによって示されます.これと同じように,KV言語でもインデントが文法の一部となっています.
さて上記のKVファイルには以下のことが書かれています.
- BoxLayoutがルートウィジェットである
- その orientation プロパティの値は 'vertical' である(子どもは縦に並ぶ)
- 3つのButtonを子どもに持つ
- 1つ目のButtonの文字列は 'x1' である
- 2つ目のButtonの文字列は 'x2' で,色は赤 (1,0,0,1) である
- 3つ目のButtonの文字列は 'x3' で,フォントサイズは 32 である
こういったことが直感的に書けて,後で見直したときにもわかりやすいように(少なくとも私は)思います.
なお BoxLayout がルートウィジェットであることが指定されているので,Pythonスクリプトにおいてルートウィジェットを指定する必要がないことに注意してください.これまでは Appクラスのサブクラスにおいて build メソッドをオーバーライドし,ルートウィジェットを返すようにしてきましたが,KVファイルでルートウィジェットを指定する場合はこれが不要です.
KV言語にはまだまだ便利な機能があります.次回以降はそれらについて触れたいと思います.
Creating Apps in Kivy Mobile with Python |
PythonでかんたんiOSアプリプログラミング Kivyによるマルチタッチアプリケーション制作 [ 桑井博之 ] |