mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 07:31:38 +00:00 
			
		
		
		
	svn+ssh://pythondev@svn.python.org/python/trunk ........ r69998 | benjamin.peterson | 2009-02-26 13:04:40 -0600 (Thu, 26 Feb 2009) | 1 line the startship is rather outdated now ........ r69999 | benjamin.peterson | 2009-02-26 13:05:59 -0600 (Thu, 26 Feb 2009) | 1 line comma ........ r70002 | andrew.kuchling | 2009-02-26 16:34:30 -0600 (Thu, 26 Feb 2009) | 1 line The curses panel library is now supported ........ r70022 | georg.brandl | 2009-02-27 10:23:18 -0600 (Fri, 27 Feb 2009) | 1 line #5361: fix typo. ........ r70023 | georg.brandl | 2009-02-27 10:39:26 -0600 (Fri, 27 Feb 2009) | 1 line #5363: fix cmpfiles() docs. Another instance where a prose description is twice as long as the code. ........ r70025 | georg.brandl | 2009-02-27 10:52:55 -0600 (Fri, 27 Feb 2009) | 1 line #5344: fix punctuation. ........ r70026 | georg.brandl | 2009-02-27 10:59:03 -0600 (Fri, 27 Feb 2009) | 1 line #5365: add quick look conversion table for different time representations. ........ r70061 | hirokazu.yamamoto | 2009-02-28 09:24:00 -0600 (Sat, 28 Feb 2009) | 1 line Binary flag is needed on windows. ........ r70086 | benjamin.peterson | 2009-03-01 21:35:12 -0600 (Sun, 01 Mar 2009) | 1 line fix a silly problem of caching gone wrong #5401 ........ r70145 | benjamin.peterson | 2009-03-03 16:51:57 -0600 (Tue, 03 Mar 2009) | 1 line making the writing more formal ........ r70171 | facundo.batista | 2009-03-04 15:18:17 -0600 (Wed, 04 Mar 2009) | 3 lines Fixed a typo. ........ r70183 | benjamin.peterson | 2009-03-04 18:17:57 -0600 (Wed, 04 Mar 2009) | 1 line add example ........ r70188 | hirokazu.yamamoto | 2009-03-05 03:34:14 -0600 (Thu, 05 Mar 2009) | 1 line Fixed memory leak on failure. ........ r70235 | benjamin.peterson | 2009-03-07 18:21:17 -0600 (Sat, 07 Mar 2009) | 1 line fix funky indentation ........ r70244 | martin.v.loewis | 2009-03-08 09:06:19 -0500 (Sun, 08 Mar 2009) | 2 lines Add Chris Withers. ........ r70275 | georg.brandl | 2009-03-09 11:35:48 -0500 (Mon, 09 Mar 2009) | 2 lines Add missing space. ........ r70281 | benjamin.peterson | 2009-03-09 15:38:56 -0500 (Mon, 09 Mar 2009) | 1 line gzip and bz2 are context managers ........
		
			
				
	
	
		
			436 lines
		
	
	
	
		
			21 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			436 lines
		
	
	
	
		
			21 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
.. _curses-howto:
 | 
						|
 | 
						|
**********************************
 | 
						|
  Curses Programming with Python
 | 
						|
**********************************
 | 
						|
 | 
						|
:Author: A.M. Kuchling, Eric S. Raymond
 | 
						|
:Release: 2.03
 | 
						|
 | 
						|
 | 
						|
.. topic:: Abstract
 | 
						|
 | 
						|
   This document describes how to write text-mode programs with Python 2.x, using
 | 
						|
   the :mod:`curses` extension module to control the display.
 | 
						|
 | 
						|
 | 
						|
What is curses?
 | 
						|
===============
 | 
						|
 | 
						|
The curses library supplies a terminal-independent screen-painting and
 | 
						|
keyboard-handling facility for text-based terminals; such terminals include
 | 
						|
VT100s, the Linux console, and the simulated terminal provided by X11 programs
 | 
						|
such as xterm and rxvt.  Display terminals support various control codes to
 | 
						|
