Pythonでストップウォッチをつくろう

python
python

Pythonでストップウォッチをつくってみた

まずは簡単なものからバージョンアップしていきます。

Pythonでストップウォッチをしてみました!

少し前にメトロノームをつくってみましたが、そのつながりでストップウォッチをつくろうと思い立ちました。
非常に簡単なので、Pythonを少しさわりはじめた人が作るのに最適です!
(2021年6月13日:学習開始114日目 PyQさんで勉強中!

オンラインPython学習サービス「PyQ™(パイキュー)」


時間に関する曲はたくさんあって選ぶのが大変ですが、今回は、「Doin’ Time」という曲をピックアップします。
Sublime というバンドの Sublime という超名盤に収録されている「Doin’ Time」です。
このアルバムでは、夏の暑さやハイテンションのアッパーな部分だけでなく、夏のけだるさや雨といったダウナーな雰囲気も含んだ唯一無二の超名盤です。
夏の浜辺やドライブで聞きたい感じです。
で、2019年にはローテンションの歌姫 Lana Del Rey が 「Doin’ Time」をカバーしています。
こちらのバージョンは、落ち着いた雰囲気でカフェで聞きたい感じです。


では、ストップウォッチをつくって遊ぼう!!

本プログラムのGitHubページ

1.最小単位のストップウォッチ

まずは、最小単位のストップウォッチをつくってみましょう。

プログラムの流れとしては、
 ①:ストップウォッチ開始
 ②:開始時刻記録
 ③:ストップウォッチ停止
 ④:停止時刻記録
 ⑤:計測時間 = 停止時刻 – 開始時刻
となります。

時間の記録は標準モジュールの「timeモジュール」で出来ます。
では、プログラムを書いてみましょう

import time

start_signal = input('Push "ENTER" to Start')
start_time = time.time()
stop_signal = input('Push "ENTER" to Stop')
stop_time = time.time()
result = stop_time - start_time
print(f"Stop Time:{result:.3f} sec")

結果はこのようになります。

Push "ENTER" to Start
Push "ENTER" to Stop
Stop Time:4.366 sec

とても簡単ですね。
ここからバージョンアップしていきましょう。

2.バージョンアップ① ~時間表示~

最小単位のストップウォッチをバージョンアップしていきましょう。
ここでは「時間表示を変換」します。
現行の表示では、時間は「秒」で表されています。
これを「[時]:[分]:[秒]:[ミリ秒(3ケタ)]」で表したと思います。

まずは、秒→分の変換です。
例えば、145秒=2分25秒ですね。
これは、145 ÷ 60 = 2 あまり 25という計算をしています。

Pythonの場合、
 ・X // Y → XをYで割った整数部
 ・X % Y → XをYで割ったあまり

 (通常の割り算は X / Y
となります。
これを応用すれば、「秒→分」「分→時」が計算できます。

次に「ミリ秒」の計算です。
これば、秒表示の小数点以下のみを抽出できればよさそうです。
int(X)はXの小数点以下を切り捨てた整数部分が取得できます。
つまりXの小数点以下は、X – int(X)で計算できます。

では、ここまでを踏まえてプログラムを書いていきます。
時間変換パートは個別で関数に設定しています。

import time


def convert(sec):
    minits = sec // 60
    second = sec % 60
    milli_sec = (second - int(second)) * 1000
    hour = minits // 60
    min = minits % 60
    return f"{int(hour)}:{int(min)}:{int(second)}:{int(milli_sec)}"


start_signal = input('Push "ENTER" to Start')
start_time = time.time()
stop_signal = input('Push "ENTER" to Stop')
stop_time = time.time()
result = stop_time - start_time
time_result = convert(result)
print(f"Stop Time:{time_result}")

結果は以下のようになります。

Push "ENTER" to Start
Push "ENTER" to Stop
Stop Time:0:1:19:289


いい感じですね。

3.バージョンアップ① ~ラップ機能~

多くのストップウォッチにある機能に「ラップ機能」があります。
通常のストップウォッチのストップは、時間を停止し、開始からの時間を表示します。
一方で、ラップ機能は、ストップウォッチの止めずに、現在までの時間を表示する機能です。

では、実装していきましょう。
まず、完成形を図示してみましょう。

こんな感じです。
今までは、エンターキーを押せば停止していたところを、「停止」にすすむか「ラップ」に進むかで分岐させています。
難しくないので早速プログラムにしてみましょう。
このプログラムでは、停止しシグナルで「何も入力せずエンターでラップ機能」「”p”を入力すると停止」「それ以外が入力されると入力案内が出る」というようにしています。

import time


def convert(sec):
    minits = sec // 60
    second = sec % 60
    milli_sec = (second - int(second)) * 1000
    hour = minits // 60
    min = minits % 60
    return f"{int(hour)}:{int(min)}:{int(second)}:{int(milli_sec)}"


start_signal = input('Push "ENTER" to Start')
start_time = time.time()

print('Push "ENTER" to lap time')
print('Push "p and ENTER" to Stop')
lap_num = 0
while True:
    stop_signal = input()
    stop_time = time.time()
    if stop_signal == '':
        lap_num += 1
        result = stop_time - start_time
        time_result = convert(result)
        print(f"lap {lap_num}:{time_result}")
    elif stop_signal == 'p':
        result = stop_time - start_time
        time_result = convert(result)
        print(f"Stop Time:{time_result}")
        break
    else:
        print('Push "ENTER" to lap time')
        print('Push "p and ENTER" to Stop')

出力してみましょう。
いくつかのパターンを試してみています。

Push "ENTER" to Start
Push "ENTER" to lap time
Push "p and ENTER" to Stop

lap 1:0:0:0:832

lap 2:0:0:13:999

lap 3:0:1:21:416
x
Push "ENTER" to lap time
Push "p and ENTER" to Stop

lap 4:0:1:26:304
p
Stop Time:0:2:27:279

うまくできていますね。これでストップウォッチが完成です!!

FIN.

PyQさんで勉強中!


コメント

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