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

时间:2015-05-04 15:06:11

标签: 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时钟来更改标签上的数据。目前我收到错误,自我没有定义。请指教。

2 个答案:

答案 0 :(得分:2)

错误是因为你引用了self,但是在my_callback函数中定义了 isn&#t; ,你必须将它作为参数传递。

一种方便的方法是使用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)

答案 1 :(得分:0)

虽然inclement的方法可行,但将回调添加为类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)