番茄工作法,一直耳闻,从未实践过。
之前预习迎考,时有动力不足、精力不集中等状况发生,效率低下,一天时间不知不觉就过去。
而且对于实际的复习时间没有把握,不知道时间丢到哪里去了,也不知道自己的效率究竟如何,只有模糊的认知——不高。
没有准确的认知,就没有良好有效的改进。
看来没有点统计数据是不行的。
怎么办呢,要简单易行的,试试番茄工作法。
怎么用呢,当然是使用工具。所谓君子性非异也,善假于物也。
对于我这种以台式电脑为生产力工具的人,得有个桌面软件来帮助我。搜索一番找到两个工具:番茄盒子,番茄土豆,功能很丰富,不过感觉有点繁琐,对于我这种初步接触的人不是很友好。
想了想,实际上我要的就是一个简单直观的固定几十分钟的倒计时显示,时间到了就提醒,轻松重复使用。
需求确定后发现,使用python很容易开发这个小工具,谷歌+stackoverflow很快实现了我的目标,使用pyinstaller生成exe执行文件为9M大小,可以接受。
窗体效果为一个半透明悬浮小框,置于桌面右下角,始终置顶。使用步骤为:点开应用程序就开始第一个番茄钟的倒计时,一般番茄钟为25+5即25分钟的工作+5分钟的休息,我根据个人喜好改为40+10,40分钟到后会响铃提醒,显示休息10分钟的倒计时。休息后,点击悬浮图标即可重新开始。
是不是很容易上手呢,有兴趣的朋友可以尝试,链接:http://pan.baidu.com/s/1i4EwWVb 密码:ugl5
代码github
效果图
这个小工具的效果还不错,总结下有4个优点:
- 能让我快速开始,快速进入状态,打开电脑后点开程序就直接开始计时,防止拖延。
- 让我在一段时间内有意识地排除其他干扰集中精力去做一件事。
- 能让我有清晰的时间概念,比如一件事花了多少个番茄钟,一天内实现了多少个番茄钟,很容易统计。
- 它能提醒我休息,看电脑很容易麻木,然后就陷于低效率工作无法自拔,适当放空反而更好,劳逸结合。
代码
- 基于tkinter,python自带的图形界面框架
# 生成可执行文件
# pyinstaller countdown.py --onefile --noconsole --noupx
import time
import datetime
import winsound
import tkinter as tk
time_end = datetime.datetime.now() + datetime.timedelta(minutes=40)
time_zero = datetime.timedelta(seconds=0)
def beep():
global time_end
for i in range(2):
winsound.Beep(440, 250) # frequency, duration
time.sleep(0.25) # in seconds (0.25 is 250ms)
winsound.Beep(600, 250)
time.sleep(0.25)
winsound.PlaySound("SystemExit", winsound.SND_ALIAS)
clock.config(text=u"开始休息")
time_end = datetime.datetime.now() + datetime.timedelta(minutes=10)
clock.after(1000, tick)
def restart():
global time_end
time_end = datetime.datetime.now() + datetime.timedelta(minutes=40)
clock.config(command=lambda: root.destroy())
tick()
def pause():
time.sleep(2)
clock.config(text=u"再战一回", bg='#dfd')
flag = 1
def tick():
global time_end, flag
deltatime = time_end - datetime.datetime.now()
if deltatime < time_zero:
if flag == 1:
flag = 0
clock.config(text=u"成功番茄", bg='red')
clock.config(command=restart)
clock.after(500, beep)
else:
flag = 1
clock.config(text=u"休息完毕")
clock.after(500, pause)
else:
deltatime = str(deltatime).split('.')[0]
clock.config(text=deltatime)
# calls itself every 1s
# to update the time display as needed
# after为利用tk自身的事件循环机制进行延时调用
clock.after(1000, tick)
root = tk.Tk() # create a Tk root window
# root.overrideredirect(True)
# -----------------隐藏标题边框 始-------------------- #
root.attributes('-alpha', 0.0) #For icon
#root.lower()
root.iconify()
window = tk.Toplevel(root)
# -----------------设定窗口位置 始-------------------- #
w = 140 # width for the Tk root
h = 50 # height for the Tk root
# get screen width and height
ws = root.winfo_screenwidth() # 屏幕尺寸 宽 x
hs = root.winfo_screenheight() # height of the screen 高 y
# calculate x and y coordinates for the Tk root window
x = ws - w - 100
y = hs - h - 60
# set the dimensions of the screen and where it is placed
# root.geometry('%dx%d+%d+%d' % (w, h, x, y))
window.geometry('%dx%d+%d+%d' % (w, h, x, y))
# -----------------设定窗口位置 终-------------------- #
window.overrideredirect(1) #Remove border
window.attributes('-topmost', 1)
window.attributes('-alpha', 0.5)
#Whatever buttons, etc
# close = tk.Button(window, text = "Close Window", command = lambda: root.destroy())
# -----------------隐藏标题边框 终-------------------- #
# ----------------- 主要控件设置与主循环 ------------- #
# root.wm_attributes("-topmost", 1) # 窗口置顶
# clock = tk.Label(window, font=('times', 20, 'bold'), bg='green')
clock = tk.Button(window,
font=('times', 20, 'bold'),
bg='#dfd',
command=lambda: root.destroy(),
# command = lambda: root.destroy()
)
clock.pack(fill='both', expand=True)
tick()
window.mainloop()
# another:
# https://stackoverflow.com/questions/10596988/making-a-countdown-timer-with-python-and-tkinter
# tkinter Window Always on Top :
# https://www.daniweb.com/programming/software-development/threads/42766/keeping-python-window-on-top-of-others
# set window postion
# https://stackoverflow.com/questions/14910858/how-to-specify-where-a-tkinter-window-opens
# remove window title bar, border
# https://stackoverflow.com/questions/31085533/how-to-remove-just-the-window-border
# Play simple beep with python without external library
# https://stackoverflow.com/questions/4467240/play-simple-beep-with-python-without-external-library
其他
- 其他人的electron实现,略大,40多M: pomolectron