【问题标题】:Kivy ScreenManager - Updating label textKivy ScreenManager - 更新标签文本
【发布时间】:2016-12-30 20:15:30
【问题描述】:

我问了一个关于更新标签文本 (Kivy change label text with python) 的问题 - 它已得到回答并且正在工作,但我已经尝试了几个小时试图将我的运行代码调整为 ScreenManager,以便我可以拥有多个屏幕。我已将代码缩减为我无法使用的基本内容。

ScreenManager 代码破坏了解决方案,我知道问题是什么,但我无法解决它。代码正在运行,文本和时间在 shell 中更新,但标签没有更新,我无法将 return self.first_screen 添加到 Kivy def build,因此它不绑定到 the_time: _id_lbl_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()

【问题讨论】:

    标签: python label kivy


    【解决方案1】:

    我不能在这里返回 self.first_screen 等?

    没有。在Screen 小部件之上必须有一个ScreenManager,否则它只是一个RelativeLayout,就像它在源代码中的定义一样。

    您遇到了一个非常常见的初学者错误。您使用ScreenManager 的一个实例FirstScreen()SecondScreen()(这些是可见的),然后您创建了另一个实例:

    self.first_screen = FirstScreen()
    self.sec_screen = SecondScreen()
    

    然后您将其用于Clock

    Clock.schedule_interval(self.first_screen.update_time, 1)
    Clock.schedule_interval(self.sec_screen.update_text, 2)
    

    这意味着text 实例中的属性实际上没有添加到任何地方,因为小部件用于更新。实例存在,因此除了视觉错误之外不会触发错误 → 您看不到值,因为您使用了错误的实例。

    正确build():

    def build(self):
        sm = ScreenManager()
        self.first_screen = FirstScreen(name='first')
        self.sec_screen = SecondScreen(name='second')
        sm.add_widget(self.first_screen)
        sm.add_widget(self.sec_screen)
        return sm
    

    【讨论】:

    • 是的,这很有效 - 值得为未来的搜索者添加 build(self): 需要 return sm 以返回 ScreenManager 以实际显示它。
    猜你喜欢
    • 1970-01-01
    • 2014-03-04
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多