Skip to content

Commit 147c463

Browse files
gh-156347: Fix wrong statements in the curses documentation
window.encoding does not encode the string arguments on a build with wide-character support: the curses library converts the characters itself. In the HOWTO: getch() returns -1, not curses.ERR, when there is no input, and half-delay mode does the same as no-delay mode. getkey() returns the key name only for a special key. leaveok() is not a synonym for curs_set(). getstr() returns a bytes object, interprets the erase and kill characters, and limits bytes. The ACS_* constants are not all larger than 255. Also document get_wch() before getch(), mention complexchar and complexstr, and read whole characters in the examples.
1 parent fe8ace3 commit 147c463

2 files changed

Lines changed: 60 additions & 38 deletions

File tree

Doc/howto/curses.rst

Lines changed: 58 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -295,17 +295,21 @@ underline, reverse code, or in color. They'll be explained in more detail in
295295
the next subsection.
296296

297297

298-
The :meth:`~curses.window.addstr` method takes a Python string or
299-
bytestring as the value to be displayed. The contents of bytestrings
300-
are sent to the terminal as-is. Strings are encoded to bytes using
301-
the value of the window's :attr:`~window.encoding` attribute; this defaults to
302-
the default system encoding as returned by :func:`locale.getencoding`.
298+
The :meth:`~curses.window.addstr` method takes a Python string, bytestring
299+
or :class:`~curses.complexstr` as the value to be displayed. The contents
300+
of bytestrings are sent to the terminal as-is.
301+
On a build without wide-character support strings are encoded
302+
using the value of the window's :attr:`~window.encoding` attribute;
303+
this defaults to the default system encoding
304+
as returned by :func:`locale.getencoding`.
303305

304306
The :meth:`~curses.window.addch` methods take a character, which can be
305-
either a string of length 1, a bytestring of length 1, or an integer.
307+
either a string of length 1, a bytestring of length 1, an integer, or a
308+
:class:`~curses.complexchar`.
306309

307-
Constants are provided for extension characters; these constants are
308-
integers greater than 255. For example, :const:`ACS_PLMINUS` is a +/-
310+
Constants are provided for the characters of the terminal's alternate
311+
character set.
312+
For example, :const:`ACS_PLMINUS` is a +/-
309313
symbol, and :const:`ACS_ULCORNER` is the upper left corner of a box
310314
(handy for drawing borders). You can also use the appropriate Unicode
311315
character.
@@ -319,11 +323,11 @@ won't be distracting; it can be confusing to have the cursor blinking at some
319323
apparently random location.
320324

321325
If your application doesn't need a blinking cursor at all, you can
322-
call ``curs_set(False)`` to make it invisible. For compatibility
323-
with older curses versions, there's a ``leaveok(bool)`` function
324-
that's a synonym for :func:`~curses.curs_set`. When *bool* is true, the
325-
curses library will attempt to suppress the flashing cursor, and you
326-
won't need to worry about leaving it in odd locations.
326+
call ``curs_set(False)`` to make it invisible.
327+
The window method :meth:`~curses.window.leaveok` does something different:
328+
when its argument is true,
329+
curses leaves the cursor wherever the last update put it,
330+
instead of moving it back to the window's cursor position.
327331

328332

329333
Attributes and Color
@@ -364,6 +368,14 @@ could code::
364368
curses.A_REVERSE)
365369
stdscr.refresh()
366370

371+
A :class:`~curses.complexchar` carries its attributes and color pair
372+
together with the text of one character cell,
373+
and a :class:`~curses.complexstr` is a run of such cells.
374+
They are what :meth:`~curses.window.in_wch` and
375+
:meth:`~curses.window.in_wchstr` return,
376+
so a part of the screen can be read and written back
377+
with its appearance intact.
378+
367379
The curses library also supports color on those terminals that provide it. The
368380
most common such terminal is probably the Linux console, followed by color
369381
xterms.
@@ -429,40 +441,48 @@ The C curses library offers only very simple input mechanisms. Python's
429441
:mod:`curses` module adds a basic text-input widget. (Other libraries
430442
such as :pypi:`Urwid` have more extensive collections of widgets.)
431443

432-
There are two methods for getting input from a window:
444+
There are three methods for getting input from a window:
433445

434-
* :meth:`~curses.window.getch` refreshes the screen and then waits for
446+
* :meth:`~curses.window.get_wch` refreshes the screen and then waits for
435447
the user to hit a key, displaying the key if :func:`~curses.echo` has been
436448
called earlier. You can optionally specify a coordinate to which
437449
the cursor should be moved before pausing.
438450

