from tkinter import *
import time
#ポモドーロタイマーの秒数を設定。仕事時間、短い休憩、長い休憩モードの3種類
work_sec = 25 * 60 #25分
shortBreak_sec = 5 * 60 #5分
longBreak_sec = 15 * 60 #15分
#テスト用。テスト用に3秒を設定中。本番では以下の3行を削除する
work_sec = 3
shortBreak_sec = 3
longBreak_sec = 3
#Pomodoroカウントの初期値0を設定する
work_counter = 0
shortBreak_counter = 0
longBreak_counter = 0
class myTimer():
def __init__(self):
#Tkinterのメインの枠を設定
self.root = Tk()
self.root.title("Pomodoro")
self.root.geometry("300x200")
self.time_counted = 0
#初期設定で一時停止及びリセットの設定をオフにしておく
self.pause = False
self.isPauseClicked = False
self.stop = False
#初期設定は、仕事時間モードのみTrueとしておく
self.timeForWork = True
self.timeForShortBreak = False
self.timeForLongBreak = False
#画面に表示させるメッセージ、ボタンを配置するフレームを整備する-----
self.grid_layout = Frame(self.root)
self.grid_layout.pack(pady = 5)
#デフォルトで表示するメッセージ”Pomodoro Timer”
self.message_label = Label(self.grid_layout, text="Pomodoro Timer", font=("Arial", 16, "bold"))
self.message_label.grid(pady=5, columnspan=5, row=0)
self.pomodoro_timer_label = Label(self.grid_layout, text="25:00", font=("Arial", 24))
self.pomodoro_timer_label.grid(row=2, columnspan=4, pady=10)
self.button_start = Button(self.grid_layout, text="Start", font=("Arial", 12), command=self.start_timer)
self.button_start.grid(column=1, row=4, padx=5, pady=5)
self.button_pause = Button(self.grid_layout, text="Pause", font=("Arial", 12), command=self.pause_timer)
self.button_pause.grid(column=2, row=4, padx=5, pady=5)
self.button_reset = Button(self.grid_layout, text="Reset", font=("Arial", 12), command=self.reset_timer)
self.button_reset.grid(column=3, row=4, padx=5, pady=5)
self.timer_counter_label = Label(self.grid_layout, text="Pomodoro: 0", font=("Arial", 12), pady=10)
self.timer_counter_label.grid(row=5, columnspan=4)
#---------------------------------------------------------------------
self.root.mainloop()
#ポモドーロタイマー開始、一時停止、リセット機能の設定
def start_timer(self): #タイマー開始
self.pause = False
self.stop = False
self.count_down()
def pause_timer(self): #一時停止
self.pause = True
self.isPauseClicked = True
def reset_timer(self): #タイマーリセット
global work_counter, shortBreak_counter, longBreak_counter
self.stop = True
self.message_label.config(text="Time for Work", font=("Arial",16, "bold"))
self.pomodoro_timer_label.config(text="25:00")
self.timer_counter_label.config(text="Pomodoro: 0")
work_counter = 0
shortBreak_counter = 0
longBreak_counter = 0
#カウントダウン機能(スタートボタンを押すとこの関数が発動される)
def count_down(self):
global work_counter,shortBreak_counter,longBreak_counter
while self.pause == False and self.stop == False:
#3つのモードそれぞれの計算パターンを用意する
if self.timeForWork == True: #メインの仕事時間の場合
if self.isPauseClicked == True:
pass
else:
self.message_label.config(text="Time for Work", font=("Arial", 16, "bold"))
self.currentTime_counting = work_sec
work_counter += 1
self.timer_counter_label.config(text=f"Pomodoro: {work_counter}")
#もしPauseボタンがクリックされた場合はその時点の時間を取得する
if self.isPauseClicked == True:
self.currentTime_counting = self.time_counted
elif self.timeForShortBreak == True: #Short breakの場合
self.message_label.config(text="Short break", font=("Arial", 16, "bold"))
self.currentTime_counting = shortBreak_sec
#もしPauseボタンがクリックされた場合はその時点の時間を取得する
if self.isPauseClicked == True:
self.currentTime_counting = self.time_counted
elif self.timeForLongBreak == True: #Long breakの場合
self.message_label.config(text="Long break", font=("Arial", 16, "bold"))
self.currentTime_counting = longBreak_sec
#もしPauseボタンがクリックされた場合はその時点の時間を取得する
if self.isPauseClicked == True:
self.currentTime_counting = self.time_counted
self.isPauseClicked = False #これが漏れると、一時停止後の再スタートでタイマーが正しく動かなくなる
#カウントダウンのロジック
for self.jikan in range(self.currentTime_counting, -1, -1):
minutes, seconds = divmod(self.jikan, 60)
self.pomodoro_timer_label.configure(text=f"{minutes:02d}:{seconds:02d}")
#要学習:minutes, secondsを分ける目的は何?
self.root.update()
time.sleep(1)
#これを入れるとPause後の再スタートが上手くゆく
self.time_counted = self.jikan
#Pauseの場合はタイマーの計算を止める
if self.pause == True:
self.isPauseClicked = True
break
#ストップの場合はタイマーの計算を完全停止し、初期値に戻す
if self.stop == True:
break
#self.jikanがゼロになった場合、どのモードに移るかを設定する
if self.jikan == 0:
if self.timeForWork == True:
self.timeForWork = False
#Pomodoroの仕事時間が4サイクル回った場合にはLong breakに移る(繰り返す)
if work_counter % 4 == 0 and shortBreak_counter != 0:
self.timeForLongBreak = True
self.timeForShortBreak = False
#4サイクルでなければShort breakに移る
else:
self.timeForShortBreak = True
self.timeForLongBreak = False
#Short breakの場合、Short breakのカウンターを1増やす
elif self.timeForShortBreak == True:
shortBreak_counter += 1
self.timeForShortBreak = False
self.timeForWork = True
#Long breakの場合、Long breakのカウントを1増やす
elif self.timeForLongBreak == True:
longBreak_counter += 1
self.timeForLongBreak = False
self.timeForWork = True
myTimer() #classをこれで閉じないとPythonをRunしたときにアプリが起動しない
#今後に向けて改善できそうなこと
#・フォント、フォントカラーの変更
#・ポモドーロ開始した時刻を表示させる
#・ウィンドウ背景に画像を入れる
#・タイマー時間をユーザーが自由に設定できるようにする
#・タイマーが稼働している間、Startボタンの操作不可とする
#・タイマーの残時間が徐々に少なくなってくることをバーで表示させる