perform common operations such as moving the cursor, scrolling the screen, and
 | 
						|
erasing areas.  Different terminals use widely differing codes, and often have
 | 
						|
their own minor quirks.
 | 
						|
 | 
						|
In a world of X displays, one might ask "why bother"?  It's true that
 | 
						|
character-cell display terminals are an obsolete technology, but there are
 | 
						|
niches in which being able to do fancy things with them are still valuable.  One
 | 
						|
is on small-footprint or embedded Unixes that don't carry an X server.  Another
 | 
						|
is for tools like OS installers and kernel configurators that may have to run
 | 
						|
before X is available.
 | 
						|
 | 
						|
The curses library hides all the details of different terminals, and provides
 | 
						|
the programmer with an abstraction of a display, containing multiple
 | 
						|
non-overlapping windows.  The contents of a window can be changed in various
 | 
						|
ways-- adding text, erasing it, changing its appearance--and the curses library
 | 
						|
will automagically figure out what control codes need to be sent to the terminal
 | 
						|
to produce the right output.
 | 
						|
 | 
						|
The curses library was originally written for BSD Unix; the later System V
 | 
						|
versions of Unix from AT&T added many enhancements and new functions. BSD curses
 | 
						|
is no longer maintained, having been replaced by ncurses, which is an
 | 
						|
open-source implementation of the AT&T interface.  If you're using an
 | 
						|
open-source Unix such as Linux or FreeBSD, your system almost certainly uses
 | 
						|
ncurses.  Since most current commercial Unix versions are based on System V
 | 
						|
code, all the functions described here will probably be available.  The older
 | 
						|
versions of curses carried by some proprietary Unixes may not support
 | 
						|
everything, though.
 | 
						|
 | 
						|
No one has made a Windows port of the curses module.  On a Windows platform, try
 | 
						|
the Console module written by Fredrik Lundh.  The Console module provides
 | 
						|
cursor-addressable text output, plus full support for mouse and keyboard input,
 | 
						|
and is available from http://effbot.org/zone/console-index.htm.
 | 
						|
 | 
						|
 | 
						|
The Python curses module
 | 
						|
------------------------
 | 
						|
 | 
						|
Thy Python module is a fairly simple wrapper over the C functions provided by
 | 
						|
curses; if you're already familiar with curses programming in C, it's really
 | 
						|
easy to transfer that knowledge to Python.  The biggest difference is that the
 | 
						|
Python interface makes things simpler, by merging different C functions such as
 | 
						|
:func:`addstr`, :func:`mvaddstr`, :func:`mvwaddstr`, into a single
 | 
						|
:meth:`addstr` method.  You'll see this covered in more detail later.
 | 
						|
 | 
						|
This HOWTO is simply an introduction to writing text-mode programs with curses
 | 
						|
and Python. It doesn't attempt to be a complete guide to the curses API; for
 | 
						|
that, see the Python library guide's section on ncurses, and the C manual pages
 | 
						|
for ncurses.  It will, however, give you the basic ideas.
 | 
						|
 | 
						|
 | 
						|
Starting and ending a curses application
 | 
						|
========================================
 | 
						|
 | 
						|
Before doing anything, curses must be initialized.  This is done by calling the
 | 
						|
:func:`initscr` function, which will determine the terminal type, send any
 | 
						|
required setup codes to the terminal, and create various internal data
 | 
						|
structures.  If successful, :func:`initscr` returns a window object representing
 | 
						|
the entire screen; this is usually called ``stdscr``, after the name of the
 | 
						|
corresponding C variable. ::
 | 
						|
 | 
						|
   import curses
 | 
						|
   stdscr = curses.initscr()
 | 
						|
 | 
						|
Usually curses applications turn off automatic echoing of keys to the screen, in
 | 
						|
order to be able to read keys and only display them under certain circumstances.
 | 
						|
This requires calling the :func:`noecho` function. ::
 | 
						|
 | 
						|
   curses.noecho()
 | 
						|
 | 
						|
Applications will also commonly need to react to keys instantly, without
 | 
						|
requiring the Enter key to be pressed; this is called cbreak mode, as opposed to
 | 
						|
