2015-12-01 1 views
3

В настоящее время я работаю над проектом, который требует очень простого таймера обратного отсчета, который работает в графическом интерфейсе tkinter и не полагается на рекурсию. Я пробовал разные вещи, но пока ничего не работает.Базовый таймер обратного отсчета Tkinter

import time 
from tkinter import * 


root = Tk() 
root.title("Timer") 
root.geometry("100x100") 

def countdown(count): 
    label = Label(root, text= count) 
    label.place(x=35, y=15) 

for i in range(5,0,-1): 
    countdown(i) 
    time.sleep(1) 

root.mainloop() 
+1

'sleep' закроет окно. Попробуйте использовать 'root.after'. – Kevin

+0

связанные: [Отсрочка функций в python] (http://stackoverflow.com/a/14040516/4279) – jfs

ответ

3

Вы не можете использовать sleep, потому что он останавливает mainloop и программа не может работать. Вы можете использовать root.after вызвать функцию после 1000мс (1s)

import tkinter as tk 

def countdown(count): 
    # change text in label   
    label['text'] = count 

    if count > 0: 
     # call countdown again after 1000ms (1s) 
     root.after(1000, countdown, count-1) 

root = tk.Tk() 

label = tk.Label(root) 
label.place(x=35, y=15) 

# call countdown first time  
countdown(5) 
# root.after(0, countdown, 5) 

root.mainloop() 
0

Подобный принцип, как решение furas уже отвечал, но с использованием STRINGVAR:

import Tkinter 

def button_countdown(i, label): 
    if i > 0: 
     i -= 1 
     label.set(i) 
     root.after(1000, lambda: button_countdown(i, label)) 
    else: 
     close() 

def close(): 
    root.destroy() 

root = Tkinter.Tk() 

counter = 10 
button_label = Tkinter.StringVar() 
button_label.set(counter) 
Tkinter.Button(root, textvariable=button_label, command=close).pack() 
button_countdown(counter, button_label) 

root.mainloop() 

Это можно сделать более изящным, если части живут в тот же класс (а именно, устранить необходимость в lambda), но я думаю, вы можете получить здесь.