2016-12-17 2 views
3

Возможно ли такой подход, подобный приведенному ниже примеру, в Kivy?
Проведенный код явно не работает, и снова это всего лишь пример: мне понадобятся разные макеты, которые будут нарисованы в зависимости от определенного свойства.Python/Kivy: условный дизайн в .kv-файле

Как бы вы предлагаете это сделать?

BoxLayout: 
    number: 0 
    if self.number > 3: 
     Label: 
      text: 'number is bigger than 3' 
     Button: 
      text: 'click here to decrease' 
      on_press: root.number -= 1 
    else: 
     Label: 
      text: 'number is smaller than 3' 
     Button: 
      text: 'click here to increase' 
      on_press: root.number += 1 

ответ

1

Я бы с ScreenManager или Carousel, простой пример может быть:

Carousel: 
    index: 1# or a "certain property" :) 
    scroll_timeout: 0.0 # disable the user ability to mess with the widgets layout 
    BoxLayout: #first option 
     Label: 
     Button: 
    BoxLayout: #2nd option 
     Button: 
     Label: 

Если свяжет индекс к свойству вашего выбора будет автоматически переключать раскладку :). ..

ScreenManager основы подхода будет очень похож, главное изменение только обязательное свойство current_screen вместо индекса

1

KV lang имеет ограниченную функциональность, поэтому, если вы хотите большего контроля, вы должны поместить свою логику в код Python. Например, вы можете перемещать макеты в отдельные виджеты, а затем динамически выбирать правильный код из Python с помощью add_widget() и remove_widget().

from kivy.app import App 
from kivy.uix.boxlayout import BoxLayout 
from kivy.properties import NumericProperty 
from kivy.lang import Builder 

Builder.load_string(''' 
<SubWidget1>: 
    Label: 
     text: 'number is bigger than 3' 
    Button: 
     text: 'click here to decrease' 
     on_press: root.parent.number -= 1 

<SubWidget2>: 
    Label: 
     text: 'number is smaller than 3' 
    Button: 
     text: 'click here to increase' 
     on_press: root.parent.number += 1 

<MyWidget> 
    number: 0 
''') 

class SubWidget1(BoxLayout): 
    pass 

class SubWidget2(BoxLayout): 
    pass 

class MyWidget(BoxLayout): 
    number = NumericProperty() 

    def __init__(self, *args): 
     super(MyWidget, self).__init__(*args) 
     self.widget = None 
     self._create_widget() 

    def _create_widget(self): 
     print(self.number) 
     if self.widget is not None: 
      self.remove_widget(self.widget) 
     if self.number > 3: 
      self.widget = SubWidget1() 
     else: 
      self.widget = SubWidget2() 
     self.add_widget(self.widget) 

    def on_number(self, obj, value): 
     self._create_widget() 

class MyApp(App): 
    def build(self): 
     return MyWidget() 

if __name__ == '__main__': 
    MyApp().run() 
Смежные вопросы