Jonathanb Jonathanb - 3 months ago 7
Python Question

_curses.error: add_wch() returned an error

I have the following code rendering the display for my roguelike game. It includes rendering the map.

def render_all(self):
for y in range(self.height):
for x in range(self.width):
wall =,y).blocked
if wall:
self.main.addch(y, x, "#")
self.main.addch(y, x, ".")
for thing in self.things:

It errors out every time. I think it's because it's going off the screen, but the height and width variables are coming from self.main.getmaxyx(), so it shouldn't do that, right? What am I missing? Python 3.4.3 running in Ubuntu 14.04 should that matter.


That's expected behavior. Python uses ncurses, which does this because other implementations do this.

In the manual page for addch:

The addch, waddch, mvaddch and mvwaddch routines put the character ch into the given window at its current window position, which is then advanced. They are analogous to putchar in stdio(3). If the advance is at the right margin:

  • The cursor automatically wraps to the beginning of the next line.

  • At the bottom of the current scrolling region, and if scrollok is enabled, the scrolling region is scrolled up one line.

  • If scrollok is not enabled, writing a character at the lower right margin succeeds. However, an error is returned because it is not possible to wrap to a new line

Python's curses binding has scrollok. To add characters without scrolling, you would call it with a "false" parameter, e.g.,


If you do not want to scroll, you can use a try/catch block, like this:

import curses

def main(win):
  for y in range(curses.LINES):
    for x in range(curses.COLS):
        win.addch(y, x, ord('.'))
      except (curses.error):
  ch = win.getch()