基本 Tkinter 倒计时器[重复]

问题描述 投票:0回答:2

我目前正在开发一个项目,需要非常简单的倒计时器,该计时器在 tkinter GUI 中工作并且不依赖于递归。我尝试过不同的方法,但到目前为止似乎没有任何效果。

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()
python timer tkinter countdown
2个回答
14
投票

您无法使用

sleep
,因为它会停止
mainloop
并且程序无法运行。您可以使用
root.after
在 1000ms(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()

2
投票

与已经发布的furas解决方案类似的原理,但使用StringVar:

import Tkinter

def button_countdown(i, label):
    if i > 0:
        i -= 1
        # schedule next call first to avoid time drifting away from 1s after many calls          
        root.after(1000, lambda: button_countdown(i, label))
        label.set(i)
    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
的需要),这可以变得更加优雅,但我认为你可以在这里明白这一点。

© www.soinside.com 2019 - 2024. All rights reserved.