プログラミングの勉強をしています。言語はPython。初心者です。全くの経験のない人間が今から始めても時代の流行りに流されているだけ、と言われるかもしれませんが…これからの時代はプログラミングの基礎知識をもっておくことが必要だ、ということを見聞きしてから実際に勉強を始めました。ロシアでの業務でマクロに触れるようになり、その面白さを体験しつつ今では初学者にもお勧めとされているPythonを触っています。実際に手を動かしてみて、思った通りに動くことを見るのは最高の気分です。といっても、思った通りのものを作って感動している…そんなレベルには到底及びません。
それでも、教材の中で取り上げられた”Pomodoro Timer“。これはまさに自分に必要としているもので、自分が追加したい機能を付け加えて作ってみることにしました。
分からない部分は、ただただひたすらインターネットでGoogle検索か試行錯誤の繰り返し。分からないなりに、それでも兎にも角にも自分の思っている通りに動くものを作ってみること。それが大切だということで、やっと完成したコードが以下になります。きっと、学習を重ねてゆくうえで成長できることを期待しつつ、見様見真似で苦労しつつ何とか作り上げたコードをありのまま、飾らずに見せることも何かの役に立つのでしょうか…?そう願っています。
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 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 |
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ボタンの操作不可とする #・タイマーの残時間が徐々に少なくなってくることをバーで表示させる |
参考URL:
上記の2つの内容を参考にして作成しました。
https://www.udemy.com/course/100-days-of-code/
このUdemy教材で取り上げられたPomodoro題材がきっかけとなり、Pomodoro Timerを作成しました。この教材で取り上げられているPomodoro Timerのコードは、ほぼ同じ内容が以下のStackoverflowに掲載されています。私自身、このコードにPause機能を追加したくても出来ず、やむを得ずUdemy教材をベースとしたPomodoro Timerを作成するのは断念しました。全く同じことを考え、悩んでいる人がいるんだな、とちょっぴり嬉しくなった一方で、あたかも自分でコードを作成している、といった論調はどうなのだろう…参考にした出典元は明記すべきではないでしょうか…。
https://stackoverflow.com/questions/70422973/pause-and-resume-for-tkinter-pomodoro-clock