439-
* :meth:`~curses.window.getkey` does the same thing but converts the
440-
integer to a string. Individual characters are returned as
441-
1-character strings, and special keys such as function keys return
442-
longer strings containing a key name such as ``KEY_UP`` or ``^G``.
451+
* :meth:`~curses.window.getch` does the same thing but returns the code of
452+
the key instead of a character.
453+
With ncurses this is a single byte of the key's encoding in the current
454+
locale, so a character encoded with several bytes takes several calls,
455+
one byte per call.
456+
457+
* :meth:`~curses.window.getkey` does the same as :meth:`!getch` but returns
458+
a string:
459+
an ordinary key as a 1-character string,
460+
and a special key as its name, such as ``KEY_UP``.
443461

444462
It's possible to not wait for the user using the
445463
:meth:`~curses.window.nodelay` window method. After ``nodelay(True)``,
446-
:meth:`!getch` and :meth:`!getkey` for the window become
447-
non-blocking. To signal that no input is ready, :meth:`!getch` returns
448-
``curses.ERR`` (a value of -1) and :meth:`!getkey` raises an exception.
464+
the reads for the window become non-blocking.
465+
To signal that no input is ready,
466+
:meth:`!get_wch` and :meth:`!getkey` raise an exception,
467+
and :meth:`!getch` returns ``-1``.
449468
There's also a :func:`~curses.halfdelay` function, which can be used to (in
450-
effect) set a timer on each :meth:`!getch`; if no input becomes
469+
effect) set a timer on each read; if no input becomes
451470
available within a specified delay (measured in tenths of a second),
452-
curses raises an exception.
471+
the read fails the same way.
453472

454-
The :meth:`!getch` method returns an integer; if it's between 0 and 255, it
455-
represents the ASCII code of the key pressed. Values greater than 255 are
456-
special keys such as Page Up, Home, or the cursor keys. You can compare the
457-
value returned to constants such as :const:`curses.KEY_PPAGE`,
473+
Special keys such as Page Up, Home, or the cursor keys are returned by all
474+
three as one of the :ref:`KEY_* constants <curses-key-constants>`,
475+
all larger than 255.
476+
You can compare the value returned to constants such as
477+
:const:`curses.KEY_PPAGE`,
458478
:const:`curses.KEY_HOME`, or :const:`curses.KEY_LEFT`. The main loop of
459479
your program may look something like this::
460480

461481
while True:
462-
c = stdscr.getch()
463-
if c == ord('p'):
482+
c = stdscr.get_wch()
483+
if c == 'p':
464484
PrintDocument()
465-
elif c == ord('q'):
485+
elif c == 'q':
466486
break # Exit the while loop
467487
elif c == curses.KEY_HOME:
468488
x = y = 0
@@ -474,16 +494,17 @@ conversion functions that take either integer or 1-character-string arguments
474494
and return the same type. For example, :func:`curses.ascii.ctrl` returns the
475495
control character corresponding to its argument.
476496

477-
There's also a method to retrieve an entire string,
478-
:meth:`~curses.window.getstr`. It isn't used very often, because its
497+
There's also a method to retrieve an entire line,
498+
:meth:`~curses.window.get_wstr`. It isn't used very often, because its
479499
functionality is quite limited; the only editing keys available are
480-
the backspace key and the Enter key, which terminates the string. It
481-
can optionally be limited to a fixed number of characters. ::
500+
the erase and kill characters, and the Enter key, which terminates the line.
501+
It can optionally be limited to a fixed number of characters;
502+
:meth:`~curses.window.getstr` returns a bytes object instead. ::
482503

483504
curses.echo() # Enable echoing of characters
484505

485-
# Get a 15-character string, with the cursor on the top line
486-
s = stdscr.getstr(0,0, 15)
506+
# Get a line of at most 15 characters, with the cursor on the top line
507+
s = stdscr.get_wstr(0,0, 15)
487508

488509
The :mod:`curses.textpad` module supplies a text box that supports an
489510
Emacs-like set of keybindings. Various methods of the

Doc/library/curses.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2002,7 +2002,8 @@ Other
20022002

20032003
.. attribute:: window.encoding
20042004

2005-
Encoding used to encode method arguments (Unicode strings and characters).
2005+
Encoding used to encode the string arguments of the methods and to decode
2006+
their results on a build without wide-character support.
20062007
The encoding attribute is inherited from the parent window when a subwindow
20072008
is created, for example with :meth:`window.subwin`.
20082009
By default, current locale encoding is used (see :func:`locale.getencoding`).

0 commit comments

Comments
 (0)