2017-06-19 72 views
2

我想通過StringProperty獲取我的TextInput的文本,但它不起作用。我得到一個空字符串。在第二個示例中,我將整個TextInput聲明爲ObjectProperty,然後它可以工作。我的第一個例子有什麼問題?kivy TextInput的StringProperty參考文本

如何使用StringProperty來定義TextInput中的文本?

第一個例子不打印的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() 

第二個例子做的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() 

如果我將文本設置爲特定的,它顯示在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 __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文件中定義。通常我會堅持第二個版本,但我不明白爲什麼我不能使用第一個版本。 – PalimPalim

+0

對於'text:root.textinputtext',如果'StringVariable'的值確實會改變'TextInput'的文本,但是反之不會。 – FJSevilla

回答

1

如果你想設置和使用StringProperty,那麼你應該創建一個雙向綁定獲取文本:

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