У меня проблема в Kivy с библиотекой Clock. Я пытаюсь создать таймер обратного отсчета для игры. По умолчанию я установил для таймера 10:00 минут. Каждую секунду я хочу обновлять метку в Kivy, которая отображает время, но кажется, что часы застывают в 09:59 минут и перестают обновляться. Вот что я сделал до сих пор.
class AddNumbers(Screen):
def __init__(self, **kwargs):
super(AddNumbers, self).__init__(**kwargs)
self.minutes = 10
self.seconds = 0
В моем первом классе я добавляю атрибуты для минут и секунд, так что минуты по умолчанию будут установлены на 10, а секунды по умолчанию будут установлены на 0.
Затем я добавляю атрибуты и методы класса AddNumbers в свой основной класс приложения.
class MinuteMathApp(App, AddNumbers):
В моем основном классе приложения я добавляю метод под названием «таймер», который должен вычитать -1 из self.seconds при каждом вызове этой функции. Как только self.seconds станет == до -1, self.minutes уменьшится на 1, self.seconds должен увеличиться на + = 60, чтобы он мог перезапуститься через 59 секунд, и снова начнет обратный отсчет. Если минуты и секунды == 0, то я заморозю время в 00:00. Я создаю объект datetime.timedelta, в котором минуты установлены равными self.minutes, а секунды установлены равными self.seconds. Затем я обновляю свою метку kivy, используя строковую форму времени.
def timer(self, *args):
self.seconds - 1
if self.seconds == -1:
self.seconds += 60
self.minutes -= 1
if self.minutes == 0 and self.seconds == 0:
self.minutes = 0
self.seconds = 0
self.time = datetime.timedelta(minutes=self.minutes, seconds=self.seconds)
self.root.ids.time.text = str(self.time)
Наконец, у меня есть функция addnums, которая привязана к кнопке в kivy. Когда пользователь нажимает эту кнопку, ему будет задан ряд математических вопросов, и именно здесь должен запуститься таймер. Я планирую запуск функции таймера один раз в секунду с помощью функции Clock.schedule_interval. Поскольку в моей функции есть self.seconds - 1, я думал, что функция будет вычитать 1 секунду КАЖДЫЙ раз, когда функция вызывается с помощью функции Clock.schedule_interval. Однако моя проблема в том, что время остается замороженным в 10:00 и не меняется на моем ярлыке kivy.
def addnums(self):
Clock.schedule_interval(self.timer, 1)
Вот часть моего кода .kv, которая соответствует вызываемой функции.
Button:
text: 'Get Question'
id: easy_addition_next_question_button
background_normal: 'navy.png'
on_press: app.addnums()
А вот моя метка в файле .kv, которую нужно обновить:
Label:
id: time
text: 'Time: '
Вот изображение моего приложения с замороженным временем просто для визуального представления того, что я пытаюсь достичь:

Как видите, время остановлено на 0:09:59 и не обновляется, как я ожидал.
Заранее прошу прощения за длинный вопрос. Мне кажется, что важно быть максимально подробным, чтобы не было путаницы. Мне сложнее всего ответить на вопросы на этом сайте, в которых отсутствуют какие-либо подробности, и сложно точно структурировать вопрос без каких-либо подробностей.






Я смог решить свой вопрос. Я решил использовать - = 1, чтобы увеличивать свое время один раз при каждом вызове метода таймера вместо -1. Я также создал новый метод, вызывающий функцию «таймер». Я решил привязать к этой функции новую кнопку под названием «Start Timer». При нажатии этой кнопки запускается метод «Clock.schedule_interval», который позволяет часам отсчитывать обратный отсчет. Похоже, что вычитание - = 1 из секунд вместо вычитания -1 было ключом к выполнению этой работы. Вот изменения, которые я внес ниже:
def timer(self, *args):
self.seconds -= 1
if self.seconds == -1:
self.seconds += 60
self.minutes -= 1
self.time = datetime.timedelta(minutes=self.minutes, seconds=self.seconds)
self.root.ids.time.text = str(self.time)
if '-1 day' in str(self.time):
self.root.ids.time.text = 'Time Over!'
#--------------------------------------------------------------------------------------------------------------
def start_timer(self):
Clock.schedule_interval(self.timer, 1)
Вот кнопка, которую я добавил в файл .kv для запуска метода start_timer, который будет вызывать метод таймера с часами kivy.
Button:
text: 'Start Timer'
id: easy_addition_timer_button
background_normal: 'navy.png'
on_press: app.start_timer()