tediousdays’ blog

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

KV言語 (2)

以前の記事で取り上げたスクリーンマネージャのプログラムを,KV言語を用いて書き換えてみます.



まずは Pythonソースコード

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

KV側でルートウィジェットを定義するので,Python側では最低限のこと(Appクラスのサブクラスを定義し,runメソッドを走らせる)しかしていません.サブクラスの名前は


screenmanagerkvApp
ですので,KVファイルのデフォルト名は

screenmanagerkv.kv
となります.

続いてその screenmanagerkv.kv です.

ScreenManager:
   Screen:
      name: '0'
      Button:
         text: 'Button 0'
   Screen:
      name: '1'
      Button:
         text: 'Button 1'
   Screen:
      name: '2'
      Button:
         text: 'Button 2'
   Screen:
      name: '3'
      Button:
         text: 'Button 3'
   Screen:
      name: '4'
      Button:
         text: 'Button 4'

<Button>:
   font_size: 36
   on_press:
      self.parent.parent.current = self.parent.parent.next()

ScreenManager オブジェクトがルートウィジェットです.
前回も書いたとおり,この ScreenManager は Screen オブジェクトのみを子に持つことができます.上では5つの Screen オブジェクトを子に持っています.

Screen 自体は RelativeLayout というレイアウトクラスを継承していますので,さらに子を持たせて使うことになります.また Screen オブジェクトの name プロパティに名前となる文字列をわたし,画面切替のときに使えるようにしておきます.

さて5つの Screen はいずれも Button オブジェクトを子に持っていますが,KVスクリプトの一番下に Button クラスに関する記述があります.

<Button>:
   font_size: 36
   on_press:
      self.parent.parent.current = self.parent.parent.next()

これはクラスルールといって,Buttonクラスの各種プロパティのデフォルト値を定めるものです.クラスルールは < ... > のようにクラス名を不等号ではさんで書きます.このクラスルールに書いてあることは:

  • Button のデフォルトのフォントサイズは36です
  • on_press を押すと次の画面に切り替わります(前回の記事参照)

このようにメソッドをクラスルールの中に書くこともできますが,メソッドについてはなんでもかんでも書けるわけではありません.このことについては後日詳しく述べたいと思いますが,要はインデントが増えないような「簡単な」もので,on_*** で始まる特殊なメソッドしか書けません.