2016-11-11 14 views
1

Ich versuche, eine Regel auf meiner KV-Sprache zu verwenden, um Klassen am on zu generieren, aber ich bekomme immer einen Fehler.Kivy, dynimic Klasse auf KV-Sprache

<SimpleInputLayout>: 
    orientation: 'vertical' 

    message_label: message 
    user_input: input 

    Label: 
     id: message 
     text: root.message_to_user 
    FloatInput: if input_type == 'float' else TextInput: 
     id: input 
     focus: True 

Was kann ich dies funktioniert auszukommen, wenn input_type gleich 'float' ich meine input Klasse wollen ein FloatInput, sonst ein TextInput sein.

Antwort

0

So etwas ist nicht möglich mit kv lang allein. Zumindest nicht direkt. Sie haben ~ 4 Optionen:

  1. Set input_type nach einer Eigenschaft eines widget:

    TextInput: 
        hint_text: 'int' 
        input_type: 'int' if self.hint_text == 'int' else 'float' 
    
  2. ändern input.input_type Eigenschaft von außen (wenn der Unterschied nur input type)

  3. hinzufügen das richtige Widget dynamisch mit z <parent>.add_widget(Factory.FloatInput()) auf ein Ereignis, sagen wir on_release eines Button
  4. Tun Sie es in Python vor allem in __init__ beim Erstellen des Layouts. Es ist einfacher, als herumzuprobieren, um etwas zu implementieren, das nicht da ist, oder nach dem richtigen Ereignis zu suchen, das zum Hinzufügen eines Widgets in kv verwendet werden kann. Es ist flexibler.

Obwohl es wahrscheinlich in der Dokumentation erwähnt wird die Sache, dass alles nach : verhält sich wie ein lockeres Python, aber das Eigenschaften Widget & Ereignisse gilt, nicht selbst Widgets:

schlecht:

v--rule-- : v------------ not Python -------------v 
FloatInput: if input_type == 'float' else TextInput: 

gut:

TextInput: 
    text: 'int' 
    # property: v-------------- Python ---------------v 
    input_type: 'int' if self.text == 'int' else 'float'