ポジショニングの目標がそれほど複雑でない場合は、aRelativeLayout
で十分かもしれません。
class MainPage(RelativeLayout):
def __init__(self, dispatcher, **kwargs):
super(MainPage, self).__init__(**kwargs)
self.child = ChildWidget(dispatcher, pos=(10,10))
self.add_widget(self.child)
(RelativeLayout
および一般に、絶対位置を保持する FloatLayout を除くすべてのレイアウト)は、子を親の位置に更新します。すべてのレイアウトもウィジェットなので安全です。
<ChildWidget>:
size_hint: .1, .05
text: "press me"
on_press: self.parent.pos = (200,200)
<MainPage>:
pos: 400,400
私が試した完全なコードは次のとおりです。
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.button import Button
Builder.load_string("""
<ChildWidget>:
size_hint: .1, .05
text: "press me"
on_press: self.parent.pos = (200,200)
<MainPage>:
pos: 400,400
""")
class Dispatcher():
pass
class ChildWidget(Button):
def __init__(self, dispatcher, **kwargs):
super(ChildWidget, self).__init__(**kwargs)
self.dispatcher = dispatcher
class MainPage(RelativeLayout):
def __init__(self, dispatcher, **kwargs):
super(MainPage, self).__init__(**kwargs)
self.child = ChildWidget(dispatcher, pos=(10,10))
self.add_widget(self.child)
class TestApp(App):
def build(self):
dispatcher = Widget()
return MainPage(dispatcher)
if __name__ == '__main__':
TestApp().run()