📜  使用Python Tkinter 创建番茄钟

📅  最后修改于: 2022-05-13 01:54:35.588000             🧑  作者: Mango

使用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()

输出: