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

时间:2020-08-08 22:21:06

标签: python python-3.x tkinter

我是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()

1 个答案:

答案 0 :(得分:2)

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

因此,让我们从第一个问题开始。您需要更新Label中的文本。一个不错的方法是使用tkinter的{​​{1}}类。更新StringVar也会同时更新StringVar中的文本,因此请先执行该操作。

Label

,然后将其设置为countdown = tk.StringVar() countdown.set("00:00:00") 中的文本。

Label

现在已经解决了。让我们继续第二个问题。您缺少回叫功能。首先,让我们设置一个要调用的函数,该函数接受可变的秒数进行倒计时。

要在调用label = tk.Label(root, textvariable=countdown, width=9, font=("calibri", 40, "bold")) 之后显示某些内容,可以使用root.mainloop()方法。它将返回一个标识符,我们以后可以使用它来取消更新。但是,为了稍后在另一个函数中使用它来取消,我们应该使其成为带有关键字after()的全局变量。

global接受毫秒参数,并在经过毫秒后调用函数。让我们以比调用时少一毫秒的时间再次调用此函数。另外,如果秒数降至0以下,我们应该取消回调。

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

要注意的另一件事是root.after的function参数需要一个功能对象。要将其传递给带有参数的函数,我们可以将其包装在lambda中。

root.after

但是此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设置为什么?好吧,以适当的StringVar格式显示秒数只是一个小帮手。

hh:mm:ss

您最后的要求是停止倒计时。我们可以通过取消全局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}' 错误而首先设置后一个。

NameError

完整代码如下: 请注意,按钮的回调函数包装在lambda中,使我们可以将参数传递给回调。

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