Python Kivy ScreenManager-更新标签文本

Python Kivy ScreenManager-更新标签文本,python,label,kivy,Python,Label,Kivy,我问了一个关于更新标签文本()的问题-它得到了回答并且正在工作,但我已经尝试了几个小时,试图将我运行的代码调整为ScreenManager,这样我就可以有多个屏幕了。我已经把代码删减到基本的东西了,我无法工作 ScreenManagercode破坏了解决方案,我知道问题出在哪里,就是解决不了。代码正在运行,文本和时间在shell中更新,但标签没有更新,我无法添加返回self。首先,将屏幕添加到Kivydef build,因此它不绑定到时间:\u id\u lbl\u time-非常感谢任何帮助/

我问了一个关于更新标签文本()的问题-它得到了回答并且正在工作,但我已经尝试了几个小时,试图将我运行的代码调整为
ScreenManager
,这样我就可以有多个屏幕了。我已经把代码删减到基本的东西了,我无法工作

ScreenManager
code破坏了解决方案,我知道问题出在哪里,就是解决不了。代码正在运行,文本和时间在shell中更新,但标签没有更新,我无法添加
返回self。首先,将屏幕
添加到Kivy
def build
,因此它不绑定到
时间:\u id\u lbl\u time
-非常感谢任何帮助/指针

from kivy.app import App
from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.properties import ListProperty, StringProperty, ObjectProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import ScreenManager, Screen, WipeTransition, FadeTransition
from  kivy.uix.anchorlayout import AnchorLayout
from kivy.clock import Clock
import time
from datetime import datetime, timedelta


class FirstScreen(Screen):
  def update_time(self, sec):
    MyTime = time.strftime("%H:%M:%S")
    print  MyTime # to test update_time is called etc
    self.the_time.text = MyTime #<---- self.the_time isn't working

class SecondScreen(Screen):
  def update_text(self, sec):
    MyText = 'New Text'
    print  MyText # to test update_text is called etc
    self.the_set.text = MyText #<---- self.the_set isn't working

class MyScreenManager(ScreenManager):
    pass

Builder.load_string('''

<FirstScreen>:
    name: 'first'
    the_time: _id_lbl_time

    BoxLayout:
        orientation: 'vertical'
        Label
            id: _id_lbl_time
            text: 'Clock'
            font_size: 30
        BoxLayout:
            Button:
                text: 'New Here'
                font_size: 20
                size: 200, 50
                size_hint: None, None
                on_release: app.root.current = 'second'

<SecondScreen>:
    name: 'second'
    the_set: _id_lbl_set

    BoxLayout:
        orientation: 'vertical'
        Label:
            id: _id_lbl_set
            text: 'New Here'
            font_size: 30
        BoxLayout:
            Button:
                text: 'Main'
                font_size: 20
                size: 200, 50
                size_hint: None, None
                on_release: app.root.current = 'first'
''')
class ScreenManagerApp(App):
    def build(self):
        sm = ScreenManager()
        sm.add_widget(FirstScreen(name='first'))
        sm.add_widget(SecondScreen(name='second'))
        self.first_screen = FirstScreen()
        self.sec_screen = SecondScreen()
        return sm #<---- I can't return self.first_screen etc here?

    def on_start(self):
        Clock.schedule_interval(self.first_screen.update_time, 1)             # 1 second
        Clock.schedule_interval(self.sec_screen.update_text, 2)

ScreenManagerApp().run()
从kivy.app导入应用
从kivy.base导入runTouchApp
从kivy.lang导入生成器
从kivy.properties导入ListProperty、StringProperty、ObjectProperty
从kivy.uix.boxlayout导入boxlayout
从kivy.uix.screenmanager导入screenmanager、Screen、WipeTransition、FadeTransition
从kivy.uix.anchorlayout导入anchorlayout
从kivy.clock导入时钟
导入时间
从datetime导入datetime,timedelta
类第一屏幕(屏幕):
def更新时间(自身,秒):
MyTime=time.strftime(“%H:%M:%S”)
打印我的时间#测试更新#调用etc时间
self.the_time.text=MyTime#
我不能返回self.first\u屏幕等

不可以。在
屏幕
小部件的顶部必须有一个
屏幕管理器
,否则它只是一个
相对值
,就像它在源代码中的定义一样

你遇到了一个初学者经常犯的错误。您将一个实例
FirstScreen()
SecondScreen()
用于
ScreenManager
(这些都是可见的),然后使用以下内容创建了另一个实例:

self.first_screen = FirstScreen()
self.sec_screen = SecondScreen()
然后将其用于
时钟

Clock.schedule_interval(self.first_screen.update_time, 1)
Clock.schedule_interval(self.sec_screen.update_text, 2)
这意味着在实例中的
text
属性实际上没有添加到任何地方,因为小部件用于更新。实例存在,因此除了可视实例外,不会触发任何错误→ 您没有看到值,因为您使用了错误的实例

更正
build()

我不能返回self.first\u屏幕等

不可以。在
屏幕
小部件的顶部必须有一个
屏幕管理器
,否则它只是一个
相对值
,就像它在源代码中的定义一样

你遇到了一个初学者经常犯的错误。您将一个实例
FirstScreen()
SecondScreen()
用于
ScreenManager
(这些都是可见的),然后使用以下内容创建了另一个实例:

self.first_screen = FirstScreen()
self.sec_screen = SecondScreen()
然后将其用于
时钟

Clock.schedule_interval(self.first_screen.update_time, 1)
Clock.schedule_interval(self.sec_screen.update_text, 2)
这意味着在实例中的
text
属性实际上没有添加到任何地方,因为小部件用于更新。实例存在,因此除了可视实例外,不会触发任何错误→ 您没有看到值,因为您使用了错误的实例

更正
build()


是的,这很有效-值得为将来的搜索者添加
build(self):
需要
返回sm
才能返回屏幕管理器以实际显示它。是的,这很有效-值得为将来的搜索者添加
build(self):
需要
返回sm
才能返回屏幕管理器以实际显示它。