使curses程序输出在程序退出后保留在终端回滚历史记录中
Posted
技术标签:
【中文标题】使curses程序输出在程序退出后保留在终端回滚历史记录中【英文标题】:Make curses program output persist in terminal scrollback history after program exits 【发布时间】:2013-01-04 23:03:14 【问题描述】:我对 curses 很陌生,所以我在 python 中尝试了一些不同的东西。
我已经初始化了窗口并为窗口对象设置了滚动条。我可以添加字符串,并且滚动可以使 addstr() 在窗口末尾没有任何错误。
我想要的是在程序完成后能够在我的终端程序(在本例中为 tmux 或 KDE Konsole)的程序输出中回滚。
在我的代码中,如果我跳过 endwin() 调用,我至少可以看到输出,但是终端需要一个 reset 调用才能恢复运行。
此外,即使在程序运行时,在 curses 窗口向下滚动后,我也无法在 Konsole 中回滚以查看初始输出。
#!/usr/bin/env python2
import curses
import time
win = curses.initscr()
win.scrollok(True)
(h,w)=win.getmaxyx()
h = h + 10
while h > 0:
win.addstr("[h=%d] This is a sample string. After 1 second, it will be lost\n" % h)
h = h - 1
win.refresh()
time.sleep(0.05)
time.sleep(1.0)
curses.endwin()
【问题讨论】:
【参考方案1】:对于这项任务,我建议您使用垫子 (http://docs.python.org/2/library/curses.html#curses.newpad):
pad 就像一个窗口,只是它不受屏幕大小的限制,也不一定与屏幕的特定部分相关联。 [...] 一次只有窗口的一部分会出现在屏幕上。 [...]
为了在你使用完curses后将pad的内容留在控制台上,我会从pad读回内容,结束curses并将内容写入标准输出。
下面的代码实现了你所描述的。
#!/usr/bin/env python2
import curses
import time
# Create curses screen
scr = curses.initscr()
scr.keypad(True)
scr.refresh()
curses.noecho()
# Get screen width/height
height,width = scr.getmaxyx()
# Create a curses pad (pad size is height + 10)
mypad_height = height + 10
mypad = curses.newpad(mypad_height, width);
mypad.scrollok(True)
mypad_pos = 0
mypad_refresh = lambda: mypad.refresh(mypad_pos, 0, 0, 0, height-1, width)
mypad_refresh()
# Fill the window with text (note that 5 lines are lost forever)
for i in range(0, height + 15):
mypad.addstr("0 This is a sample string...\n".format(i))
if i > height: mypad_pos = min(i - height, mypad_height - height)
mypad_refresh()
time.sleep(0.05)
# Wait for user to scroll or quit
running = True
while running:
ch = scr.getch()
if ch == curses.KEY_DOWN and mypad_pos < mypad_height - height:
mypad_pos += 1
mypad_refresh()
elif ch == curses.KEY_UP and mypad_pos > 0:
mypad_pos -= 1
mypad_refresh()
elif ch < 256 and chr(ch) == 'q':
running = False
# Store the current contents of pad
mypad_contents = []
for i in range(0, mypad_height):
mypad_contents.append(mypad.instr(i, 0))
# End curses
curses.endwin()
# Write the old contents of pad to console
print '\n'.join(mypad_contents)
【讨论】:
以上是关于使curses程序输出在程序退出后保留在终端回滚历史记录中的主要内容,如果未能解决你的问题,请参考以下文章