Kivy

(翻訳) FactoryとKivyLanguageに関する豆知識集

面白いKvLanguageの解説を見つけたので訳しました。

原文: Kivy Factory and Kivy Language demo

from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.factory import Factory

# ----------------------------------------
# Widgetのクラス名は大文字から始めないといけません
# KivyのPropertyの名前は小文字から始めないといけません
# ----------------------------------------
# WOW 1: まだ存在してもいないMagicクラスの継承
# WOW 2: Rabbitクラスに新しく"feet"というPropertyを作成
# WOW 3: KvLanguageはKivyのPropertyの変化を感知し、それに依存している他の物を自動で更新します。
#        この場合は"text"の値が"feet"に依存しているので、"feet"が変化した時に自動で"text"が更新されます。
#        ("text"はMagicクラスを通してLabelクラスから継承されたものです)
# WOW 4: 同じeventに対するコールバック関数を複数書ける
#        (on_pressはButtonBehaviorから来たものです)
# WOW 5: 複数行に渡って書くことも出来ます (ただしこれ以上のIndentは無理)
# WOW 6: KivyのPropertiyは値が変わった時に on_<Property名> のメソッドを呼び出します。
Builder.load_string('''
<Rabbit@ButtonBehavior+Magic>: # WOW1
    feet: 4 # WOW2
    text: 'Rabbit with {} feet'.format(self.feet) # WOW3
    on_press: print('a callback') # WOW4 (with next line)
    on_press:
        self.feet = (self.feet + 1) % 5
        print("set feet: {}".format(self.feet)) # WOW5
    on_feet:
        print("recv feet: {}".format(self.feet)) # WOW6
''')

# WOW 7: Factoryからは登録されたWidgetクラスを得る事が出来ます(この例では"Label"クラスを得ている).
class Magic(Factory.Label):
   pass

# 上のLabelの例と同じです。ただこの例では継承はせずInstanceを作っています。
wow = Factory.GridLayout(cols=1)

# WOW 8: Widgetクラスは自動でFactoryに登録されます。 (自作したMagicクラスが登録されている)
wow.add_widget(Factory.Magic(text='not a Rabbit'))

# WOW 9: Rabbitクラスが今ではInstance化可能です。何故なら基本クラスであるMagicをFactoryが知っているから(登録されているから)。
# またRabbitクラスの定義がPythonを使わずにKvLanguageのみで完結している為、これがKvLanguageの外からRabbitクラスを得る為の唯
# 一の手段です
wow.add_widget(Factory.Rabbit())

# RabbitとMagicはKvLanguage上でも使う事ができます。
wow.add_widget(Builder.load_string('Rabbit:'))

# WOW 10: もし何かトリッキーな事をしたいなら、以下のようにFactoryをいじる事も出来ます。
# 推奨はしませんが時々役にたつ技です。
Factory.unregister('Label') # (非推奨)
Factory.register('Label', cls=Factory.Rabbit) # (非推奨)
wow.add_widget(Builder.load_string('Label:')) # 元のLabelに代わってRabbitが作られる。

runTouchApp(wow)