如何在第二个 kivy 屏幕上更新标签文本

How to update label text on second kivy screen

我有一个带有两个屏幕的小 kivy 应用程序。我正在尝试从第一个开始更新第二个标签

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty

# Declare both screens
class MainScreen(Screen):
    def SetText(self):
      text='Total='+str(17*21)
      StrategyScreen().SetText(text)

class StrategyScreen(Screen):
    labelText = StringProperty()
    labelText='My label'
    print 'start'

    def SetText(self, text):
      print 'a', self.labelText
      self.labelText=text
      print 'b', self.labelText

class TestApp(App):
    def build(self):
        # Create the screen manager
        screenManager = ScreenManager()
        screenManager.add_widget(MainScreen(name='main'))
        screenManager.add_widget(StrategyScreen(name='strategy'))
        return screenManager

if __name__ == '__main__':
    TestApp().run()

带有 kv 文件:

<MainScreen>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: 'Goto strategy'
            on_press: root.manager.current = 'strategy'
        Button:
            text: 'Set text'
            on_press: root.SetText()

<StrategyScreen>:
    BoxLayout:
        orientation: "vertical"
        Label:
            text: root.labelText
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'main'

从'start'来看只有一个StrategyScreen实例和SetText被正确调用,但标签仍然显示旧文本。

谁能帮忙

问题出在你的MainScreenclass的SetText方法上。调用 StrategyScreen().SetText(text) 会创建类型为 StrategyScreen() 的新临时对象,对其调用方法 SetText,然后将其丢弃,因为不再需要它。要获取现有屏幕,请使用 self.manager.get_screen() 方法:

class MainScreen(Screen):
    def SetText(self):
        text = 'Total=' + str(17*21)
        self.manager.get_screen('strategy').SetText(text)

您可以直接更改其 属性 而不是调用 StrategyScreen 方法:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import StringProperty

Builder.load_string('''
<MainScreen>:
    BoxLayout:
        orientation: "vertical"
        Button:
            text: 'Goto strategy'
            on_press: root.manager.current = 'strategy'
        Button:
            text: 'Set text'
            on_press: root.SetText()

<StrategyScreen>:
    BoxLayout:
        orientation: "vertical"
        Label:
            text: root.labelText
        Button:
            text: 'Back to menu'
            on_press: root.manager.current = 'main'
''')

class MainScreen(Screen):
    def SetText(self):
        text = 'Total=' + str(17*21)
        self.manager.get_screen('strategy').labelText = text

class StrategyScreen(Screen):
    labelText = StringProperty('My label')

class TestApp(App):
    def build(self):
        # Create the screen manager
        screenManager = ScreenManager()
        screenManager.add_widget(MainScreen(name='main'))
        screenManager.add_widget(StrategyScreen(name='strategy'))
        return screenManager

if __name__ == '__main__':
    TestApp().run()