用Python打造具备多档时长与多种功能的番茄钟小工具
用Python打造具备多档时长与多种功能的番茄钟小工具
在快速生活的当下,时间安排成了很多人头疼的问题。大家都在探讨如何更好地利用时间,这时番茄钟这个小帮手便显得格外有用,仿佛是时间管理中的得力助手。番茄钟的设计非常人性化。例如,在处理一些日常事务时,30分钟的番茄时间就足够使用。不同的工作对专注时间的需求不同,番茄钟恰如其分地满足了这一需求。若学生在备考时使用番茄钟来学习,他们能通过数据了解自己在不同科目上的实际学习时长。
在快速生活的当下,时间安排成了很多人头疼的问题。大家都在探讨如何更好地利用时间,这时番茄钟这个小帮手便显得格外有用,仿佛是时间管理中的得力助手。
番茄钟的多种时长设置
番茄钟的设计非常人性化。它根据不同人的工作步调,提供了30分钟、45分钟和60分钟三种时长选择。这与实际的工作环境紧密相连。例如,在处理一些日常事务时,30分钟的番茄时间就足够使用。比如办公室的文员在30分钟内集中精力整理文件,就能高效地完成一小部分工作。而对于创意性工作或较为复杂的任务,60分钟的设置可能更为适宜。比如程序员在编写复杂的代码时,60分钟的工作时间能让他们更深入地开发,降低被打扰的风险。不同的工作对专注时间的需求不同,番茄钟恰如其分地满足了这一需求。
不同的时长安排,适用于各种场合。比如,在家阅读深奥的专业书籍,45分钟的番茄工作法可能更有助于理解。而在图书馆搜集资料撰写论文,可以根据不同阶段的任务来挑选时长,60分钟可能有助于完成一小节内容的资料搜集和初稿撰写。
实用的番茄统计功能
番茄统计功能给用户提供了不少方便。它能精确计算出在一定时间段内,每天或每周总共使用了多少个番茄时间。上班族能清楚地了解自己在连续工作周期中,实际有效利用时间的情况。比如,一位销售人员通过查看番茄统计,发现每周有效的客户沟通时间仅20个番茄时间,大约是16个小时(以每个番茄25分钟计算),于是他意识到需要调整工作方法,以增加与客户交流的有效时长。
这项功能对学生群体同样有益。若学生在备考时使用番茄钟来学习,他们能通过数据了解自己在不同科目上的实际学习时长。例如,若发现自己在数学上的学习时间仅为英语的一半,学生便会意识到需要调整学习时间的分配。
休息期间音乐功能的人性化
休息时的音乐播放设计得很贴心。它能帮助人们在休息时放松心情和身体。对于在办公室辛勤工作的人来说,短短5分钟的休息中,柔和的放松音乐能快速减轻压力。不过,也有人可能不希望在休息时听音乐,这时番茄钟功能可以关闭音乐。在处理繁忙的财务报告期间,财务人员可能只想安静地休息5分钟。而在呼叫中心工作的员工,他们可能更愿意在休息时播放一些轻松的音乐,以缓解高强度工作带来的疲惫。
音乐操控同样智能高效。休息一旦结束,音乐便会自动暂停,以免干扰那些准备重新投入工作或学习的人。比如,一位自媒体工作者在短暂休息期间通过音乐来放松,休息完毕后音乐自动关闭,他便能迅速回归创作状态。
番茄钟结束的提醒功能
## 创建番茄计时函数
def tomato_clock(remain_time):
# 如果在休息时间未结束就开启番茄钟,则停止音乐
pygame.mixer.music.pause()
# 用来提醒用户选择番茄钟时长,为选择的话,就跳出函数,结束线程
if remain_time == 0:
lb3.configure(text='请先选择番茄钟时长')
return
print(remain_time)
# gmtime这里是将时间转化为计算机可处理的时间格式即time_t到tm类型的转换;不是重点,知道是格式转化即可
# strptime()函数将字符串转换为datetime
begin_time = time.strftime('%M:%S', time.gmtime(remain_time))
# 将时间内容打印到界面上
lb2.configure(text=begin_time)
lb3.configure(text='总时间/剩余时间')
# 用于保证番茄钟线程或者休息线程只有一个能存在,这个也是本人觉得比较巧的一个点
global thread_flag
if thread_flag:
thread_flag = False
else:
thread_flag = True
tmp_thread_flag = thread_flag
# 时间变化部分
for i in range(remain_time):
# 如果收到休息线程导致的thread_flag标志位的变化,则退出线程
if tmp_thread_flag != thread_flag:
return
remain_time -= 1
remain_time_str = time.strftime('/ %M:%S', time.gmtime(remain_time))
# 将时钟实时更新到界面上
lb1.configure(text=remain_time_str)
root.update()
time.sleep(1)
#时间到了,开启蜂鸣提醒与提示框提醒
if remain_time == 0:
Beep(500, 800)
tomato_count()
mymsg()
lb1.configure(text=begin_time)
#使用者确认后,自动进入休息模式
relax()
番茄钟的蜂鸣提示和弹出窗口非常方便。科研人员在实验室专心实验时,很容易忽略时间流逝。这时,蜂鸣声和弹出窗口能迅速提醒他们。这样,他们就能按时休息或开始下一个番茄时间。
设计师在进行设计工作时,若能适时得到提醒,便能有效避免疲劳。比如,当室内设计师在绘制房型效果图时,每次番茄工作法时间结束后,这样的提示便能让他的眼睛和大脑得到及时休息,从而更高效地投入到后续的工作中。
# 音乐控制函数,用来控制是否允许休息时播放音乐,其实本质只是静音而已,狗头.jpg
# 在定义时,music_flag已经初始化True,代表运行休息时播放音乐
def music_allow():
global music_flag #声明全局变量
# 如果已经是True(即不禁止音乐时),勾选了按钮,则music_flag 变为 False,禁止音乐
if music_flag:
music_flag = False
pygame.mixer.music.set_volume(0.0)
else:
# 代表取消勾选,不禁止音乐
music_flag = True
pygame.mixer.music.set_volume(0.5)
组件解析
为了达成这些出色的功能,番茄钟集成了多种组件。其中,负责界面设计的组件,它影响着用户操作的便捷程度和视觉美感。界面若显得杂乱无章,即便功能强大,用户的体验也会大打折扣。许多用户就发现,那些界面简洁、一目了然的番茄钟小工具,更容易被他们熟练掌握。
# 每当按钮点击后,就会产生一个线程,执行对应的功能,和主线程并行
# 以防止单线程的话,进入番茄钟或者休息时,界面中的其他功能按钮失效
# 开启番茄钟按钮,使用lambda构造匿名函数是因为command后接的函数如果有参数会失效,这点本人也不清楚,没去深究,直接匿名函数走去
# 同时daemon=True,即将线程设为守护线程,解决主线程退出时,其他线程不正常退出的问题
Button1 = tk.Button(root, text='开启一个番茄', bg='orange', fg='black', font='Verdana 13 bold',width=15,
height=1, command=lambda: threading.Thread(target=tomato_clock, daemon=True,args=(var.get(),)).start())
Button1.place(x=70, y=150)
# 休息一下按钮
Button2 = tk.Button(root, text='休息一下', bg='cornflowerblue', fg='black', font='Verdana 13 bold',
width=15,height=1,command=lambda:threading.Thread(target=relax,daemon=True).start())
Button2.place(x=70, y=200)
蜂鸣器提示音和音乐播放功能的模块不可或缺。其稳定性直接影响到番茄钟的整体功能稳定性。另外,time模块负责进行时间格式的转换,目的是保证番茄钟的设置与实际时间相符,防止出现混乱。
代码优化与借鉴
# -*- coding:utf-8 -*-
import tkinter as tk
import tkinter.messagebox
from winsound import Beep
import threading
import sys
import pygame
import time
# 用于统计完成的番茄钟个数
count = 0
# 线程切换标志
thread_flag = True
# 音乐开关标志
music_flag = True
# 调用Tk()创建主窗口
root = tk.Tk()
# 给主窗口起一个名字,也就是窗口的名字
root.title('Rio的番茄钟')
# 设置窗口大小:宽x高,注,此处不能为 "*",必须使用 "x"
root.geometry('460x300')
root.configure(bg='Tomato')
# 创建完成计时后的弹窗
def mymsg():
try:
tk.messagebox.showinfo("提示", "恭喜完成一个番茄钟!!记得休息一下")
except Exception as e:
print(type(e), e)
sys.exit()
# 休息结束弹窗
def mymsg2():
tk.messagebox.showinfo("提示", "休息完毕!")
# 创建番茄计时函数
# strptime()函数将字符串转换为datetime
def tomato_clock(remain_time):
# 如果在休息时间未结束就开启番茄钟,则停止音乐
pygame.mixer.music.pause()
# 避免未进行番茄钟时长选择
if remain_time == 0:
lb3.configure(text='请先选择番茄钟时长')
return
print(remain_time)
begin_time = time.strftime('%M:%S', time.gmtime(remain_time))
lb2.configure(text=begin_time)
lb3.configure(text='总时间/剩余时间')
global thread_flag
if thread_flag:
thread_flag = False
else:
thread_flag = True
tmp_thread_flag = thread_flag
for i in range(remain_time):
if tmp_thread_flag != thread_flag:
return
remain_time -= 1
remain_time_str = time.strftime('/ %M:%S', time.gmtime(remain_time))
lb1.configure(text=remain_time_str)
root.update()
time.sleep(1)
if remain_time == 0:
Beep(500, 800)
tomato_count()
mymsg()
lb1.configure(text=begin_time)
relax()
# 创建番茄计数的函数
def tomato_count():
global count
count = 1
lb4.configure(text=count)
# 创建休息时间函数
def relax():
remain_time = 480 # 休息8分钟
begin_time = time.strftime('%M:%S', time.gmtime(remain_time))
lb2.configure(text=begin_time)
lb3.configure(text='总时间/剩余时间')
# 线程标志,用于结束旧线程
global thread_flag
if thread_flag:
thread_flag = False
else:
thread_flag = True
tmp_thread_flag = thread_flag
pygame.mixer.music.play(-1)
for i in range(remain_time):
if tmp_thread_flag != thread_flag:
return
remain_time -= 1
remain_time_str = time.strftime('/ %M:%S', time.gmtime(remain_time))
lb1.configure(text=remain_time_str)
root.update()
time.sleep(1)
if remain_time == 0:
pygame.mixer.music.pause()
mymsg2()
lb1.configure(text=begin_time)
# 音乐控制函数
def music_allow():
global music_flag
# 如果已经是True(即不禁止音乐时),勾选了按钮,则music_flag 变为 False,禁止音乐
if music_flag:
music_flag = False
pygame.mixer.music.set_volume(0.0)
else:
music_flag = True
pygame.mixer.music.set_volume(0.5)
if __name__ == "__main__":
#音乐初始化
pygame.mixer.init()
# 异常抛出,防止没有放音乐文件
try:
pygame.mixer.music.load('music.mp3')
except Exception as e:
print(type(e), e)
tk.messagebox.showinfo("提示", "无文件music.mp3或改文件路径不对")
sys.exit()
pygame.mixer.music.set_volume(0.5)
# 创建变量
var = tk.IntVar()
# 给变量赋初值为30
var.set(30)
# 番茄动态计时
lb1 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=7, height=1)
lb1.place(x=130, y=100)
# 番茄固定时间
lb2 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=5, height=1)
lb2.place(x=60, y=100)
# 剩余时间/总时间
lb3 = tk.Label(root, text=' ', bg='Tomato', fg='white', font='Verdana 16 bold', width=14, height=2)
lb3.place(x=50, y=44)
# 番茄个数显示
lb4 = tk.Label(root, text='0', bg='Tomato', fg='white', font='Verdana 16 bold', width=7, height=1)
lb4.place(x=90, y=20)
# 左上角的 番茄:
lb5 = tk.Label(root, text='已积累番茄:', bg='Tomato', fg='white', font='Verdana 16 bold', width=8, height=1)
lb5.place(x=5, y=20)
# 按钮
##创造一个frame来收纳按钮
fr1 = tk.LabelFrame(root,bg='LightGreen',text='选择番茄钟时长', relief='groove', bd=1,)
fr1.pack(side='right')
r1 = tk.Radiobutton(fr1, text='30min', variable=var, bg='LightGreen', value=1800)
r1.pack()
r2 = tk.Radiobutton(fr1, text='45min', variable=var, bg='LightGreen', value=2700)
r2.pack()
r3 = tk.Radiobutton(fr1, text='60min', variable=var, bg='LightGreen', value=3599)
r3.pack()
Checkbutton = tk.Checkbutton(fr1, text="是否禁止音乐", fg='black', bg='LightGreen', command=music_allow)
Checkbutton.pack()
# 开启一个番茄
#利用多线程,避免进入番茄钟后,退出按钮失效
Button1 = tk.Button(root, text='开启一个番茄', bg='orange', fg='black', font='Verdana 13 bold',width=15,
height=1, command=lambda: threading.Thread(target=tomato_clock, daemon=True,args=(var.get(),)).start())
Button1.place(x=70, y=150)
# 休息一下
Button2 = tk.Button(root, text='休息一下', bg='cornflowerblue', fg='black', font='Verdana 13 bold',
width=15, height=1, command=lambda: threading.Thread(target=relax, daemon=True).start())
Button2.place(x=70, y=200)
# 添加按钮,以及按钮的文本,并通过command 参数设置关闭窗口的功能
button = tk.Button(root, text="退出", fg='black', bg='YellowGreen', width=15, command=root.quit)
# 将按钮放置在主窗口内
button.place(x=105, y=250)
#开启主循环,让窗口处于显示状态
root.mainloop()
这个番茄钟工具并非从头开始打造。它参考了其他简易番茄钟的代码,并且作者在此基础上进行了增强和改进。这种做法是软件开发中常见的。在软件行业,借鉴与创造是相辅相成的。作者对此持开放态度,欢迎那些想要深入研究或改进工具的用户。例如,一个具备编程知识的兼职开发者,就有可能对番茄钟进行升级,增强其功能。这种开放性有助于番茄钟的持续进步。
你也想试一下这个番茄钟工具吗?它可以帮助你提高时间管理能力。不妨点个赞,分享给朋友,或者直接在评论区发表你的看法。