当前位置: 代码网 > it编程>前端脚本>Python > 使用Python代码实现番茄钟功能

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

2026年03月21日 Python 我要评论
一、项目简介本代码是一款基于 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番茄钟功能内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com