Nattawut Phetmak
Jack of all Trades
ปรกติแล้ว คำสั่ง print
จะทำการเก็บ string ที่จะพิมพ์ไว้ก่อน จนกว่าจะเจออักขระสำหรับขึ้นบรรทัดใหม่อย่าง \n
หรือ \r
มันถึงจะพิมพ์ข้อมูลเหล่านั้นออกมา
เราอาจประยุกต์ท่านี้มาใช้สร้าง progress bar/progress message ได้ง่ายๆ เช่น
import time
# run percent from 0 to 100 in 10 sec.
for i in range(101):
print('{}%\r'.format(i), end='')
if i != 100:
time.sleep(0.1)
else:
print()
แต่ถ้าต้องการพิมพ์ข้อมูลออกมาเรื่อยๆ ไม่อยากกลับไปเริ่มต้นจากด้านหน้าบรรทัดใหม่หมดตามตัวอย่างข้างบน ต้อง import
ฟังก์ชัน flush จากโมดูล sys.stdout มาครับ
from sys import stdout
# run A to Z step by step.
for i in range(26):
print('{}'.format(ord("A")+i), end='')
stdout.flush()
time.sleep(0.3)
สุดท้าย ถ้าเราต้องการปรับค่าเล็กน้อยในบรรทัด แต่ไม่ต้องการลบทั้งบรรทัดเพื่อพิมพ์ใหม่หมด เราอาจใช้ \b
เพื่อลบตัวอักษร (จริงๆ ก็ไม่ได้ลบ แต่เป็นการเลื่อน cursor ไปด้านซ้าย) ได้
def progress():
'''little bit advance progress message.'''
# init progress message.
print('now: %, please wait.', end='')
print('\b' * len(' %, please wait.'), end='')
# run number of percent progresses.
for i in range(101):
print('{:3}'.format(i), end='')
print('\b'*3, end='')
stdout.flush()
if i != 100:
time.sleep(0.1)
else:
print()
ระวังอย่าเลื่อนกลับไปทางซ้ายด้วย \b
เพลิน เพราะการจะเลื่อนกลับมาด้านขวาไม่มีอักขระแบบ \b
ให้ใช้ ต้องพิมพ์ซ้ำตัวอักษรทับลงไปในตำแหน่งนั้นๆ ครับ