tediousdays’ blog

プログラミングに関するブログです

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()

続いてスクリーンショットです.

f:id:tediousdays:20180506074745p:plain




上のプログラムをKV言語を使って書き換えてみます.このKV言語は Python スクリプトの中に書くことも,外部ファイルに書くこともできます.また外部ファイルに書く場合は,デフォルトのファイル名が決まっていて,そこに書くのが都合が良いと思います.

今回はデフォルト名の外部ファイルに書くことにします.デフォルト名についてはこの後ですぐ説明します.また,以後このファイルをKVファイルと呼ぶことにします.

さて,デフォルト名のKVファイルを用いる場合の Python スクリプトは以下のようになります.

from kivy.app import App
class layoutkvApp(App):
    pass
layoutkvApp().run()

たったの4行です.Appクラスのサブクラスを定義し,そのrunメソッドを実行するというだけのものです.

KVファイルのデフォルト名は,Appクラスのサブクラスの名前から決定されます.その決定ルールは次の通りです.

  • Appクラスのサブクラスの名前をすべて小文字にした文字列とする
  • ただし末尾のappは取り除く
  • 最後に .kv を付ける

今回の場合,サブクラスの名前は lauoutkvApp なので,すべてを小文字にすると

layoutkvapp
ですが,末尾の app を取り除いて .kv を付けた,

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
価格:4259円(税込、送料無料) (2018/5/7時点)