summaryrefslogtreecommitdiffstats
path: root/Demo/curses
diff options
context:
space:
mode:
Diffstat (limited to 'Demo/curses')
-rw-r--r--Demo/curses/README13
-rwxr-xr-xDemo/curses/repeat.py58
2 files changed, 64 insertions, 7 deletions
diff --git a/Demo/curses/README b/Demo/curses/README
index 7635c3d..f2a3b74 100644
--- a/Demo/curses/README
+++ b/Demo/curses/README
@@ -10,11 +10,11 @@ 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
+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
+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
@@ -24,6 +24,5 @@ submit them to the Python Bug Tracker on SourceForge
Other demos
===========
-life.py Simple game of Life
-
-
+life.py -- Simple game of Life
+repeat.py -- Repeatedly execute a shell command (like watch(1))
diff --git a/Demo/curses/repeat.py b/Demo/curses/repeat.py
new file mode 100755
index 0000000..158264c
--- /dev/null
+++ b/Demo/curses/repeat.py
@@ -0,0 +1,58 @@
+#! /usr/bin/env python
+
+"""repeat <shell-command>
+
+This simple program repeatedly (with 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
+screen doesn't change. This is handy to watch for changes in e.g. a
+directory or process listing.
+
+To end, hit Control-C.
+"""
+
+# Author: Guido van Rossum
+
+# Disclaimer: there's a Linux program named 'watch' that does the same
+# thing. Honestly, I didn't know of its existence when I wrote this!
+
+# To do: add features until it has the same functionality as watch(1);
+# then compare code size and development time.
+
+import os
+import sys
+import time
+import curses
+
+def main():
+ if not sys.argv[1:]:
+ print __doc__
+ sys.exit(0)
+ cmd = " ".join(sys.argv[1:])
+ p = os.popen(cmd, "r")
+ text = p.read()
+ sts = p.close()
+ if sts:
+ print >>sys.stderr, "Exit code:", sts
+ sys.exit(sts)
+ w = curses.initscr()
+ try:
+ while 1:
+ w.erase()
+ try:
+ w.addstr(text)
+ except curses.error:
+ pass
+ w.refresh()
+ time.sleep(1)
+ p = os.popen(cmd, "r")
+ text = p.read()
+ sts = p.close()
+ if sts:
+ print >>sys.stderr, "Exit code:", sts
+ sys.exit(sts)
+ finally:
+ curses.endwin()
+
+main()