the usual buffered input mode. ::
 | 
						|
 | 
						|
   curses.cbreak()
 | 
						|
 | 
						|
Terminals usually return special keys, such as the cursor keys or navigation
 | 
						|
keys such as Page Up and Home, as a multibyte escape sequence.  While you could
 | 
						|
write your application to expect such sequences and process them accordingly,
 | 
						|
curses can do it for you, returning a special value such as
 | 
						|
:const:`curses.KEY_LEFT`.  To get curses to do the job, you'll have to enable
 | 
						|
keypad mode. ::
 | 
						|
 | 
						|
   stdscr.keypad(1)
 | 
						|
 | 
						|
Terminating a curses application is much easier than starting one. You'll need
 | 
						|
to call  ::
 | 
						|
 | 
						|
   curses.nocbreak(); stdscr.keypad(0); curses.echo()
 | 
						|
 | 
						|
to reverse the curses-friendly terminal settings. Then call the :func:`endwin`
 | 
						|
function to restore the terminal to its original operating mode. ::
 | 
						|
 | 
						|
   curses.endwin()
 | 
						|
 | 
						|
A common problem when debugging a curses application is to get your terminal
 | 
						|
messed up when the application dies without restoring the terminal to its
 | 
						|
previous state.  In Python this commonly happens when your code is buggy and
 | 
						|
raises an uncaught exception.  Keys are no longer be echoed to the screen when
 | 
						|
you type them, for example, which makes using the shell difficult.
 | 
						|
 | 
						|
In Python you can avoid these complications and make debugging much easier by
 | 
						|
importing the module :mod:`curses.wrapper`.  It supplies a :func:`wrapper`
 | 
						|
function that takes a callable.  It does the initializations described above,
 | 
						|
and also initializes colors if color support is present.  It then runs your
 | 
						|
provided callable and finally deinitializes appropriately.  The callable is
 | 
						|
called inside a try-catch clause which catches exceptions, performs curses
 | 
						|
deinitialization, and then passes the exception upwards.  Thus, your terminal
 | 
						|
won't be left in a funny state on exception.
 | 
						|
 | 
						|
 | 
						|
Windows and Pads
 | 
						|
================
 | 
						|
 | 
						|
Windows are the basic abstraction in curses.  A window object represents a
 | 
						|
rectangular area of the screen, and supports various methods to display text,
 | 
						|
erase it, allow the user to input strings, and so forth.
 | 
						|
 | 
						|
The ``stdscr`` object returned by the :func:`initscr` function is a window
 | 
						|
object that covers the entire screen.  Many programs may need only this single
 | 
						|
window, but you might wish to divide the screen into smaller windows, in order
 | 
						|
to redraw or clear them separately. The :func:`newwin` function creates a new
 | 
						|
window of a given size, returning the new window object. ::
 | 
						|
 | 
						|
   begin_x = 20 ; begin_y = 7
 | 
						|
   height = 5 ; width = 40
 | 
						|
   win = curses.newwin(height, width, begin_y, begin_x)
 | 
						|
 | 
						|
A word about the coordinate system used in curses: coordinates are always passed
 | 
						|
in the order *y,x*, and the top-left corner of a window is coordinate (0,0).
 | 
						|
This breaks a common convention for handling coordinates, where the *x*
 | 
						|
coordinate usually comes first.  This is an unfortunate difference from most
 | 
						|
other computer applications, but it's been part of curses since it was first
 | 
						|
written, and it's too late to change things now.
 | 
						|
 | 
						|
When you call a method to display or erase text, the effect doesn't immediately
 | 
						|
show up on the display.  This is because curses was originally written with slow
 | 
						|
300-baud terminal connections in mind; with these terminals, minimizing the time
 | 
						|
required to redraw the screen is very important.  This lets curses accumulate
 | 
						|
changes to the screen, and display them in the most efficient manner.  For
 | 
						|
example, if your program displays some characters in a window, and then clears
 | 
						|
the window, there's no need to send the original characters because they'd never
 | 
						|
be visible.
 | 
						|
 | 
						|
