使用屏幕管理器更新 kivy 标签

Posted

技术标签:

【中文标题】使用屏幕管理器更新 kivy 标签【英文标题】:update kivy label using screen manager 【发布时间】:2017-03-13 12:09:05 【问题描述】:

我正在尝试制作一个多屏应用程序,我希望在所有应用程序上都添加一个日期/时间标签。 我做了一个时钟事件,每秒更新文本值。

时钟事件正在工作,因为在 python 控制台上我可以看到它正在更新,但标签没有刷新,它只是第一次工作。 如何刷新屏幕?

main.py 文件:

import kivy
import time
from kivy.app import App
from kivy.uix.label import Label
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.clock import Clock

kivy.require("1.9.1")
Window.size = (1280,1024)
Config.set('graphics', 'fullscreen', '0')

class TimeLabel(Label):
    def __init__(self, **kwargs):
        super(TimeLabel, self).__init__(**kwargs)
        self.text= str(time.asctime())

    def update(self, *args):
        self.text = str(time.asctime())
        print self.text


class LoginScreen(Screen):
    pass


class MainScreen(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


class My1App(App):
    def build(self):
        my1sm = Builder.load_file("main.kv")
        crudeclock = TimeLabel()
        Clock.schedule_interval(crudeclock.update, 1)
        return my1sm


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

还有 main.kv 文件:

#: kivy 1.9
#: import ScreenManager kivy.uix.screenmanager.ScreenManager
#: import Screen kivy.uix.screenmanager.ScreenManager
#: import FadeTransition kivy.uix.screenmanager.FadeTransition

ScreenManagement:
    transition: FadeTransition()
    MainScreen:
    LoginScreen:


<MainScreen>:
    name: 'main'
    size_hint: (1, 1)
    FloatLayout:
        Image:
            source: './background.png'
            size: 1280,1024
    TimeLabel:


<LoginScreen>:
    name: 'loginS'
    FloatLayout:
        Image:
            source: './Login.png'
            size: 1280,1024
    TimeLabel:


<TimeLabel>:
    x:-545
    y:-475
    color: (0,0,0,1)

【问题讨论】:

【参考方案1】:

标签实例化时需要设置 schedule_interval。

import kivy
import time
from kivy.app import App
from kivy.uix.label import Label
from kivy.config import Config
from kivy.core.window import Window
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.lang import Builder
from kivy.clock import Clock

kivy.require("1.9.1")
Window.size = (600,600)
Config.set('graphics', 'fullscreen', '0')

class TimeLabel(Label):
    def __init__(self, **kwargs):
        super(TimeLabel, self).__init__(**kwargs)
        self.text= str(time.asctime())
        Clock.schedule_interval(self.update,1)

    def update(self, *args):
        self.text = str(time.asctime())
        print self.text


class LoginScreen(Screen):
    pass


class MainScreen(Screen):
    pass


class ScreenManagement(ScreenManager):
    pass


class My1App(App):
    def build(self):
        my1sm = Builder.load_file("main.kv")
        crudeclock = TimeLabel()
        return my1sm


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

【讨论】:

以上是关于使用屏幕管理器更新 kivy 标签的主要内容,如果未能解决你的问题,请参考以下文章

Kivy:使用 on_press 事件在屏幕管理器中更改屏幕

python- .py 文件中的 Kivy 屏幕管理器

如果在 kivy 文件中定义了屏幕管理器,如何在 Python 中更改屏幕?

使用 kivy 和 python 返回屏幕管理器时未设置焦点

Kivy HELP:小部件和屏幕管理器

如何使用 kivy StringProperty?