Kivy

Kivyの基本 Property

KivyのPropertyって何?

 簡単に言うと監視の仕組みを持った属性です。あらかじめ関数を登録(複数可)しておくと、属性が書き換えられた時にその関数を呼び出してくれるのです。KivyのWidget群の色んな属性(大きさ,位置,テキスト,他色々)がこれで実装されているので、いつでも自由に関数を引っ掛けて属性の変化を察知することができるようになってます。

使い方

Propertyを作る

from kivy.event import EventDispatcher
from kivy.properties import StringProperty, NumericProperty


class Person(EventDispatcher):

    name = StringProperty()
    age = NumericProperty()

KivyのPropertyは必ずEventDispatcherの派生ClassのClass変数の位置で作らないといけません。Class変数の位置で作ってはいますが、Instance毎の属性として振る舞います。そのままClass変数として扱おうとして失敗している人をよく見かけるので注意してください。もしどのような仕組みで動いているか気になるのなら、python ディスクリプタでググるといいと思います。

変更を監視(その1)

プロパティの持ち主.bind(監視対象のプロパティ名=プロパティが変化した時に呼びたい関数)とすることで監視できます。

person1 = Person(name='Bob', age=20)
person2 = Person(name='Ken', age=30)

# person1のageが変わった時、person2のageを同じ値に書き換える
person1.bind(age=person2.setter('age'))

# person1のnameが変わった時、person2のnameを[person1のnameを全て大文字にした物]に書き換える
person1.bind(name=(lambda person, value: setattr(person2, 'name', value.upper())))
# 上のlambdaを見やすくした物
# def callback(person, value):
#    person2.name = value.upper()

print(person1.name, person1.age)
print(person2.name, person2.age)
person1.age = 90
person1.name = 'Jess'
print(person1.name, person1.age)
print(person2.name, person2.age)
標準出力
Bob 20
Ken 30
Jess 90
JESS 90

変更を監視(その2)

on_プロパティ名のMethodを定義する事でも監視出来ます。

from kivy.event import EventDispatcher
from kivy.properties import StringProperty, NumericProperty


class Person(EventDispatcher):

    name = StringProperty()
    age = NumericProperty()

    def on_name(self, __, value):
        print('on_name', value)

    def on_age(self, __, value):
        print('on_age', value)


person1 = Person(name='Bob', age=20)
person2 = Person(name='Ken', age=30)
person1.name = 'Jess'
標準出力
on_name Bob
on_age 20
on_name Ken
on_age 30
on_name Jess