在开发过程中我发现终端屏幕频繁的刷新,看上去闪的厉害。使用截包工具(我用的是EtherDetect Packet Sniffer,在Sniffer单机端口数据的时候比Sniffer Pro易用)分析发现,每次更新一个子窗口的时候竟然整个屏幕都被刷新了,数据量非常大。为了发现问题,我编写了下面的测试程序:
from ACursesEX import *
import curses
def main():
    mainwin = curses.newwin(15,50,0,0)
    mainwin.box()
   
    mainwin.addstr(0,0,"主窗口")
    mainwin.refresh()
   
    cwin = curses.newwin(5,20,2,2)
    cwin.addstr(1,1,"子窗口")
    cwin.box()
    cwin.refresh()
    while(True):
        ch = cwin.getch()
        cwin.clear()
        cwin.addch(2,1,ch)
        cwin.touchwin()
        cwin.refresh()
       
  
try:
    initapp()
    try:       
        main()
    except:       
        traceback.print_exc()
finally:
    endapp()
经测试每一次按键的时候屏幕的数据都刷新一次,经过尝试发现把cwin.clear()改成cwin.erase()就不会出现这种问题了。查看curses的API说明才发现自己犯了一个大错误:
clear( ) :
Like erase(), but also causes the whole window to be repainted upon next call to refresh().
   也就是说erase只会使子窗口刷新,而clear会导致整个窗口刷新。
看来还是自己太粗心了!