diff options
author | Andrew M. Kuchling <amk@amk.ca> | 2000-12-15 00:41:48 (GMT) |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 2000-12-15 00:41:48 (GMT) |
commit | 15c3c2bdf84aa333e213d8f5ac2b4b30a2595231 (patch) | |
tree | 7c2d45ae1febeb48cf10b68c7da96e816e283221 | |
parent | 61c64c9de0f9b9a8355b4c365537cdfe15489eab (diff) | |
download | cpython-15c3c2bdf84aa333e213d8f5ac2b4b30a2595231.zip cpython-15c3c2bdf84aa333e213d8f5ac2b4b30a2595231.tar.gz cpython-15c3c2bdf84aa333e213d8f5ac2b4b30a2595231.tar.bz2 |
Curses demos contributed by Thomas Gellekum <tg@FreeBSD.org>.
ncurses.py requires panel support, and therefore doesn't work yet.
-rw-r--r-- | Demo/curses/README | 27 | ||||
-rw-r--r-- | Demo/curses/ncurses.py | 272 | ||||
-rw-r--r-- | Demo/curses/rain.py | 94 | ||||
-rw-r--r-- | Demo/curses/tclock.py | 149 |
4 files changed, 541 insertions, 1 deletions
diff --git a/Demo/curses/README b/Demo/curses/README index 7de5c96..2fb1159 100644 --- a/Demo/curses/README +++ b/Demo/curses/README @@ -1,3 +1,28 @@ -Sample programs that use the curses package: +This is a collection of demos and tests for the curses module. + +ncurses demos +============= + +These demos are converted from the C versions in the ncurses +distribution, and were contributed by Thomas Gellekum <tg@FreeBSD.org> +I didn't strive for a `pythonic' style, but bluntly copied the +originals. I won't attempt to `beautify' the program anytime soon, but +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 + +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>). + + +Other demos +=========== life.py Simple game of Life + + diff --git a/Demo/curses/ncurses.py b/Demo/curses/ncurses.py new file mode 100644 index 0000000..782d17f --- /dev/null +++ b/Demo/curses/ncurses.py @@ -0,0 +1,272 @@ +#!/usr/bin/env python +# +# $Id$ +# +# (n)curses exerciser in Python, an interactive test for the curses +# module. Currently, only the panel demos are ported. + +import curses + +def wGetchar(win = None): + if win == None: win = stdscr + return win.getch() + +def Getchar(): + wGetchar() + +# +# Panels tester +# +def wait_a_while(): + if nap_msec == 1: + Getchar() + else: + curses.napms(nap_msec) + +def saywhat(text): + stdscr.move(curses.LINES - 1, 0) + stdscr.clrtoeol() + stdscr.addstr(text) + +def mkpanel(color, rows, cols, tly, tlx): + win = curses.newwin(rows, cols, tly, tlx) + pan = win.new_panel() + if curses.has_colors(): + if color == curses.COLOR_BLUE: + fg = curses.COLOR_WHITE + else: + fg = curses.COLOR_BLACK + bg = color + curses.init_pair(color, fg, bg) + win.bkgdset(ord(' '), curses.color_pair(color)) + else: + win.bkgdset(ord(' '), curses.A_BOLD) + + return pan + +def pflush(): + curses.update_panels() + curses.doupdate() + +def fill_panel(pan): + win = pan.window() + num = pan.userptr()[1] + + win.move(1, 1) + win.addstr("-pan%c-" % num) + win.clrtoeol() + win.box() + + maxy, maxx = win.getmaxyx() + for y in range(2, maxy - 1): + for x in range(1, maxx - 1): + win.move(y, x) + win.addch(num) + +def demo_panels(win): + global stdscr, nap_msec, mod + stdscr = win + nap_msec = 1 + mod = ["test", "TEST", "(**)", "*()*", "<-->", "LAST"] + + stdscr.refresh() + + for y in range(0, curses.LINES - 1): + for x in range(0, curses.COLS): + stdscr.addstr("%d" % ((y + x) % 10)) + for y in range(0, 1): + p1 = mkpanel(curses.COLOR_RED, + curses.LINES / 2 - 2, + curses.COLS / 8 + 1, + 0, + 0) + p1.set_userptr("p1") + + p2 = mkpanel(curses.COLOR_GREEN, + curses.LINES / 2 + 1, + curses.COLS / 7, + curses.LINES / 4, + curses.COLS / 10) + p2.set_userptr("p2") + + p3 = mkpanel(curses.COLOR_YELLOW, + curses.LINES / 4, + curses.COLS / 10, + curses.LINES / 2, + curses.COLS / 9) + p3.set_userptr("p3") + + p4 = mkpanel(curses.COLOR_BLUE, + curses.LINES / 2 - 2, + curses.COLS / 8, + curses.LINES / 2 - 2, + curses.COLS / 3) + p4.set_userptr("p4") + + p5 = mkpanel(curses.COLOR_MAGENTA, + curses.LINES / 2 - 2, + curses.COLS / 8, + curses.LINES / 2, + curses.COLS / 2 - 2) + p5.set_userptr("p5") + + fill_panel(p1) + fill_panel(p2) + fill_panel(p3) + fill_panel(p4) + fill_panel(p5) + p4.hide() + p5.hide() + pflush() + saywhat("press any key to continue") + wait_a_while() + + saywhat("h3 s1 s2 s4 s5;press any key to continue") + p1.move(0, 0) + p3.hide() + p1.show() + p2.show() + p4.show() + p5.show() + pflush() + wait_a_while() + + saywhat("s1; press any key to continue") + p1.show() + pflush() + wait_a_while() + + saywhat("s2; press any key to continue") + p2.show() + pflush() + wait_a_while() + + saywhat("m2; press any key to continue") + p2.move(curses.LINES / 3 + 1, curses.COLS / 8) + pflush() + wait_a_while() + + saywhat("s3; press any key to continue") + p3.show() + pflush() + wait_a_while() + + saywhat("m3; press any key to continue") + p3.move(curses.LINES / 4 + 1, curses.COLS / 15) + pflush() + wait_a_while() + + saywhat("b3; press any key to continue") + p3.bottom() + pflush() + wait_a_while() + + saywhat("s4; press any key to continue") + p4.show() + pflush() + wait_a_while() + + saywhat("s5; press any key to continue") + p5.show() + pflush() + wait_a_while() + + saywhat("t3; press any key to continue") + p3.top() + pflush() + wait_a_while() + + saywhat("t1; press any key to continue") + p1.show() + pflush() + wait_a_while() + + saywhat("t2; press any key to continue") + p2.show() + pflush() + wait_a_while() + + saywhat("t3; press any key to continue") + p3.show() + pflush() + wait_a_while() + + saywhat("t4; press any key to continue") + p4.show() + pflush() + wait_a_while() + + for itmp in range(0, 6): + w4 = p4.window() + w5 = p5.window() + + saywhat("m4; press any key to continue") + w4.move(curses.LINES / 8, 1) + w4.addstr(mod[itmp]) + p4.move(curses.LINES / 6, itmp * curses.COLS / 8) + w5.move(curses.LINES / 6, 1) + w5.addstr(mod[itmp]) + pflush() + wait_a_while() + + saywhat("m5; press any key to continue") + w4.move(curses.LINES / 6, 1) + w4.addstr(mod[itmp]) + p5.move(curses.LINES / 3 - 1, itmp * 10 + 6) + w5.move(curses.LINES / 8, 1) + w5.addstr(mod[itmp]) + pflush() + wait_a_while() + + saywhat("m4; press any key to continue") + p4.move(curses.LINES / 6, (itmp + 1) * curses.COLS / 8) + pflush() + wait_a_while() + + saywhat("t5; press any key to continue") + p5.top() + pflush() + wait_a_while() + + saywhat("t2; press any key to continue") + p2.top() + pflush() + wait_a_while() + + saywhat("t1; press any key to continue") + p1.top() + pflush() + wait_a_while() + + saywhat("d2; press any key to continue") + del p2 + pflush() + wait_a_while() + + saywhat("h3; press any key to continue") + p3.hide() + pflush() + wait_a_while() + + saywhat("d1; press any key to continue") + del p1 + pflush() + wait_a_while() + + saywhat("d4; press any key to continue") + del p4 + pflush() + wait_a_while() + + saywhat("d5; press any key to continue") + del p5 + pflush() + wait_a_while() + if nap_msec == 1: + break + nap_msec = 100 + +# +# one fine day there'll be the menu at this place +# +curses.wrapper(demo_panels) diff --git a/Demo/curses/rain.py b/Demo/curses/rain.py new file mode 100644 index 0000000..2399d7f --- /dev/null +++ b/Demo/curses/rain.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +# +# $Id$ +# +# somebody should probably check the randrange()s... + +import curses +from random import randrange + +def next_j(j): + if j == 0: + j = 4 + else: + j -= 1 + + if curses.has_colors(): + z = randrange(0, 3) + color = curses.color_pair(z) + if z: + color = color | curses.A_BOLD + stdscr.attrset(color) + + return j + +def main(win): + # we know that the first argument from curses.wrapper() is stdscr. + # Initialize it globally for convenience. + global stdscr + stdscr = win + + if curses.has_colors(): + bg = curses.COLOR_BLACK + curses.init_pair(1, curses.COLOR_BLUE, bg) + curses.init_pair(2, curses.COLOR_CYAN, bg) + + curses.nl() + curses.noecho() + # XXX curs_set() always returns ERR + # curses.curs_set(0) + stdscr.timeout(0) + + c = curses.COLS - 4 + r = curses.LINES - 4 + xpos = [0] * c + ypos = [0] * r + for j in range(4, -1, -1): + xpos[j] = randrange(0, c) + 2 + ypos[j] = randrange(0, r) + 2 + + j = 0 + while 1: + x = randrange(0, c) + 2 + y = randrange(0, r) + 2 + + stdscr.addch(y, x, ord('.')) + + stdscr.addch(ypos[j], xpos[j], ord('o')) + + j = next_j(j) + stdscr.addch(ypos[j], xpos[j], ord('O')) + + j = next_j(j) + stdscr.addch( ypos[j] - 1, xpos[j], ord('-')) + stdscr.addstr(ypos[j], xpos[j] - 1, "|.|") + stdscr.addch( ypos[j] + 1, xpos[j], ord('-')) + + j = next_j(j) + stdscr.addch( ypos[j] - 2, xpos[j], ord('-')) + stdscr.addstr(ypos[j] - 1, xpos[j] - 1, "/ \\") + stdscr.addstr(ypos[j], xpos[j] - 2, "| O |") + stdscr.addstr(ypos[j] + 1, xpos[j] - 1, "\\ /") + stdscr.addch( ypos[j] + 2, xpos[j], ord('-')) + + j = next_j(j) + stdscr.addch( ypos[j] - 2, xpos[j], ord(' ')) + stdscr.addstr(ypos[j] - 1, xpos[j] - 1, " ") + stdscr.addstr(ypos[j], xpos[j] - 2, " ") + stdscr.addstr(ypos[j] + 1, xpos[j] - 1, " ") + stdscr.addch( ypos[j] + 2, xpos[j], ord(' ')) + + xpos[j] = x + ypos[j] = y + + ch = stdscr.getch() + if ch == ord('q') or ch == ord('Q'): + return 0 + elif ch == ord('s'): + stdscr.nodelay(0) + elif ch == ord(' '): + stdscr.nodelay(1) + + curses.napms(50) + +curses.wrapper(main) diff --git a/Demo/curses/tclock.py b/Demo/curses/tclock.py new file mode 100644 index 0000000..adc0056 --- /dev/null +++ b/Demo/curses/tclock.py @@ -0,0 +1,149 @@ +#!/usr/bin/env python +# +# $Id$ +# +# From tclock.c, Copyright Howard Jones <ha.jones@ic.ac.uk>, September 1994. + +from math import * +import curses, time + +ASPECT = 2.2 + +def sign(_x): + if _x < 0: return -1 + return 1 + +def A2XY(angle, radius): + return int(round(ASPECT * radius * sin(angle))), int(round(radius * cos(angle))) + +def plot(x, y, col): + stdscr.addch(y, x, col) + +# draw a diagonal line using Bresenham's algorithm +def dline(pair, from_x, from_y, x2, y2, ch): + if curses.has_colors(): + stdscr.attrset(curses.color_pair(pair)) + + dx = x2 - from_x + dy = y2 - from_y + + ax = abs(dx * 2) + ay = abs(dy * 2) + + sx = sign(dx) + sy = sign(dy) + + x = from_x + y = from_y + + if ax > ay: + d = ay - ax / 2 + + while 1: + plot(x, y, ch) + if x == x2: + return + + if d >= 0: + y += sy + d -= ax + x += sx + d += ay + else: + d = ax - ay / 2 + + while 1: + plot(x, y, ch) + if y == y2: + return + + if d >= 0: + x += sx + d -= ay + y += sy + d += ax + +def main(win): + global stdscr + stdscr = win + + lastbeep = -1 + my_bg = curses.COLOR_BLACK + + stdscr.nodelay(1) + stdscr.timeout(0) +# curses.curs_set(0) + if curses.has_colors(): + curses.init_pair(1, curses.COLOR_RED, my_bg) + 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 + if cx > cy: + ch = cy + else: + ch = cx + mradius = (3 * cy) / 4 + hradius = cy / 2 + sradius = (2 * cy) / 3 + + for i in range(0, 12): + sangle = (i + 1) * 2.0 * pi / 12.0 + sradius = 5 * cy / 6 + sdx, sdy = A2XY(sangle, sradius) + + stdscr.addstr(cy - sdy, cx + sdx, "%d" % (i + 1)) + + stdscr.addstr(0, 0, + "ASCII Clock by Howard Jones <ha.jones@ic.ac.uk>, 1994") + + sradius = 8 + while 1: + curses.napms(1000) + + tim = time.time() + t = time.localtime(tim) + + hours = t[3] + t[4] / 60.0 + if hours > 12.0: + hours -= 12.0 + + mangle = t[4] * 2 * pi / 60.0 + mdx, mdy = A2XY(mangle, mradius) + + hangle = hours * 2 * pi / 12.0 + hdx, hdy = A2XY(hangle, hradius) + + sangle = t[5] * 2 * pi / 60.0 + sdx, sdy = A2XY(sangle, sradius) + + dline(3, cx, cy, cx + mdx, cy - mdy, ord('#')) + + stdscr.attrset(curses.A_REVERSE) + dline(2, cx, cy, cx + hdx, cy - hdy, ord('.')) + stdscr.attroff(curses.A_REVERSE) + + if curses.has_colors(): + stdscr.attrset(curses.color_pair(1)) + + plot(cx + sdx, cy - sdy, ord('O')) + + if curses.has_colors(): + stdscr.attrset(curses.color_pair(0)) + + stdscr.addstr(curses.LINES - 2, 0, time.ctime(tim)) + stdscr.refresh() + if (t[5] % 5) == 0 and t[5] != lastbeep: + lastbeep = t[5] + curses.beep() + + ch = stdscr.getch() + if ch == ord('q'): + return 0 + + plot(cx + sdx, cy - sdy, ord(' ')) + dline(0, cx, cy, cx + hdx, cy - hdy, ord(' ')) + dline(0, cx, cy, cx + mdx, cy - mdy, ord(' ')) + +curses.wrapper(main) |