python 控制台单行刷新,多行刷新

Posted why

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 控制台单行刷新,多行刷新相关的知识,希望对你有一定的参考价值。

先贴出单行刷新实现的进度条:

对于控制台的单行刷新,比较简单,先直接贴出代码:

1 strarrs = [\'/\',\'|\',\'\\\\\']
2 for i in range(15):
3     sys.stdout.write(strarrs[i % 3]+\'{}/15:\'.format(i+1)+\'#\' * i+\'\\r\')
4     sys.stdout.flush()
5     time.sleep(1)

对于单行刷新以及坑

1.print是对sys.stdout.write的友好封装,利用sys.stdout.write把数据输出到标准输出,貌似也可用print来做,这里没有深入研究

2.一定要在write()里面加入 \'\\r\',或者是\'\\b\'等转义字符,其中python转义字符表如下:

转义字符描述
\\(在行尾时) 续行符
\\\\ 反斜杠符号
\\\' 单引号
\\" 双引号
\\a 响铃
\\b 退格(Backspace)
\\e 转义
\\000
\\n 换行
\\v 纵向制表符
\\t 横向制表符
\\r 回车
\\f 换页
\\oyy 八进制数yy代表的字符,例如:\\o12代表换行
\\xyy 十进制数yy代表的字符,例如:\\x0a代表换行
\\other 其它的字符以普通格式输出

这就相当于是回车到了输出开头,然后,重新写,在刷新!

如此,一个简单的进度条就实现了!

接下来说一说,多行的刷新问题:

多行刷新,就不能简单的使用输入输出了,应该使用的是一个curses的库,这个库,是以前用c写的库,如果熟悉c下,curses库的使用的话,用python会上手很快.

但是我之前并没有接触罗..一点一点看罗- - ,还有一点就是这个库,现在好像貌似只能在linux下使用,windows不能使用,mac不太清楚,windows下貌似是有别的解决方案

上效果图:

大部分实现curses,的程序模式都是基于以下的代码  

 stdscr=curses.initscr()
 # 一些常用设置
 curses.noecho()
 curses.cbreak()
 stdscr.keypad(1)
 # 以下写监听按键的代码或者loop代码等...
  ....
#关闭之前的操作
 stdscr.keypad(0)
 curses.echo()
 curses.nocbreak()
 curses.endwin() 

主要的程序逻辑都在...中,下面直接贴出代码:

import curses
import time
import os
import random
stdscr = curses.initscr()
curses.noecho()     #不输出- -
curses.cbreak()     #立刻读取:暂不清楚- -
stdscr.keypad(1)    #开启keypad
stdscr.box()

width = os.get_terminal_size().columns
height = os.get_terminal_size().lines
c_y = height//2 - 1
c_x = width//2 - 10
stdscr.addstr(c_y+5,c_x,\'press C to continue\',curses.A_REVERSE)
while True:
    c = stdscr.getch()
    if c == ord(\'c\') or c == ord(\'C\'):
        break

zh_ = \'1234567890-qwertyuiopasdfghjklzxcvbnm,[;l,]/~!@#$%^&*()_+}"?{:><}"\'\';\'
while True:
    for linei in range(1,width-1):
        for linej in range(1,height-1):
            if linej == c_y:
                if linei <= 5 or linei+6 >= width:
                    stdscr.addstr(linej,linei,\'$\')
                else:
                    stdscr.addstr(linej,c_x,time.strftime(\'%Y-%m-%d %H:%M:%S\'),curses.A_BOLD)
            else:
                randominx = random.randint(0,len(zh_)-1)
                stdscr.addstr(linej,linei,zh_[randominx])
    stdscr.move(c_y,c_x)
    stdscr.refresh()
    time.sleep(1)

curses.endwin()

这样,一个多行刷新的demo就完成了.

以上是关于python 控制台单行刷新,多行刷新的主要内容,如果未能解决你的问题,请参考以下文章

python代码实现:视频转换终端字符,输出字符代码视频(python实现输出多行刷新)

刷新片段不再起作用?

无法刷新 BrowseFragment 中的数据

python之HTML(meta,input等基础标签)

自动刷新android片段,直到满足条件

从 fragmentActivity 刷新片段 UI