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