2016-06-12 98 views
0

我试图让用户输入一个时间,当他们启动计时器时,用户插入的时间将从该输入时间开始倒计时。函数只需要2个参数(1给出)kivy定时器

但是我得到的错误updatetimer()究竟需要两个参数(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 

预先感谢您的建议

+0

在你的函数'my_callback(屏幕,DT)'你有下面的语句:'T =试验。 updatetimer()'。对象'test'被认为是第一个参数('self'),但你仍然有'timeup'。所以错误是有道理的 – VlassisFo

+0

什么应该t = test.updatetimer()被改变为使得t等于用户输入的时间? – fastmhc

回答

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

相关问题