Accordingly, curses requires that you explicitly tell it to redraw windows,
 | 
						|
using the :func:`refresh` method of window objects.  In practice, this doesn't
 | 
						|
really complicate programming with curses much. Most programs go into a flurry
 | 
						|
of activity, and then pause waiting for a keypress or some other action on the
 | 
						|
part of the user.  All you have to do is to be sure that the screen has been
 | 
						|
redrawn before pausing to wait for user input, by simply calling
 | 
						|
``stdscr.refresh()`` or the :func:`refresh` method of some other relevant
 | 
						|
window.
 | 
						|
 | 
						|
A pad is a special case of a window; it can be larger than the actual display
 | 
						|
screen, and only a portion of it displayed at a time. Creating a pad simply
 | 
						|
requires the pad's height and width, while refreshing a pad requires giving the
 | 
						|
coordinates of the on-screen area where a subsection of the pad will be
 | 
						|
displayed.   ::
 | 
						|
 | 
						|
   pad = curses.newpad(100, 100)
 | 
						|
   #  These loops fill the pad with letters; this is
 | 
						|
   # explained in the next section
 | 
						|
   for y in range(0, 100):
 | 
						|
       for x in range(0, 100):
 | 
						|
           try: pad.addch(y,x, ord('a') + (x*x+y*y) % 26 )
 | 
						|
           except curses.error: pass
 | 
						|
 | 
						|
   #  Displays a section of the pad in the middle of the screen
 | 
						|
   pad.refresh( 0,0, 5,5, 20,75)
 | 
						|
 | 
						|
The :func:`refresh` call displays a section of the pad in the rectangle
 | 
						|
extending from coordinate (5,5) to coordinate (20,75) on the screen; the upper
 | 
						|
left corner of the displayed section is coordinate (0,0) on the pad.  Beyond
 | 
						|
that difference, pads are exactly like ordinary windows and support the same
 | 
						|
methods.
 | 
						|
 | 
						|
If you have multiple windows and pads on screen there is a more efficient way to
 | 
						|
go, which will prevent annoying screen flicker at refresh time.  Use the
 | 
						|
:meth:`noutrefresh` method of each window to update the data structure
 | 
						|
representing the desired state of the screen; then change the physical screen to
 | 
						|
match the desired state in one go with the function :func:`doupdate`.  The
 | 
						|
normal :meth:`refresh` method calls :func:`doupdate` as its last act.
 | 
						|
 | 
						|
 | 
						|
Displaying Text
 | 
						|
===============
 | 
						|
 | 
						|
From a C programmer's point of view, curses may sometimes look like a twisty
 | 
						|
maze of functions, all subtly different.  For example, :func:`addstr` displays a
 | 
						|
string at the current cursor location in the ``stdscr`` window, while
 | 
						|
:func:`mvaddstr` moves to a given y,x coordinate first before displaying the
 | 
						|
string. :func:`waddstr` is just like :func:`addstr`, but allows specifying a
 | 
						|
window to use, instead of using ``stdscr`` by default. :func:`mvwaddstr` follows
 | 
						|
similarly.
 | 
						|
 | 
						|
Fortunately the Python interface hides all these details; ``stdscr`` is a window
 | 
						|
object like any other, and methods like :func:`addstr` accept multiple argument
 | 
						|
forms.  Usually there are four different forms.
 | 
						|
 | 
						|
+---------------------------------+-----------------------------------------------+
 | 
						|
| Form                            | Description                                   |
 | 
						|
+=================================+===============================================+
 | 
						|
| *str* or *ch*                   | Display the string *str* or character *ch* at |
 | 
						|
|                                 | the current position                          |
 | 
						|
+---------------------------------+-----------------------------------------------+
 | 
						|
| *str* or *ch*, *attr*           | Display the string *str* or character *ch*,   |
 | 
						|
|                                 | using attribute *attr* at the current         |
 | 
						|
|                                 | position                                      |
 | 
						|
+---------------------------------+-----------------------------------------------+
 | 
						|
| *y*, *x*, *str* or *ch*         | Move to position *y,x* within the window, and |
 | 
						|
