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就完成了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM