This directory contains various demonstrations of what you can do with
Python.  They were all written by me except where explicitly stated
otherwise -- in general, demos contributed by others ends up in the
../Contrib directory, unless I think they're of utmost general
importance (like Matt Conway's Tk demos).

A fair number of utilities that are useful when while developing
Python code can be found in the ../Tools directory -- some of these
can also be considered good examples of how to write Python code.

Finally, in order to save disk space and net bandwidth, not all
subdirectories listed here are distributed.  They are listed just
in case I change my mind about them.


cgi             CGI examples.

classes         Some examples of how to use classes.

comparisons     A set of responses to a really old language-comparison
                challenge.

curses          A set of curses demos.

distutils       Test for using transparent 2to3 conversion in distutils.

embed           An example of embedding Python in another application
                (see also pysvr).

imputil         Demonstration subclasses of imputil.Importer.

md5test         Test program for the optional md5 module.

newmetaclasses  Demonstration of metaclasses.

parser          Example using the parser module.

pysvr           An example of embedding Python in a threaded
                application.

rpc             A set of classes for building clients and servers for
                Sun RPC.

scripts         Some useful Python scripts that I put in my bin
                directory.  No optional built-in modules needed.

sockets         Examples for the new built-in module 'socket'.

threads         Demos that use the 'thread' module.  (Currently these
                only run on SGIs, but this may change in the future.)

tix             Demos using the Tix widget set addition to Tkinter.

tkinter         Demos using the Tk interface (including Matt Conway's
                excellent set of demos).

turtle          Demos for the "turtle" module.

xml             Some XML demos.

zlib            Some demos for the zlib module (see also the standard
                library module gzip.py).
