使用Python代碼實現(xiàn)番茄鐘功能
一、項目簡介
本代碼是一款基于 Python Tkinter 開發(fā)的極簡懸浮番茄鐘,僅 91 行核心代碼實現(xiàn)番茄工作法核心功能:自定義計時時長、懸浮置頂顯示、倒計時結(jié)束提醒、倒計時最后 1 秒背景閃爍提醒,兼顧實用性與視覺體驗,適配 Windows 系統(tǒng),代碼精簡且功能完整。
二、核心功能亮點
- 懸浮置頂設(shè)計:窗口置頂且透明背景,不遮擋其他操作,辦公學習時隨時可見;
- 自定義時長:支持 1-60 分鐘自定義計時(輸入異常自動重置為 25 分鐘);
- 視覺 + 聽覺雙重提醒:倒計時最后 1 秒背景高頻閃爍,計時結(jié)束觸發(fā)雙頻蜂鳴音;
- 極簡交互:僅輸入框 + 開始按鈕,操作無學習成本,符合番茄鐘 “專注” 核心訴求。
三、代碼核心邏輯拆解
| 代碼段 | 功能說明 |
|---|---|
| 1-18 行 | 初始化窗口:設(shè)置懸浮、置頂、透明背景、位置(屏幕右上角),定義核心變量(計時狀態(tài)、剩余時間等) |
| 19-29 行 | UI 搭建:極簡布局(計時顯示標簽 + 時長輸入框 + 開始按鈕),配色選用護眼淺綠 + 透明底色 |
| 30-33 行 | 時間格式化顯示:將秒數(shù)轉(zhuǎn)換為 “分:秒” 格式,實時更新標簽 |
| 34-45 行 | 倒計時核心:每秒遞減時間,最后 1 秒觸發(fā)背景閃爍,計時結(jié)束調(diào)用提醒邏輯 |
| 46-52 行 | 背景閃爍:最后 1 秒高頻切換背景色,強化視覺提醒 |
| 53-58 行 | 聽覺提醒:雙頻蜂鳴音(800Hz+1000Hz),兼容系統(tǒng)發(fā)聲異常場景 |
| 59-75 行 | 開始 / 重置邏輯:清空舊計時任務(wù)、校驗輸入時長、重置狀態(tài)變量、啟動新倒計時 |
| 76-80 行 | 程序入口:創(chuàng)建主窗口、實例化番茄鐘、啟動主循環(huán) |
四、創(chuàng)意設(shè)計思路
極簡主義:拒絕冗余 UI,僅保留核心交互元素,符合番茄鐘 “專注” 的使用場景;
沉浸式提醒:最后 1 秒背景閃爍 + 結(jié)束蜂鳴,避免錯過計時節(jié)點,比單一聲音提醒更有效;
容錯設(shè)計:輸入非數(shù)字 / 超出范圍自動重置為 25 分鐘,降低用戶操作失誤成本;
懸浮體驗:窗口固定在屏幕右上角,透明背景不干擾其他工作,兼顧 “可見” 與 “不打擾”。
五、使用說明
運行代碼后,番茄鐘窗口自動懸浮在屏幕右上角;
在輸入框中輸入 1-60 的數(shù)字(代表分鐘),點擊 “開始” 即可啟動倒計時;
倒計時最后 1 秒,窗口背景會高頻閃爍;
計時結(jié)束后,系統(tǒng)會發(fā)出雙頻蜂鳴音提醒,同時自動重置為設(shè)定時長。
六、代碼創(chuàng)新點
僅 91 行代碼實現(xiàn)完整番茄鐘功能,無冗余邏輯,變量命名簡潔易懂;
結(jié)合視覺(背景閃爍)+ 聽覺(蜂鳴)雙重提醒,比傳統(tǒng)番茄鐘更人性化;
透明懸浮窗口設(shè)計,適配多場景使用(辦公、學習、刷題等);
輸入容錯機制,避免用戶誤操作導致程序異常。
七、項目代碼
安裝Python環(huán)境后,新建.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()到此這篇關(guān)于使用Python代碼實現(xiàn)番茄鐘功能的文章就介紹到這了,更多相關(guān)Python番茄鐘功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Pytorch保存模型用于測試和用于繼續(xù)訓練的區(qū)別詳解
今天小編就為大家分享一篇Pytorch保存模型用于測試和用于繼續(xù)訓練的區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
PyQt通過動畫實現(xiàn)平滑滾動的QScrollArea
這篇文章主要為大家詳細介紹了PyQt如何使用Qt的動畫框架 QPropertyAnimation來實現(xiàn)平滑滾動的QScrollArea,文中的示例代碼講解詳細,具有一定的借鑒價值,感興趣的可以學習一下2023-01-01
python實現(xiàn)tail實時查看服務(wù)器日志示例
今天小編就為大家分享一篇python實現(xiàn)tail實時查看服務(wù)器日志示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
pycharm的console輸入實現(xiàn)換行的方法
今天小編就為大家分享一篇pycharm的console輸入實現(xiàn)換行的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Django Haystack 全文檢索與關(guān)鍵詞高亮的實現(xiàn)
這篇文章主要介紹了Django Haystack 全文檢索與關(guān)鍵詞高亮的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-02-02
python數(shù)據(jù)庫操作常用功能使用詳解(創(chuàng)建表/插入數(shù)據(jù)/獲取數(shù)據(jù))
這篇文章主要介紹了python數(shù)據(jù)庫操作常用功能使用方法:獲取mysql版本、創(chuàng)建表、插入數(shù)據(jù)、slect獲取數(shù)據(jù)等,下面看示例吧2013-12-12

