
파이썬 택시 미터기 예제는 단순히 재미로 끝나지 않습니다. 잘 만들면 내가 일한 시간이 얼마나 쌓였고, 지금 근무수당이 얼마까지 올라왔는지를 콘솔에서 바로 확인하는 작은 도구가 됩니다.
이번 글에서는 말이 달리는 느낌을 살린 콘솔 출력과 함께, 경과 시간, 누적 수당, 종료 요약까지 한 번에 들어간 근무수당 계산기 스타일의 파이썬 택시 미터기를 만들어 보겠습니다.
완성 화면
먼저 어떤 결과가 나오는지 감을 잡고 가겠습니다. 숫자만 올라가는 것이 아니라, 근무 시간과 누적 수당이 함께 뛰는 택시 미터기 감성을 목표로 잡았습니다.

위 화면은 이 글에서 만들 최종 결과물 예시입니다. 즉, 말이 달리듯 한 줄이 움직이고, 그 옆에서 근무 시간과 누적 수당이 실시간으로 올라가는 구조입니다.
파이썬 택시 미터기 설계
이 도구는 아래 흐름만 이해하면 충분합니다. 복잡한 GUI 없이도, 시간 측정과 금액 계산, 화면 갱신이 어떻게 맞물리는지 한 번에 볼 수 있습니다.

