Kivy 更新带有变量的标签文本

Kivy Update Label Text with Variable

问:在这种情况下如何更新标签文本?

Python代码:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition
from kivy.uix.textinput import TextInput
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.widget import Widget
from kivy.uix.scrollview import ScrollView
from kivy.properties import StringProperty, ObjectProperty, NumericProperty

class SearchForPart(Widget):
    def searchforpart(self):
        Barty = 'text update';
        demogar = DemoGarage()
        demogar.ids.scrollref.UpdateParam(Barty)

class ScrollableLabel1(ScrollView):  
    text_variable_1 = StringProperty()
    def __init__(self, **kwargs):
        super(ScrollableLabel1, self).__init__(**kwargs)
        self.text_variable_1 = 'initial' 

    def UpdateParam(self, param):
        self.param = param
        self.text_variable_1 = param
        print(param)

class AnotherScreen(Screen):
    pass

class MainScreen(Screen):
    pass

class DemoGarage(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass

presentation = Builder.load_file("garagemainexample.kv")

class MainApp(App):
    def build(self):
        return presentation

if __name__ == "__main__":
    MainApp().run()

Kv代码:

#: import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManagement:
    transition: FadeTransition()
    MainScreen:
    DemoGarage:

<BigButton@Button>:
    font_size: 40
    size_hint: 0.5, 0.15
    color: 0,1,0,1 

<MainScreen>:
    name: "main"
    FloatLayout:
        BigButton:
            on_release: app.root.current = "demogarage"
            text: "Demo Garage"
            pos_hint: {"x":0.25, "top": 0.4} 

<DemoGarage>:
    name: "demogarage"
    ScrollableLabel1:
        id:scrollref
    SearchForPart:
        id:searchpart

<ScrollableLabel1>:
    Label:
        id: mylabel
        text: root.text_variable_1
        font_size: 20
        text_size: self.width, None
        size_hint_y: None
        height: self.texture_size[1]
        padding_y: 10
        padding_x: 140

<SearchForPart>:
    size_hint: 1,1
    FloatLayout:
        Label:
            text: "Search for Part:"
            font_size: 30
            pos_hint: {"x": 0.95, "y": 0.85}
            color: 0,1,0,1
            size_hint: 0.3, 0.2
        TextInput:
            id: partname
            multiline: False
            font_size: 30
            pos_hint: {"x": 0.85, "y": 0.15}
            color: 0,1,0,1
            on_text_validate: root.searchforpart()
            size_hint: 1, 0.5

初始化程序后,Label文本初始化成功,输出'initial text'。

一旦 'searchforpart' 方法运行(作为对在搜索框中输入的响应),即使 'print(param)' 打印 'text update',标签文本也不会更新。

问:在这种情况下如何更新标签文本?

我是否误解了如何触发 Kivy 事件循环更改的核心概念?

使用基维属性:

from kivy.properties import StringProperty

class (YourClass):
    text_variable_1 = StringProperty()

当你在kv中引用这个属性,它的值改变时,gui会自动更新。如果您不使用 属性,则不会发生这种情况,因为 kv 代码无法知道已更改的值。

此外,您不必遵循 pep8,但 属性 名称应以小写字母开头 - 这对您的示例可能无关紧要,但如果您尝试,可能会影响 kv在此处设置 属性。