summaryrefslogtreecommitdiffstats
path: root/Demo/curses
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/curses')
-rw-r--r--Demo/curses/README5
-rwxr-xr-xDemo/curses/life.py128
-rw-r--r--Demo/curses/rain.py4
-rwxr-xr-xDemo/curses/repeat.py4
-rw-r--r--Demo/curses/tclock.py25
-rw-r--r--Demo/curses/xmas.py6
6 files changed, 82 insertions, 90 deletions
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 @@ I wouldn't mind someone else making an effort in that direction, of
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 @@ class LifeBoard:
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 @@ class LifeBoard:
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 @@ class LifeBoard:
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 @@ def display_menu(stdscr, menu_y):
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 @@ def main(stdscr):
# 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 @@ def main(stdscr):
# 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
-
-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
+ 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
+
+
+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 @@ def main(win):
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 @@ def main(win):
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 @@ def main():
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 @@ def sign(_x):
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 @@ def dline(pair, from_x, from_y, x2, y2, ch):
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 @@ def dline(pair, from_x, from_y, x2, y2, ch):
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 @@ def main(win):
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 @@ def main(win):
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 strng5():
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 @@ def reindeer():
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)