|                                 | display *str* or *ch*                         |
 | 
						|
+---------------------------------+-----------------------------------------------+
 | 
						|
| *y*, *x*, *str* or *ch*, *attr* | Move to position *y,x* within the window, and |
 | 
						|
|                                 | display *str* or *ch*, using attribute *attr* |
 | 
						|
+---------------------------------+-----------------------------------------------+
 | 
						|
 | 
						|
Attributes allow displaying text in highlighted forms, such as in boldface,
 | 
						|
underline, reverse code, or in color.  They'll be explained in more detail in
 | 
						|
the next subsection.
 | 
						|
 | 
						|
The :func:`addstr` function takes a Python string as the value to be displayed,
 | 
						|
while the :func:`addch` functions take a character, which can be either a Python
 | 
						|
string of length 1 or an integer.  If it's a string, you're limited to
 | 
						|
displaying characters between 0 and 255.  SVr4 curses provides constants for
 | 
						|
extension characters; these constants are integers greater than 255.  For
 | 
						|
example, :const:`ACS_PLMINUS` is a +/- symbol, and :const:`ACS_ULCORNER` is the
 | 
						|
upper left corner of a box (handy for drawing borders).
 | 
						|
 | 
						|
Windows remember where the cursor was left after the last operation, so if you
 | 
						|
leave out the *y,x* coordinates, the string or character will be displayed
 | 
						|
wherever the last operation left off.  You can also move the cursor with the
 | 
						|
``move(y,x)`` method.  Because some terminals always display a flashing cursor,
 | 
						|
you may want to ensure that the cursor is positioned in some location where it
 | 
						|
won't be distracting; it can be confusing to have the cursor blinking at some
 | 
						|
apparently random location.
 | 
						|
 | 
						|
If your application doesn't need a blinking cursor at all, you can call
 | 
						|
``curs_set(0)`` to make it invisible.  Equivalently, and for compatibility with
 | 
						|
older curses versions, there's a ``leaveok(bool)`` function.  When *bool* is
 | 
						|
true, the curses library will attempt to suppress the flashing cursor, and you
 | 
						|
won't need to worry about leaving it in odd locations.
 | 
						|
 | 
						|
 | 
						|
Attributes and Color
 | 
						|
--------------------
 | 
						|
 | 
						|
Characters can be displayed in different ways.  Status lines in a text-based
 | 
						|
application are commonly shown in reverse video; a text viewer may need to
 | 
						|
highlight certain words.  curses supports this by allowing you to specify an
 | 
						|
attribute for each cell on the screen.
 | 
						|
 | 
						|
An attribute is a integer, each bit representing a different attribute.  You can
 | 
						|
try to display text with multiple attribute bits set, but curses doesn't
 | 
						|
guarantee that all the possible combinations are available, or that they're all
 | 
						|
visually distinct.  That depends on the ability of the terminal being used, so
 | 
						|
it's safest to stick to the most commonly available attributes, listed here.
 | 
						|
 | 
						|
+----------------------+--------------------------------------+
 | 
						|
| Attribute            | Description                          |
 | 
						|
+======================+======================================+
 | 
						|
| :const:`A_BLINK`     | Blinking text                        |
 | 
						|
+----------------------+--------------------------------------+
 | 
						|
| :const:`A_BOLD`      | Extra bright or bold text            |
 | 
						|
+----------------------+--------------------------------------+
 | 
						|
| :const:`A_DIM`       | Half bright text                     |
 | 
						|
+----------------------+--------------------------------------+
 | 
						|
| :const:`A_REVERSE`   | Reverse-video text                   |
 | 
						|
+----------------------+--------------------------------------+
 | 
						|
| :const:`A_STANDOUT`  | The best highlighting mode available |
 | 
						|
+----------------------+--------------------------------------+
 | 
						|
| :const:`A_UNDERLINE` | Underlined text                      |
 | 
						|
+----------------------+--------------------------------------+
 | 
						|
 | 
						|
So, to display a reverse-video status line on the top line of the screen, you
 | 
						|
