Python 如何在Kivy中为倒计时计时器创建圈数函数

Python 如何在Kivy中为倒计时计时器创建圈数函数,python,timer,kivy,kivy-language,Python,Timer,Kivy,Kivy Language,我有一个倒计时计时器,它从randint()参数给定范围内的一个随机整数开始,然后倒计时到零。其目的是使计时器在第一次达到零(即圈功能)时以新的随机数重新启动,并在第二次达到零时显示“FINISH”(完成) 这是我第一次使用kivy,如果解决方案显而易见,我深表歉意。目前,我只需要两次迭代,但我可能需要在以后调整,以便计时器在最终停止之前可以运行任意次数。圈数将在运行应用程序之前在代码中确定,而不是由运行应用程序时的应用程序用户确定 from kivy.app import App from k

我有一个倒计时计时器,它从randint()参数给定范围内的一个随机整数开始,然后倒计时到零。其目的是使计时器在第一次达到零(即圈功能)时以新的随机数重新启动,并在第二次达到零时显示“FINISH”(完成)

这是我第一次使用kivy,如果解决方案显而易见,我深表歉意。目前,我只需要两次迭代,但我可能需要在以后调整,以便计时器在最终停止之前可以运行任意次数。圈数将在运行应用程序之前在代码中确定,而不是由运行应用程序时的应用程序用户确定

from kivy.app import App
from kivy.uix.label import Label
from kivy.animation import Animation
from kivy.properties import NumericProperty
from random import randint


class IncrediblyCrudeClock(Label):
    for i in range(2):
        r=randint(3,7)
        a = NumericProperty(r)  # Number of seconds to countdown


        def start(self):  #Function to initiate the countdown
            Animation.cancel_all(self)  # stop any current animations
            self.anim = Animation(a=0, duration=self.a)  #a=0 sets the 
#final destination of a. duration sets the time taken to reach stopping 
#point (i.e 5 seconds for a=5)
            def finish_callback(animation, incr_crude_clock):
                if self.i==1:
                    incr_crude_clock.text = "FINISHED"  #when the clock 
#reaches zero, display "FINISHED"
            self.anim.bind(on_complete=finish_callback)  #call the 
#finish_callback function once a=0
            self.anim.start(self)  #Start the animation (otherwise clock 
#stuck at 5 for a=5)


class TimeApp(App):
    def build(self):
        crudeclock = IncrediblyCrudeClock()
        crudeclock.start()
        return crudeclock

if __name__ == "__main__":
    TimeApp().run()



<IncrediblyCrudeClock>
    text: str(round(self.a, 1))
从kivy.app导入应用
从kivy.uix.label导入标签
从kivy.animation导入动画
从kivy.properties导入NumericProperty
从随机导入randint
类不可信的RudeClock(标签):
对于范围(2)中的i:
r=randint(3,7)
a=数值属性(r)#倒计时的秒数
def start(自我):启动倒计时的功能
动画。取消所有(自身)#停止任何当前动画
self.anim=Animation(a=0,duration=self.a)#a=0设置
#a的最终目的地。持续时间设置达到停止所需的时间
#点(即a=5的5秒)
def完成回调(动画、递增时钟):
如果self.i==1:
incr_crude_clock.text=“FINISHED”#时钟
#达到零,显示“已完成”
self.anim.bind(on_complete=finish_回调)#调用
#一旦a=0,完成_回调函数
self.anim.start(self)#启动动画(否则为时钟)
#a=5时卡在5)
类时间应用程序(应用程序):
def生成(自):
crudeclock=难以置信的crudeclock()
crudeclock.start()
回油分离器
如果名称=“\uuuuu main\uuuuuuuu”:
TimeApp().run()
文本:str(圆形(self.a,1))
应用程序在第一次倒计时时确实按预期运行。选择一个随机数,计时器倒计时到零,但在第一次倒计时后停止并显示“已完成”。在应用程序实际启动之前,for循环似乎正在从0迭代到1,因此,在倒计时开始时,i已经等于1(而不是先从a运行到0,i=0,然后从新a运行到0,i=1)。我想这是因为for循环位于错误的位置(即不是在调用start函数时),但我无法解决如何纠正这一点。
这也是我第一次使用堆栈溢出,因此如果您还需要了解其他信息,请告诉我。

很难理解您的代码,但这里有一个版本的
IncremidlyCrudeClock
,它可以工作:

