使用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番茄钟功能内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Pytorch保存模型用于测试和用于继续训练的区别详解

    Pytorch保存模型用于测试和用于继续训练的区别详解

    今天小编就为大家分享一篇Pytorch保存模型用于测试和用于继续训练的区别详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • PyQt通过动画实现平滑滚动的QScrollArea

    PyQt通过动画实现平滑滚动的QScrollArea

    这篇文章主要为大家详细介绍了PyQt如何使用Qt的动画框架 QPropertyAnimation来实现平滑滚动的QScrollArea,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的可以学习一下
    2023-01-01
  • python列表嵌套引发的问题总结

    python列表嵌套引发的问题总结

    这篇文章主要介绍了python列表嵌套引发的问题总结,下面问文章引发问题来自日常工作总结,具有一定的参考价值需要的小伙伴可以参考一下
    2022-05-05
  • 利用Python进行数据可视化的实例代码

    利用Python进行数据可视化的实例代码

    数据可视化和数据挖掘都是探索数据和分析数据的一种手段,下面这篇文章主要给大家介绍了关于如何利用Python进行数据可视化的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • python实现tail实时查看服务器日志示例

    python实现tail实时查看服务器日志示例

    今天小编就为大家分享一篇python实现tail实时查看服务器日志示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • pycharm的console输入实现换行的方法

    pycharm的console输入实现换行的方法

    今天小编就为大家分享一篇pycharm的console输入实现换行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Django Haystack 全文检索与关键词高亮的实现

    Django Haystack 全文检索与关键词高亮的实现

    这篇文章主要介绍了Django Haystack 全文检索与关键词高亮的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • python数据库操作常用功能使用详解(创建表/插入数据/获取数据)

    python数据库操作常用功能使用详解(创建表/插入数据/获取数据)

    这篇文章主要介绍了python数据库操作常用功能使用方法:获取mysql版本、创建表、插入数据、slect获取数据等,下面看示例吧
    2013-12-12
  • Python 怎么定义计算N的阶乘的函数

    Python 怎么定义计算N的阶乘的函数

    这篇文章主要介绍了Python 怎么定义计算N的阶乘的函数,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Pycharm连接gitlab实现过程图解

    Pycharm连接gitlab实现过程图解

    这篇文章主要介绍了Pycharm连接gitlab实现过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论