【问题标题】:Basic Tkinter countdown timer [duplicate]基本 Tkinter 倒数计时器 [重复]
【发布时间】:2016-03-05 21:30:45
【问题描述】:

我目前正在开发一个项目,该项目需要非常简单的倒数计时器,可以在 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


【解决方案1】:

您不能使用sleep,因为它会停止mainloop 并且程序无法运行。 1000ms(1s)后可以使用root.after调用函数

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
            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 的需要),但我认为您可以在这里得到重点。

    【讨论】:

    • 您可以使用root.after(1000, button_countdown, i, label) 来消除lambda
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多