[英]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.