Обновление часов Python Kivy

У меня проблема в 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: '

Вот изображение моего приложения с замороженным временем просто для визуального представления того, что я пытаюсь достичь: Обновление часов Python Kivy

Как видите, время остановлено на 0:09:59 и не обновляется, как я ожидал.

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
605
1

Ответы 1

Я смог решить свой вопрос. Я решил использовать - = 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()

Другие вопросы по теме