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の効果的な学習方法は「Udemy(ユーデミー)」によるビデオ学習です。

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

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

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

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

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

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

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

今回は以上となります。

コメント

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