2016-08-25 70 views
2

我在Python中使用curses模塊通過讀取文件實時顯示輸出。 字符串消息使用addstr()函數 輸出到控制檯,但無法在任何需要的位置打印到換行符。python curses中的新行輸出

示例代碼:

import json 
import curses 
w=curses.initscr() 

try: 
    while True: 
     with open('/tmp/install-report.json') as json_data: 
      beta = json.load(json_data) 
      w.erase() 
      w.addstr("\nStatus Report for Install process\n=========\n\n") 
      for a1, b1 in beta.iteritems(): 
       w.addstr("{0} : {1}\n".format(a1, b1)) 
      w.refresh() 
finally: 
    curses.endwin() 

上面是不是真的輸出字符串到一個新的線(請注意在addstr成\ n())與每一次迭代。相反,如果我調整終端窗口的大小,腳本會失敗並出錯。

w.addstr("{0} ==> {1}\n".format(a1, b1)) 
_curses.error: addstr() returned ERR 
+0

爲什麼不'的print()'您的信息?您是否有理由需要說明,回滾或中斷打印過程? –

+0

@WayneWerner當然,我試圖在後端更新json文件時實時輸出數據。爲此我正在使用curses。像linux'top'命令格式。 print()語句不適合在curses上下文中,因爲我正在循環讀取文件。所以print()會混亂控制檯 – cool77

+0

@SurestTexas如果有人沒有給出他們正在使用的東西的理由我不認爲他們有一個很好的理由。經驗表明,大部分時間......他們不是! –

回答

1

有沒有足夠的程序提供比一般建議更多:

  • ,如果你的腳本不支持滾動,您將打印到屏幕的結束的時候得到一個錯誤(見window.scroll)。
  • 如果您調整終端窗口的大小,您將必須閱讀鍵盤才能處理任何KEY_RESIZE(並忽略錯誤)。

關於擴大的問題,這些功能將被用於像這樣:

import json 
import curses 
w=curses.initscr() 
w.scrollok(1) # enable scrolling 
w.timeout(1) # make 1-millisecond timeouts on `getch` 

try: 
    while True: 
     with open('/tmp/install-report.json') as json_data: 
      beta = json.load(json_data) 
      w.erase() 
      w.addstr("\nStatus Report for Install process\n=========\n\n") 
      for a1, b1 in beta.iteritems(): 
       w.addstr("{0} : {1}\n".format(a1, b1)) 
      ignore = w.getch() # wait at most 1msec, then ignore it 
finally: 
    curses.endwin() 
+0

我已經在上下文中添加了額外的代碼(編輯我原來的帖子)。我經歷了curses文檔,但沒有得到如何在我的代碼上下文中實現window.scroll或KEY_RESIZE。 – cool77

+0

它現在可用。我看到一個小故障。當輸出超過屏幕滿。我無法向上滾動查看輸出的起始行。有沒有辦法向上滾動並查看最初的輸出行。 – cool77

+0

這是預期的(如果你的應用程序需要這樣做,它必須使用足夠大的** pad **而不是一個窗口,或者使用其他方式來保存數據)。 –