title: python curses addstr error - but only on my computer
body: <p>I was writing a little program that takes a list and generates a menu out of it in curses (straight up, standard library or whatever, batteries included python's curses) when I noticed the strangest problem (if you'd like, a heavily commented copy of the entire program is below). Simply put, when accepting the results of an <code>os.listdir</code> generated list, curses crashes with an <code>addstr</code> ERR, BUT, if I feed it a hardcoded list, it works fine. This, of course, makes absolutely no sense, right? A list is a list is a list and a list by any other name should still be a list, right? </p>
  
  <p>To make things even more complicated, I sent the code to a friend of mine who works mainly in python2.6 (mine was originally written to work in python3.1). He uncommented the <code>broken_input()</code> call (which feeds the program the <code>os.listdir</code> generated information) and said that it worked fine for him. I have both python 2.6 and 3.1 installed, so I changed my shebang to make the program run in 2.6, and (with the <code>broken_input()</code> uncommented) for me, it <em>still</em> throws the <code>addstr</code> ERR (yet runs fine with the hardcoded input... which is, of course, btw, entirely useless apart from proof of concept). </p>
  
  <p>Thus, my question is this: is there something broken in my python installation (I'm running Ubuntu lucid, with python2.6.5 and 3.1 installed), and, if so, how do I fix it so I can get curses to execute this code properly. And, if it's not my python installation, how can I get the same functionality out of curses (i.e.: paint a menu from a list containing an arbitrary number of items, numbering them so that the user can make a selection based on the item number).   </p>
  
  <pre><code>#!/usr/bin/env python3.1
  """curses_mp3eater.py: a curses-based implementation of my mp3eater program;
  diplays the contents of cwd, allows user to make a selection. But I'm having
  problems getting it to iterate over a list.
  v0.1 03.14.11
  by skookie sprite
  address@gmail.com
  """
  
  import curses, curses.wrapper, os, sys
  
  
  def working_input():
      """the following is demo code to demonstrate my problem... main will accept the following,
      but won't accept the product of a directorylist for reasons that I can't figure out."""
      dircontents=['this','is','a','list','','and','it','will','iterate','fine','in','the','(main) function.']
      return dircontents
  
  def broken_input():
      """this is the code that I NEED to have work... but for reasons beyond me will not iterate in
      the main function. It's a simple list of the contents of the CWD."""
      cwd=os.getcwd()
      dircontents=[]
      for item in os.listdir(cwd):
          dircontents += [item]
      return dircontents
  
  def main(stdscr):
      """This is the program. Designed to take a list of stuff and display it. If I can solve
      that hurdle, I'll add selection mechanisms, and break it across screens - amongst other
      things. But, currently, it can only accept the demo code. Uncomment one or the other to
      see what I mean."""
      #broken_input returns an addstr() ERR, but I don't see the difference between working_input
      #and broken_input as they are both just lists. 
      #working_input() is demo code that illustrates my problem
      stuffin=working_input()
      #stuffin=broken_input()
  
      #the rest of this stuff works. The problem is with the input. Why?
      linenumber=int()
      linenumber=6
      itemnumber=int()
      itemnumber=1
  
      stdscr.clear()
      stdscr.border(0)
  
      for item in stuffin:
          stdscr.addstr(linenumber, 10, '%s   -   %s' % (itemnumber, item), curses.A_NORMAL)
          linenumber += 1
          itemnumber += 1
  
      curses.doupdate()
      stdscr.getch()
  
  
  
  if __name__ == '__main__':
      curses.wrapper(main)
  </code></pre>