先贴出单行刷新实现的进度条:
对于控制台的单行刷新,比较简单,先直接贴出代码:
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()
主要的程序逻辑都在...中,下面直接贴出代码:
importcursesimporttimeimportosimportrandom
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 - 1c_x= width//2 - 10stdscr.addstr(c_y+5,c_x,'press C to continue',curses.A_REVERSE)whileTrue:
c=stdscr.getch()if c == ord('c') or c == ord('C'):breakzh_= '1234567890-qwertyuiopasdfghjklzxcvbnm,[;l,]/~!@#$%^&*()_+}"?{:><}"'';'
whileTrue: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就完成了.