Как я могу остановить обратный отсчет перекрытия друг друга?

1

Это код:

import tkinter as Alarm
class test(Alarm.Frame):
    def __init__(self, parent):
        Alarm.Frame.__init__(self, parent)
        self.prompt = Alarm.Label(self, text="Enter seconds:", anchor="w")
        self.entry = Alarm.Entry(self)
        self.output = Alarm.Label(self, text="Start")
        self.submit = Alarm.Button(self, text="Submit", command = self.startTimer)
        self.prompt.pack(side="top", fill="x")
        self.entry.pack(side="top", fill="x", padx=20)
        self.output.pack(side="top", fill="x", expand=True)
        self.submit.pack(side="right")
    def countdown(self, s):
        if s==0:
            self.output.configure(text="Alarm!")
            return  
        self.output.configure(text=str(s))
        s -= 1
        self.output.after(1000, lambda: self.countdown(s))
    def startTimer(self):
        try:
            i = int(self.entry.get())
            self.countdown(i)
        except ValueError:
            print("Please enter whole digits only in all boxes")
if __name__ == "__main__":
    root = Alarm.Tk()
    test(root).pack(fill="both", expand=True)
    root.mainloop()

Так что для этого кода это позволяет мне создать таймер обратного отсчета. Я хочу сделать так, чтобы, если обратный отсчет уже был запущен, он остановился, если был установлен другой отсчет.

  • 0
    Вам нужно было бы где-нибудь сохранить возвращаемое значение .after() , чтобы вы могли вызвать .after_cancel() для него, если .after_cancel() другой обратный отсчет.
  • 0
    Как проверить, начался ли другой отсчет?
Показать ещё 2 комментария
Теги:
tkinter

1 ответ

1
Лучший ответ

Вы можете использовать очень маленький хак для этого. У меня есть check переменная, инициализированная 0. Когда вы нажмете кнопку "Отправить", она изменится на 1. В функции обратного отсчета вы можете проверить его значение и предпринять соответствующие действия. Вот демо.

import tkinter as Alarm

class test(Alarm.Frame):
    def __init__(self, parent):
        Alarm.Frame.__init__(self, parent)
        self.prompt = Alarm.Label(self, text="Enter seconds:", anchor="w")
        self.entry = Alarm.Entry(self)
        self.output = Alarm.Label(self, text="Start")
        self.submit = Alarm.Button(self, text="Submit", command = self.startTimer)
        self.prompt.pack(side="top", fill="x")
        self.entry.pack(side="top", fill="x", padx=20)
        self.output.pack(side="top", fill="x", expand=True)
        self.submit.pack(side="right")
        self.check = 0
    def countdown(self, s):
        if self.check == 0:
            return
        if s==0:
            self.output.configure(text="Alarm!")
            return  
        self.output.configure(text=str(s))
        s -= 1
        self.output.after(1000, lambda: self.countdown(s))
    def startTimer(self):
        self.check = (self.check+1)%2
        try:
            i = int(self.entry.get())
            self.countdown(i)
        except ValueError:
            print("Please enter whole digits only in all boxes")
if __name__ == "__main__":
    root = Alarm.Tk()
    test(root).pack(fill="both", expand=True)
    root.mainloop()

Изображение 174551

  • 0
    Это сработало очень хорошо с моим реальным кодом, спасибо! : D

Ещё вопросы

Сообщество Overcoder
Наверх
Меню