Carriage

ปรกติแล้ว คำสั่ง 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 ให้ใช้ ต้องพิมพ์ซ้ำตัวอักษรทับลงไปในตำแหน่งนั้นๆ ครับ

Nattawut Phetmak

Jack of all Trades

blog comments powered by Disqus