Program学習Python

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

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/

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

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

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

Pythonのオススメ勉強方法

私がオススメするPython初心者向けの最初に購入すべき書籍は「シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全です。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

この書籍は実際にシリコンバレーの一流エンジニアとして活躍している酒井潤さんが書いた本です。

内容も初心者から上級者までまとめられており、各Lessonも長すぎずに分かりやすくまとめられているので、初心者の方にもおすすめです。

シリコンバレー一流プログラマーが教える Pythonプロフェッショナル大全

今回は以上となります。

コメント