반응형
Pomodoro 뽀모도로 공부 타이머 만들기 (feat. Python, Threading)
서론
'뽀모도로'(Pomodoro)는 이탈리아어로 토마토를 뜻한다. 프란체스코 시릴로가 대학생 시절 토마토 모양으로 생긴 요리용 타이머를 이용해 25분간 집중 후 휴식하는 일처리 방법을 제안한데서 그 이름이 유래했다.
동기
한 번 켜 놓으면 25분, 5분 타이머를 자동으로 실행하는 타이머를 PC에 만들고 싶었다.
코드 Code
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
import time
import threading
import tkinter as tk
from tkinter import ttk, PhotoImage
class PomodoroTimer:
def __init__(self):
self.root = tk.Tk()
self.root.geometry("600x300")
self.root.title("뽀모도로 타이머")
self.s = ttk.Style()
self.s.configure("TNotebook.Tab", font=("Ubuntu", 16))
self.s.configure("TButton", font=("Ubuntu", 16))
self.tabs = ttk.Notebook(self.root)
self.tabs.pack(fill="both", pady=10, expand=True)
self.tab1 = ttk.Frame(self.tabs, width=600, height=100)
self.tab2 = ttk.Frame(self.tabs, width=600, height=100)
self.tab3 = ttk.Frame(self.tabs, width=600, height=100)
self.pomodoro_timer_label = ttk.Label(self.tab1, text="25:00", font=("Ubuntu", 48))
self.pomodoro_timer_label.pack(pady=20)
self.pomodoro_short_break_timer_label = ttk.Label(self.tab2, text="05:00", font=("Ubuntu", 48))
self.pomodoro_short_break_timer_label.pack(pady=20)
self.pomodoro_long_break_timer_label = ttk.Label(self.tab3, text="15:00", font=("Ubuntu", 48))
self.pomodoro_long_break_timer_label.pack(pady=20)
self.tabs.add(self.tab1, text="Pomodoro")
self.tabs.add(self.tab2, text="5분 휴식")
self.tabs.add(self.tab3, text="15분 휴식")
self.grid_layout = ttk.Frame(self.root)
self.grid_layout.pack(pady=10)
self.start_button = ttk.Button(self.grid_layout, text="시작", command=self.start_timer_thread)
self.start_button.grid(row=0, column=0)
self.skip_button = ttk.Button(self.grid_layout, text="건너뛰기", command=self.skip_clock)
self.skip_button.grid(row=0, column=1)
self.reset_button = ttk.Button(self.grid_layout, text="초기화", command=self.reset_clock)
self.reset_button.grid(row=0, column=2)
self.pomodoro_counter_label = ttk.Label(self.grid_layout, text="Pomodoro: 0", font=("Ubuntu", 16))
self.pomodoro_counter_label.grid(row=1, column=0, columnspan=3, pady=10)
self.pomodoros=0
self.skipped = False
self.stopped = False
self.running = False
self.root.mainloop()
def start_timer_thread(self):
if not self.running:
t = threading.Thread(target=self.start_timer)
t.start()
self.running = True
def start_timer(self):
self.stopped = False
self.skipped = False
timer_id = self.tabs.index(self.tabs.select()) + 1
if timer_id == 1:
full_seconds = 60 * 25
while full_seconds > 0 and not self.stopped:
minutes, seconds = divmod(full_seconds, 60)
self.pomodoro_timer_label.configure(text=f"{minutes:02d}:{seconds:02d}")
self.root.update()
time.sleep(1)
full_seconds -= 1
if not self.stopped or self.skipped:
self.pomodoros += 1
self.pomodoro_counter_label.config(text=f"Pomodoros: {self.pomodoros}")
if self.pomodoros % 4 == 0:
self.tabs.select(2)
self.start_timer()
else:
self.tabs.select(1)
self.start_timer()
elif timer_id == 2:
full_seconds = 60 * 5
while full_seconds > 0 and not self.stopped:
minutes, seconds = divmod(full_seconds, 60)
self.pomodoro_short_break_timer_label.configure(text=f"{minutes:02d}:{seconds:02d}")
self.root.update()
time.sleep(1)
full_seconds -= 1
if not self.stopped or self.skipped:
self.tabs.select(0)
self.start_timer()
elif timer_id == 3:
full_seconds = 60 * 15
while full_seconds > 0 and not self.stopped:
minutes, seconds = divmod(full_seconds, 60)
self.pomodoro_long_break_timer_label.configure(text=f"{minutes:02d}:{seconds:02d}")
self.root.update()
time.sleep(1)
full_seconds -= 1
if not self.stopped or self.skipped:
self.tabs.select(0)
self.start_timer()
else:
print("Invalid timer id")
def reset_clock(self):
self.stopped = True
self.skipped = False
self.pomodoros = 0
self.pomodoro_timer_label.config(text="25:00")
self.pomodoro_short_break_timer_label.config(text="05:00")
self.pomodoro_long_break_timer_label.config(text="15:00")
self.pomodoro_counter_label.config(text="Pomodoros: 0")
self.running = False
def skip_clock(self):
current_tab = self.tabs.index(self.tabs.select())
if current_tab == 0:
self.pomodoro_timer_label.config(text="25:00")
elif current_tab == 1:
self.pomodoro_short_break_timer_label.config(text="05:00")
elif current_tab == 2:
self.pomodoro_long_break_timer_label.config(text="15:00")
self.stopped = True
self.skipped = True
PomodoroTimer()
|
cs |
Python에서 가장 간단하게 GUI를 구현할 수 있는 Tkinter 라이브러리를 활용했다.
구현 화면
반응형
'공부 > 파이썬 Python' 카테고리의 다른 글
Password Generator (자동 비밀번호 생성기) with Python (0) | 2022.01.29 |
---|---|
비밀번호 강력도 확인 (Password Strength Checker) with Python (0) | 2022.01.26 |
파이썬으로 3D 게임 만들기 (feat. Ursina) (0) | 2022.01.23 |
Python 3D 플로팅 연습하기 (0) | 2022.01.04 |
Python에서 나만의 HTTP Server 만들기 (0) | 2022.01.03 |
댓글