티스토리 뷰

 

여는 글

지금 이 글을 쓰는 중에도 뽀모도로 타이머는 돌아가고 있다.

 

 

그래도 시간은 흐른다.

 

  무려, 2019년 12월에 '뽀모도로 타이머 만들기 기획편'을 올렸으니, 대략 3년 가까운 시간이 지났다. 언제쯤 후속 포스팅이 올라오는지 기다렸던 분들에게는 죄송하다는 말씀을 먼저 드리고 싶다. 이 모든 것은 주인장의 나태함과 게으름 때문이리라.

 

🔻이전 글 

https://dreamsailor.tistory.com/12

 

[홈프로젝트] Python으로 뽀모도로 타이머 만들기 1화 기획편

특별 기획 홈프로젝트 1탄! Python으로 뽀모도로 타이머 만들기 일단 거창하게 홈프로젝트라는 기획 명으로 콘텐츠를 만들어 보았다. 사실 별건 아니고, 그냥 평소에 "이런 게 있었으면 좋았을 텐

dreamsailor.tistory.com

 

  결론부터 이야기하면, 현재는 Focus To Do🍅라는 프로그램으로 정착했다. 게으름만 피우다가, 결국 상용 프로그램을 쓰게 됐다는 웃픈(?) 이야기. 나의 경우엔 쭉 오래 쓸거라 생각했기에 아예 무제한 버전을 결제했다. UI도 깔끔한 편이고, 무엇보다 기록을 통계로 뽑아준다는 점. 그리고 멀티 디바이스를 지원하여, PC, 모바일, 태블릿 어떤 환경에서도 기록을 이어나갈 수 있다는 점이 좋았다.

 

인터페이스는 깔끔하고 직관적인 게 최고다.
대학원생의 삶이란... 물론 매일 이렇게 살면 일찍 죽을지도 모른다.

 

 


 

뽀모도로 타이머 구현 코드

 

  그런데 갑자기 왜 실천편을 쓰게 되었는지 의아하게 여기실 수 있다고 생각한다. 대학원에 진학한 이후로 부족한 코딩 스킬을 메우고자 이리저리 건드려보고 있는 중에 파이썬 스터디를 시작하게 되었고, 해당 코스 안에 뽀모도로 타이머를 만드는 프로젝트가 있었던 것이다. 뽀모도로 타이머를 파이썬으로 구현해본 것도 좋았지만, 오늘 포스팅을 결심하게 된 이유는 사실 내가 듣고 있는 Udemy 강좌가 퀄리티가 너무 좋기 때문이다. 좋은 것은 나눠야 한다는 것이 학계의 정설.

 

  먼저 이 글을 읽고 계신 분들은, 아마 파이썬을 활용한 뽀모도로 타이머 구현이 궁금하신 분들일 것이라 생각하고, 내가 작성한 코드 및 결과물부터 공유하려 한다.

 

🔻 작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from tkinter import *
import math
# ---------------------------- CONSTANTS ------------------------------- #
PINK = "#e2979c"
RED = "#e7305b"
GREEN = "#9bdeac"
YELLOW = "#f7f5dd"
FONT_NAME = "Courier"
WORK_MIN = 1#25
SHORT_BREAK_MIN = 1#5
LONG_BREAK_MIN = 1#20
reps = 0
check_txt = ""
timer = None
 
# ---------------------------- TIMER RESET ------------------------------- # 
def reset_timer():
    window.after_cancel(timer)
    # timer_text 00:00
    canvas.itemconfig(timer_text, text=f"00:00")
    # title_label "Timer"
    title_lb.config(text="Timer", fg=GREEN, bg=YELLOW, highlightthickness=0
font=(FONT_NAME, 45"bold"))
    # reset check_marks
    check_lb.config(text="", fg=GREEN, bg=YELLOW, highlightthickness=0
font=(FONT_NAME, 20"bold"))
    global reps
    reps = 0
 
# ---------------------------- TIMER MECHANISM ------------------------------- # 
def start_timer():
    global reps
    work_sec = WORK_MIN * 61
    short_break_sec = SHORT_BREAK_MIN * 60
    long_break_sec = LONG_BREAK_MIN * 60
 
    if reps % 2 == 0:
        count_down(work_sec)
        print(f"{reps} - working time")
        title_lb.config(text="Work", fg=GREEN, bg=YELLOW, highlightthickness=0
font=(FONT_NAME, 45"bold"))
    else:
        if reps % 4 == 1 and reps != 1:
            count_down(long_break_sec)
            title_lb.config(text="Break", fg=RED, bg=YELLOW, highlightthickness=0,
                            font=(FONT_NAME, 45"bold"))
            print(f"{reps} - long break time")
        else:
            count_down(short_break_sec)
            title_lb.config(text="BREAK", fg=PINK, bg=YELLOW, highlightthickness=0,
                            font=(FONT_NAME, 45"bold"))
            print(f"{reps} - short break time")
 
