mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 15:11:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
"""curses.wrapper
 | 
						|
 | 
						|
Contains one function, wrapper(), which runs another function which
 | 
						|
should be the rest of your curses-based application.  If the
 | 
						|
application raises an exception, wrapper() will restore the terminal
 | 
						|
to a sane state so you can read the resulting traceback.
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
import curses
 | 
						|
 | 
						|
def wrapper(func, *args, **kwds):
 | 
						|
    """Wrapper function that initializes curses and calls another function,
 | 
						|
    restoring normal keyboard/screen behavior on error.
 | 
						|
    The callable object 'func' is then passed the main window 'stdscr'
 | 
						|
    as its first argument, followed by any other arguments passed to
 | 
						|
    wrapper().
 | 
						|
    """
 | 
						|
 | 
						|
    try:
 | 
						|
        # Initialize curses
 | 
						|
        stdscr = curses.initscr()
 | 
						|
 | 
						|
        # Turn off echoing of keys, and enter cbreak mode,
 | 
						|
        # where no buffering is performed on keyboard input
 | 
						|
        curses.noecho()
 | 
						|
        curses.cbreak()
 | 
						|
 | 
						|
        # In keypad mode, escape sequences for special keys
 | 
						|
        # (like the cursor keys) will be interpreted and
 | 
						|
        # a special value like curses.KEY_LEFT will be returned
 | 
						|
        stdscr.keypad(1)
 | 
						|
 | 
						|
        # Start color, too.  Harmless if the terminal doesn't have
 | 
						|
        # color; user can test with has_color() later on.  The try/catch
 | 
						|
        # works around a minor bit of over-conscientiousness in the curses
 | 
						|
        # module -- the error return from C start_color() is ignorable.
 | 
						|
        try:
 | 
						|
            curses.start_color()
 | 
						|
        except:
 | 
						|
            pass
 | 
						|
 | 
						|
        return func(stdscr, *args, **kwds)
 | 
						|
    finally:
 | 
						|
        # Set everything back to normal
 | 
						|
        if 'stdscr' in locals():
 | 
						|
            stdscr.keypad(0)
 | 
						|
            curses.echo()
 | 
						|
            curses.nocbreak()
 | 
						|
            curses.endwin()
 |