needmoreeasy EN 한국어
배우기

47 — 진행 — 터미널 진행 막대

★★★★☆ (4/5)TUI/출력
선수 지식
22 — 터미널 메뉴, 05 — 반복
결과물
반복이 돌면서 한 줄을 채우는 터미널 진행 막대

오래 걸리는 일에는 진행 상황이 필요합니다. 진행 막대는 반복이 도는 동안 자라나는 # 한 줄입니다. 새 줄을 출력하는 대신 같은 줄을 다시 그리므로 터미널에 한 줄이 채워지는 모습이 보입니다. 이 가이드는 print\r(캐리지 리턴)로 진행 막대를 만듭니다.

단계

  1. print()는 보통 새 줄로 끝나서, 두 번째 print는 새 줄로 떨어집니다. end="\r"이 새 줄 대신 캐리지 리턴을 넣는데, 캐리지 리턴은 커서를 같은 줄의 시작으로 보냅니다 — 다음 print가 그 위에 덮어씁니다:

    print("Hello", end="\r")
    print("World")
    
    실행해 보기 →

    결국 World만 보입니다. 두 번째 호출이 첫 줄을 덮어썼기 때문입니다.

  2. 같은 줄 덮어쓰기를 for 반복과 자라나는 # 줄로 반복합니다. "#" * ii개의 해시로 된 문자열입니다 — "#" * 3"###"입니다:

    for i in range(1, 11):
        print("#" * i, end="\r")
    print()
    
    실행해 보기 →

    한 번 돌 때마다 해시가 하나 더 긴 줄로 다시 그려져 막대가 왼쪽에서 오른쪽으로 채워집니다. 반복 뒤의 빈 print()는 새 줄로 끝내서 다음 출력이 새 줄에서 시작하게 합니다.

  3. 막대가 너무 빨리 움직여 보기 어렵습니다. import time이 시계를 불러오고, time.sleep(0.2)가 한 번마다 0.2초 멈춥니다:

    import time
    
    for i in range(1, 11):
        print("#" * i, end="\r")
        time.sleep(0.2)
    print()
    
    실행해 보기 →
  4. 전체 프로그램입니다. progress.ko.nme으로 저장합니다:

    # progress.ko.nme — 한 줄을 채우는 터미널 진행 막대.
    # 실행: nme 실행 progress.ko
    #
    # # 한 줄이 1개에서 10개로 자랍니다. \r은 줄 시작으로 돌아가
    # 긴 줄이 그 자리에 덮어씁니다. time.sleep이 움직임을 보여 줍니다.
    # 막대가 10단계를 달리고, 마지막 print()가 새 줄로 이동합니다.
    
    import time
    
    steps = 10
    말해 "작업 중..."
    # 매번 한 줄을 만들어 그 자리에 다시 그립니다.
    for i in range(1, steps + 1):
        filled = "#" * i
        percent = i * 10
        print(f"{filled} {percent}%", end="\r")
        time.sleep(0.2)
    print()
    말해 "완료!"
    
    실행해 보기 →

    막대에 퍼센트가 붙었습니다: percent = i * 10이 1단계를 10%로, 10단계를 100%로 만듭니다.

  5. 실행합니다:

    nme 실행 progress.ko
    
    작업 중...
    ########## 100%
    완료!
    

    진짜 터미널에서는 # 10%부터 ########## 100%까지 열 줄이 같은 줄에서 서로를 덮어써 해시 하나씩 채워지는 모습이 보입니다. 출력으로 남는 것은 마지막 꽉 찬 막대뿐입니다.

직접 해보기

반복을 거꾸로 바꿔 보세요: range(10, 0, -1)은 꽉 찬 막대가 해시 하나까지 비워지는 것을 그립니다. 또는 "#""="로 바꿔 다른 글자가 줄을 채우게 해 보세요.

배운 것

  • print(..., end="\r")이 새 줄을 캐리지 리턴으로 바꿉니다.
  • "#" * i가 문자열을 반복합니다 — 반복이 한 줄에 자라나는 막대를 그립니다.
  • import timetime.sleep(0.2)이 단계 사이에 멈춥니다.
  • 진행 막대는 꽉 찰 때까지 한 줄을 다시 그리는 반복입니다.

GitHub에서 이 문서 보기