2017-06-19 8 views
2

Ich möchte den Text meines TextInput über eine StringProperty abrufen, aber es funktioniert nicht. Ich bekomme eine leere Zeichenfolge. Im zweiten Beispiel deklariere ich den gesamten TextInput als ObjectProperty und dann funktioniert es. Was ist falsch an meinem ersten Beispiel?Kivy-Referenztext von TextInput von StringProperty

Wie kann eine StringProperty verwendet werden, um den Text in einem TextInput zu definieren?

Erstes Beispiel druckt nicht Text von TextInput- example1.py

from kivy.app import App 
from kivy.base import Builder 
from kivy.properties import StringProperty 
from kivy.uix.boxlayout import BoxLayout 

Builder.load_string(""" 
<rootwi>: 
    orientation: 'vertical' 
    Button: 
     on_press: root.print_txt() 
    TextInput: 
     text: root.textinputtext 
""") 
class rootwi(BoxLayout): 
    textinputtext = StringProperty() 

    def print_txt(self): 
     print(self.textinputtext) 


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

if __name__ == '__main__': 
    MyApp().run() 

Zweites Beispiel druckt Text von TextInput-, verwendet aber eine Object nicht String example2.py

from kivy.app import App 
from kivy.base import Builder 
from kivy.properties import ObjectProperty 
from kivy.uix.boxlayout import BoxLayout 
from kivy.clock import Clock 


Builder.load_string(""" 
<rootwi>: 
    txt: txt 
    orientation: 'vertical' 
    Button: 
     on_press: root.print_txt() 
    TextInput: 
     id: txt 
""") 
class rootwi(BoxLayout): 
    txt = ObjectProperty() 

    def print_txt(self): 
     print(self.txt.text) 


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

if __name__ == '__main__': 
    MyApp().run() 

Wenn ich den Text auf den spezifischen Wert setze, wird er im TextInput angezeigt. (Aber immer noch kann nicht gedruckt werden)

from kivy.app import App 
from kivy.base import Builder 
from kivy.properties import StringProperty 
from kivy.uix.boxlayout import BoxLayout 

Builder.load_string(""" 
<rootwi>: 
    orientation: 'vertical' 
    Button: 
     on_press: root.print_txt() 
    TextInput: 
     text: root.textinputtext 
""") 
class rootwi(BoxLayout): 
    textinputtext = StringProperty() 

    def __init__(self, **kwargs): 
     self.textinputtext = 'palim' 
     super(rootwi, self).__init__(**kwargs) 

    def print_txt(self): 
     print(self.textinputtext) 


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

if __name__ == '__main__': 
    MyApp().run() 
+0

Warum verwenden Sie das Attribut 'TextInput.text' nicht direkt? – FJSevilla

+0

, da dies ein vereinfachtes Beispiel für ein Widget ist, das aus mehreren Texteingaben, Beschriftungen und Schaltflächen besteht, die alle in der kv-Datei definiert sind. Normalerweise würde ich bei der zweiten Version bleiben, aber ich verstehe einfach nicht, warum ich nicht mit der ersten Version arbeiten kann. – PalimPalim

+0

Mit 'text: root.textinputtext' ändert sich der Text von' TextInput', wenn der Wert der 'StringVariable', aber nicht umgekehrt. – FJSevilla

Antwort

1

Wenn Sie den Text und erhalten mit Hilfe des String dann sollten Sie eine bidirektionale binden erstellen gesetzt werden sollen:

from kivy.app import App 
from kivy.base import Builder 
from kivy.properties import StringProperty, ObjectProperty 
from kivy.uix.boxlayout import BoxLayout 


Builder.load_string(""" 
<rootwi>: 
    orientation: 'vertical' 
    textinputtext: txt.text 
    Button: 
     on_press: root.print_txt() 
    TextInput: 
     id: txt 
     text: root.textinputtext 
""") 

class rootwi(BoxLayout): 
    textinputtext = StringProperty() 

    def __init__(self, **kwargs): 
     super(rootwi, self).__init__(**kwargs) 
     self.textinputtext = 'palim' 

    def print_txt(self): 
     print(self.textinputtext) 



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

if __name__ == '__main__': 
    MyApp().run() 

Ausgang:

enter image description here

+0

Vielen Dank! Das ist eine wirklich nette Antwort. – PalimPalim

Verwandte Themen