第1回:https://syachiku.net/python-timer1/
第2回:https://syachiku.net/python-timer2/
第3回:https://syachiku.net/python-timer3/<-今回
第4回:https://syachiku.net/python-timer4/
第5回:https://syachiku.net/python-timer5/
前回( 第2回)の続きです。
ここまでで、「秒」についてのタイマー動作ができるようになりました。引き続き「分」の部分から作っていきます。
完成時のイメージは以下のようになります。
3-1. 残り時間の計算部分の作成
残り時間の「分」を作っていきます。分を繰り下げるアルゴリズムを考えます。
やり方はいくつかあると思いますが、私は以下の様にしました。
分の要素も前回の秒と同様に最初にフォーム値(__text_min)を受け取ってから残り時間(__remain_min)に入れます。
処理としては「分」が0より上だったら秒を1減らします。秒がマイナス1になったら分を1つ減らして秒を59にセットします。コードを見たほうが早いですね(;’∀’)
// timer_main.py
def click_timer_button(self):
self.__remain_min.set(int(self.__text_min.get()))
self.__remain_sec.set(int(self.__text_sec.get()))
self.exec_timer()
def exec_timer(self):
__tmp_time_min = int(self.__remain_min.get())
__tmp_time_sec = int(self.__remain_sec.get())
if __tmp_time_min >= 0:
__tmp_time_sec -= 1
self.__remain_sec.set(str(__tmp_time_sec))
if __tmp_time_sec == -1:
__tmp_time_min -= 1
self.__remain_min.set(str(__tmp_time_min))
self.__remain_sec.set("59")
self.__frame.after(1000, self.exec_timer)
タイマーとしてカウントダウン処理がされていることを確認できます。分の動作が正しいことも合わせて確認してみましょう。
ここまでで、ほぼタイマーとして中心となる機能が完成です!
あとは周りに必要は要素を追加していきましょう。
3-2. ボタンの表示を切り替え
次は残っているボタン周りから作っていきます。まずは表示の切り替え部分だけを作ります。
ボタンの表示は「__text_start_stop_button」で制御していました。
切り替えるだけなら単純にclick_timer_buttonメソッドの先頭で変更すればよいのですが、StopとStartを切り替える必要がります。
def click_timer_button(self):
self.__text_start_stop_button.set("Stop")
self.__remain_min.set(int(self.__text_min.get()))
self.__remain_sec.set(int(self.__text_sec.get()))
self.exec_timer()
そのため、ボタンの状態についても制御する必要があります。そのため最初に宣言だけはしておいた「__start_status」を使います。
もし「__start_status」がTrue=Startボタンが押されたとしてタイマー処理を行います。逆にFalse=Stopボタンが押されたとして処理を止めます。
// timer_main.py
def click_timer_button(self):
if self.__start_status:
self.__start_status = False
self.__text_start_stop_button.set("Stop")
self.__remain_min.set(int(self.__text_min.get()))
self.__remain_sec.set(int(self.__text_sec.get()))
self.exec_timer()
else:
self.__start_status = True
self.__text_start_stop_button.set("Start")
ボタンが正しく切り替わっていることが分かると思います。
ただ、タイマーは動き続けており、うまく停止されていません。これはafterで実行しているexec_timerが動き続けているからです。
3-2. Stopボタンでタイマーを停止する
Stopボタンが押された際にタイマーを停止するように設定します。
exec_timerの先頭に「if not self.__start_status:」を追加して「__start_status」がTrueの時だけ処理をするようにしています。
合わせてStopを押された時に残り時間も初期状態に戻してます。
def click_timer_button(self):
if self.__start_status:
self.__start_status = False
self.__text_start_stop_button.set("Stop")
self.__remain_min.set(int(self.__text_min.get()))
self.__remain_sec.set(int(self.__text_sec.get()))
self.exec_timer()
else:
self.__start_status = True
self.__text_start_stop_button.set("Start")
self.__remain_sec.set(str("-"))
self.__remain_min.set(str("-"))
def exec_timer(self):
if not self.__start_status:
__tmp_time_min = int(self.__remain_min.get())
__tmp_time_sec = int(self.__remain_sec.get())
if __tmp_time_min >= 0:
__tmp_time_sec -= 1
self.__remain_sec.set(str(__tmp_time_sec))
if __tmp_time_sec == -1:
__tmp_time_min -= 1
self.__remain_min.set(str(__tmp_time_min))
self.__remain_sec.set("59")
self.__frame.after(1000, self.exec_timer)
正しくタイマーとしてStartとStopが制御できるようになりました!!
まとめ
今回でタイマーの基本動作は完成できました。残っているアイテムを引き続き実装していきましょう。
要件にある黄塗の3つが完了となります。
Timerで設定できるのは「分」と「秒」とし、それぞれがフォーム入力可能とする(第1回)ボタンは1つとして、開いたタイミングでは「Start」を表示(第1回)「Start」ボタンをクリックするとタイマーが開始され、1秒単位でカウントダウンする(第2回)- 0秒になったらアラートのポップアップメッセージを表示する(今回はTkinerのmesageboxで実装する)
「Start」ボタンを押したらタイマーが開始され、ボタンが「Stop」の表示に切り替わるStopを押したらタイマーが停止する残り時間として「分」と「秒」を表示する- 上と共に「推定での終わる時刻」を表示する。M/D hh:mm:ss形式とする
- 「推定での終わる時刻」は1分で随時更新される
次回は残ってる中からタイマーが終了で0秒になった時の動きを実装します。
第3回終了時のGithubコード
以下に保管してますので参考にどうぞ
Pythonのオススメ勉強方法
私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全」です。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。
内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
今回は以上となります。
コメント