1.. _curses-howto:
2
3**********************************
4  Curses Programming with Python
5**********************************
6
7.. currentmodule:: curses
8
9:Author: A.M. Kuchling, Eric S. Raymond
10:Release: 2.04
11
12
13.. topic:: Abstract
14
15   This document describes how to use the :mod:`curses` extension
16   module to control text-mode displays.
17
18
19What is curses?
20===============
21
22The curses library supplies a terminal-independent screen-painting and
23keyboard-handling facility for text-based terminals; such terminals
24include VT100s, the Linux console, and the simulated terminal provided
25by various programs.  Display terminals support various control codes
26to perform common operations such as moving the cursor, scrolling the
27screen, and erasing areas.  Different terminals use widely differing
28codes, and often have their own minor quirks.
29
30In a world of graphical displays, one might ask "why bother"?  It's
31true that character-cell display terminals are an obsolete technology,
32but there are niches in which being able to do fancy things with them
33are still valuable.  One niche is on small-footprint or embedded
34Unixes that don't run an X server.  Another is tools such as OS
35installers and kernel configurators that may have to run before any
36graphical support is available.
37
38The curses library provides fairly basic functionality, providing the
39programmer with an abstraction of a display containing multiple
40non-overlapping windows of text.  The contents of a window can be
41changed in various ways---adding text, erasing it, changing its
42appearance---and the curses library will figure out what control codes
43need to be sent to the terminal to produce the right output.  curses
44doesn't provide many user-interface concepts such as buttons, checkboxes,
45or dialogs; if you need such features, consider a user interface library such as
46`Urwid <https://pypi.org/project/urwid/>`_.
47
48The curses library was originally written for BSD Unix; the later System V
49versions of Unix from AT&T added many enhancements and new functions. BSD curses
50is no longer maintained, having been replaced by ncurses, which is an
51open-source implementation of the AT&T interface.  If you're using an
52open-source Unix such as Linux or FreeBSD, your system almost certainly uses
53ncurses.  Since most current commercial Unix versions are based on System V
54code, all the functions described here will probably be available.  The older
55versions of curses carried by some proprietary Unixes may not support
56everything, though.
57
58The Windows version of Python doesn't include the :mod:`curses`
59module.  A ported version called `UniCurses
60<https://pypi.org/project/UniCurses>`_ is available.
61
62
63The Python curses module
64------------------------
65
66The Python module is a fairly simple wrapper over the C functions provided by
67curses; if you're already familiar with curses programming in C, it's really
68easy to transfer that knowledge to Python.  The biggest difference is that the
69Python interface makes things simpler by merging different C functions such as
70:c:func:`!addstr`, :c:func:`!mvaddstr`, and :c:func:`!mvwaddstr` into a single
71:meth:`~curses.window.addstr` method.  You'll see this covered in more
72detail later.
73
74This HOWTO is an introduction to writing text-mode programs with curses
75and Python. It doesn't attempt to be a complete guide to the curses API; for
76that, see the Python library guide's section on ncurses, and the C manual pages
77for ncurses.  It will, however, give you the basic ideas.
78
79
80Starting and ending a curses application
81========================================
82
83Before doing anything, curses must be initialized.  This is done by
84calling the :func:`~curses.initscr` function, which will determine the
85terminal type, send any required setup codes to the terminal, and
86create various internal data structures.  If successful,
87:func:`!initscr` returns a window object representing the entire
88screen; this is usually called ``stdscr`` after the name of the
89corresponding C variable. ::
90
91   import curses
92   stdscr = curses.initscr()
93
94Usually curses applications turn off automatic echoing of keys to the
95screen, in order to be able to read keys and only display them under
96certain circumstances.  This requires calling the
97:func:`~curses.noecho` function. ::
98
99   curses.noecho()
100
101Applications will also commonly need to react to keys instantly,
102without requiring the Enter key to be pressed; this is called cbreak
103mode, as opposed to the usual buffered input mode. ::
104
105   curses.cbreak()
106
107Terminals usually return special keys, such as the cursor keys or navigation
108keys such as Page Up and Home, as a multibyte escape sequence.  While you could
109write your application to expect such sequences and process them accordingly,
110curses can do it for you, returning a special value such as
111:const:`curses.KEY_LEFT`.  To get curses to do the job, you'll have to enable
112keypad mode. ::
113
114   stdscr.keypad(True)
115
116Terminating a curses application is much easier than starting one. You'll need
117to call::
118
119   curses.nocbreak()
120   stdscr.keypad(False)
121   curses.echo()
122
123to reverse the curses-friendly terminal settings. Then call the
124:func:`~curses.endwin` function to restore the terminal to its original
125operating mode. ::
126
127   curses.endwin()
128
129A common problem when debugging a curses application is to get your terminal
130messed up when the application dies without restoring the terminal to its
131previous state.  In Python this commonly happens when your code is buggy and
132raises an uncaught exception.  Keys are no longer echoed to the screen when
133you type them, for example, which makes using the shell difficult.
134
135In Python you can avoid these complications and make debugging much easier by
136importing the :func:`curses.wrapper` function and using it like this::
137
138   from curses import wrapper
139
140   def main(stdscr):
141       # Clear screen
142       stdscr.clear()
143
144       # This raises ZeroDivisionError when i == 10.
145       for i in range(0, 11):
146           v = i-10
147           stdscr.addstr(i, 0, '10 divided by {} is {}'.format(v, 10/v))
148
149       stdscr.refresh()
150       stdscr.getkey()
151
152   wrapper(main)
153
154The :func:`~curses.wrapper` function takes a callable object and does the
155initializations described above, also initializing colors if color
156support is present.  :func:`!wrapper` then runs your provided callable.
157Once the callable returns, :func:`!wrapper` will restore the original
158state of the terminal.  The callable is called inside a
159:keyword:`try`...\ :keyword:`except` that catches exceptions, restores
160the state of the terminal, and then re-raises the exception.  Therefore
161your terminal won't be left in a funny state on exception and you'll be
162able to read the exception's message and traceback.
163
164
165Windows and Pads
166================
167
168Windows are the basic abstraction in curses.  A window object represents a
169rectangular area of the screen, and supports methods to display text,
170erase it, allow the user to input strings, and so forth.
171
172The ``stdscr`` object returned by the :func:`~curses.initscr` function is a
173window object that covers the entire screen.  Many programs may need
174only this single window, but you might wish to divide the screen into
175smaller windows, in order to redraw or clear them separately. The
176:func:`~curses.newwin` function creates a new window of a given size,
177returning the new window object. ::
178
179   begin_x = 20; begin_y = 7
180   height = 5; width = 40
181   win = curses.newwin(height, width, begin_y, begin_x)
182
183Note that the coordinate system used in curses is unusual.
184Coordinates are always passed in the order *y,x*, and the top-left
185corner of a window is coordinate (0,0).  This breaks the normal
186convention for handling coordinates where the *x* coordinate comes
187first.  This is an unfortunate difference from most other computer
188applications, but it's been part of curses since it was first written,
189and it's too late to change things now.
190
191Your application can determine the size of the screen by using the
192:data:`curses.LINES` and :data:`curses.COLS` variables to obtain the *y* and
193*x* sizes.  Legal coordinates will then extend from ``(0,0)`` to
194``(curses.LINES - 1, curses.COLS - 1)``.
195
196When you call a method to display or erase text, the effect doesn't
197immediately show up on the display.  Instead you must call the
198:meth:`~curses.window.refresh` method of window objects to update the
199screen.
200
201This is because curses was originally written with slow 300-baud
202terminal connections in mind; with these terminals, minimizing the
203time required to redraw the screen was very important.  Instead curses
204accumulates changes to the screen and displays them in the most
205efficient manner when you call :meth:`!refresh`.  For example, if your
206program displays some text in a window and then clears the window,
207there's no need to send the original text because they're never
208visible.
209
210In practice, explicitly telling curses to redraw a window doesn't
211really complicate programming with curses much. Most programs go into a flurry
212of activity, and then pause waiting for a keypress or some other action on the
213part of the user.  All you have to do is to be sure that the screen has been
214redrawn before pausing to wait for user input, by first calling
215:meth:`!stdscr.refresh` or the :meth:`!refresh` method of some other relevant
216window.
217
218A pad is a special case of a window; it can be larger than the actual display
219screen, and only a portion of the pad displayed at a time. Creating a pad
220requires the pad's height and width, while refreshing a pad requires giving the
221coordinates of the on-screen area where a subsection of the pad will be
222displayed.  ::
223
224   pad = curses.newpad(100, 100)
225   # These loops fill the pad with letters; addch() is
226   # explained in the next section
227   for y in range(0, 99):
228       for x in range(0, 99):
229           pad.addch(y,x, ord('a') + (x*x+y*y) % 26)
230
231   # Displays a section of the pad in the middle of the screen.
232   # (0,0) : coordinate of upper-left corner of pad area to display.
233   # (5,5) : coordinate of upper-left corner of window area to be filled
234   #         with pad content.
235   # (20, 75) : coordinate of lower-right corner of window area to be
236   #          : filled with pad content.
237   pad.refresh( 0,0, 5,5, 20,75)
238
239The :meth:`!refresh` call displays a section of the pad in the rectangle
240extending from coordinate (5,5) to coordinate (20,75) on the screen; the upper
241left corner of the displayed section is coordinate (0,0) on the pad.  Beyond
242that difference, pads are exactly like ordinary windows and support the same
243methods.
244
245If you have multiple windows and pads on screen there is a more
246efficient way to update the screen and prevent annoying screen flicker
247as each part of the screen gets updated.  :meth:`!refresh` actually
248does two things:
249
2501) Calls the :meth:`~curses.window.noutrefresh` method of each window
251   to update an underlying data structure representing the desired
252   state of the screen.
2532) Calls the function :func:`~curses.doupdate` function to change the
254   physical screen to match the desired state recorded in the data structure.
255
256Instead you can call :meth:`!noutrefresh` on a number of windows to
257update the data structure, and then call :func:`!doupdate` to update
258the screen.
259
260
261Displaying Text
262===============
263
264From a C programmer's point of view, curses may sometimes look like a
265twisty maze of functions, all subtly different.  For example,
266:c:func:`!addstr` displays a string at the current cursor location in
267the ``stdscr`` window, while :c:func:`!mvaddstr` moves to a given y,x
268coordinate first before displaying the string. :c:func:`!waddstr` is just
269like :c:func:`!addstr`, but allows specifying a window to use instead of
270using ``stdscr`` by default. :c:func:`!mvwaddstr` allows specifying both
271a window and a coordinate.
272
273Fortunately the Python interface hides all these details.  ``stdscr``
274is a window object like any other, and methods such as
275:meth:`~curses.window.addstr` accept multiple argument forms.  Usually there
276are four different forms.
277
278+---------------------------------+-----------------------------------------------+
279| Form                            | Description                                   |
280+=================================+===============================================+
281| *str* or *ch*                   | Display the string *str* or character *ch* at |
282|                                 | the current position                          |
283+---------------------------------+-----------------------------------------------+
284| *str* or *ch*, *attr*           | Display the string *str* or character *ch*,   |
285|                                 | using attribute *attr* at the current         |
286|                                 | position                                      |
287+---------------------------------+-----------------------------------------------+
288| *y*, *x*, *str* or *ch*         | Move to position *y,x* within the window, and |
289|                                 | display *str* or *ch*                         |
290+---------------------------------+-----------------------------------------------+
291| *y*, *x*, *str* or *ch*, *attr* | Move to position *y,x* within the window, and |
292|                                 | display *str* or *ch*, using attribute *attr* |
293+---------------------------------+-----------------------------------------------+
294
295Attributes allow displaying text in highlighted forms such as boldface,
296underline, reverse code, or in color.  They'll be explained in more detail in
297the next subsection.
298
299
300The :meth:`~curses.window.addstr` method takes a Python string or
301bytestring as the value to be displayed.  The contents of bytestrings
302are sent to the terminal as-is.  Strings are encoded to bytes using
303the value of the window's :attr:`~window.encoding` attribute; this defaults to
304the default system encoding as returned by :func:`locale.getencoding`.
305
306The :meth:`~curses.window.addch` methods take a character, which can be
307either a string of length 1, a bytestring of length 1, or an integer.
308
309Constants are provided for extension characters; these constants are
310integers greater than 255.  For example, :const:`ACS_PLMINUS` is a +/-
311symbol, and :const:`ACS_ULCORNER` is the upper left corner of a box
312(handy for drawing borders).  You can also use the appropriate Unicode
313character.
314
315Windows remember where the cursor was left after the last operation, so if you
316leave out the *y,x* coordinates, the string or character will be displayed
317wherever the last operation left off.  You can also move the cursor with the
318``move(y,x)`` method.  Because some terminals always display a flashing cursor,
319you may want to ensure that the cursor is positioned in some location where it
320won't be distracting; it can be confusing to have the cursor blinking at some
321apparently random location.
322
323If your application doesn't need a blinking cursor at all, you can
324call ``curs_set(False)`` to make it invisible.  For compatibility
325with older curses versions, there's a ``leaveok(bool)`` function
326that's a synonym for :func:`~curses.curs_set`.  When *bool* is true, the
327curses library will attempt to suppress the flashing cursor, and you
328won't need to worry about leaving it in odd locations.
329
330
331Attributes and Color
332--------------------
333
334Characters can be displayed in different ways.  Status lines in a text-based
335application are commonly shown in reverse video, or a text viewer may need to
336highlight certain words.  curses supports this by allowing you to specify an
337attribute for each cell on the screen.
338
339An attribute is an integer, each bit representing a different
340attribute.  You can try to display text with multiple attribute bits
341set, but curses doesn't guarantee that all the possible combinations
342are available, or that they're all visually distinct.  That depends on
343the ability of the terminal being used, so it's safest to stick to the
344most commonly available attributes, listed here.
345
346+----------------------+--------------------------------------+
347| Attribute            | Description                          |
348+======================+======================================+
349| :const:`A_BLINK`     | Blinking text                        |
350+----------------------+--------------------------------------+
351| :const:`A_BOLD`      | Extra bright or bold text            |
352+----------------------+--------------------------------------+
353| :const:`A_DIM`       | Half bright text                     |
354+----------------------+--------------------------------------+
355| :const:`A_REVERSE`   | Reverse-video text                   |
356+----------------------+--------------------------------------+
357| :const:`A_STANDOUT`  | The best highlighting mode available |
358+----------------------+--------------------------------------+
359| :const:`A_UNDERLINE` | Underlined text                      |
360+----------------------+--------------------------------------+
361
362So, to display a reverse-video status line on the top line of the screen, you
363could code::
364
365   stdscr.addstr(0, 0, "Current mode: Typing mode",
366                 curses.A_REVERSE)
367   stdscr.refresh()
368
369The curses library also supports color on those terminals that provide it. The
370most common such terminal is probably the Linux console, followed by color
371xterms.
372
373To use color, you must call the :func:`~curses.start_color` function soon
374after calling :func:`~curses.initscr`, to initialize the default color set
375(the :func:`curses.wrapper` function does this automatically).  Once that's
376done, the :func:`~curses.has_colors` function returns TRUE if the terminal
377in use can
378actually display color.  (Note: curses uses the American spelling 'color',
379instead of the Canadian/British spelling 'colour'.  If you're used to the
380British spelling, you'll have to resign yourself to misspelling it for the sake
381of these functions.)
382
383The curses library maintains a finite number of color pairs, containing a
384foreground (or text) color and a background color.  You can get the attribute
385value corresponding to a color pair with the :func:`~curses.color_pair`
386function; this can be bitwise-OR'ed with other attributes such as
387:const:`A_REVERSE`, but again, such combinations are not guaranteed to work
388on all terminals.
389
390An example, which displays a line of text using color pair 1::
391
392   stdscr.addstr("Pretty text", curses.color_pair(1))
393   stdscr.refresh()
394
395As I said before, a color pair consists of a foreground and background color.
396The ``init_pair(n, f, b)`` function changes the definition of color pair *n*, to
397foreground color f and background color b.  Color pair 0 is hard-wired to white
398on black, and cannot be changed.
399
400Colors are numbered, and :func:`start_color` initializes 8 basic
401colors when it activates color mode.  They are: 0:black, 1:red,
4022:green, 3:yellow, 4:blue, 5:magenta, 6:cyan, and 7:white.  The :mod:`curses`
403module defines named constants for each of these colors:
404:const:`curses.COLOR_BLACK`, :const:`curses.COLOR_RED`, and so forth.
405
406Let's put all this together. To change color 1 to red text on a white
407background, you would call::
408
409   curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)
410
411When you change a color pair, any text already displayed using that color pair
412will change to the new colors.  You can also display new text in this color
413with::
414
415   stdscr.addstr(0,0, "RED ALERT!", curses.color_pair(1))
416
417Very fancy terminals can change the definitions of the actual colors to a given
418RGB value.  This lets you change color 1, which is usually red, to purple or
419blue or any other color you like.  Unfortunately, the Linux console doesn't
420support this, so I'm unable to try it out, and can't provide any examples.  You
421can check if your terminal can do this by calling
422:func:`~curses.can_change_color`, which returns ``True`` if the capability is
423there.  If you're lucky enough to have such a talented terminal, consult your
424system's man pages for more information.
425
426
427User Input
428==========
429
430The C curses library offers only very simple input mechanisms. Python's
431:mod:`curses` module adds a basic text-input widget.  (Other libraries
432such as `Urwid <https://pypi.org/project/urwid/>`_ have more extensive
433collections of widgets.)
434
435There are two methods for getting input from a window:
436
437* :meth:`~curses.window.getch` refreshes the screen and then waits for
438  the user to hit a key, displaying the key if :func:`~curses.echo` has been
439  called earlier.  You can optionally specify a coordinate to which
440  the cursor should be moved before pausing.
441
442* :meth:`~curses.window.getkey` does the same thing but converts the
443  integer to a string.  Individual characters are returned as
444  1-character strings, and special keys such as function keys return
445  longer strings containing a key name such as ``KEY_UP`` or ``^G``.
446
447It's possible to not wait for the user using the
448:meth:`~curses.window.nodelay` window method. After ``nodelay(True)``,
449:meth:`!getch` and :meth:`!getkey` for the window become
450non-blocking. To signal that no input is ready, :meth:`!getch` returns
451``curses.ERR`` (a value of -1) and :meth:`!getkey` raises an exception.
452There's also a :func:`~curses.halfdelay` function, which can be used to (in
453effect) set a timer on each :meth:`!getch`; if no input becomes
454available within a specified delay (measured in tenths of a second),
455curses raises an exception.
456
457The :meth:`!getch` method returns an integer; if it's between 0 and 255, it
458represents the ASCII code of the key pressed.  Values greater than 255 are
459special keys such as Page Up, Home, or the cursor keys. You can compare the
460value returned to constants such as :const:`curses.KEY_PPAGE`,
461:const:`curses.KEY_HOME`, or :const:`curses.KEY_LEFT`.  The main loop of
462your program may look something like this::
463
464   while True:
465       c = stdscr.getch()
466       if c == ord('p'):
467           PrintDocument()
468       elif c == ord('q'):
469           break  # Exit the while loop
470       elif c == curses.KEY_HOME:
471           x = y = 0
472
473The :mod:`curses.ascii` module supplies ASCII class membership functions that
474take either integer or 1-character string arguments; these may be useful in
475writing more readable tests for such loops.  It also supplies
476conversion functions  that take either integer or 1-character-string arguments
477and return the same type.  For example, :func:`curses.ascii.ctrl` returns the
478control character corresponding to its argument.
479
480There's also a method to retrieve an entire string,
481:meth:`~curses.window.getstr`.  It isn't used very often, because its
482functionality is quite limited; the only editing keys available are
483the backspace key and the Enter key, which terminates the string.  It
484can optionally be limited to a fixed number of characters. ::
485
486   curses.echo()            # Enable echoing of characters
487
488   # Get a 15-character string, with the cursor on the top line
489   s = stdscr.getstr(0,0, 15)
490
491The :mod:`curses.textpad` module supplies a text box that supports an
492Emacs-like set of keybindings.  Various methods of the
493:class:`~curses.textpad.Textbox` class support editing with input
494validation and gathering the edit results either with or without
495trailing spaces.  Here's an example::
496
497   import curses
498   from curses.textpad import Textbox, rectangle
499
500   def main(stdscr):
501       stdscr.addstr(0, 0, "Enter IM message: (hit Ctrl-G to send)")
502
503       editwin = curses.newwin(5,30, 2,1)
504       rectangle(stdscr, 1,0, 1+5+1, 1+30+1)
505       stdscr.refresh()
506
507       box = Textbox(editwin)
508
509       # Let the user edit until Ctrl-G is struck.
510       box.edit()
511
512       # Get resulting contents
513       message = box.gather()
514
515See the library documentation on :mod:`curses.textpad` for more details.
516
517
518For More Information
519====================
520
521This HOWTO doesn't cover some advanced topics, such as reading the
522contents of the screen or capturing mouse events from an xterm
523instance, but the Python library page for the :mod:`curses` module is now
524reasonably complete.  You should browse it next.
525
526If you're in doubt about the detailed behavior of the curses
527functions, consult the manual pages for your curses implementation,
528whether it's ncurses or a proprietary Unix vendor's.  The manual pages
529will document any quirks, and provide complete lists of all the
530functions, attributes, and :const:`ACS_\*` characters available to
531you.
532
533Because the curses API is so large, some functions aren't supported in
534the Python interface.  Often this isn't because they're difficult to
535implement, but because no one has needed them yet.  Also, Python
536doesn't yet support the menu library associated with ncurses.
537Patches adding support for these would be welcome; see
538`the Python Developer's Guide <https://devguide.python.org/>`_ to
539learn more about submitting patches to Python.
540
541* `Writing Programs with NCURSES <https://invisible-island.net/ncurses/ncurses-intro.html>`_:
542  a lengthy tutorial for C programmers.
543* `The ncurses man page <https://linux.die.net/man/3/ncurses>`_
544* `The ncurses FAQ <https://invisible-island.net/ncurses/ncurses.faq.html>`_
545* `"Use curses... don't swear" <https://www.youtube.com/watch?v=eN1eZtjLEnU>`_:
546  video of a PyCon 2013 talk on controlling terminals using curses or Urwid.
547* `"Console Applications with Urwid" <https://pyvideo.org/video/1568/console-applications-with-urwid>`_:
548  video of a PyCon CA 2012 talk demonstrating some applications written using
549  Urwid.
550