2017-06-19 11 views
2

TextInputのテキストをStringPropertyで取得したいのですが、動作しません。私は空の文字列を取得します。 2番目の例では、TextProperty全体をObjectPropertyとして宣言しています。最初の例で何が間違っていますか?TextInput by StringProperty

StringPropertyを使用してTextInput内のテキストを定義するにはどうすればよいですか?

最初の例では、 example1.pyのTextInputのテキストを印刷しません

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

第二の例では、TextInputの印刷テキストを行いますが、OBJECTPROPERTYないStringProperty 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() 

テキストをsth固有に設定すると、TextInputに表示されます。あなたが設定した後、あなたは、双方向バインドを作成する必要がありStringPropertyを使用してテキストを取得したい場合

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

なぜ 'TextInput.text'属性を直接使用しないのですか? – FJSevilla

+0

これは、複数のテキスト入力、ラベル、ボタンがすべてkvファイルで定義されているウィジェットの単純化された例であるためです。通常は2番目のバージョンに固執しますが、最初のバージョンではうまくいかない理由はありません。 – PalimPalim

+0

'Text:root.textinputtext'では' StringVariable'の値がそうであれば 'TextInput'のテキストは変化しますが、その逆はありません。 – FJSevilla

答えて

1

(しかし、それでもまだ、印刷することができません):

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

出力:

enter image description here

+0

ありがとう!それは本当に素晴らしい答えです。 – PalimPalim