繁体   English   中英

如何在倒计时计时器中显示倒计时

[英]How do I make the countdown display in a countdown timer

我是 Python 的新手,一般只是编程。 我需要帮助来为我的计时器创建倒计时显示,这是一个龙舌兰酒计时器。 我的朋友喝了很多龙舌兰酒,并让我给他们做一个计时器,因为他们对计算机一无所知。

无论如何,我已经以最好的方式进行布局,它看起来像这样: https://i.stack.imgur.com/bvt57.png

我需要帮助的是,当单击 1 分钟按钮时,它会从一分钟倒计时到 0。另一个按钮也是如此。 我还需要停止操作方面的帮助,因此您可以随时通过按下停止按钮来停止计时器。 这真的是一个很大的帮助!

这是我的代码:

import tkinter as tk

#GUI
root = tk.Tk()
root.title("Tequila timer")

#Load of background with the tequila bottle
canvas = tk.Canvas(root, width=423, height=700)
canvas.pack()
Load = tk.PhotoImage(file="tequila.png")
canvas.create_image(211, 350, image=Load)

#buttons
btn_1min = tk.Button(root, text="1 min", width=10, height=5, command=root.quit)
btn_1min_v = canvas.create_window(140, 350, window=btn_1min)

btn_10min = tk.Button(root, text="10 min", width=10, height=5, command=root.quit)
bt1_10min_v = canvas.create_window(283, 350, window=btn_10min)

btn_1hour = tk.Button(root, text="1 hour", width=10, height=5, command=root.quit)
bt1_1hour_v = canvas.create_window(140, 475, window=btn_1hour)

btn_2hours = tk.Button(root, text="2 hours", width=10, height=5, command=root.quit)
bt1_2hours_v = canvas.create_window(283, 475, window=btn_2hours)

btn_stop = tk.Button(root, text="Stop", width=10, height=5, command=root.quit)
bt1_stop_v = canvas.create_window(211, 600, window=btn_stop)

#Display
label = tk.Label(root, text="00:00:00", width=9, font=("calibri", 40, "bold"))
label.pack()
label_v = canvas.create_window(211, 200, window=label)

root.mainloop()

问题是您的按钮都没有映射到任何东西。 好吧,除了root.quit ,它只会关闭你的 window。

所以让我们从你的第一个问题开始。 您需要更新Label中的文本。 一个很好的方法是使用tkinter s StringVar class。 更新StringVar也会更新Label中的文本,所以让我们先这样做。

countdown = tk.StringVar()
countdown.set("00:00:00")

然后将其设置为Label中的文本。

label = tk.Label(root, textvariable=countdown, width=9, font=("calibri", 40, "bold"))

现在已经处理好了。 让我们继续你的第二个问题。 你缺乏回调函数。 首先让我们设置一个 function 来调用它,它接受可变的秒数来倒计时。

要在root.mainloop()之后显示某些内容,我们可以使用after()方法。 它将返回一个标识符,我们可以在以后使用它来取消更新。 但是,为了在后面的另一个 function 中使用它来取消,我们应该使用关键字global将其设为全局变量。

root.after需要一个毫秒参数和一个 function 在这些毫秒过去后调用。 让我们再次调用这个 function,比调用时少一毫秒。 此外,如果秒数低于 0,我们应该取消回调。

我们可以使用root.after_cancel来做到这一点,并将我们之前从root.after检索到的after标识符交给它。

需要注意的另一件事是root.after的 function 参数需要 function object。 为了给它一个带有参数的 function,我们可以将它包装在 lambda 中。

def update(seconds):
    global after
    if seconds >= 0:
        countdown.set(seconds_to_time(seconds))
        after = root.after(1000, lambda: update(seconds - 1))
    else:
        root.after_cancel(after)

但是这个seconds_to_time function 将我们的StringVar设置为什么呢? 好吧,它只是让我们的秒以正确的hh:mm:ss格式显示的小帮手。

def seconds_to_time(seconds):
    hours = seconds // 3600
    seconds -= hours * 3600
    minutes = seconds // 60
    seconds -= minutes * 60
    return f'{hours:02d}:{minutes:02d}:{seconds:02d}'

你最后的要求是停止倒计时。 我们可以通过取消我们的全局标识符来做到这一点。 最好通过避免NameError错误来确保我们已经设置了 after first,以防它尚未设置。

def stop():
    try:
        root.after_cancel(after)
    except NameError:
        pass

下面的完整代码:注意按钮的回调函数被包裹在 lambdas 中,以允许我们将参数传递给回调。

import tkinter as tk

def update(seconds):
    global after
    if seconds >= 0:
        countdown.set(seconds_to_time(seconds))
        after = root.after(1000, lambda: update(seconds - 1))
    else:
        root.after_cancel(after)

def seconds_to_time(seconds):
    hours = seconds // 3600
    seconds -= hours * 3600
    minutes = seconds // 60
    seconds -= minutes * 60
    return f'{hours:02d}:{minutes:02d}:{seconds:02d}'

def stop():
    try:
        root.after_cancel(after)
    except NameError:
        pass


#GUI
root = tk.Tk()
root.title("Tequila timer")

#Load of background with the tequila bottle
canvas = tk.Canvas(root, width=423, height=700)
canvas.pack()
Load = tk.PhotoImage(file="tequila.png")
canvas.create_image(211, 350, image=Load)

countdown = tk.StringVar()
countdown.set("00:00:00")

#buttons
btn_1min = tk.Button(root, text="1 min", width=10, height=5, command=lambda: update(60))
btn_1min_v = canvas.create_window(140, 350, window=btn_1min)

btn_10min = tk.Button(root, text="10 min", width=10, height=5, command=lambda: update(600))
bt1_10min_v = canvas.create_window(283, 350, window=btn_10min)

btn_1hour = tk.Button(root, text="1 hour", width=10, height=5, command=lambda: update(3600))
bt1_1hour_v = canvas.create_window(140, 475, window=btn_1hour)

btn_2hours = tk.Button(root, text="2 hours", width=10, height=5, command=lambda: update(7200))
bt1_2hours_v = canvas.create_window(283, 475, window=btn_2hours)

btn_stop = tk.Button(root, text="Stop", width=10, height=5, command=stop)
bt1_stop_v = canvas.create_window(211, 600, window=btn_stop)

#Display
label = tk.Label(root, textvariable=countdown, width=9, font=("calibri", 40, "bold"))
label.pack()
label_v = canvas.create_window(211, 200, window=label)

root.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM