我试图让用户输入一个时间,当他们启动计时器时,用户插入的时间将从输入的时间开始倒计时。
但是我得到错误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
提前感谢您的建议
答案 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