使用StringProperty引用Kivy TextInput的参考文本

3

我希望通过StringProperty获取我的TextInput的文本,但是它不起作用。我得到了一个空字符串。在第二个示例中,我将整个TextInput声明为ObjectProperty,然后它可以工作。我的第一个示例有什么问题?

如何使用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()

为什么不直接使用 TextInput.text 属性? - FJSevilla
因为这只是一个由多个文本输入、标签和按钮组成的小部件的简化示例,它们都在kv文件中定义。通常我会坚持使用第二个版本,但我就是不明白为什么我不能使用第一个版本。 - PalimPalim
使用 text: root.textinputtext,如果 StringVariable 的值发生变化,则 TextInput 的文本会随之改变,但反之则不然。 - FJSevilla
是的,我也看到了。例如,如果你在初始化方法中指定它为某个值,那么当你启动应用程序时,它就会存在。 - PalimPalim
也许你需要进行某种绑定。(我已经将你指出的内容添加到问题中) - PalimPalim
1个回答

5
如果您希望使用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()

输出:

在此输入图片描述


这段内容展示了一个动态的图像,可以通过点击链接来查看。

谢谢!那是一个非常好的答案。 - PalimPalim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接