could code::
 | 
						|
 | 
						|
   stdscr.addstr(0, 0, "Current mode: Typing mode",
 | 
						|
                 curses.A_REVERSE)
 | 
						|
   stdscr.refresh()
 | 
						|
 | 
						|
The curses library also supports color on those terminals that provide it, The
 | 
						|
most common such terminal is probably the Linux console, followed by color
 | 
						|
xterms.
 | 
						|
 | 
						|
To use color, you must call the :func:`start_color` function soon after calling
 | 
						|
:func:`initscr`, to initialize the default color set (the
 | 
						|
:func:`curses.wrapper.wrapper` function does this automatically).  Once that's
 | 
						|
done, the :func:`has_colors` function returns TRUE if the terminal in use can
 | 
						|
actually display color.  (Note: curses uses the American spelling 'color',
 | 
						|
instead of the Canadian/British spelling 'colour'.  If you're used to the
 | 
						|
British spelling, you'll have to resign yourself to misspelling it for the sake
 | 
						|
of these functions.)
 | 
						|
 | 
						|
The curses library maintains a finite number of color pairs, containing a
 | 
						|
foreground (or text) color and a background color.  You can get the attribute
 | 
						|
value corresponding to a color pair with the :func:`color_pair` function; this
 | 
						|
can be bitwise-OR'ed with other attributes such as :const:`A_REVERSE`, but
 | 
						|
again, such combinations are not guaranteed to work on all terminals.
 | 
						|
 | 
						|
An example, which displays a line of text using color pair 1::
 | 
						|
 | 
						|
   stdscr.addstr( "Pretty text", curses.color_pair(1) )
 | 
						|
   stdscr.refresh()
 | 
						|
 | 
						|
As I said before, a color pair consists of a foreground and background color.
 | 
						|
:func:`start_color` initializes 8 basic colors when it activates color mode.
 | 
						|
They are: 0:black, 1:red, 2:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and
 | 
						|
7:white.  The curses module defines named constants for each of these colors:
 | 
						|
:const:`curses.COLOR_BLACK`, :const:`curses.COLOR_RED`, and so forth.
 | 
						|
 | 
						|
The ``init_pair(n, f, b)`` function changes the definition of color pair *n*, to
 | 
						|
foreground color f and background color b.  Color pair 0 is hard-wired to white
 | 
						|
on black, and cannot be changed.
 | 
						|
 | 
						|
Let's put all this together. To change color 1 to red text on a white
 | 
						|
background, you would call::
 | 
						|
 | 
						|
   curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
 | 
						|
 | 
						|
When you change a color pair, any text already displayed using that color pair
 | 
						|
will change to the new colors.  You can also display new text in this color
 | 
						|
with::
 | 
						|
 | 
						|
   stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1) )
 | 
						|
 | 
						|
Very fancy terminals can change the definitions of the actual colors to a given
 | 
						|
RGB value.  This lets you change color 1, which is usually red, to purple or
 | 
						|
blue or any other color you like.  Unfortunately, the Linux console doesn't
 | 
						|
support this, so I'm unable to try it out, and can't provide any examples.  You
 | 
						|
can check if your terminal can do this by calling :func:`can_change_color`,
 | 
						|
which returns TRUE if the capability is there.  If you're lucky enough to have
 | 
						|
such a talented terminal, consult your system's man pages for more information.
 | 
						|
 | 
						|
 | 
						|
User Input
 | 
						|
==========
 | 
						|
 | 
						|
The curses library itself offers only very simple input mechanisms. Python's
 | 
						|
support adds a text-input widget that makes up some of the lack.
 | 
						|
 | 
						|
The most common way to get input to a window is to use its :meth:`getch` method.
 | 
						|
:meth:`getch` pauses and waits for the user to hit a key, displaying it if
 | 
						|
:func:`echo` has been called earlier.  You can optionally specify a coordinate
 | 
						|
to which the cursor should be moved before pausing.
 | 
						|
 | 
						|
It's possible to change this behavior with the method :meth:`nodelay`. After
 | 
						|
