diff --git a/Demo/curses/README b/Demo/curses/README
index f2a3b74..2d1c4b1 100644
--- a/Demo/curses/README
+++ b/Demo/curses/README
@@ -11,14 +11,11 @@
 course.
 
 ncurses.py      -- currently only a panels demo
-                   XXX this won't work until panel support is checked in
 rain.py         -- raindrops keep falling on my desktop
 tclock.py       -- ASCII clock, by Howard Jones
 xmas.py         -- I'm dreaming of an ASCII christmas
 
-Please send bugfixes and new contributions to me or, even better,
-submit them to the Python Bug Tracker on SourceForge
-(<URL:http://sourceforge.net/bugs/?group_id=5470>).
+Please submit bugfixes and new contributions to the Python bug tracker.
 
 
 Other demos
diff --git a/Demo/curses/life.py b/Demo/curses/life.py
index a787e26..a5bbed2 100755
--- a/Demo/curses/life.py
+++ b/Demo/curses/life.py
@@ -44,14 +44,15 @@
         scr -- curses screen object to use for display
         char -- character used to render live cells (default: '*')
         """
-        self.state={} ; self.scr=scr
+        self.state = {}
+        self.scr = scr
         Y, X = self.scr.getmaxyx()
         self.X, self.Y = X-2, Y-2-1
         self.char = char
         self.scr.clear()
 
         # Draw a border around the board
-        border_line='+'+(self.X*'-')+'+'
+        border_line = '+'+(self.X*'-')+'+'
         self.scr.addstr(0, 0, border_line)
         self.scr.addstr(self.Y+1,0, border_line)
         for y in range(0, self.Y):
@@ -73,16 +74,16 @@
             del self.state[x,y]
             self.scr.addch(y+1, x+1, ' ')
         else:
-            self.state[x,y]=1
+            self.state[x,y] = 1
             self.scr.addch(y+1, x+1, self.char)
         self.scr.refresh()
 
     def erase(self):
         """Clear the entire board and update the board display"""
-        self.state={}
-        self.display(update_board=0)
+        self.state = {}
+        self.display(update_board=False)
 
-    def display(self, update_board=1):
+    def display(self, update_board=True):
         """Display the whole board, optionally computing one generation"""
         M,N = self.X, self.Y
         if not update_board:
@@ -95,42 +96,46 @@
             self.scr.refresh()
             return
 
-        d={} ; self.boring=1
+        d = {}
+        self.boring = 1
         for i in range(0, M):
-            L=range( max(0, i-1), min(M, i+2) )
+            L = range( max(0, i-1), min(M, i+2) )
             for j in range(0, N):
-                s=0
-                live=self.state.has_key( (i,j) )
+                s = 0
+                live = self.state.has_key( (i,j) )
                 for k in range( max(0, j-1), min(N, j+2) ):
                     for l in L:
                         if self.state.has_key( (l,k) ):
-                            s=s+1
-                s=s-live
-                if s==3:
+                            s += 1
+                s -= live
+                if s == 3:
                     # Birth
-                    d[i,j]=1
+                    d[i,j] = 1
                     self.scr.addch(j+1, i+1, self.char)
-                    if not live: self.boring=0
-                elif s==2 and live: d[i,j]=1       # Survival
+                    if not live: self.boring = 0
+                elif s == 2 and live: d[i,j] = 1       # Survival
                 elif live:
                     # Death
                     self.scr.addch(j+1, i+1, ' ')
-                    self.boring=0
-        self.state=d
+                    self.boring = 0
+        self.state = d
         self.scr.refresh()
 
     def makeRandom(self):
         "Fill the board with a random pattern"
-        self.state={}
+        self.state = {}
         for i in range(0, self.X):
             for j in range(0, self.Y):
-                if random.random() > 0.5: self.set(j,i)
+                if random.random() > 0.5:
+                    self.set(j,i)
 
 
 def erase_menu(stdscr, menu_y):
     "Clear the space where the menu resides"
-    stdscr.move(menu_y, 0) ; stdscr.clrtoeol()
-    stdscr.move(menu_y+1, 0) ; stdscr.clrtoeol()
+    stdscr.move(menu_y, 0)
+    stdscr.clrtoeol()
+    stdscr.move(menu_y+1, 0)
+    stdscr.clrtoeol()
 
 def display_menu(stdscr, menu_y):
     "Display the menu of possible keystroke commands"
@@ -140,18 +145,17 @@
     stdscr.addstr(menu_y+1, 4,
                   'E)rase the board, R)andom fill, S)tep once or C)ontinuously, Q)uit')
 
-def main(stdscr):
-
+def keyloop(stdscr):
     # Clear the screen and display the menu of keys
     stdscr.clear()
     stdscr_y, stdscr_x = stdscr.getmaxyx()
-    menu_y=(stdscr_y-3)-1
+    menu_y = (stdscr_y-3)-1
     display_menu(stdscr, menu_y)
 
     # Allocate a subwindow for the Life board and create the board object
-    subwin=stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0)
-    board=LifeBoard(subwin, char=ord('*'))
-    board.display(update_board=0)
+    subwin = stdscr.subwin(stdscr_y-3, stdscr_x, 0, 0)
+    board = LifeBoard(subwin, char=ord('*'))
+    board.display(update_board=False)
 
     # xpos, ypos are the cursor's position
     xpos, ypos = board.X/2, board.Y/2
@@ -159,9 +163,9 @@
     # Main loop:
     while (1):
         stdscr.move(1+ypos, 1+xpos)     # Move the cursor
-        c=stdscr.getch()                # Get a keystroke
+        c = stdscr.getch()                # Get a keystroke
         if 0<c<256:
-            c=chr(c)
+            c = chr(c)
             if c in ' \n':
                 board.toggle(ypos, xpos)
             elif c in 'Cc':
@@ -173,50 +177,40 @@
                 # if no keystroke is available, instead of waiting.
                 stdscr.nodelay(1)
                 while (1):
-                    c=stdscr.getch()
-                    if c!=-1: break
-                    stdscr.addstr(0,0, '/'); stdscr.refresh()
+                    c = stdscr.getch()
+                    if c != -1:
+                        break
+                    stdscr.addstr(0,0, '/')
+                    stdscr.refresh()
                     board.display()
-                    stdscr.addstr(0,0, '+'); stdscr.refresh()
+                    stdscr.addstr(0,0, '+')
+                    stdscr.refresh()
 
                 stdscr.nodelay(0)       # Disable nodelay mode
                 display_menu(stdscr, menu_y)
 
-            elif c in 'Ee': board.erase()
-            elif c in 'Qq': break
+            elif c in 'Ee':
+                board.erase()
+            elif c in 'Qq':
+                break
             elif c in 'Rr':
                 board.makeRandom()
-                board.display(update_board=0)
+                board.display(update_board=False)
             elif c in 'Ss':
                 board.display()
             else: pass                  # Ignore incorrect keys
-        elif c==curses.KEY_UP and ypos>0:            ypos=ypos-1
-        elif c==curses.KEY_DOWN and ypos<board.Y-1:  ypos=ypos+1
-        elif c==curses.KEY_LEFT and xpos>0:          xpos=xpos-1
-        elif c==curses.KEY_RIGHT and xpos<board.X-1: xpos=xpos+1
-        else: pass                      # Ignore incorrect keys
+        elif c == curses.KEY_UP and ypos>0:            ypos -= 1
+        elif c == curses.KEY_DOWN and ypos<board.Y-1:  ypos += 1
+        elif c == curses.KEY_LEFT and xpos>0:          xpos -= 1
+        elif c == curses.KEY_RIGHT and xpos<board.X-1: xpos += 1
+        else:
+            # Ignore incorrect keys
+            pass
 
-if __name__=='__main__':
-    try:
-        # Initialize curses
-        stdscr=curses.initscr()
-        # Turn off echoing of keys, and enter cbreak mode,
-        # where no buffering is performed on keyboard input
-        curses.noecho() ; curses.cbreak()
 
-        # In keypad mode, escape sequences for special keys
-        # (like the cursor keys) will be interpreted and
-        # a special value like curses.KEY_LEFT will be returned
-        stdscr.keypad(1)
-        main(stdscr)                    # Enter the main loop
-        # Set everything back to normal
-        stdscr.keypad(0)
-        curses.echo() ; curses.nocbreak()
-        curses.endwin()                 # Terminate curses
-    except:
-        # In the event of an error, restore the terminal
-        # to a sane state.
-        stdscr.keypad(0)
-        curses.echo() ; curses.nocbreak()
-        curses.endwin()
-        traceback.print_exc()           # Print the exception
+def main(stdscr):
+    keyloop(stdscr)                    # Enter the main loop
+
+
+if __name__ == '__main__':
+    curses.wrapper(main)
diff --git a/Demo/curses/rain.py b/Demo/curses/rain.py
index 69794b3..9d46e6e 100644
--- a/Demo/curses/rain.py
+++ b/Demo/curses/rain.py
@@ -48,7 +48,7 @@
         ypos[j] = randrange(0, r) + 2
 
     j = 0
-    while 1:
+    while True:
         x = randrange(0, c) + 2
         y = randrange(0, r) + 2
 
@@ -83,7 +83,7 @@
 
         ch = stdscr.getch()
         if ch == ord('q') or ch == ord('Q'):
-            return 0
+            return
         elif ch == ord('s'):
             stdscr.nodelay(0)
         elif ch == ord(' '):
diff --git a/Demo/curses/repeat.py b/Demo/curses/repeat.py
index 158264c..fa7daac 100755
--- a/Demo/curses/repeat.py
+++ b/Demo/curses/repeat.py
@@ -2,7 +2,7 @@
 
 """repeat <shell-command>
 
-This simple program repeatedly (with 1-second intervals) executes the
+This simple program repeatedly (at 1-second intervals) executes the
 shell command given on the command line and displays the output (or as
 much of it as fits on the screen).  It uses curses to paint each new
 output on top of the old output, so that if nothing changes, the
@@ -38,7 +38,7 @@
         sys.exit(sts)
     w = curses.initscr()
     try:
-        while 1:
+        while True:
             w.erase()
             try:
                 w.addstr(text)
diff --git a/Demo/curses/tclock.py b/Demo/curses/tclock.py
index 1950043..8058d9a 100644
--- a/Demo/curses/tclock.py
+++ b/Demo/curses/tclock.py
@@ -14,7 +14,8 @@
     return 1
 
 def A2XY(angle, radius):
-    return int(round(ASPECT * radius * sin(angle))), int(round(radius * cos(angle)))
+    return (int(round(ASPECT * radius * sin(angle))),
+            int(round(radius * cos(angle))))
 
 def plot(x, y, col):
     stdscr.addch(y, x, col)
@@ -37,9 +38,9 @@
     y = from_y
 
     if ax > ay:
-        d = ay - ax / 2
+        d = ay - ax // 2
 
-        while 1:
+        while True:
             plot(x, y, ch)
             if x == x2:
                 return
@@ -50,9 +51,9 @@
             x += sx
             d += ay
     else:
-        d = ax - ay / 2
+        d = ax - ay // 2
 
-        while 1:
+        while True:
             plot(x, y, ch)
             if y == y2:
                 return
@@ -78,12 +79,12 @@
         curses.init_pair(2, curses.COLOR_MAGENTA, my_bg)
         curses.init_pair(3, curses.COLOR_GREEN, my_bg)
 
-    cx = (curses.COLS - 1) / 2
-    cy = curses.LINES / 2
-    ch = min( cy-1, int(cx / ASPECT) - 1)
-    mradius = (3 * ch) / 4
-    hradius = ch / 2
-    sradius = 5 * ch / 6
+    cx = (curses.COLS - 1) // 2
+    cy = curses.LINES // 2
+    ch = min( cy-1, int(cx // ASPECT) - 1)
+    mradius = (3 * ch) // 4
+    hradius = ch // 2
+    sradius = 5 * ch // 6
 
     for i in range(0, 12):
         sangle = (i + 1) * 2.0 * pi / 12.0
@@ -96,7 +97,7 @@
 
     sradius = max(sradius-4, 8)
 
-    while 1:
+    while True:
         curses.napms(1000)
 
         tim = time.time()
diff --git a/Demo/curses/xmas.py b/Demo/curses/xmas.py
index e51bc5f..349b3a8 100644
--- a/Demo/curses/xmas.py
+++ b/Demo/curses/xmas.py
@@ -4,7 +4,7 @@
 # $Id$
 #
 # I'm dreaming of an ascii character-based monochrome Christmas,
-# Just like the one's I used to know!
+# Just like the ones I used to know!
 # Via a full duplex communications channel,
 # At 9600 bits per second,
 # Even though it's kinda slow.
@@ -272,7 +272,7 @@
 def blinkit():
     treescrn8.touchwin()
 
-    for cycle in range(0, 5):
+    for cycle in range(5):
         if cycle == 0:
             treescrn3.overlay(treescrn8)
             treescrn8.refresh()
@@ -380,7 +380,7 @@
         middeer0.refresh()
         w_del_msg.refresh()
 
-        for looper in range(0, 2):
+        for looper in range(2):
             deer_step(middeer3, y_pos, x_pos)
             deer_step(middeer2, y_pos, x_pos)
             deer_step(middeer1, y_pos, x_pos)
