美文网首页工具集工具癖python
工具向——简易番茄钟

工具向——简易番茄钟

作者: treelake | 来源:发表于2017-07-06 12:52 被阅读302次

    番茄工作法,一直耳闻,从未实践过。
    之前预习迎考,时有动力不足、精力不集中等状况发生,效率低下,一天时间不知不觉就过去。
    而且对于实际的复习时间没有把握,不知道时间丢到哪里去了,也不知道自己的效率究竟如何,只有模糊的认知——不高。
    没有准确的认知,就没有良好有效的改进。
    看来没有点统计数据是不行的。
    怎么办呢,要简单易行的,试试番茄工作法。
    怎么用呢,当然是使用工具。所谓君子性非异也,善假于物也。
    对于我这种以台式电脑为生产力工具的人,得有个桌面软件来帮助我。搜索一番找到两个工具:番茄盒子番茄土豆,功能很丰富,不过感觉有点繁琐,对于我这种初步接触的人不是很友好。
    想了想,实际上我要的就是一个简单直观的固定几十分钟的倒计时显示,时间到了就提醒,轻松重复使用
    需求确定后发现,使用python很容易开发这个小工具,谷歌+stackoverflow很快实现了我的目标,使用pyinstaller生成exe执行文件为9M大小,可以接受。
    窗体效果为一个半透明悬浮小框,置于桌面右下角始终置顶。使用步骤为:点开应用程序就开始第一个番茄钟的倒计时,一般番茄钟为25+5即25分钟的工作+5分钟的休息,我根据个人喜好改为40+10,40分钟到后会响铃提醒,显示休息10分钟的倒计时。休息后,点击悬浮图标即可重新开始
    是不是很容易上手呢,有兴趣的朋友可以尝试,链接:http://pan.baidu.com/s/1i4EwWVb 密码:ugl5
    代码github

    效果图



    这个小工具的效果还不错,总结下有4个优点:

    1. 能让我快速开始,快速进入状态,打开电脑后点开程序就直接开始计时,防止拖延
    2. 让我在一段时间内有意识地排除其他干扰集中精力去做一件事。
    3. 能让我有清晰的时间概念,比如一件事花了多少个番茄钟,一天内实现了多少个番茄钟,很容易统计。
    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

    相关文章

      网友评论

      本文标题:工具向——简易番茄钟

      本文链接:https://www.haomeiwen.com/subject/sekhhxtx.html