Kivy Language автоматически создает внутренние привязки в свойствах. Например, если мы назначим позицию родителя позиции дочернего элемента, то позиция дочернего элемента будет обновляться автоматически:
Widget:
Label:
pos: self.parent.pos
В этом случае, если мы переместим родителя Widget
, то потомок тоже переместится. Как отвязать свойство pos
от дочернего элемента? Я знаю, как отменить привязку (свойств)[http://kivy.org/docs/api-kivy.uix.widget.html#using-properties], которые я привязываю сам, но как мне их отменить, если я не знаю < strong>имя связанного метода.
Вот небольшой пример, чтобы показать, что я имею в виду. Button
Вверх перемещает GridLayout
вверх, а Down
вниз Вниз. Button
Центр располагается в центре экрана. Моя проблема в том, что когда я нажимаю Вверх или Вниз, моя центрированная кнопка больше не отображается.
from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivy.lang import Builder
Builder.load_string("""
<Example>:
GridLayout:
id: _box
cols: 3
size_hint: .7, .3
pos_hint: {'center_x': .5}
x: 0
Widget:
Button:
pos: self.parent.pos
size: self.parent.size
on_press: _box.y = 0
text: "Down"
Widget:
Button:
pos: self.parent.pos
size: self.parent.size
on_press: self.center_y = root.height/2
text: "Out of the Grid"
Widget:
Button:
pos: self.parent.pos
size: self.parent.size
on_press: _box.top = root.height
text: "Up"
""")
class Example(FloatLayout):
pass
class ExampleApp(App):
def build(self):
return Example()
if __name__ == "__main__":
ExampleApp().run()
Зачем мне это делать в любом случае? Я использую анимацию на GridLayout
, которая постоянно обновляет позицию. Нормальное положение кнопок должно быть внутри сетки, но время от времени одна из кнопок пролетает над экраном и возвращается в то же положение. Проблема в том, что я не могу заставить их летать, пока мой gridlayout также движется, потому что свойство привязано, и как только кнопка пытается летать, она возвращается к сетке. Это также означает, что привязка иногда желательна. Я хочу иметь контроль над привязкой и развязкой.
Layout
(простоWidget
). Это не сработало, потому чтоpos: self.parent.pos
по-прежнему связываетButton
иWidget
pos
. Я закончил привязывать и отвязывать их с помощью Python, так что теперь у меня есть контроль. - person toto_tico   schedule 08.07.2013Button
кFloatLayout
приведет к повторной привязке вещей к новому родителю? Я попробую, но я знаю, что я так не думаю. @Tshirman объяснил мне раньше, что эта привязка выполняется строителем, потому что у меня есть обратная проблема с холстом. - person toto_tico   schedule 08.07.2013Up
илиDown
. Он не обновляется немедленно, пока не будет выполнено другое действие. Тем не менее, он отлично работает, когда я возвращаю его в сетку. Другими словами, он не работает сразу, когда я достаю его из коробки, но работает, когда я кладу его обратно. Я вставлю код в качестве ответа. - person toto_tico   schedule 08.07.2013