如何在多个位置更改字符串值?

时间:2016-06-17 09:28:50

标签: python python-3.x kivy

假设我有一个字符串,我用它为一些Kivy小部件设置一个值。如何让所有小部件对该字符串的更改做出反应?
我可以为每个小部件创建该字符串属性,但是如果我更改一个小部件的属性,则具有相同属性的其他小部件将不会相应地更改。

我想要的行为就像列表引用:

st = ["1"]
st1 = st
st.append("2")
print(st1, st)  # output: ['1', '2'] ['1', '2']

如您所见,当我更改列表st时,列表st1也会发生变化。这是因为st1是对列表的引用。如何将此行为应用于字符串?可能使用Kivy,如果Python的标准库没有办法实现我想要的东西

这是Kivy的演示:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput

class TestApp(App):
    def change_text(self, bt):
        self.string += "!"
        print(self.string)

    def build(self):
        self.string = "Hello"
        lb = Label(text = self.string)
        bt = Button(on_press = self.change_text)
        tx = TextInput(text = self.string)
        bl = BoxLayout()
        bl.add_widget(lb)
        bl.add_widget(tx)
        bl.add_widget(bt)
        return bl

TestApp().run()

因此,当按下按钮时,应用的属性string会发生变化,但我希望该更改会反映在左侧的小部件上(LabelTextInput

1 个答案:

答案 0 :(得分:0)

在kivy中你可以使用属性(不要与python属性混淆,这是一个完全不同的东西)。在kv语言中,您应该能够执行以下操作:

MainWidget:
    id: "main"
    mystring: "asdf"

    widget1:
        content: main.mystring
    widget2:
        content: main.mystring
    ...

properties的kivy文档中阅读更多内容。