Kivy 中的数字时钟标签

Posted

技术标签:

【中文标题】Kivy 中的数字时钟标签【英文标题】:Digital Clock Label in Kivy 【发布时间】:2018-07-28 15:21:44 【问题描述】:

过去 6 周左右一直在玩 python,过去两周我一直在尝试学习 kivy。很难弄清楚如何更新我用来在我的应用中显示时间的标签。

我已经在这里查看了粗制时钟,非常粗制,一切都很好,但它返回一个标签而不是根小部件:

from kivy.app import App
from kivy.uix.label import Label
from kivy.clock import Clock

import time

class IncrediblyCrudeClock(Label):
    def update(self, *args):
        self.text = time.asctime()

class TimeApp(App):
    def build(self):
        crudeclock = IncrediblyCrudeClock()
        Clock.schedule_interval(crudeclock.update, 1)
        return crudeclock

if __name__ == "__main__":
    TimeApp().run()

到目前为止,这是我的代码:

from kivy.app import App
from kivy.config import Config
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.uix.widget import Widget

import time

Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '480')

global clocktext

class v3Widget(BoxLayout):
    pass

class ClockText(Label):
    def update(self, *args):
        self.text = time.strftime('%I'+':'+'%M'+' %p')
        return ClockText

class v3App(App):
    def build(self):
        clocktext = ClockText()
        Clock.schedule_interval(clocktext.update, 1)
        return v3Widget()

if __name__=="__main__":
    v3App().run()

这是基维:

<v3Widget>
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'horizontal'
            size_hint: 1,0.85
            Label:
                text: App.ClockText
                size_hint: 0.75,1
            Button:
                text: 'not clicked'
                size_hint: 0.25,1
        BoxLayout:
            orientation: 'horizontal'
            size_hint: 1,0.15
            Button:
                text: '1'
            Button:
                text: '2'
            Button:
                text: '3'
            Button:
                text: '4'
            Button:
                text: '5'

任何关于如何让时钟标签每分钟更新一次的建议将不胜感激。我能得到的最接近的是将变量设置为clocktext并让它在启动时加载但不会改变。

提前致谢

【问题讨论】:

【参考方案1】:

您向Clock.interval 发送了错误的实例。你应该发送在kv file中创建的需求

class ClockText(Label):
    def update(self, *args):
        self.text = time.strftime('%I'+':'+'%M'+' %p')

def build(self):
    v3w = v3Widget()
    clocktext = v3w.ids.clocktext
    Clock.schedule_interval(clocktext.update, 1)
    return v3w

也在kv文件中创建一个ID:

<ClockText>:

<v3Widget>:
    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'horizontal'
            size_hint: 1,0.85
            ClockText: # <--------- !!!
                id: clocktext 
                size_hint: 0.75,1
            Button:
                text: 'not clicked'
                size_hint: 0.25,1
        BoxLayout:
            orientation: 'horizontal'
            size_hint: 1,0.15
            Button:
                text: '1'
            Button:
                text: '2'
            Button:
                text: '3'
            Button:
                text: '4'
            Button:
                text: '5'

【讨论】:

谢谢!!这就是我试图完成但无法做到的事情。感谢您的帮助! 没问题的朋友!【参考方案2】:

显示时间的标签应该是ClockText 类的实例。您有几种可能性,例如:

ma​​in.py

from kivy.app import App
from kivy.config import Config
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label
from kivy.properties import ObjectProperty

import time

Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '480')


class V3Widget(BoxLayout):
    clock_label = ObjectProperty()

    def __init__(self, **kwargs):
        super(V3Widget, self).__init__(**kwargs)
        Clock.schedule_interval(self.clock_label.update, 1)


class ClockLabel(Label):
    def update(self, *args):
        self.text = time.strftime('%I:%M %p')


class V3App(App):
    def build(self):
        return V3Widget()


if __name__ == "__main__":
    V3App().run()

v3.kv

<V3Widget>
    clock_label: clock_label
    orientation: 'vertical'

    BoxLayout:
        orientation: 'horizontal'
        size_hint: 1,0.85

        ClockLabel:
            id: clock_label
            size_hint: 0.75,1

        Button:
            text: 'Not clicked'
            size_hint: 0.25,1

    BoxLayout:
        orientation: 'horizontal'
        size_hint: 1,0.15

        Button:
            text: '1'

        Button:
            text: '2'

        Button:
            text: '3'

        Button:
            text: '4'

        Button:
            text: '5'

如果标签只显示时间,您也可以让标签自行更新:

ma​​in.py(与上一个示例中的 kv 相同):

from kivy.app import App
from kivy.config import Config
from kivy.clock import Clock
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.label import Label

import time

Config.set('graphics', 'width', '800')
Config.set('graphics', 'height', '480')


class V3Widget(BoxLayout):
    pass


class ClockLabel(Label):
    def __init__(self, **kwargs):
        super(ClockLabel, self).__init__(**kwargs)
        Clock.schedule_interval(self.update, 1)

    def update(self, *args):
        self.text = time.strftime('%I:%M %p')


class V3App(App):
    def build(self):
        return V3Widget()


if __name__ == "__main__":
    V3App().run()

你不需要使用全局变量,但是你做错了:要在函数内部使用全局变量,你需要在函数/方法内部执行global &lt;varName&gt;,而不是当你声明它时。

【讨论】:

以上是关于Kivy 中的数字时钟标签的主要内容,如果未能解决你的问题,请参考以下文章

Python Kivy:self.ids 不更新标签文本

如何用jQuery和CSS3制作数字时钟

数字设计中的时钟与约束

使用 Kivy 同时显示多个时钟

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

带有strftime的python Tkinter中的七段数字时钟与系统时间