# ---------------------------- COUNTDOWN MECHANISM ------------------------------- # 
def count_down(count):
    global reps, check_txt, timer
    count_min = math.floor(count / 60)
    count_sec = count % 60
 
    canvas.itemconfig(timer_text, text=f"{count_min:02d}:{count_sec:02d}")
    if count > 0:
        timer = window.after(100, count_down, count - 1)
    else:
        reps += 1
        start_timer()
        if reps % 2 == 1:
            check_txt = check_txt + "✓"
            check_lb.config(text=check_txt)
 
# ---------------------------- UI SETUP ------------------------------- #
window = Tk()
window.title("Pomodoro")
window.config(padx=100, pady=50, bg=YELLOW)
 
canvas = Canvas(width=200, height=224, bg=YELLOW, highlightthickness=0)
tomato_img = PhotoImage(file="tomato.png")
canvas.create_image(100112, image=tomato_img)
timer_text = canvas.create_text(103130, text="00:00", fill="white"
font=(FONT_NAME, 35"bold"))
canvas.grid(row=2, column=1)
 
title_lb = Label(text="Timer", fg=GREEN, bg=YELLOW, highlightthickness=0
font=(FONT_NAME, 45"bold"))
title_lb.grid(row=1, column=1)
 
check_lb = Label(fg=GREEN, bg=YELLOW, highlightthickness=0, font=(FONT_NAME, 20"bold"))
check_lb.grid(row=4, column=1)
 
start_btn = Button(text="Start", font=(FONT_NAME, 20"bold"), bg='white', command=start_timer)
reset_btn = Button(text="Reset", font=(FONT_NAME, 20"bold"), bg='white', command=reset_timer)
 
start_btn.grid(row=3, column=0)
reset_btn.grid(row=3, column=2)
 
window.mainloop()
cs
 
   

 

  tkinter를 활용하여, UI를 구현하였으며 해당 프로젝트를 구현하는 단계가 OOP(객체지향프로그래밍) 파트 이 전에 나오기 때문에, 단순한 구조로 프로그래밍되었음을 양해 바란다. 코드를 살펴보면 알겠지만, tkinter에서 제공하는 기본적인 라이브러리를 어떻게 잘 사용하여 코드가 의도한 대로 동작하게 만드는지가 핵심이다. 강사님께서는 구현하고자 하는 내용을 잘게 쪼개고, 순차적으로 만들어 나가는 botton-up 스타일을 강조하신다. 

 

결과물도 나름 그럴싸하다.

 

 


 

안젤라 Python 부트캠프 100 days

 

  현재 진행 중인 파이썬 스터디는 각자 강의를 들으면서 공부하고, 서로 일주일마다 진도를 체크해주는 방식으로 운영되고 있다. 스터디원 중에 한 분께서 추천해준 강의로 시작했는데, 만족도가 매우 높아서 간단히 소개 드리고자 한다. 이 강의는 내 돈 내산으로 결제한 것임을 밝혀두며, 절대 광고가 아니므로 안심하셔도 된다.

 

  강의명은 '안젤라 Python 부트캠프 100 days'이고, Udemy를 통해서 제공되고 있다. Udemy는 다니고 있는 회사에서 무료로 라이센스를 지원해주기 때문에 나에겐 익숙한 교육 플랫폼이었지만, 대부분의 강의가 영어였기 때문에 활용도가 매우 높지는 않았다. 그러나 최근에 웅진씽크빅에서 차츰 강의를 한글화 해주고 있어서, 예전보다는 진입 장벽이 많이 낮아진 편이다.

 

현재 학습 진행률은 50% 정도

 

 

  거의 절반 정도 강의를 들은 상태인데, 강사님의 설명도 친절하고 무엇보다 제공하는 프로젝트의 수준이 괜찮다. 리플잇에서 바로 실행할 수 있는 예제 템플릿을 제공하고, 대부분의 IDE에서 바로 실행할 수 있는 소스 파일도 제공한다. 코드는 듣는 것이 아니라, 구현하면서 배우는 것이라 생각하기 때문에 이러한 강의의 구성이 마음에 들었다. 

 

구현하면서 배우는 신나는 코딩

 

간단한 퀴즈도 중간중간 배치되어 있다.

 

  여담으로, 강사님은 영국에서 활동하고 계신 분인데 이력이 참 괴랄하다. 런던 유니버시티 컬리지를 졸업하셨고, 의사 자격증도 갖고 있으면서 프로그래머로도 일하고 있다. 우리나라로 치면 이젠 정치계로 빠지신 어떤 국회의원이 떠오르기도 하는데 읍읍... 여기까지만 말하고 넘어가겠다.💦

 

의사 + 프로그래밍 = ?

 

 


 

 

마치며...

 

  뽀모도로 타이머 실천편 포스팅이라 해놓고, 쓰다 보니 강의 추천 포스팅이 되어버렸다. 그래도 이렇게나마 계획했던 프로젝트를 달성해서 오래 묵혀 뒀던 숙제가 해결된 기분이다. 항상 느끼는 것이지만, 일단 시작하는 것이 가장 중요하다. 하고자 하는 마음이 있다면 어떻게든 마무리할 수 있는 날이 반드시 오기 마련이다.

 

 

 

 

댓글
공지사항