class IncrediblyCrudeClock(Label):
    a = NumericProperty(0)  # Number of seconds to countdown

    def start(self):
        self.a = randint(3, 7)
        self.anim = Animation(a=0, duration=self.a)
        self.anim.bind(on_complete=self.secondAnim)
        print('starting first anim')
        self.anim.start(self)

    def secondAnim(self, animation, incr_crude_clock):
        self.a = randint(3, 7)
        self.anim = Animation(a=0, duration=self.a)
        self.anim.bind(on_complete=self.finish_callback)
        print('starting second anim')
        self.anim.start(self)

    def finish_callback(self, animation, incr_crude_clock):
        print('in finish_callback')
        self.text = 'FINISHED'

这是一个非常简单的方法。我确信
start
secondAnim
方法可以结合为一种方法,具有更高的逻辑性。

以下是一个将倒计时重复指定次数的版本:

from random import randint
from kivy.animation import Animation
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import NumericProperty
from kivy.uix.label import Label


class IncrediblyCrudeClock(Label):
    a = NumericProperty(0)  # Number of seconds to countdown

    def __init__(self, **kwargs):
        self.max_laps = kwargs.pop('laps', 2)  # default is to do 2 laps
        self.lap_counter = 0
        super(IncrediblyCrudeClock, self).__init__(**kwargs)

    def start(self, *args):
        self.lap_counter += 1
        self.a = randint(3, 7)
        self.anim = Animation(a=0, duration=self.a)
        if self.lap_counter >= self.max_laps:
            # this is the last lap, set on_complete to call self.finish_callback
            self.anim.bind(on_complete=self.finish_callback)
        else:
            # not finished yet, call self.start again
            self.anim.bind(on_complete=self.start)
        print('starting anim number', self.lap_counter)
        self.anim.start(self)

    def finish_callback(self, animation, incr_crude_clock):
        print('in finish_callback')
        self.text = 'FINISHED'

Builder.load_string('''
<IncrediblyCrudeClock>
    text: str(round(self.a, 1))
''')


class TimeApp(App):
    def build(self):
        # specify the number of repetitions in the constructor
        crudeclock = IncrediblyCrudeClock(laps=3)
        crudeclock.start()
        return crudeclock

if __name__ == "__main__":
    TimeApp().run()
来自随机导入randint
从kivy.animation导入动画
从kivy.app导入应用程序
从kivy.lang导入生成器
从kivy.properties导入NumericProperty
从kivy.uix.label导入标签
类不可信的RudeClock(标签):
a=NumericProperty(0)#倒计时的秒数
定义初始(自我,**kwargs):
self.max_laps=kwargs.pop('laps',2)#默认值为2圈
self.lap_计数器=0
超级(难以置信的鲁德洛克,自我)。\uuuuu初始值(**kwargs)
def启动(自,*参数):
自重叠计数器+=1
self.a=randint(3,7)
self.anim=动画(a=0,持续时间=self.a)
如果self.lap\u计数器>=self.max\u圈数:
#这是最后一圈,设置为“完成”以调用self.finish\u回调
self.anim.bind(on_complete=self.finish_回调)
其他:
#尚未完成,请再次调用self.start
self.anim.bind(on_complete=self.start)
打印('开始动画编号',自动圈数计数器)
self.anim.start(self)
def完成回调(自我、动画、递增时钟):
打印('在完成\u回调中')
self.text='FINISHED'
Builder.load_字符串(“”)
文本:str(圆形(self.a,1))
''')
类时间应用程序(应用程序):
def生成(自):
#指定构造函数中的重复次数
crudeclock=难以置信的crudeclock(圈数=3)
crudeclock.start()
回油分离器
如果名称=“\uuuuu main\uuuuuuuu”:
TimeApp().run()

谢谢,这非常有帮助。你能给我一些关于如何结合第一种和第二种方法的建议吗?我在过去使用过Spyder,一个重复预定次数的过程只需要一个简单的for循环,但我不知道如何在这里实现这种方法。我最终会要求程序在文本输入小部件中重复用户输入指定的特定次数。太好了,谢谢!你能不能给我解释一下init_u;()函数中的pop()和super()方法在做什么?我目前的理解是,pop()可用于从列表中删除特定元素,super()可用于从父类继承。似乎pop函数正在将max_laps设置为关键字参数,但我不确定如何设置?此外,在本例中,是否使用super()方法将uu init函数的参数设置为UncreditlyCrudeClock()类的参数?提前感谢
kwargs
是传递到
\uuuu init\uuuu()方法的关键字参数字典。
pop
max_laps
的值设置为传入的值(如果未提供
laps
关键字,则设置为2)。它还从
kwargs
字典中删除
laps
键,这样
标签的
\uuuu init\uuuuuuu()
将不会遇到意外的关键字。当你包括你自己的