- 시급을 입력받는다
- 시작 시점을 기록한다
- 경과 초를 계속 계산한다
- 시급을 초당 금액으로 바꾼다
- 누적 수당을 계산한다
- 같은 줄을 다시 그리며 콘솔을 갱신한다
- Ctrl+C 로 멈추면 총 시간을 요약한다
여기서 하나만 먼저 기억하면 됩니다. 이 글에서는 현재 시각보다 경과 시간 측정이 더 중요하므로 time.monotonic()을 사용합니다.
전체 코드
아래 코드는 바로 실행할 수 있는 전체 예제입니다. 파일 이름을 taxi_meter.py로 저장한 뒤 그대로 실행하면 됩니다.
import argparse
import shutil
import sys
import time
def format_duration(seconds: float) -> str:
total_seconds = int(seconds)
hours = total_seconds // 3600
minutes = (total_seconds % 3600) // 60
secs = total_seconds % 60
return f"{hours:02d}:{minutes:02d}:{secs:02d}"
def format_money(amount: float) -> str:
return f"{amount:,.0f}원"
def horse_frame(step: int) -> str:
frames = [
"🐎 ",
" 🐎 ",
" 🐎 ",
" 🐎 ",
" 🐎",
" 🐎 ",
" 🐎 ",
" 🐎 ",
]
return frames[step % len(frames)]
def make_meter_line(hourly_wage: int, elapsed_seconds: float, step: int) -> str:
earned = hourly_wage * (elapsed_seconds / 3600)
per_second = hourly_wage / 3600
duration_text = format_duration(elapsed_seconds)
horse = horse_frame(step)
line = (
f"{horse} 달리는 말 미터기 | "
f"근무 시간 {duration_text} | "
f"누적 수당 {format_money(earned)} | "
f"초당 +{per_second:,.2f}원"
)
terminal_width = shutil.get_terminal_size((100, 20)).columns
if len(line) > terminal_width - 1:
line = (
f"{horse} {duration_text} | "
f"{format_money(earned)} | "
f"+{per_second:,.2f}원/s"
)
return line
def run_meter(hourly_wage: int, interval: float) -> None:
start = time.monotonic()
step = 0
print("근무수당 콘솔 미터기를 시작합니다.")
print("멈추려면 Ctrl+C 를 누르세요.\n")
try:
while True:
now = time.monotonic()
elapsed = now - start
line = make_meter_line(hourly_wage, elapsed, step)
sys.stdout.write("\r" + line.ljust(shutil.get_terminal_size((100, 20)).columns - 1))
sys.stdout.flush()
step += 1
time.sleep(interval)
except KeyboardInterrupt:
total_elapsed = time.monotonic() - start
total_earned = hourly_wage * (total_elapsed / 3600)
print("\n")
print("근무를 종료합니다.")
print(f"총 근무 시간: {format_duration(total_elapsed)}")
print(f"최종 누적 수당: {format_money(total_earned)}")
print("오늘도 말처럼 달린 근무였습니다.")
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="근무수당이 실시간으로 올라가는 파이썬 택시 미터기"
)
parser.add_argument(
"hourly_wage",
type=int,
help="시급을 원 단위 정수로 입력하세요. 예: 40000",
)
parser.add_argument(
"--interval",
type=float,
default=1.0,
help="화면 갱신 간격(초). 기본값은 1.0",
)
return parser.parse_args()
if __name__ == "__main__":
args = parse_args()
if args.hourly_wage <= 0:
raise SystemExit("시급은 0보다 커야 합니다.")
if args.interval <= 0:
raise SystemExit("갱신 간격은 0보다 커야 합니다.")
run_meter(args.hourly_wage, args.interval)실행
예를 들어 시급이 4만 원이면 이렇게 실행하면 됩니다. 화면 갱신은 기본적으로 1초마다 이뤄집니다.
python taxi_meter.py 40000갱신을 조금 더 빠르게 보고 싶다면 간격을 줄이면 됩니다.
python taxi_meter.py 40000 --interval 0.5멈출 때는 Ctrl+C를 누르면 됩니다. 종료 직후에는 총 근무 시간과 최종 누적 수당을 요약해서 보여줍니다.
시간 계산
이 예제에서 가장 중요한 줄은 사실 아래 한 줄입니다. 이 글의 목적은 지금 몇 시인지가 아니라 얼마나 지났는가를 재는 것이기 때문입니다.
start = time.monotonic()
elapsed = time.monotonic() - start정밀 계측 장비처럼 과장할 필요는 없습니다. 다만 이런 콘솔 도구에서는 현재 시각보다 경과 시간 계산이 핵심이라는 감각을 잡는 것이 중요합니다.
수당 계산
수당 계산은 단순합니다. 시급을 초당 금액으로 바꾼 뒤, 경과 초와 곱하면 됩니다.
earned = hourly_wage * (elapsed_seconds / 3600)- 시급 36,000원이라면 초당 금액은 10원이다
- 90초가 지나면 누적 수당은 900원이다
- 이 원리만 이해하면 시급 계산기와 미터기 로직이 바로 연결된다
복잡한 세금 계산이나 야간수당 규칙은 일부러 넣지 않았습니다. 이 글의 목표는 실시간 누적 계산 흐름을 이해하는 것이기 때문입니다.
콘솔 출력
이 글의 재미 포인트는 콘솔을 한 줄씩 계속 다시 그리는 부분입니다. 새 줄을 무한히 쌓지 않고 같은 줄을 갱신해야 택시 미터기 느낌이 살아납니다.
sys.stdout.write("\r" + line.ljust(shutil.get_terminal_size((100, 20)).columns - 1))
sys.stdout.flush()여기서 \r은 커서를 현재 줄 맨 앞으로 되돌리는 역할을 합니다. ljust(...)를 붙인 이유는 이전 줄이 더 길었을 때 화면 뒤쪽 찌꺼기가 남지 않게 하려는 것입니다.
즉, 이 부분은 단순 장식이 아니라 콘솔 화면을 읽기 좋게 유지하는 실전 팁입니다.
달리는 말
말이 달리는 느낌은 아주 단순한 프레임 애니메이션으로 만들었습니다. 숫자만 오르는 것보다 훨씬 재미있고, 제목의 택시 미터기 감성과도 잘 맞습니다.
def horse_frame(step: int) -> str:
frames = [
"🐎 ",
" 🐎 ",
" 🐎 ",
" 🐎 ",
" 🐎",
" 🐎 ",
" 🐎 ",
" 🐎 ",
]
return frames[step % len(frames)]- 시간 계산은 실용적으로 가져간다
- 화면 표현은 가볍게 재미를 더한다
- 둘을 섞으면 공유하고 싶은 파이썬 예제가 된다
확장 포인트
시작 시각
현재는 경과 시간만 보여주지만, 실제 시작 시각도 함께 출력하면 기록 도구 느낌이 더 강해집니다.
목표 금액
예를 들어 5만 원이 넘으면 한 번 알림을 띄우게 만들 수 있습니다. 작은 보상 시스템을 붙이는 느낌입니다.
로그 저장
종료할 때 결과를 텍스트 파일이나 CSV로 저장하면, 콘솔 장난감이 아니라 작은 근무 기록 도구로 바뀝니다.
수당 규칙
평일, 야간, 주말 배율을 옵션으로 받아 더 현실적인 계산기로 확장할 수도 있습니다. 이 구조는 다음 기능을 붙이기 쉬운 편입니다.
주의점
- time.sleep()은 운영체제 스케줄링에 따라 완벽히 같은 간격으로 떨어지지 않을 수 있다
- 터미널 환경에 따라 이모지 너비가 조금 다르게 보일 수 있다
- ANSI 색상을 더 붙이면 환경별 차이가 커질 수 있으니 기본 정보는 색상 없이도 읽히게 두는 편이 안전하다
즉, 이 예제는 콘솔 실시간 표시와 계산 흐름을 배우는 도구로 보는 것이 가장 좋습니다.
한 번 더 정리
- 경과 시간 측정
- 시급 기반 누적 계산
- 콘솔 한 줄 갱신
- 종료 시 요약 출력
여기에 말이 달리는 느낌까지 더했기 때문에, 재미와 설명 가치가 같이 살아 있습니다. 작게 시작했지만 실제로 계속 확장할 수 있는 구조라는 점이 이 예제의 가장 큰 장점입니다.
관련해서 파이썬 기본 문법 감각을 더 다지고 싶다면 파이썬 pass, continue, break 차이, 파이썬 리스트와 튜플 차이, 파이썬 is와 == 차이 글도 같이 보면 좋습니다. 공식 기준은 Python time 모듈 문서와 Python shutil.get_terminal_size 문서를 참고하면 됩니다.