Kivy 中简单的 30 秒倒数计时器

Simple 30 second countdown timer in Kivy

我想在单击按钮后立即启动 30 秒计时器。

我的尝试:

#!/usr/bin/kivy
import kivy
kivy.require('1.7.2')

from random import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.gridlayout import GridLayout
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.popup import Popup
from random import random
from random import choice
from kivy.properties import StringProperty
import time
from kivy.clock import Clock

t=30
check=0

def my_callback(dt):
    global t
    t=t-1
    self.ids['timer'].text=str(t)

Builder.load_string("""
<MenuScreen>:
    GridLayout:
        cols: 1
        Button:
            id: btn_0
            text: "press me to start timer"
            on_press: root.val0()
        Label:
            text:'timer'
        Label:
            id: timer
            text:str(30)
""")

class MenuScreen(Screen):
    def val0(self):
        global check
        if(check==0):
            check=check+1
            Clock.schedule_interval(my_callback, 1)

sm = ScreenManager()
menu_screen = MenuScreen(name='menu')
sm.add_widget(menu_screen)

class TestApp(App):

    def build(self):
        return sm

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

我不知道如何使用 kivy 时钟更改标签上的数据。目前我收到未定义自我的错误。请指教

错误是因为您引用了 self,但是 不是 在 my_callback 函数中定义的,您必须将其作为参数传递。

一个方便的方法是使用functools.partial。您可以将时钟调度替换为:

from functools import partial
Clock.schedule_interval(partial(my_callback, self), 1)

并将my_callback声明为

def my_callback(screen, dt):
    global t
    t -= 1
    screen.ids.timer.text = str(t)

虽然 inclement 的方法可行,但将回调添加为 class MenuScreen

的方法会更简单
class MenuScreen(Screen):
    def my_callback(self, dt):
        global t
        t=t-1
        self.ids['timer'].text=str(t)

然后更改调度时钟的调用,使其指向方法

Clock.schedule_interval(self.my_callback, 1)