Program学習Python

PythonでTkinerを使ってTimerを作ってみる【その5】

Program学習

第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コード

以下に保管してますので参考にどうぞ

GitHub - gogoloon/python-timer at Lesson#5
Contribute to gogoloon/python-timer development by creating an account on GitHub.

Pythonのオススメ勉強方法

私がオススメするPythonの効果的な学習方法は「Udemy(ユーデミー)」によるビデオ学習です。

「Udemy」は、オンライン学習の提供サイトです。学びたい人は多くある講座の中から受講したいコースを選択することができ、動画で学べるのが特徴です。

多くあるPythonのコースの中でもオススメするPythonのコースは以下となります!!

現役シリコンバレーエンジニアが教えるPython 3 入門 + 応用 +アメリカのシリコンバレー流コードスタイル

このコースでは合計で28.5時間のビデオ講座があって、それらを受講するだけで、Pythonの基礎から応用まで学ぶことができます。

私も購入して受講していますが、内容としては初心者の方から上級者まで対応する幅広い内容になっています。

下手な書籍を何冊か購入するより、この動画コースを最初からじっくりと受けることで総合的なスキルを習得することができるできます。おそらくこれ以上の教材はないと思いますので、絶対おすすめです。

ちなみに、Udemyでは頻繁にセール(1か月に2,3回程度)が開催されているので、セールのタイミングで購入すれば90%OFFになる講座もあるため、セールが開催されてからの購入をオススメします!

今回は以上となります。

コメント

タイトルとURLをコピーしました