使用Python代码实现番茄钟功能

 更新时间:2026年03月21日 14:49:41   作者: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番茄钟功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Jupyter notebook中5个有趣的魔法命令分享

    Jupyter notebook中5个有趣的魔法命令分享

    众​所周知,Jupyter notebook是一个交互式的Python shell,也就是IPython的封装版,非常适合用来进行数据分析和机器学习。本文为大家整理了Jupyter notebook中5个有趣的魔法命令,感兴趣的可以了解一下
    2022-07-07
  • 利用Pycharm + Django搭建一个简单Python Web项目的步骤

    利用Pycharm + Django搭建一个简单Python Web项目的步骤

    这篇文章主要介绍了利用Pycharm + Django搭建一个简单Python Web项目的步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • TensorFlow打印tensor值的实现方法

    TensorFlow打印tensor值的实现方法

    今天小编就为大家分享一篇TensorFlow打印tensor值的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • python常规方法实现数组的全排列

    python常规方法实现数组的全排列

    这篇文章主要介绍了python常规方法实现数组的全排列,实例分析了全排列的概念及Python常规实现技巧,需要的朋友可以参考下
    2015-03-03
  • Pandas中resample方法详解

    Pandas中resample方法详解

    这篇文章主要介绍了Pandas中resample方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python Pickle 实现在同一个文件中序列化多个对象

    Python Pickle 实现在同一个文件中序列化多个对象

    今天小编就为大家分享一篇Python Pickle 实现在同一个文件中序列化多个对象,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • Python统计序列和文件中元素的频度

    Python统计序列和文件中元素的频度

    这篇文章主要介绍了Python统计序列和文件中元素的频度,文章基于python的相关资料展开详细的内容介绍,具有一定的参考价值需要的小伙伴可以参考一下
    2022-04-04
  • Python实现在数字中添加千位分隔符的方法小结

    Python实现在数字中添加千位分隔符的方法小结

    在数据处理和数据可视化中,经常需要对大数值进行格式化,其中一种常见的需求是在数字中添加千位分隔符,本文为大家整理了三种常见方法,希望对大家有所帮助
    2024-01-01
  • Jupyter notebook运行Spark+Scala教程

    Jupyter notebook运行Spark+Scala教程

    这篇文章主要介绍了Jupyter notebook运行Spark+Scala教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python的字典和列表的使用中一些需要注意的地方

    Python的字典和列表的使用中一些需要注意的地方

    这篇文章主要介绍了Python的字典和列表的使用中一些需要注意的地方,字典和列表的使用是Python学习当中的基本功,需要的朋友可以参考下
    2015-04-04

最新评论