函数只需2个参数(给定1个)kivy计时器

时间:2016-06-12 20:16:59

标签: python timer kivy

我试图让用户输入一个时间,当他们启动计时器时,用户插入的时间将从输入的时间开始倒计时。

但是我得到错误updatetimer()只需要2个参数(给定1个)

从输入中返回值的最佳方法是什么,以便可以在整个脚本的其余部分使用它。

以下是我正在使用的代码:

#!/usr/bin/kivy
import kivy

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

from functools import partial


check=0

Builder.load_string("""
<MenuScreen>:
    GridLayout:
        cols: 1
        TextInput:
            id: ti
        Button:
            text: 'do something!'
            on_press: root.updatetimer(ti.text)
        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 updatetimer(self,timeup):
        return timeup


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

test = MenuScreen()

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

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

class TestApp(App):

    def build(self):
        return sm 

提前感谢您的建议

1 个答案:

答案 0 :(得分:1)

首先,我会稍微整理一下代码并保持方法名称在类中更具描述性。

Builder.load_string("""
<MenuScreen>:
    GridLayout:
        cols: 1
        TextInput:
            id: ti
        Button:
            id: btn_0
            text: "press me to start timer"
            on_press: root.startTimer(int(ti.text))
        Label:
            id: output
            text: "Here"
""")

class MenuScreen(Screen):
    time = 0

    def printTime(self, t):
        self.ids.output.text = str(t)

    def tick(self, *largs):
        self.time -= 1
        self.printTime(self.time)

    def startTimer(self, t):
        self.printTime(t)
        self.time = t
        Clock.schedule_interval(partial(self.tick), 1)

这里我们有3个方法,一个是在开始时调用,一个是每次迭代,另一个是打印辅助函数。当然,这个计数器不会停在0,这可能是你想要的,但我会把那部分留给你。

请记住,类中的方法将self作为第一个参数传递。如果你想最终取消它,我会看看Clock.schedule_interval方法的作用:

https://kivy.org/docs/api-kivy.clock.html#kivy.clock.ClockBase.schedule_interval