``nodelay(1)``, :meth:`getch` for the window becomes non-blocking and returns
 | 
						|
``curses.ERR`` (a value of -1) when no input is ready.  There's also a
 | 
						|
:func:`halfdelay` function, which can be used to (in effect) set a timer on each
 | 
						|
:meth:`getch`; if no input becomes available within a specified
 | 
						|
delay (measured in tenths of a second), curses raises an exception.
 | 
						|
 | 
						|
The :meth:`getch` method returns an integer; if it's between 0 and 255, it
 | 
						|
represents the ASCII code of the key pressed.  Values greater than 255 are
 | 
						|
special keys such as Page Up, Home, or the cursor keys. You can compare the
 | 
						|
value returned to constants such as :const:`curses.KEY_PPAGE`,
 | 
						|
:const:`curses.KEY_HOME`, or :const:`curses.KEY_LEFT`.  Usually the main loop of
 | 
						|
your program will look something like this::
 | 
						|
 | 
						|
   while True:
 | 
						|
       c = stdscr.getch()
 | 
						|
       if c == ord('p'): PrintDocument()
 | 
						|
       elif c == ord('q'): break  # Exit the while()
 | 
						|
       elif c == curses.KEY_HOME: x = y = 0
 | 
						|
 | 
						|
The :mod:`curses.ascii` module supplies ASCII class membership functions that
 | 
						|
take either integer or 1-character-string arguments; these may be useful in
 | 
						|
writing more readable tests for your command interpreters.  It also supplies
 | 
						|
conversion functions  that take either integer or 1-character-string arguments
 | 
						|
and return the same type.  For example, :func:`curses.ascii.ctrl` returns the
 | 
						|
control character corresponding to its argument.
 | 
						|
 | 
						|
There's also a method to retrieve an entire string, :const:`getstr()`.  It isn't
 | 
						|
used very often, because its functionality is quite limited; the only editing
 | 
						|
keys available are the backspace key and the Enter key, which terminates the
 | 
						|
string.  It can optionally be limited to a fixed number of characters. ::
 | 
						|
 | 
						|
   curses.echo()            # Enable echoing of characters
 | 
						|
 | 
						|
   # Get a 15-character string, with the cursor on the top line
 | 
						|
   s = stdscr.getstr(0,0, 15)
 | 
						|
 | 
						|
The Python :mod:`curses.textpad` module supplies something better. With it, you
 | 
						|
can turn a window into a text box that supports an Emacs-like set of
 | 
						|
keybindings.  Various methods of :class:`Textbox` class support editing with
 | 
						|
input validation and gathering the edit results either with or without trailing
 | 
						|
spaces.   See the library documentation on :mod:`curses.textpad` for the
 | 
						|
details.
 | 
						|
 | 
						|
 | 
						|
For More Information
 | 
						|
====================
 | 
						|
 | 
						|
This HOWTO didn't cover some advanced topics, such as screen-scraping or
 | 
						|
capturing mouse events from an xterm instance.  But the Python library page for
 | 
						|
the curses modules is now pretty complete.  You should browse it next.
 | 
						|
 | 
						|
If you're in doubt about the detailed behavior of any of the ncurses entry
 | 
						|
points, consult the manual pages for your curses implementation, whether it's
 | 
						|
ncurses or a proprietary Unix vendor's.  The manual pages will document any
 | 
						|
quirks, and provide complete lists of all the functions, attributes, and
 | 
						|
:const:`ACS_\*` characters available to you.
 | 
						|
 | 
						|
Because the curses API is so large, some functions aren't supported in the
 | 
						|
Python interface, not because they're difficult to implement, but because no one
 | 
						|
has needed them yet.  Feel free to add them and then submit a patch.  Also, we
 | 
						|
don't yet have support for the menu library associated with
 | 
						|
ncurses; feel free to add that.
 | 
						|
 | 
						|
If you write an interesting little program, feel free to contribute it as
 | 
						|
another demo.  We can always use more of them!
 | 
						|
 | 
						|
The ncurses FAQ: http://invisible-island.net/ncurses/ncurses.faq.html
 | 
						|
 |