tyrel.cloud


All posts tagged:


Python Break Timer

Updated by Tyrel on 2021-12-05

Summary

Here's a break timer that I created in jupyter notebook/lab for a python class I teach at various universities.

Import Modules

import time
import datetime as dt
try:from IPython.display import clear_output
except:pass
import subprocess

Define Functions

def clear_out():
    '''quick and dirty multi-platform way to clear output'''
    try:subprocess.run('clear'.split())
    except:pass
    try:clear_output(wait=True)
    except:pass
    try:subprocess.run('cls'.split())
    except:pass
def typewriter(input_str, pause_time=.22):
    '''simulate a typewriter'''
    for i in str(input_str):
        print(i, end='', flush=True)
        time.sleep(pause_time)

# typewriter('Demo')
def what_time():
    '''Create a DateTime Object from User Input'''
    try:
        break_time_over = input('''        
        Enter an "end time" in one of these formats:
        10:30 PM (12 hour clock) HH:MM AM|PM
        22:30    (24 hour clock) HH:MM
        30       (minutes only)     MM

        ''').upper().strip()
        cur_time = dt.datetime.now().replace(microsecond=0)
        if 'AM' in break_time_over or 'PM' in break_time_over:
            end_dt_obj = dt.datetime.strptime(break_time_over, '%I:%M %p')
            end_dt_obj = cur_time.replace(hour=end_dt_obj.hour,\
                                          minute=end_dt_obj.minute)
        elif ':' in break_time_over:
            end_dt_obj = dt.datetime.strptime(break_time_over, '%H:%M')
            end_dt_obj = cur_time.replace(hour=end_dt_obj.hour,\
                                          minute=end_dt_obj.minute)
        else:
            end_dt_obj = cur_time + dt.timedelta(minutes=float(break_time_over))
        return end_dt_obj
    except Exception as e:
        clear_out()
        print(f'Invalid Input: {e}')
        return what_time()

# what_time()
def break_timer():
    try:
        end_dt_obj = what_time()
        while True:
            cur_time = dt.datetime.now().replace(microsecond=0)
            clear_out()
            remaining_time = end_dt_obj - cur_time
            info = f'''
            \t{"Python Break Timer":.^37}
            \tEnd Time:{end_dt_obj.strftime("%I:%M:%S %p"):_>28}
            \tCurrent Time:{cur_time.strftime("%I:%M:%S %p"):_>24}
            \tTime Remaining:{str(remaining_time):_>19}
            '''.replace('  ','')
            print(info)
            if cur_time >= end_dt_obj:
                info = f'\t{" BREAK TIME IS OVER! ":=^37}\n\n'                      
                typewriter(info)
                break
            time.sleep(1)
    except Exception as error:
        print(f'ERROR: {error}')

Invoke

if __name__ == '__main__':
    break_timer()
Feel like I missed something? Let me know in the comments!