我如何修复“ValueError: callback must be a callable, got 18:19:46”

问题描述

所以我试图很好地掌握 kivy,我想创建一个基本的时钟应用程序,但当我去更新时钟标签时,我一直遇到问题。我在这里查看了其他线程,但仍然找不到正确的解决方案。我相信我在 Clock.schedule_interval 上做错了但同样,我试图了解 kivy 但我不确定。任何帮助将不胜感激

Python 代码

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.lang import Builder
from kivy.clock import Clock
import time

Builder.load_file('myApp.kv')

class ClockScreen(Widget):
    def updateClock(self):
        hour = time.strftime("%H")
        minute = time.strftime("%M")
        second = time.strftime("%s")
        Clocktime = self.root.ids.clock.text
        print(Clocktime)
        newTime = self.root.ids.clock.text = f'{hour}:{minute}:{second}'
        return newTime


class FirstApp(App):

    def build(self):
        return ClockScreen()

    def on_start(self):
        Clock.schedule_interval(ClockScreen.updateClock(self),1)



FirstApp().run()
```

KV 文件

FloatLayout:
    size: root.width,root.height

    Label:
        id: clock
        text: "12:00"

解决方法

试试

def on_start(self):
    Clock.schedule_interval(ClockScreen.updateClock,1)

原因:

ClockScreen.updateClock 是可调用的(函数句柄)。 This is also explained in the docs

ClockScreen.updateClock(self) 实际上是调用返回时间的函数,您不能安排字符串(18:19:46,根据您的错误)。


但是,这并没有说明 ClockScreen 的哪个实例得到更新(您通过类而不是特定实例引用该函数),因此这可能更准确地满足您的需求

class FirstApp(App):

    def build(self):
        return ClockScreen()

    def on_start(self):
        cs = self.build()
        Clock.schedule_interval(cs.updateClock,1)