У меня есть таймер обратного отсчета, который начинается со случайного целого числа в диапазоне, заданном аргументами 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))
Приложение работает так, как ожидается для первого обратного отсчета.Случайное число выбирается и таймер начинает обратный отсчет до нуля, но он останавливается и отображает «ЗАВЕРШЕНО» после первого обратного отсчета.Кажется, что цикл for итерирует от нуля до единицы, прежде чем приложение действительно запустится, поэтому к моменту начала обратного отсчета я уже равен 1 (вместо запуска сначала с a до нуля с i = 0 изатем из нового а в ноль с i = 1).Я предполагаю, что это потому, что цикл for находится не в том месте (т.е. не при вызове функции start), но я не смог решить, как это исправить.Я также впервые использую переполнение стека, поэтому, пожалуйста, дайте мне знать, если вам нужно знать что-то еще.