Pythonでストップウォッチをつくってみた。
まずは簡単なものからバージョンアップしていきます。
Pythonでストップウォッチをしてみました!
少し前にメトロノームをつくってみましたが、そのつながりでストップウォッチをつくろうと思い立ちました。
非常に簡単なので、Pythonを少しさわりはじめた人が作るのに最適です!
(2021年6月13日:学習開始114日目 PyQさんで勉強中!)
時間に関する曲はたくさんあって選ぶのが大変ですが、今回は、「Doin’ Time」という曲をピックアップします。
Sublime というバンドの Sublime という超名盤に収録されている「Doin’ Time」です。
このアルバムでは、夏の暑さやハイテンションのアッパーな部分だけでなく、夏のけだるさや雨といったダウナーな雰囲気も含んだ唯一無二の超名盤です。
夏の浜辺やドライブで聞きたい感じです。
で、2019年にはローテンションの歌姫 Lana Del Rey が 「Doin’ Time」をカバーしています。
こちらのバージョンは、落ち着いた雰囲気でカフェで聞きたい感じです。
では、ストップウォッチをつくって遊ぼう!!
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さんで勉強中!
コメント