Kivyで良く使うapp, rootについて
Kivyでは良くappやrootといった変数を使用します。
- app
- Appのインスタンスを指します
- 対象となるインスタンスは基本ひとつです
- root
- 対象の根っこになっているWidgetのインスタンスを指します
- 下の例ではImageのrootはLargeImageです
例えば、下みたいな感じで使います。
main.kv
<LargeImage>:
on_touch_down: app.changeScene() #Widget がタッチされたらMainAppのchangeeSceneを呼ぶ
Image:
allow_stretch: True
source: root.path
main.py
class LargeImage(Widget):
def __init__(self, path):
self.path = path
super(LargeImage, self).__init__()
class MainApp(App):
def build(self):
self.root = LargeImage()
return self.root
def changeScene(self, scene, opt = None):
pass
rootってどこのどいつよ?
例えば下のファイルが有るとして、
上のImageのrootはLargeImage、下のImageのrootはSmallImageとなります。
main.kv
<LargeImage>:
Image:
source: root.path
<SmallImage>:
Image:
source: root.path
ここで、pythonファイル側で下のコードを実行したとします。
main.py
l_img = LargetImage()
l_img.add_widget(SmallImage()) #LargeImageにSmallImageを追加する
この場合、SmallImage側ImageのrootはSmallImageのままです。
LargeImageの下に追加してもrootはLargeImageに変わりません。
SmallImage側からLargeImageにアクセスしたい場合は、
rootでは無くroot.parentを使います。
逆にLargeImage側からSmallImageにアクセスする場合は
root.children[0]でアクセスできます。