2014-12-15 4 views
0

Я столкнулся с этой проблемой несколько раз, поэтому либо мой подход ошибочен, либо я пропустил критическую функцию.Принудительная компоновка киви внутри __init__

Зачастую мне нужно установить начальную графическую информацию в методе init. Это не работает, потому что когда сначала создаются графические киви, они находятся на pos:0, 0 и size:100, 100. Так что любая настройка в init не выглядит корректной.

Есть ли способ заставить киви размещать в виджетах init? Я вижу do_layout, но не понял, как добраться до макета, чтобы попробовать.

Вот пример:

Python:

class Main(Widget): 
    route = ListProperty([]) 

    def __init__(self, *args, **kwargs): 
     super(Main, self).__init__(**kwargs) 
     self.route = [0, 0, self.width, self.height] 


class RouteBuilderApp(App): 
    def build(self): 
     main = Main() 
     return main 

if __name__ == "__main__": 
    RouteBuilderApp().run() 

Kv:

<Main> 
    canvas: 
     Color: 
      rgb: 0, 0, 0 
     Rectangle: 
      size: self.size 
      pos: self.pos 
     Color: 
      rgb: 0, 0, 1 
     Line: 
      points: root.route 
      width: 2 

Выход:

enter image description here

ответ

1

Вы должны использовать привязка свойств. Это супер просто на языке кв, вы можете просто изменить свое кВ так:

canvas: 
    Color: 
     rgb: 0, 0, 0 
    Rectangle: 
     size: self.size 
     pos: self.pos 
    Color: 
     rgb: 0, 0, 1 
    Line: 
     points: 0, 0, root.width, root.height 
     width: 2 

Связываясь с точки Line напрямую, вам не нужно даже промежуточный route свойство.

+0

Мой пример может быть упрощен, но я не думаю, что вы действительно ответили на мой вопрос. Возможно ли запустить раскладку? – danatron

+0

Вы не используете '' Layout'' в своем коде выше. Вы можете запускать макет на виджетах «Макет», но вне расширенного использования это обычно означает, что вы сделали что-то еще неправильно. –

Смежные вопросы