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)
