在开发过程中我发现终端屏幕频繁的刷新,看上去闪的厉害。使用截包工具(我用的是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会导致整个窗口刷新。
看来还是自己太粗心了!