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