使用Python代码实现番茄钟功能
作者:Amour恋空
这篇文章主要介绍了基于 Python Tkinter 开发的极简悬浮番茄钟,仅 91 行核心代码实现番茄工作法核心功能:自定义计时时长、悬浮置顶显示、倒计时结束提醒、倒计时最后 1 秒背景闪烁提醒,兼顾实用性与视觉体验,需要的朋友可以参考下
一、项目简介
本代码是一款基于 Python Tkinter 开发的极简悬浮番茄钟,仅 91 行核心代码实现番茄工作法核心功能:自定义计时时长、悬浮置顶显示、倒计时结束提醒、倒计时最后 1 秒背景闪烁提醒,兼顾实用性与视觉体验,适配 Windows 系统,代码精简且功能完整。
二、核心功能亮点
- 悬浮置顶设计:窗口置顶且透明背景,不遮挡其他操作,办公学习时随时可见;
- 自定义时长:支持 1-60 分钟自定义计时(输入异常自动重置为 25 分钟);
- 视觉 + 听觉双重提醒:倒计时最后 1 秒背景高频闪烁,计时结束触发双频蜂鸣音;
- 极简交互:仅输入框 + 开始按钮,操作无学习成本,符合番茄钟 “专注” 核心诉求。
三、代码核心逻辑拆解
| 代码段 | 功能说明 |
|---|---|
| 1-18 行 | 初始化窗口:设置悬浮、置顶、透明背景、位置(屏幕右上角),定义核心变量(计时状态、剩余时间等) |
| 19-29 行 | UI 搭建:极简布局(计时显示标签 + 时长输入框 + 开始按钮),配色选用护眼浅绿 + 透明底色 |
| 30-33 行 | 时间格式化显示:将秒数转换为 “分:秒” 格式,实时更新标签 |
| 34-45 行 | 倒计时核心:每秒递减时间,最后 1 秒触发背景闪烁,计时结束调用提醒逻辑 |
| 46-52 行 | 背景闪烁:最后 1 秒高频切换背景色,强化视觉提醒 |
| 53-58 行 | 听觉提醒:双频蜂鸣音(800Hz+1000Hz),兼容系统发声异常场景 |
| 59-75 行 | 开始 / 重置逻辑:清空旧计时任务、校验输入时长、重置状态变量、启动新倒计时 |
| 76-80 行 | 程序入口:创建主窗口、实例化番茄钟、启动主循环 |
四、创意设计思路
极简主义:拒绝冗余 UI,仅保留核心交互元素,符合番茄钟 “专注” 的使用场景;
沉浸式提醒:最后 1 秒背景闪烁 + 结束蜂鸣,避免错过计时节点,比单一声音提醒更有效;
容错设计:输入非数字 / 超出范围自动重置为 25 分钟,降低用户操作失误成本;
悬浮体验:窗口固定在屏幕右上角,透明背景不干扰其他工作,兼顾 “可见” 与 “不打扰”。
五、使用说明
运行代码后,番茄钟窗口自动悬浮在屏幕右上角;
在输入框中输入 1-60 的数字(代表分钟),点击 “开始” 即可启动倒计时;
倒计时最后 1 秒,窗口背景会高频闪烁;
计时结束后,系统会发出双频蜂鸣音提醒,同时自动重置为设定时长。
六、代码创新点
仅 91 行代码实现完整番茄钟功能,无冗余逻辑,变量命名简洁易懂;
结合视觉(背景闪烁)+ 听觉(蜂鸣)双重提醒,比传统番茄钟更人性化;
透明悬浮窗口设计,适配多场景使用(办公、学习、刷题等);
输入容错机制,避免用户误操作导致程序异常。
七、项目代码
安装Python环境后,新建.py文件,复制保存,双击运行即可
import tkinter as tk
from tkinter import ttk
import time
import winsound
class TomatoClock:
def __init__(self, root):
self.root = root
self.root.title("番茄钟")
self.root.geometry("320x200")
self.root.overrideredirect(True)
self.root.wm_attributes("-topmost", 1)
self.root.update_idletasks()
sw = self.root.winfo_screenwidth()
self.root.geometry(f"320x200+{sw-330}+10")
self.tc = "#000001"
self.root.wm_attributes("-transparentcolor", self.tc)
self.root.wm_attributes("-alpha", 0.95)
self.lg = "#90EE90"
self.is_running = False
self.work_time = 25 * 60
self.remaining = self.work_time
self.timer_id = None
self.flash_count = 0
self.is_flashing = False
self.setup_ui()
self.update_display()
def setup_ui(self):
self.mf = tk.Frame(self.root, bg=self.tc, highlightthickness=0)
self.mf.place(relwidth=1, relheight=1)
self.tl = tk.Label(self.mf, text="25:00", font=("微软雅黑", 42, "bold"), bg=self.tc, fg=self.lg)
self.tl.pack(pady=5)
self.bf = tk.Frame(self.mf, bg=self.tc)
self.bf.pack(pady=15)
self.te = ttk.Entry(self.bf, width=8)
self.te.insert(0, "25")
self.te.grid(row=0, column=0, padx=5)
self.sb = ttk.Button(self.bf, text="开始", command=self.start_timer, width=8)
self.sb.grid(row=0, column=1, padx=5)
def update_display(self):
m = self.remaining // 60
s = self.remaining % 60
self.tl.config(text=f"{m:02d}:{s:02d}")
def countdown(self):
if self.is_running and self.remaining > 0:
if self.remaining == 1 and not self.is_flashing:
self.is_flashing = True
self.flash_background()
self.remaining -= 1
self.update_display()
self.timer_id = self.root.after(1000, self.countdown)
elif self.remaining == 0:
self.is_running = False
self.is_flashing = False
self.alarm()
self.flash_count = 0
self.mf.config(bg=self.tc)
self.tl.config(bg=self.tc)
self.remaining = self.work_time
self.update_display()
def flash_background(self):
if self.is_flashing and self.flash_count < 20:
cb = self.mf.cget("bg")
nb = self.lg if cb == self.tc else self.tc
self.mf.config(bg=nb)
self.tl.config(bg=nb)
self.flash_count += 1
self.root.after(50, self.flash_background)
def alarm(self):
try:
winsound.Beep(800, 500)
winsound.Beep(1000, 500)
except:
pass
def start_timer(self):
if self.timer_id:
self.root.after_cancel(self.timer_id)
self.is_flashing = False
self.flash_count = 0
self.mf.config(bg=self.tc)
self.tl.config(bg=self.tc)
try:
cm = int(self.te.get())
if cm <= 0 or cm > 60:
cm = 25
self.te.delete(0, tk.END)
self.te.insert(0, "25")
except ValueError:
cm = 25
self.te.delete(0, tk.END)
self.te.insert(0, "25")
self.work_time = cm * 60
self.remaining = self.work_time
self.is_running = True
self.update_display()
self.countdown()
if __name__ == "__main__":
r = tk.Tk()
app = TomatoClock(r)
r.mainloop()到此这篇关于使用Python代码实现番茄钟功能的文章就介绍到这了,更多相关Python番茄钟功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
