???在開發過程中我發現終端屏幕頻繁的刷新,看上去閃的厲害。使用截包工具(我用的是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會導致整個窗口刷新。
看來還是自己太粗心了!
?