第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/<-今回
前回(第4回)の続きになります。
最後の「推定終了時刻」を表示する処理を追加します。
5-1. 推定の終了時刻を計算する
まず「推定」といっていることについて説明します。
今回利用しているafter関数では1秒(1,000ms)おきに処理を実行しています。そのため、PCのスペックや負荷状況によっては処理が遅くなり、正確な時間には処理できないためです。
そのことを考慮したうえで、今回はStartをクリックしたタイミングで終了予定時刻を表示します。
また、長期間のタイマーだと結構誤差が出るため、1分おきに終了予定時刻を変更するようにロジックを組みたいと思います。
まずは計算部分のメソッドとしてcalc_expect_finish_timeを作成します。
import tkinter as tk
import tkinter.messagebox as messagebox
from datetime import datetime
from datetime import timedelta
(省略)
def calc_expect_finish_time(self):
__remain_sec_total = int(self.__remain_min.get()) * 60 + int(self.__remain_sec.get())
__scheduled_finish_time = datetime.now() + timedelta(seconds=__remain_sec_total)
self.__scheduled_finish_time.set(__scheduled_finish_time.strftime('%m/%d %H:%M:%S'))
calc_expect_finish_timeの最初で残りの分と秒を計算して合計の秒に変更しています。
その後、datetimeを使って現在の日時を取得し、timedelta関数で残りの合計の秒を足しています。
最後に文字列形式として時刻をm/d HH:MM:SS形式に変換して __expect_finish_time変数にセットします。
5-2. タイマーに組み込む
最後に作った関数をTkinerに組み込んでいきます。
組み込む場所としては①クリック時と②1分経過したタイミングにします。
②については分をマイナス1しているところがありますのでその部分に組み込むことで分が繰り下がるタイミングで残り推定時間を見直すことができます。
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.calc_expect_finish_time()
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("-"))
self.__scheduled_finish_time.set(str("-"))
def exec_timer(self):
if not self.__start_status:
if int(self.__remain_min.get()) == 0 and int(
self.__remain_sec.get()) == 0:
self.__start_status = True
self.__text_start_stop_button.set("Start")
messagebox.showinfo("timer", "タイマーが終了しました!!")
else:
__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.calc_expect_finish_time()
self.__frame.after(1000, self.exec_timer)
def calc_expect_finish_time(self):
__remain_sec_total = int(self.__remain_min.get()) * 60 + int(self.__remain_sec.get())
__scheduled_finish_time = datetime.now() + timedelta(seconds=__remain_sec_total)
self.__scheduled_finish_time.set(__scheduled_finish_time.strftime('%m/%d %H:%M:%S'))
Stopボタンを押したときに推定時刻もリセットするのも忘れずにセットします。
動作を確認します。タイミングによっては分が繰り下がるタイミングで推定終了時刻も見直されていることが分かります。
まとめ
今回で最後になります。
これで最初に決めた要件についてはすべて完成しました。タイマーを作成することを通じてPythonおよびTkinterの理解の助けになれば幸いです!
Timerで設定できるのは「分」と「秒」とし、それぞれがフォーム入力可能とする(第1回)ボタンは1つとして、開いたタイミングでは「Start」を表示(第1回)「Start」ボタンをクリックするとタイマーが開始され、1秒単位でカウントダウンする(第2回)0秒になったらアラートのポップアップメッセージを表示する(今回はTkinerのmesageboxで実装する)(第4回)「Start」ボタンを押したらタイマーが開始され、ボタンが「Stop」の表示に切り替わる(第3回)Stopを押したらタイマーが停止する(第3回)残り時間として「分」と「秒」を表示する(第3回)上と共に「推定での終わる時刻」を表示する。M/D hh:mm:ss形式とする「推定での終わる時刻」は1分で随時更新される
第5回終了時のGithubコード
以下に保管してますので参考にどうぞ
Pythonのオススメ勉強方法
私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全」です。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。
内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。
シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全
今回は以上となります。
コメント