Создание таймера обратного отсчета с Python и Tkinter?

Я хочу установить метку в Tkinter, используя функцию таймера обратного отсчета. Прямо сейчас все, что он делает, устанавливает ярлык на «10». как только 10 достигнуто, и я действительно не понимаю, почему. Кроме того, даже если у меня есть таймер, печатающий на терминале, вместо этого "Время истекло!" немного никогда не печатает.

import time
import tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text="null")
        self.label.pack()
        self.countdown()
        self.root.mainloop()

    # Define a timer.
    def countdown(self):
        p = 10.00
        t = time.time()
        n = 0
        # Loop while the number of seconds is less than the integer defined in "p"
        while n - t < p: 
            n = time.time()
            if n == t + p:
                self.label.configure(text="Time's up!")
            else:
                self.label.configure(text=round(n - t))

app=App()
 jfs03 мар. 2015 г., 10:15

Ответы на вопрос(1)

Решение Вопроса

способ запланировать запуск вещей по истечении определенного периода времени (используяafter). Вы можете воспользоваться этим, написав функцию, которая вызывает себя один раз в секунду для обновления дисплея. Вы можете использовать переменную класса, чтобы отслеживать оставшееся время.

import Tkinter as tk

class ExampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.label = tk.Label(self, text="", width=10)
        self.label.pack()
        self.remaining = 0
        self.countdown(10)

    def countdown(self, remaining = None):
        if remaining is not None:
            self.remaining = remaining

        if self.remaining <= 0:
            self.label.configure(text="time's up!")
        else:
            self.label.configure(text="%d" % self.remaining)
            self.remaining = self.remaining - 1
            self.after(1000, self.countdown)

if __name__ == "__main__":
    app = ExampleApp()
    app.mainloop()
 15 мая 2012 г., 14:54
@RyanHasse: дисплей обновляется только тогда, когда Tkinter может реагировать на события, которые сообщают ему об обновлении дисплея. Эти события обрабатываются только циклом событий. Если у вас есть свой собственный цикл, он приведет к истощению цикла событий, предотвращая возникновение запросов на перерисовку.
 Ryan Hasse15 мая 2012 г., 13:49
Это многое объясняет, спасибо. Мне было интересно, почему он обновляется только после достижения последнего элемента, даже после того, как я переписал его несколькими разными способами.

Ваш ответ на вопрос