【问题标题】:How to update label text on second kivy screen如何在第二个 kivy 屏幕上更新标签文本
【发布时间】:2015-11-05 05:56:23
【问题描述】:

我有一个带有两个屏幕的小型 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'

从“开始”来看,只有一个 StrategyScreen 实例,并且 SetText 被正确调用,但标签仍显示旧文本。

谁能帮忙

【问题讨论】:

  • 我想我在这里误解了 OOP。类 StrategyScreen 没有 init 那么它怎么知道'self'是什么?我很困惑

标签: kivy


【解决方案1】:

问题在于MainScreen 类的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()

【讨论】:

  • 谢谢尼卡金。我无法绕过它,但你帮我做到了
  • @Nykakin,感谢您的彻底回答。我要补充一点,我发现设置为 StringProperty() 的 labelText 数据类型特别有用。我认为 Kivy 需要它成为一个对象,而不是一个字符串,例如,才能工作。
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多