2013-01-21 13 views
7

Sono abbastanza nuovo nelle maledizioni, quindi sto provando cose diverse in python.Rendi l'output del programma curses persistente nella cronologia di scrollback del terminale dopo l'uscita dal programma

Ho inizializzato la finestra e ho impostato scrollok per l'oggetto finestra. Posso aggiungere stringhe e lo scorrimento funziona in modo che addstr() non abbia errori alla fine della finestra.

Quello che mi piacerebbe avere è la possibilità di scorrere indietro l'output del programma nel mio programma terminale (tmux o KDE Konsole, in questo caso) dopo che il programma è finito.

Nel mio codice, posso almeno vedere l'output se mi salta la chiamata endwin(), ma il terminale ha bisogno di un resettare chiamata per tornare operativa.

Inoltre, anche mentre il programma è in esecuzione, dopo che la finestra di curses si è spostata verso il basso, non posso tornare indietro in Konsole per vedere l'output iniziale.

#!/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() 

risposta

7

Per questo compito, vorrei suggerire di utilizzare un pad (http://docs.python.org/2/library/curses.html#curses.newpad):

Un pad è come una finestra, con la differenza che non è limitato dalle dimensioni dello schermo, e non è necessariamente associato a una particolare parte dello schermo. [...] solo una parte della finestra sarà visualizzata sullo schermo contemporaneamente. [...]

Al fine di lasciare il contenuto del pad della console dopo aver finito di utilizzare maledizioni, vorrei leggere il contenuto nel dal pad, maledizioni finali e scrivere i contenuti dello standard produzione.

Il codice seguente raggiunge ciò che viene descritto.

#!/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) 
Problemi correlati