使用Python Tkinter 创建番茄钟
在本文中,我们将了解如何使用Python Tkinter 创建番茄钟。
为什么是番茄钟?
专注于学习或工作是时间管理中最重要的部分。在专注于工作时,我们总是搞砸时间管理。幸运的是,您可以通过专注于工作然后休息片刻放松来管理您的时间。番茄工作法是更可取的技术,可以专注于特定时间的工作而不会分心。番茄钟在创建有效的时间管理系统方面发挥着重要作用。
首先,您需要完成一项任务并连续工作 25 分钟,不要分心。 25 分钟的时间段结束后,休息 5 分钟。在这 5 分钟内,您可以通过听音乐或短播客来放松大脑。每天重复这个过程 4 到 5 次,你会看到一个巨大的变化。
使用Python Tkinter 创建番茄钟
番茄工作从 25 分钟开始,你需要专注 25 分钟。一旦 25 分钟的时间段结束,您可以使用 Tkinter 消息框提示信息。休息时间也是如此。
现在,一旦我们导入了所需的库,接下来就是创建一个 GUI 干扰。 Pomodoro 在意大利语中的意思是“番茄”。为了使这个 GUI 看起来更逼真,我们将使用番茄图像作为背景图像。您可以使用 Canvas 小部件将背景图像添加到 Tkinter 应用程序。最后谈到项目的最后一部分是对倒数计时器进行编程。
我们将使用时间模块来处理倒数计时器。既然你现在已经熟悉番茄工作法,那么首先创建一个 25 分钟工作的命令函数。初始化分、秒变量并将工作和休息时间的总秒数存储在一个变量中。递减计数器并每秒更新一次 GUI 窗口。一旦计数达到零,您应该从工作切换到休息,反之亦然。当您专注于工作时,如何知道计数为零?您可以在此处使用 Tkinter 消息框。此外,您甚至可以实现一个 playsound 模块并在计数为 0 时播放小音乐。
这是在 Tkinter 中编写定时器语法的技巧:
由于初始时间为 25 分钟,因此首先将分钟转换为秒。
Python3
# timer = minutes*60
timer = 25*60 #for work
timer = 5*60 #for break
Python3
# divmod syntax: divmod(x,y) => returns tuple (x//y,x%y)
minute, second = divmod(1366, 60)
print(minute)
print(second)
Python3
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
from playsound import playsound
import time
class Pomodoro:
def __init__(self, root):
self.root = root
def work_break(self, timer):
# common block to display minutes
# and seconds on GUI
minutes, seconds = divmod(timer, 60)
self.min.set(f"{minutes:02d}")
self.sec.set(f"{seconds:02d}")
self.root.update()
time.sleep(1)
def work(self):
timer = 25*60
while timer >= 0:
pomo.work_break(timer)
if timer == 0:
# once work is done play
# a sound and switch for break
playsound("sound.ogg")
messagebox.showinfo(
"Good Job", "Take A Break, \
nClick Break Button")
timer -= 1
def break_(self):
timer = 5*60
while timer >= 0:
pomo.work_break(timer)
if timer == 0:
# once break is done,
# switch back to work
playsound("sound.ogg")
messagebox.showinfo(
"Times Up", "Get Back To Work, \
nClick Work Button")
timer -= 1
def main(self):
# GUI window configuration
self.root.geometry("450x455")
self.root.resizable(False, False)
self.root.title("Pomodoro Timer")
# label
self.min = tk.StringVar(self.root)
self.min.set("25")
self.sec = tk.StringVar(self.root)
self.sec.set("00")
self.min_label = tk.Label(self.root,
textvariable=self.min, font=(
"arial", 22, "bold"), bg="red", fg='black')
self.min_label.pack()
self.sec_label = tk.Label(self.root,
textvariable=self.sec, font=(
"arial", 22, "bold"), bg="black", fg='white')
self.sec_label.pack()
# add background image for GUI using Canvas widget
canvas = tk.Canvas(self.root)
canvas.pack(expand=True, fill="both")
img = Image.open('pomodoro.jpg')
bg = ImageTk.PhotoImage(img)
canvas.create_image(90, 10, image=bg, anchor="nw")
# create three buttons with countdown function command
btn_work = tk.Button(self.root, text="Start",
bd=5, command=self.work,
bg="red", font=(
"arial", 15, "bold")).place(x=140, y=380)
btn_break = tk.Button(self.root, text="Break",
bd=5, command=self.break_,
bg="red", font=(
"arial", 15, "bold")).place(x=240, y=380)
self.root.mainloop()
if __name__ == '__main__':
pomo = Pomodoro(tk.Tk())
pomo.main()
好的,现在我们已经准备好了计时器,我们需要在每一秒后递减它。这可以使用 time.sleep(1) 来实现。
但是在 GUI 中配置分钟和秒时可能会出现主要问题。由于计时器以秒为单位,我们的递减量也将以秒为单位,即 1500、1499、1498 等等。要显示分钟和秒,我们将使用以下公式:
#for minutes: timer//60
#for seconds: timer%60
例如,考虑到第 1366 秒,我们将使用 divmod()函数实现上述公式。
Python3
# divmod syntax: divmod(x,y) => returns tuple (x//y,x%y)
minute, second = divmod(1366, 60)
print(minute)
print(second)
使用的文件:
声音.ogg
下面是实现:
Python3
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk
from playsound import playsound
import time
class Pomodoro:
def __init__(self, root):
self.root = root
def work_break(self, timer):
# common block to display minutes
# and seconds on GUI
minutes, seconds = divmod(timer, 60)
self.min.set(f"{minutes:02d}")
self.sec.set(f"{seconds:02d}")
self.root.update()
time.sleep(1)
def work(self):
timer = 25*60
while timer >= 0:
pomo.work_break(timer)
if timer == 0:
# once work is done play
# a sound and switch for break
playsound("sound.ogg")
messagebox.showinfo(
"Good Job", "Take A Break, \
nClick Break Button")
timer -= 1
def break_(self):
timer = 5*60
while timer >= 0:
pomo.work_break(timer)
if timer == 0:
# once break is done,
# switch back to work
playsound("sound.ogg")
messagebox.showinfo(
"Times Up", "Get Back To Work, \
nClick Work Button")
timer -= 1
def main(self):
# GUI window configuration
self.root.geometry("450x455")
self.root.resizable(False, False)
self.root.title("Pomodoro Timer")
# label
self.min = tk.StringVar(self.root)
self.min.set("25")
self.sec = tk.StringVar(self.root)
self.sec.set("00")
self.min_label = tk.Label(self.root,
textvariable=self.min, font=(
"arial", 22, "bold"), bg="red", fg='black')
self.min_label.pack()
self.sec_label = tk.Label(self.root,
textvariable=self.sec, font=(
"arial", 22, "bold"), bg="black", fg='white')
self.sec_label.pack()
# add background image for GUI using Canvas widget
canvas = tk.Canvas(self.root)
canvas.pack(expand=True, fill="both")
img = Image.open('pomodoro.jpg')
bg = ImageTk.PhotoImage(img)
canvas.create_image(90, 10, image=bg, anchor="nw")
# create three buttons with countdown function command
btn_work = tk.Button(self.root, text="Start",
bd=5, command=self.work,
bg="red", font=(
"arial", 15, "bold")).place(x=140, y=380)
btn_break = tk.Button(self.root, text="Break",
bd=5, command=self.break_,
bg="red", font=(
"arial", 15, "bold")).place(x=240, y=380)
self.root.mainloop()
if __name__ == '__main__':
pomo = Pomodoro(tk.Tk())
pomo.main()
输出: