この記事では、Pythonのtime
モジュールを使い、ラップタイムも計測できるシンプルなコマンドラインベースのストップウォッチプログラムを作成する方法を解説します。
1. プログラムの設計
このストップウォッチは以下のロジックで動作します。
- プログラムを開始し、ユーザーがEnterキーを押すのを待つ。
- 最初のEnterキーが押されたら、計測を開始し、その時刻を
開始時刻
として記録する。 - 無限ループに入り、ユーザーが再度Enterキーを押すたびにラップを記録する。
- 各ラップでは、「合計経過時間」と「直前のラップからの経過時間」を計算して表示する。
- ユーザーが
Ctrl-C
を押すとプログラムが中断され、 gracefulに(穏便に)終了する。
2. 完成したコード全体
上記の設計に基づいた完全なスクリプトを以下に示します。
import time
# --- 準備 ---
print('Enterキーを押すと開始します。')
print('その後、Enterキーを押すたびにラップタイムを記録します。')
print('Ctrl-Cで終了します。')
# 最初のEnter入力を待つ
input()
print('スタート!')
start_time = time.time()
last_lap_time = start_time
lap_counter = 1
# --- メインループ ---
try:
while True:
# 次のEnter入力を待つ
input()
# 現在時刻を取得
current_time = time.time()
# 時間を計算
total_time = round(current_time - start_time, 2)
lap_time = round(current_time - last_lap_time, 2)
# 結果を表示
print(f"ラップ #{lap_counter}: {total_time}秒 ({lap_time}秒)")
# 次のラップのために変数を更新
lap_counter += 1
last_lap_time = current_time
except KeyboardInterrupt:
# Ctrl-Cが押されたらループを抜けて終了
print('\n終了しました。')
3. コードの解説
時間計測の準備 最初のinput()
でユーザーの入力を待ち、プログラムを一時停止させています。Enterが押されると、その直後のtime.time()
がstart_time
(全体の開始時刻)とlast_lap_time
(最初のラップの開始時刻)として記録されます。
経過時間の表示 while True:
ループの中で、input()
は再びユーザーがEnterを押すまでプログラムを停止させます。Enterが押されると、その時点のtime.time()
と、保存しておいたstart_time
およびlast_lap_time
との差分を計算することで、合計経過時間とラップタイムを算出しています。
try...except KeyboardInterrupt
while True:
のような無限ループは、通常Ctrl-C
を押すことで強制的に中断されますが、そのままだとエラーメッセージが表示されてしまいます。 try...except KeyboardInterrupt:
ブロックでループ全体を囲むことにより、Ctrl-C
による中断を例外
として捕捉し、エラーメッセージの代わりに「終了しました。」というクリーンなメッセージを表示してプログラムを穏便に終了させることができます。
まとめ
このスクリプトは、time.time()
でタイムスタンプを取得し、その差分を計算するという単純な原理で動作しています。input()
でプログラムの進行を制御し、try...except KeyboardInterrupt
でユーザーによる終了操作を綺麗にハンドリングすることで、対話的で使いやすいコマンドラインツールを作成できます。