2010/11/11

エスケープシーケンスで、コンソール制御(メーターと残り時間と顔文字)

「Python Recipes」に戻る

テスト環境
OS: Ubuntu10.10
Python2.6.6
Python2.5.2
Python3.1.2:

エスケープシーケンスで、コンソール制御(メーターと残り時間と顔文字)



エスケープシーケンスで、コンソールを制御してアニメーションをさせようというものです。
Windows 2000 以外の MS-DOS プロンプトや Linux で使えるらしいです。(引用元によると)
Pythonで書いたらこうなるんではないかなぁというコードなので汚くてすみません。
詳しくは下記のサイトを参照してください。
Note
引用・参考
C言語-コンソールでプログレス表示(アニメーション)(3) – 碧色工房-blue studio-
#!/usr/bin/env python
#-*- coding:utf-8 -*-
# Author: Iyori Komiyama
# Contact: hazimarino@gmail.co.jp
"""\
メーターと残り時間と顔文字を表示する
"""
from __future__ import unicode_literals
import sys
from time import sleep

def stdwrite(msg):
    try:
        sys.stdout.write(msg.encode('utf8'))
    except TypeError:
        sys.stdout.write(msg)
    finally:
        sys.stdout.flush()

ani = ("(^_^)", "(-_-)", "(*x*)")
# エスケープシーケンスをつかってカーソルを上に持っていく
anf = lambda x: " {0}\n\x1b[2A".format(ani[x])

def main(time):
    time = time * 100
    for i in range(1, time + 1):
        rate = i * 71 // time
        times = ((time + 1) - i) // 100
        meter = "\r|{0}{1}| {2}%\n".format(
            ("=" * rate), (' ' * (71 - rate)), i * 100 // time)
        timer = "\r残り {0:#02d} 秒".format(times)
        if  times % 2 == 0:
            anime = anf(1)
        elif times % 3 == 0:
            anime = anf(2)
        elif times % 5 == 0 and times % 7 == 0:
            anime = anf(3)
        else:
            anime = anf(0)
        stdwrite(meter)
        stdwrite(timer)
        stdwrite(anime)
        sleep(0.01)
    # 終了する前にカーソルを下に持っていく
    sys.stderr.write('\x1b[2B')


if __name__ == "__main__":
    main(20)

「Python Recipes」に戻る

0 件のコメント:

コメントを投稿