zoukankan      html  css  js  c++  java
  • python3实现进度条

    import sys
    import time
    def get_terminal_size():
        """Get (width, height) of the current terminal."""
        try:
            import fcntl, termios, struct # fcntl module only available on Unix
            return struct.unpack('hh', fcntl.ioctl(1, termios.TIOCGWINSZ, '1234'))
        except:
            return (40, 80)
    
    class SimpleProgressBar:
        term_size = get_terminal_size()[1]
    
        def __init__(self, total_size, total_pieces=1):
            self.displayed = False
            self.total_size = total_size
            self.total_pieces = total_pieces
            self.current_piece = 1
            self.received = 0
            self.speed = ''
            self.last_updated = time.time()
    
            total_pieces_len = len(str(total_pieces))
            # 38 is the size of all statically known size in self.bar
            total_str = '%5s' % round(self.total_size / 1048576, 1)
            total_str_width = max(len(total_str), 5)
            self.bar_size = self.term_size - 28 - 2 * total_pieces_len 
                - 2 * total_str_width
            self.bar = '{:>4}%% ({:>%s}/%sMB) ├{:─<%s}┤[{:>%s}/{:>%s}] {}' % (
                total_str_width, total_str, self.bar_size, total_pieces_len,
                total_pieces_len
            )
    
        def update(self):
            self.displayed = True
            bar_size = self.bar_size
            percent = round(self.received * 100 / self.total_size, 1)
            if percent >= 100:
                percent = 100
            dots = bar_size * int(percent) // 100
            plus = int(percent) - dots // bar_size * 100
            if plus > 0.8:
                plus = '█'
            elif plus > 0.4:
                plus = '>'
            else:
                plus = ''
            bar = '█' * dots + plus
            bar = self.bar.format(
                percent, round(self.received / 1048576, 1), bar,
                self.current_piece, self.total_pieces, self.speed
            )
            sys.stdout.write('
    ' + bar)
            sys.stdout.flush()
    
        def update_received(self, n):
            self.received += n
            time_diff = time.time() - self.last_updated
            bytes_ps = n / time_diff if time_diff else 0
            if bytes_ps >= 1024 ** 3:
                self.speed = '{:4.0f} GB/s'.format(bytes_ps / 1024 ** 3)
            elif bytes_ps >= 1024 ** 2:
                self.speed = '{:4.0f} MB/s'.format(bytes_ps / 1024 ** 2)
            elif bytes_ps >= 1024:
                self.speed = '{:4.0f} kB/s'.format(bytes_ps / 1024)
            else:
                self.speed = '{:4.0f}  B/s'.format(bytes_ps)
            self.last_updated = time.time()
            self.update()
    
        def update_piece(self, n):
            self.current_piece = n
    
        def done(self):
            if self.displayed:
                print()
                self.displayed = False
    
    def run():
        total_size=100
        bar = SimpleProgressBar(total_size, 1)
        for _ in range(100):
            bar.update()
            time.sleep(0.1)
            bar.update_received(1)
        bar.done()
    if __name__ == '__main__':
        run()
    
    

    代码来自开源项目you-get.

  • 相关阅读:
    10-18 noip提高组模拟赛(codecomb)T2贪心
    vj1011:记忆化搜索
    vj1010:高精乘+细心模拟
    10-18 noip提高组模拟赛(codecomb)T1倍增[未填]
    CODEFORCES ROUND #273 DIV2
    Unkown2
    2014.first[未填]
    Unknown
    历年noip复赛试题整合
    快速幂(模板)
  • 原文地址:https://www.cnblogs.com/c-x-a/p/13033497.html
Copyright © 2011-2022 走看看