2016-12-17 17 views
3

Wäre in Kivy ein Ansatz möglich, der dem folgenden Beispiel ähnelt?
Der Code geschrieben funktioniert offensichtlich nicht, und wieder ist es nur ein Beispiel: Ich brauche verschiedene Layouts abhängig von einer bestimmten Eigenschaft gezeichnet werden.Python/Kivy: konditionelles Design in .kv-Datei

Wie würden Sie vorschlagen, dies auszuarbeiten?

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 

Antwort

1

ich mit Screenmanager oder ein Karussell gehen würde, könnte ein einfaches Beispiel sein:

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: 

Wenn Sie Index auf eine Eigenschaft Ihrer Wahl binden werden es wird das Layout automatisch wechseln :). ..

A Screenmanager basierter Ansatz sehr ähnlich sein wird, ist die große Veränderung nur verbindlich, die current_screen Eigenschaft statt Index

1

KV lang hat nur eine eingeschränkte Funktionalität. Wenn Sie also mehr Kontrolle wünschen, sollten Sie Ihre Logik in den Python-Code einfügen. Zum Beispiel können Sie Ihre Layouts in separate Widgets verschieben und dann dynamisch das richtige aus Python-Code mit add_widget() und remove_widget() auswählen.

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()