More cleanup: Move some demos into a dedicated Tools/demo dir, move 2to3 demo to Tools, and remove all the other Demo content.
diff --git a/Demo/README b/Demo/README
deleted file mode 100644
index 5105e0f..0000000
--- a/Demo/README
+++ /dev/null
@@ -1,62 +0,0 @@
-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).
diff --git a/Demo/classes/Complex.py b/Demo/classes/Complex.py
deleted file mode 100644
index 06f2212..0000000
--- a/Demo/classes/Complex.py
+++ /dev/null
@@ -1,304 +0,0 @@
-# Complex numbers
-# ---------------
-
-# [Now that Python has a complex data type built-in, this is not very
-# useful, but it's still a nice example class]
-
-# This module represents complex numbers as instances of the class Complex.
-# A Complex instance z has two data attribues, z.re (the real part) and z.im
-# (the imaginary part).  In fact, z.re and z.im can have any value -- all
-# arithmetic operators work regardless of the type of z.re and z.im (as long
-# as they support numerical operations).
-#
-# The following functions exist (Complex is actually a class):
-# Complex([re [,im]) -> creates a complex number from a real and an imaginary part
-# IsComplex(z) -> true iff z is a complex number (== has .re and .im attributes)
-# ToComplex(z) -> a complex number equal to z; z itself if IsComplex(z) is true
-#                 if z is a tuple(re, im) it will also be converted
-# PolarToComplex([r [,phi [,fullcircle]]]) ->
-#       the complex number z for which r == z.radius() and phi == z.angle(fullcircle)
-#       (r and phi default to 0)
-# exp(z) -> returns the complex exponential of z. Equivalent to pow(math.e,z).
-#
-# Complex numbers have the following methods:
-# z.abs() -> absolute value of z
-# z.radius() == z.abs()
-# z.angle([fullcircle]) -> angle from positive X axis; fullcircle gives units
-# z.phi([fullcircle]) == z.angle(fullcircle)
-#
-# These standard functions and unary operators accept complex arguments:
-# abs(z)
-# -z
-# +z
-# not z
-# repr(z) == `z`
-# str(z)
-# hash(z) -> a combination of hash(z.re) and hash(z.im) such that if z.im is zero
-#            the result equals hash(z.re)
-# Note that hex(z) and oct(z) are not defined.
-#
-# These conversions accept complex arguments only if their imaginary part is zero:
-# int(z)
-# float(z)
-#
-# The following operators accept two complex numbers, or one complex number
-# and one real number (int, long or float):
-# z1 + z2
-# z1 - z2
-# z1 * z2
-# z1 / z2
-# pow(z1, z2)
-# cmp(z1, z2)
-# Note that z1 % z2 and divmod(z1, z2) are not defined,
-# nor are shift and mask operations.
-#
-# The standard module math does not support complex numbers.
-# The cmath modules should be used instead.
-#
-# Idea:
-# add a class Polar(r, phi) and mixed-mode arithmetic which
-# chooses the most appropriate type for the result:
-# Complex for +,-,cmp
-# Polar   for *,/,pow
-
-import math
-import sys
-
-twopi = math.pi*2.0
-halfpi = math.pi/2.0
-
-def IsComplex(obj):
-    return hasattr(obj, 're') and hasattr(obj, 'im')
-
-def ToComplex(obj):
-    if IsComplex(obj):
-        return obj
-    elif isinstance(obj, tuple):
-        return Complex(*obj)
-    else:
-        return Complex(obj)
-
-def PolarToComplex(r = 0, phi = 0, fullcircle = twopi):
-    phi = phi * (twopi / fullcircle)
-    return Complex(math.cos(phi)*r, math.sin(phi)*r)
-
-def Re(obj):
-    if IsComplex(obj):
-        return obj.re
-    return obj
-
-def Im(obj):
-    if IsComplex(obj):
-        return obj.im
-    return 0
-
-class Complex:
-
-    def __init__(self, re=0, im=0):
-        _re = 0
-        _im = 0
-        if IsComplex(re):
-            _re = re.re
-            _im = re.im
-        else:
-            _re = re
-        if IsComplex(im):
-            _re = _re - im.im
-            _im = _im + im.re
-        else:
-            _im = _im + im
-        # this class is immutable, so setting self.re directly is
-        # not possible.
-        self.__dict__['re'] = _re
-        self.__dict__['im'] = _im
-
-    def __setattr__(self, name, value):
-        raise TypeError('Complex numbers are immutable')
-
-    def __hash__(self):
-        if not self.im:
-            return hash(self.re)
-        return hash((self.re, self.im))
-
-    def __repr__(self):
-        if not self.im:
-            return 'Complex(%r)' % (self.re,)
-        else:
-            return 'Complex(%r, %r)' % (self.re, self.im)
-
-    def __str__(self):
-        if not self.im:
-            return repr(self.re)
-        else:
-            return 'Complex(%r, %r)' % (self.re, self.im)
-
-    def __neg__(self):
-        return Complex(-self.re, -self.im)
-
-    def __pos__(self):
-        return self
-
-    def __abs__(self):
-        return math.hypot(self.re, self.im)
-
-    def __int__(self):
-        if self.im:
-            raise ValueError("can't convert Complex with nonzero im to int")
-        return int(self.re)
-
-    def __float__(self):
-        if self.im:
-            raise ValueError("can't convert Complex with nonzero im to float")
-        return float(self.re)
-
-    def __eq__(self, other):
-        other = ToComplex(other)
-        return (self.re, self.im) == (other.re, other.im)
-
-    def __bool__(self):
-        return not (self.re == self.im == 0)
-
-    abs = radius = __abs__
-
-    def angle(self, fullcircle = twopi):
-        return (fullcircle/twopi) * ((halfpi - math.atan2(self.re, self.im)) % twopi)
-
-    phi = angle
-
-    def __add__(self, other):
-        other = ToComplex(other)
-        return Complex(self.re + other.re, self.im + other.im)
-
-    __radd__ = __add__
-
-    def __sub__(self, other):
-        other = ToComplex(other)
-        return Complex(self.re - other.re, self.im - other.im)
-
-    def __rsub__(self, other):
-        other = ToComplex(other)
-        return other - self
-
-    def __mul__(self, other):
-        other = ToComplex(other)
-        return Complex(self.re*other.re - self.im*other.im,
-                       self.re*other.im + self.im*other.re)
-
-    __rmul__ = __mul__
-
-    def __truediv__(self, other):
-        other = ToComplex(other)
-        d = float(other.re*other.re + other.im*other.im)
-        if not d: raise ZeroDivisionError('Complex division')
-        return Complex((self.re*other.re + self.im*other.im) / d,
-                       (self.im*other.re - self.re*other.im) / d)
-
-    def __rtruediv__(self, other):
-        other = ToComplex(other)
-        return other / self
-
-    def __pow__(self, n, z=None):
-        if z is not None:
-            raise TypeError('Complex does not support ternary pow()')
-        if IsComplex(n):
-            if n.im:
-                if self.im: raise TypeError('Complex to the Complex power')
-                else: return exp(math.log(self.re)*n)
-            n = n.re
-        r = pow(self.abs(), n)
-        phi = n*self.angle()
-        return Complex(math.cos(phi)*r, math.sin(phi)*r)
-
-    def __rpow__(self, base):
-        base = ToComplex(base)
-        return pow(base, self)
-
-def exp(z):
-    r = math.exp(z.re)
-    return Complex(math.cos(z.im)*r,math.sin(z.im)*r)
-
-
-def checkop(expr, a, b, value, fuzz = 1e-6):
-    print('       ', a, 'and', b, end=' ')
-    try:
-        result = eval(expr)
-    except Exception as e:
-        print('!!\t!!\t!! error: {}'.format(e))
-        return
-    print('->', result)
-    if isinstance(result, str) or isinstance(value, str):
-        ok = (result == value)
-    else:
-        ok = abs(result - value) <= fuzz
-    if not ok:
-        print('!!\t!!\t!! should be', value, 'diff', abs(result - value))
-
-def test():
-    print('test constructors')
-    constructor_test = (
-        # "expect" is an array [re,im] "got" the Complex.
-            ( (0,0), Complex() ),
-            ( (0,0), Complex() ),
-            ( (1,0), Complex(1) ),
-            ( (0,1), Complex(0,1) ),
-            ( (1,2), Complex(Complex(1,2)) ),
-            ( (1,3), Complex(Complex(1,2),1) ),
-            ( (0,0), Complex(0,Complex(0,0)) ),
-            ( (3,4), Complex(3,Complex(4)) ),
-            ( (-1,3), Complex(1,Complex(3,2)) ),
-            ( (-7,6), Complex(Complex(1,2),Complex(4,8)) ) )
-    cnt = [0,0]
-    for t in constructor_test:
-        cnt[0] += 1
-        if ((t[0][0]!=t[1].re)or(t[0][1]!=t[1].im)):
-            print("        expected", t[0], "got", t[1])
-            cnt[1] += 1
-    print("  ", cnt[1], "of", cnt[0], "tests failed")
-    # test operators
-    testsuite = {
-            'a+b': [
-                    (1, 10, 11),
-                    (1, Complex(0,10), Complex(1,10)),
-                    (Complex(0,10), 1, Complex(1,10)),
-                    (Complex(0,10), Complex(1), Complex(1,10)),
-                    (Complex(1), Complex(0,10), Complex(1,10)),
-            ],
-            'a-b': [
-                    (1, 10, -9),
-                    (1, Complex(0,10), Complex(1,-10)),
-                    (Complex(0,10), 1, Complex(-1,10)),
-                    (Complex(0,10), Complex(1), Complex(-1,10)),
-                    (Complex(1), Complex(0,10), Complex(1,-10)),
-            ],
-            'a*b': [
-                    (1, 10, 10),
-                    (1, Complex(0,10), Complex(0, 10)),
-                    (Complex(0,10), 1, Complex(0,10)),
-                    (Complex(0,10), Complex(1), Complex(0,10)),
-                    (Complex(1), Complex(0,10), Complex(0,10)),
-            ],
-            'a/b': [
-                    (1., 10, 0.1),
-                    (1, Complex(0,10), Complex(0, -0.1)),
-                    (Complex(0, 10), 1, Complex(0, 10)),
-                    (Complex(0, 10), Complex(1), Complex(0, 10)),
-                    (Complex(1), Complex(0,10), Complex(0, -0.1)),
-            ],
-            'pow(a,b)': [
-                    (1, 10, 1),
-                    (1, Complex(0,10), 1),
-                    (Complex(0,10), 1, Complex(0,10)),
-                    (Complex(0,10), Complex(1), Complex(0,10)),
-                    (Complex(1), Complex(0,10), 1),
-                    (2, Complex(4,0), 16),
-            ],
-    }
-    for expr in sorted(testsuite):
-        print(expr + ':')
-        t = (expr,)
-        for item in testsuite[expr]:
-            checkop(*(t+item))
-
-
-if __name__ == '__main__':
-    test()
diff --git a/Demo/classes/Dates.py b/Demo/classes/Dates.py
deleted file mode 100644
index 63488ce..0000000
--- a/Demo/classes/Dates.py
+++ /dev/null
@@ -1,227 +0,0 @@
-"""
-Class Date supplies date objects that support date arithmetic.
-
-Date(month,day,year) returns a Date object.  An instance prints as,
-e.g., 'Mon 16 Aug 1993'.
-
-Addition, subtraction, comparison operators, min, max, and sorting
-all work as expected for date objects:  int+date or date+int returns
-the date `int' days from `date'; date+date raises an exception;
-date-int returns the date `int' days before `date'; date2-date1 returns
-an integer, the number of days from date1 to date2; int-date raises an
-exception; date1 < date2 is true iff date1 occurs before date2 (&
-similarly for other comparisons); min(date1,date2) is the earlier of
-the two dates and max(date1,date2) the later; and date objects can be
-used as dictionary keys.
-
-Date objects support one visible method, date.weekday().  This returns
-the day of the week the date falls on, as a string.
-
-Date objects also have 4 read-only data attributes:
-  .month  in 1..12
-  .day    in 1..31
-  .year   int or long int
-  .ord    the ordinal of the date relative to an arbitrary staring point
-
-The Dates module also supplies function today(), which returns the
-current date as a date object.
-
-Those entranced by calendar trivia will be disappointed, as no attempt
-has been made to accommodate the Julian (etc) system.  On the other
-hand, at least this package knows that 2000 is a leap year but 2100
-isn't, and works fine for years with a hundred decimal digits <wink>.
-
-Tim Peters   tim@ksr.com
-not speaking for Kendall Square Research Corp
-
-Adapted to Python 1.1 (where some hacks to overcome coercion are unnecessary)
-by Guido van Rossum
-
-Note that as of Python 2.3, a datetime module is included in the stardard
-library.
-"""
-
-import functools
-
-_MONTH_NAMES = [ 'January', 'February', 'March', 'April', 'May',
-                 'June', 'July', 'August', 'September', 'October',
-                 'November', 'December' ]
-
-_DAY_NAMES = [ 'Friday', 'Saturday', 'Sunday', 'Monday',
-               'Tuesday', 'Wednesday', 'Thursday' ]
-
-_DAYS_IN_MONTH = [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ]
-
-_DAYS_BEFORE_MONTH = []
-dbm = 0
-for dim in _DAYS_IN_MONTH:
-    _DAYS_BEFORE_MONTH.append(dbm)
-    dbm = dbm + dim
-del dbm, dim
-
-def _is_leap(year):           # 1 if leap year, else 0
-    if year % 4 != 0: return 0
-    if year % 400 == 0: return 1
-    return year % 100 != 0
-
-def _days_in_year(year):      # number of days in year
-    return 365 + _is_leap(year)
-
-def _days_before_year(year):  # number of days before year
-    return year*365 + (year+3)//4 - (year+99)//100 + (year+399)//400
-
-def _days_in_month(month, year):      # number of days in month of year
-    if month == 2 and _is_leap(year): return 29
-    return _DAYS_IN_MONTH[month-1]
-
-def _days_before_month(month, year):  # number of days in year before month
-    return _DAYS_BEFORE_MONTH[month-1] + (month > 2 and _is_leap(year))
-
-def _date2num(date):          # compute ordinal of date.month,day,year
-    return _days_before_year(date.year) + \
-           _days_before_month(date.month, date.year) + \
-           date.day
-
-_DI400Y = _days_before_year(400)      # number of days in 400 years
-
-def _num2date(n):             # return date with ordinal n
-    if not isinstance(n, int):
-        raise TypeError('argument must be integer: %r' % type(n))
-
-    # Get uninitialized Date object.  This is necesary because once
-    # attributes are set, they cannot be changed.
-    ans = Date.__new__(Date)
-    ans.ord = n
-
-    n400 = (n-1)//_DI400Y                # # of 400-year blocks preceding
-    year, n = 400 * n400, n - _DI400Y * n400
-    more = n // 365
-    dby = _days_before_year(more)
-    if dby >= n:
-        more = more - 1
-        dby = dby - _days_in_year(more)
-    year, n = year + more, n - dby
-    month = min(n//29 + 1, 12)
-    dbm = _days_before_month(month, year)
-    if dbm >= n:
-        month = month - 1
-        dbm = dbm - _days_in_month(month, year)
-
-    ans.month, ans.day, ans.year = month, n-dbm, year
-    return ans
-
-def _num2day(n):      # return weekday name of day with ordinal n
-    return _DAY_NAMES[n % 7]
-
-@functools.total_ordering
-class Date:
-    def __init__(self, month, day, year):
-        if not 1 <= month <= 12:
-            raise ValueError('month must be in 1..12: %r' % (month,))
-        dim = _days_in_month(month, year)
-        if not 1 <= day <= dim:
-            raise ValueError('day must be in 1..%r: %r' % (dim, day))
-        self.month, self.day, self.year = map(int, (month, day, year))
-        self.ord = _date2num(self)
-
-    # don't allow setting existing attributes
-    def __setattr__(self, name, value):
-        if name in self.__dict__:
-            raise AttributeError('read-only attribute ' + name)
-        self.__dict__[name] = value
-
-    def __eq__(self, other):
-        return self.ord == other.ord
-
-    def __lt__(self, other):
-        return self.ord < other.ord
-
-    # define a hash function so dates can be used as dictionary keys
-    def __hash__(self):
-        return hash(self.ord)
-
-    # print as, e.g., Mon 16 Aug 1993
-    def __repr__(self):
-        return '%.3s %2d %.3s %r' % (
-              self.weekday(),
-              self.day,
-              _MONTH_NAMES[self.month-1],
-              self.year)
-
-    # Python 1.1 coerces neither int+date nor date+int
-    def __add__(self, n):
-        if not isinstance(n, int):
-            raise TypeError('can\'t add %r to date' % type(n))
-        return _num2date(self.ord + n)
-    __radd__ = __add__ # handle int+date
-
-    # Python 1.1 coerces neither date-int nor date-date
-    def __sub__(self, other):
-        if isinstance(other, int):           # date-int
-            return _num2date(self.ord - other)
-        else:
-            return self.ord - other.ord         # date-date
-
-    # complain about int-date
-    def __rsub__(self, other):
-        raise TypeError('Can\'t subtract date from integer')
-
-    def weekday(self):
-        return _num2day(self.ord)
-
-def today():
-    import time
-    local = time.localtime(time.time())
-    return Date(local[1], local[2], local[0])
-
-class DateTestError(Exception):
-    pass
-
-def test(firstyear, lastyear):
-    a = Date(9,30,1913)
-    b = Date(9,30,1914)
-    if repr(a) != 'Tue 30 Sep 1913':
-        raise DateTestError('__repr__ failure')
-    if (not a < b) or a == b or a > b or b != b:
-        raise DateTestError('__cmp__ failure')
-    if a+365 != b or 365+a != b:
-        raise DateTestError('__add__ failure')
-    if b-a != 365 or b-365 != a:
-        raise DateTestError('__sub__ failure')
-    try:
-        x = 1 - a
-        raise DateTestError('int-date should have failed')
-    except TypeError:
-        pass
-    try:
-        x = a + b
-        raise DateTestError('date+date should have failed')
-    except TypeError:
-        pass
-    if a.weekday() != 'Tuesday':
-        raise DateTestError('weekday() failure')
-    if max(a,b) is not b or min(a,b) is not a:
-        raise DateTestError('min/max failure')
-    d = {a-1:b, b:a+1}
-    if d[b-366] != b or d[a+(b-a)] != Date(10,1,1913):
-        raise DateTestError('dictionary failure')
-
-    # verify date<->number conversions for first and last days for
-    # all years in firstyear .. lastyear
-
-    lord = _days_before_year(firstyear)
-    y = firstyear
-    while y <= lastyear:
-        ford = lord + 1
-        lord = ford + _days_in_year(y) - 1
-        fd, ld = Date(1,1,y), Date(12,31,y)
-        if (fd.ord,ld.ord) != (ford,lord):
-            raise DateTestError('date->num failed', y)
-        fd, ld = _num2date(ford), _num2date(lord)
-        if (1,1,y,12,31,y) != \
-           (fd.month,fd.day,fd.year,ld.month,ld.day,ld.year):
-            raise DateTestError('num->date failed', y)
-        y = y + 1
-
-if __name__ == '__main__':
-    test(1850, 2150)
diff --git a/Demo/classes/README b/Demo/classes/README
deleted file mode 100644
index 3c636f0..0000000
--- a/Demo/classes/README
+++ /dev/null
@@ -1,11 +0,0 @@
-Examples of classes that implement special operators (see reference manual):
-
-Complex.py	Complex numbers
-Dates.py	Date manipulation package by Tim Peters
-Range.py	Example of a generator: re-implement built-in range()
-Rev.py		Yield the reverse of a sequence
-Vec.py		A simple vector class
-bitvec.py	A bit-vector class by Jan-Hein B\"uhrman
-
-(For straightforward examples of basic class features, such as use of
-methods and inheritance, see the library code.)
diff --git a/Demo/classes/Range.py b/Demo/classes/Range.py
deleted file mode 100644
index 4e6f45d..0000000
--- a/Demo/classes/Range.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""Example of a generator: re-implement the built-in range function
-without actually constructing the list of values.
-
-OldStyleRange is coded in the way required to work in a 'for' loop before
-iterators were introduced into the language; using __getitem__ and __len__ .
-
-"""
-def handleargs(arglist):
-    """Take list of arguments and extract/create proper start, stop, and step
-    values and return in a tuple"""
-    try:
-        if len(arglist) == 1:
-            return 0, int(arglist[0]), 1
-        elif len(arglist) == 2:
-            return int(arglist[0]), int(arglist[1]), 1
-        elif len(arglist) == 3:
-            if arglist[2] == 0:
-                raise ValueError("step argument must not be zero")
-            return tuple(int(x) for x in arglist)
-        else:
-            raise TypeError("range() accepts 1-3 arguments, given", len(arglist))
-    except TypeError:
-        raise TypeError("range() arguments must be numbers or strings "
-        "representing numbers")
-
-def genrange(*a):
-    """Function to implement 'range' as a generator"""
-    start, stop, step = handleargs(a)
-    value = start
-    while value < stop:
-        yield value
-        value += step
-
-class oldrange:
-    """Class implementing a range object.
-    To the user the instances feel like immutable sequences
-    (and you can't concatenate or slice them)
-
-    Done using the old way (pre-iterators; __len__ and __getitem__) to have an
-    object be used by a 'for' loop.
-
-    """
-
-    def __init__(self, *a):
-        """ Initialize start, stop, and step values along with calculating the
-        nubmer of values (what __len__ will return) in the range"""
-        self.start, self.stop, self.step = handleargs(a)
-        self.len = max(0, (self.stop - self.start) // self.step)
-
-    def __repr__(self):
-        """implement repr(x) which is also used by print"""
-        return 'range(%r, %r, %r)' % (self.start, self.stop, self.step)
-
-    def __len__(self):
-        """implement len(x)"""
-        return self.len
-
-    def __getitem__(self, i):
-        """implement x[i]"""
-        if 0 <= i <= self.len:
-            return self.start + self.step * i
-        else:
-            raise IndexError('range[i] index out of range')
-
-
-def test():
-    import time, builtins
-    #Just a quick sanity check
-    correct_result = list(builtins.range(5, 100, 3))
-    oldrange_result = list(oldrange(5, 100, 3))
-    genrange_result = list(genrange(5, 100, 3))
-    if genrange_result != correct_result or oldrange_result != correct_result:
-        raise Exception("error in implementation:\ncorrect   = %s"
-                         "\nold-style = %s\ngenerator = %s" %
-                         (correct_result, oldrange_result, genrange_result))
-    print("Timings for range(1000):")
-    t1 = time.time()
-    for i in oldrange(1000):
-        pass
-    t2 = time.time()
-    for i in genrange(1000):
-        pass
-    t3 = time.time()
-    for i in builtins.range(1000):
-        pass
-    t4 = time.time()
-    print(t2-t1, 'sec (old-style class)')
-    print(t3-t2, 'sec (generator)')
-    print(t4-t3, 'sec (built-in)')
-
-
-if __name__ == '__main__':
-    test()
diff --git a/Demo/classes/Rev.py b/Demo/classes/Rev.py
deleted file mode 100644
index d36ddb9..0000000
--- a/Demo/classes/Rev.py
+++ /dev/null
@@ -1,93 +0,0 @@
-'''
-A class which presents the reverse of a sequence without duplicating it.
-From: "Steven D. Majewski" <sdm7g@elvis.med.virginia.edu>
-
-It works on mutable or inmutable sequences.
-
->>> Rev('Hello World!')
-!dlroW olleH
-
-The .forw is so you can use anonymous sequences in __init__, and still
-keep a reference the forward sequence. )
-If you give it a non-anonymous mutable sequence, the reverse sequence
-will track the updated values. ( but not reassignment! - another
-good reason to use anonymous values in creating the sequence to avoid
-confusion. Maybe it should be change to copy input sequence to break
-the connection completely ? )
-
->>> nnn = list(range(3))
->>> rnn = Rev(nnn)
->>> for n in rnn: n
-...
-2
-1
-0
->>> for n in range(4, 6): nnn.append(n)   # update nnn
-...
->>> for n in rnn: n     # prints reversed updated values
-...
-5
-4
-2
-1
-0
->>> nnn = nnn[1:-1]
->>> nnn
-[1, 2, 4]
->>> for n in rnn: n     # prints reversed values of old nnn
-...
-5
-4
-2
-1
-0
-
-#
->>> WH = Rev('Hello World!')
->>> print(WH.forw, WH.back)
-Hello World! !dlroW olleH
->>> nnn = Rev(list(range(1, 10)))
->>> print(nnn.forw)
-[1, 2, 3, 4, 5, 6, 7, 8, 9]
->>> print(nnn.back)
-[9, 8, 7, 6, 5, 4, 3, 2, 1]
-
->>> Rev(nnn)
-<1, 2, 3, 4, 5, 6, 7, 8, 9>
-
-'''
-
-class Rev:
-    def __init__(self, seq):
-        self.forw = seq
-        self.back = self
-
-    def __len__(self):
-        return len(self.forw)
-
-    def __getitem__(self, j):
-        return self.forw[-(j + 1)]
-
-    def __repr__(self):
-        seq = self.forw
-        if isinstance(seq, list):
-            wrap = '[]'
-            sep = ', '
-        elif isinstance(seq, tuple):
-            wrap = '()'
-            sep = ', '
-        elif isinstance(seq, str):
-            wrap = ''
-            sep = ''
-        else:
-            wrap = '<>'
-            sep = ', '
-        outstrs = [str(item) for item in self.back]
-        return wrap[:1] + sep.join(outstrs) + wrap[-1:]
-
-def _test():
-    import doctest, Rev
-    return doctest.testmod(Rev)
-
-if __name__ == "__main__":
-    _test()
diff --git a/Demo/classes/bitvec.py b/Demo/classes/bitvec.py
deleted file mode 100644
index 62b26cc..0000000
--- a/Demo/classes/bitvec.py
+++ /dev/null
@@ -1,322 +0,0 @@
-#
-# this is a rather strict implementation of a bit vector class
-# it is accessed the same way as an array of python-ints, except
-# the value must be 0 or 1
-#
-
-import sys; rprt = sys.stderr.write #for debugging
-
-class error(Exception):
-    pass
-
-
-def _check_value(value):
-    if type(value) != type(0) or not 0 <= value < 2:
-        raise error('bitvec() items must have int value 0 or 1')
-
-
-import math
-
-def _compute_len(param):
-    mant, l = math.frexp(float(param))
-    bitmask = 1 << l
-    if bitmask <= param:
-        raise ValueError('(param, l) = %r' % ((param, l),))
-    while l:
-        bitmask = bitmask >> 1
-        if param & bitmask:
-            break
-        l = l - 1
-    return l
-
-
-def _check_key(len, key):
-    if type(key) != type(0):
-        raise TypeError('sequence subscript not int')
-    if key < 0:
-        key = key + len
-    if not 0 <= key < len:
-        raise IndexError('list index out of range')
-    return key
-
-def _check_slice(len, i, j):
-    #the type is ok, Python already checked that
-    i, j = max(i, 0), min(len, j)
-    if i > j:
-        i = j
-    return i, j
-
-
-class BitVec:
-
-    def __init__(self, *params):
-        self._data = 0
-        self._len = 0
-        if not len(params):
-            pass
-        elif len(params) == 1:
-            param, = params
-            if type(param) == type([]):
-                value = 0
-                bit_mask = 1
-                for item in param:
-                    # strict check
-                    #_check_value(item)
-                    if item:
-                        value = value | bit_mask
-                    bit_mask = bit_mask << 1
-                self._data = value
-                self._len = len(param)
-            elif type(param) == type(0):
-                if param < 0:
-                    raise error('bitvec() can\'t handle negative longs')
-                self._data = param
-                self._len = _compute_len(param)
-            else:
-                raise error('bitvec() requires array or long parameter')
-        elif len(params) == 2:
-            param, length = params
-            if type(param) == type(0):
-                if param < 0:
-                    raise error('can\'t handle negative longs')
-                self._data = param
-                if type(length) != type(0):
-                    raise error('bitvec()\'s 2nd parameter must be int')
-                computed_length = _compute_len(param)
-                if computed_length > length:
-                    print('warning: bitvec() value is longer than the length indicates, truncating value')
-                    self._data = self._data & \
-                              ((1 << length) - 1)
-                self._len = length
-            else:
-                raise error('bitvec() requires array or long parameter')
-        else:
-            raise error('bitvec() requires 0 -- 2 parameter(s)')
-
-
-    def append(self, item):
-        #_check_value(item)
-        #self[self._len:self._len] = [item]
-        self[self._len:self._len] = \
-                  BitVec(int(not not item), 1)
-
-
-    def count(self, value):
-        #_check_value(value)
-        if value:
-            data = self._data
-        else:
-            data = (~self)._data
-        count = 0
-        while data:
-            data, count = data >> 1, count + (data & 1 != 0)
-        return count
-
-
-    def index(self, value):
-        #_check_value(value):
-        if value:
-            data = self._data
-        else:
-            data = (~self)._data
-        index = 0
-        if not data:
-            raise ValueError('list.index(x): x not in list')
-        while not (data & 1):
-            data, index = data >> 1, index + 1
-        return index
-
-
-    def insert(self, index, item):
-        #_check_value(item)
-        #self[index:index] = [item]
-        self[index:index] = BitVec(int(not not item), 1)
-
-
-    def remove(self, value):
-        del self[self.index(value)]
-
-
-    def reverse(self):
-        #ouch, this one is expensive!
-        #for i in self._len>>1: self[i], self[l-i] = self[l-i], self[i]
-        data, result = self._data, 0
-        for i in range(self._len):
-            if not data:
-                result = result << (self._len - i)
-                break
-            result, data = (result << 1) | (data & 1), data >> 1
-        self._data = result
-
-
-    def sort(self):
-        c = self.count(1)
-        self._data = ((1 << c) - 1) << (self._len - c)
-
-
-    def copy(self):
-        return BitVec(self._data, self._len)
-
-
-    def seq(self):
-        result = []
-        for i in self:
-            result.append(i)
-        return result
-
-
-    def __repr__(self):
-        ##rprt('<bitvec class instance object>.' + '__repr__()\n')
-        return 'bitvec(%r, %r)' % (self._data, self._len)
-
-    def __cmp__(self, other, *rest):
-        #rprt('%r.__cmp__%r\n' % (self, (other,) + rest))
-        if type(other) != type(self):
-            other = bitvec(other, *rest)
-        #expensive solution... recursive binary, with slicing
-        length = self._len
-        if length == 0 or other._len == 0:
-            return cmp(length, other._len)
-        if length != other._len:
-            min_length = min(length, other._len)
-            return cmp(self[:min_length], other[:min_length]) or \
-                      cmp(self[min_length:], other[min_length:])
-        #the lengths are the same now...
-        if self._data == other._data:
-            return 0
-        if length == 1:
-            return cmp(self[0], other[0])
-        else:
-            length = length >> 1
-            return cmp(self[:length], other[:length]) or \
-                      cmp(self[length:], other[length:])
-
-
-    def __len__(self):
-        #rprt('%r.__len__()\n' % (self,))
-        return self._len
-
-    def __getitem__(self, key):
-        #rprt('%r.__getitem__(%r)\n' % (self, key))
-        key = _check_key(self._len, key)
-        return self._data & (1 << key) != 0
-
-    def __setitem__(self, key, value):
-        #rprt('%r.__setitem__(%r, %r)\n' % (self, key, value))
-        key = _check_key(self._len, key)
-        #_check_value(value)
-        if value:
-            self._data = self._data | (1 << key)
-        else:
-            self._data = self._data & ~(1 << key)
-
-    def __delitem__(self, key):
-        #rprt('%r.__delitem__(%r)\n' % (self, key))
-        key = _check_key(self._len, key)
-        #el cheapo solution...
-        self._data = self[:key]._data | self[key+1:]._data >> key
-        self._len = self._len - 1
-
-    def __getslice__(self, i, j):
-        #rprt('%r.__getslice__(%r, %r)\n' % (self, i, j))
-        i, j = _check_slice(self._len, i, j)
-        if i >= j:
-            return BitVec(0, 0)
-        if i:
-            ndata = self._data >> i
-        else:
-            ndata = self._data
-        nlength = j - i
-        if j != self._len:
-            #we'll have to invent faster variants here
-            #e.g. mod_2exp
-            ndata = ndata & ((1 << nlength) - 1)
-        return BitVec(ndata, nlength)
-
-    def __setslice__(self, i, j, sequence, *rest):
-        #rprt('%s.__setslice__%r\n' % (self, (i, j, sequence) + rest))
-        i, j = _check_slice(self._len, i, j)
-        if type(sequence) != type(self):
-            sequence = bitvec(sequence, *rest)
-        #sequence is now of our own type
-        ls_part = self[:i]
-        ms_part = self[j:]
-        self._data = ls_part._data | \
-                  ((sequence._data | \
-                  (ms_part._data << sequence._len)) << ls_part._len)
-        self._len = self._len - j + i + sequence._len
-
-    def __delslice__(self, i, j):
-        #rprt('%r.__delslice__(%r, %r)\n' % (self, i, j))
-        i, j = _check_slice(self._len, i, j)
-        if i == 0 and j == self._len:
-            self._data, self._len = 0, 0
-        elif i < j:
-            self._data = self[:i]._data | (self[j:]._data >> i)
-            self._len = self._len - j + i
-
-    def __add__(self, other):
-        #rprt('%r.__add__(%r)\n' % (self, other))
-        retval = self.copy()
-        retval[self._len:self._len] = other
-        return retval
-
-    def __mul__(self, multiplier):
-        #rprt('%r.__mul__(%r)\n' % (self, multiplier))
-        if type(multiplier) != type(0):
-            raise TypeError('sequence subscript not int')
-        if multiplier <= 0:
-            return BitVec(0, 0)
-        elif multiplier == 1:
-            return self.copy()
-        #handle special cases all 0 or all 1...
-        if self._data == 0:
-            return BitVec(0, self._len * multiplier)
-        elif (~self)._data == 0:
-            return ~BitVec(0, self._len * multiplier)
-        #otherwise el cheapo again...
-        retval = BitVec(0, 0)
-        while multiplier:
-            retval, multiplier = retval + self, multiplier - 1
-        return retval
-
-    def __and__(self, otherseq, *rest):
-        #rprt('%r.__and__%r\n' % (self, (otherseq,) + rest))
-        if type(otherseq) != type(self):
-            otherseq = bitvec(otherseq, *rest)
-        #sequence is now of our own type
-        return BitVec(self._data & otherseq._data, \
-                  min(self._len, otherseq._len))
-
-
-    def __xor__(self, otherseq, *rest):
-        #rprt('%r.__xor__%r\n' % (self, (otherseq,) + rest))
-        if type(otherseq) != type(self):
-            otherseq = bitvec(otherseq, *rest)
-        #sequence is now of our own type
-        return BitVec(self._data ^ otherseq._data, \
-                  max(self._len, otherseq._len))
-
-
-    def __or__(self, otherseq, *rest):
-        #rprt('%r.__or__%r\n' % (self, (otherseq,) + rest))
-        if type(otherseq) != type(self):
-            otherseq = bitvec(otherseq, *rest)
-        #sequence is now of our own type
-        return BitVec(self._data | otherseq._data, \
-                  max(self._len, otherseq._len))
-
-
-    def __invert__(self):
-        #rprt('%r.__invert__()\n' % (self,))
-        return BitVec(~self._data & ((1 << self._len) - 1), \
-                  self._len)
-
-    def __int__(self):
-        return int(self._data)
-
-    def __float__(self):
-        return float(self._data)
-
-
-bitvec = BitVec
diff --git a/Demo/curses/README b/Demo/curses/README
deleted file mode 100644
index 2d1c4b1..0000000
--- a/Demo/curses/README
+++ /dev/null
@@ -1,25 +0,0 @@
-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
-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 submit bugfixes and new contributions to the Python bug tracker.
-
-
-Other demos
-===========
-
-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
deleted file mode 100755
index 570f221..0000000
--- a/Demo/curses/repeat.py
+++ /dev/null
@@ -1,80 +0,0 @@
-#! /usr/bin/env python3
-
-"""repeat [-i SECONDS] <shell-command>
-
-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
-screen doesn't change.  This is handy to watch for changes in e.g. a
-directory or process listing.
-
-The -i option lets you override the sleep time between executions.
-
-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
-import getopt
-
-def main():
-    interval = 1.0
-    try:
-        opts, args = getopt.getopt(sys.argv[1:], "hi:")
-    except getopt.error as err:
-        print(err, file=sys.stderr)
-        sys.exit(2)
-    if not args:
-        print(__doc__)
-        sys.exit(0)
-    for opt, arg in opts:
-        if opt == "-i":
-            interval = float(arg)
-        if opt == "-h":
-            print(__doc__)
-            sys.exit(0)
-    cmd = " ".join(args)
-    cmd_really = cmd + " 2>&1"
-    p = os.popen(cmd_really, "r")
-    text = p.read()
-    sts = p.close()
-    text = addsts(interval, cmd, text, sts)
-    w = curses.initscr()
-    try:
-        while True:
-            w.erase()
-            try:
-                w.addstr(text)
-            except curses.error:
-                pass
-            w.refresh()
-            time.sleep(interval)
-            p = os.popen(cmd_really, "r")
-            text = p.read()
-            sts = p.close()
-            text = addsts(interval, cmd, text, sts)
-    finally:
-        curses.endwin()
-
-def addsts(interval, cmd, text, sts):
-    now = time.strftime("%H:%M:%S")
-    text = "%s, every %g sec: %s\n%s" % (now, interval, cmd, text)
-    if sts:
-        msg = "Exit status: %d; signal: %d" % (sts>>8, sts&0xFF)
-        if text and not text.endswith("\n"):
-            msg = "\n" + msg
-        text += msg
-    return text
-
-main()
diff --git a/Demo/embed/Makefile b/Demo/embed/Makefile
deleted file mode 100644
index b02772f..0000000
--- a/Demo/embed/Makefile
+++ /dev/null
@@ -1,57 +0,0 @@
-# Makefile for embedded Python use demo.
-# (This version originally written on Red Hat Linux 6.1;
-# edit lines marked with XXX.)
-
-# XXX The compiler you are using
-CC=	 	gcc
-
-# XXX Top of the build tree and source tree
-blddir=		../..
-srcdir=		../..
-
-# Python version
-VERSION=	3.2
-
-# Compiler flags
-OPT=		-g
-INCLUDES=	-I$(srcdir)/Include -I$(blddir)
-CFLAGS=		$(OPT)
-CPPFLAGS=	$(INCLUDES)
-
-# The Python library
-LIBPYTHON=	$(blddir)/libpython$(VERSION).a
-
-# XXX edit LIBS (in particular) to match $(blddir)/Makefile
-LIBS=		-lnsl -ldl -lreadline -lieee -lpthread -lutil
-LDFLAGS=	-Xlinker -export-dynamic
-SYSLIBS=	-lm
-MODLIBS=	
-ALLLIBS=	$(LIBPYTHON) $(MODLIBS) $(LIBS) $(SYSLIBS)
-
-# Build the demo applications
-all:		demo loop importexc
-demo:		demo.o
-		$(CC) $(LDFLAGS) demo.o $(ALLLIBS) -o demo
-
-loop:		loop.o
-		$(CC) $(LDFLAGS) loop.o $(ALLLIBS) -o loop
-
-importexc:	importexc.o
-		$(CC) $(LDFLAGS) importexc.o $(ALLLIBS) -o importexc
-
-# Administrative targets
-
-test:		demo
-		./demo
-
-COMMAND="print 'hello world'"
-looptest:	loop
-		./loop $(COMMAND)
-
-clean:
-		-rm -f *.o core
-
-clobber:	clean
-		-rm -f *~ @* '#'* demo loop importexc
-
-realclean:	clobber
diff --git a/Demo/embed/README b/Demo/embed/README
deleted file mode 100644
index a0f7af8..0000000
--- a/Demo/embed/README
+++ /dev/null
@@ -1,19 +0,0 @@
-This directory show how to embed the Python interpreter in your own
-application.  The file demo.c shows you all that is needed in your C
-code.
-
-To build it, you may have to edit the Makefile:
-
-1) set blddir to the directory where you built Python, if it isn't in
-the source directory (../..)
-
-2) change the variables that together define the list of libraries
-(MODLIBS, LIBS, SYSLIBS) to link with, to match their definitions in
-$(blddir)/Modules/Makefile
-
-An additional test program, loop.c, is used to experiment with memory
-leakage caused by repeated initialization and finalization of the
-interpreter.  It can be build by saying "make loop" and tested with
-"make looptest".  Command line usage is "./loop <python-command>",
-e.g. "./loop 'print 2+2'" should spit out an endless number of lines
-containing the number 4.
diff --git a/Demo/embed/demo.c b/Demo/embed/demo.c
deleted file mode 100644
index 8d92820..0000000
--- a/Demo/embed/demo.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* Example of embedding Python in another program */
-
-#include "Python.h"
-
-PyObject* PyInit_xyzzy(void); /* Forward */
-
-main(int argc, char **argv)
-{
-    /* Ignore passed-in argc/argv. If desired, conversion
-       should use mbstowcs to convert them. */
-    wchar_t *args[] = {L"embed", L"hello", 0};
-
-    /* Pass argv[0] to the Python interpreter */
-    Py_SetProgramName(args[0]);
-
-    /* Add a static module */
-    PyImport_AppendInittab("xyzzy", PyInit_xyzzy);
-
-    /* Initialize the Python interpreter.  Required. */
-    Py_Initialize();
-
-    /* Define sys.argv.  It is up to the application if you
-       want this; you can also leave it undefined (since the Python
-       code is generally not a main program it has no business
-       touching sys.argv...)
-
-       If the third argument is true, sys.path is modified to include
-       either the directory containing the script named by argv[0], or
-       the current working directory.  This can be risky; if you run
-       an application embedding Python in a directory controlled by
-       someone else, attackers could put a Trojan-horse module in the
-       directory (say, a file named os.py) that your application would
-       then import and run.
-    */
-    PySys_SetArgvEx(2, args, 0);
-
-    /* Do some application specific code */
-    printf("Hello, brave new world\n\n");
-
-    /* Execute some Python statements (in module __main__) */
-    PyRun_SimpleString("import sys\n");
-    PyRun_SimpleString("print(sys.builtin_module_names)\n");
-    PyRun_SimpleString("print(sys.modules.keys())\n");
-    PyRun_SimpleString("print(sys.executable)\n");
-    PyRun_SimpleString("print(sys.argv)\n");
-
-    /* Note that you can call any public function of the Python
-       interpreter here, e.g. call_object(). */
-
-    /* Some more application specific code */
-    printf("\nGoodbye, cruel world\n");
-
-    /* Exit, cleaning up the interpreter */
-    Py_Exit(0);
-    /*NOTREACHED*/
-}
-
-/* A static module */
-
-/* 'self' is not used */
-static PyObject *
-xyzzy_foo(PyObject *self, PyObject* args)
-{
-    return PyLong_FromLong(42L);
-}
-
-static PyMethodDef xyzzy_methods[] = {
-    {"foo",             xyzzy_foo,      METH_NOARGS,
-     "Return the meaning of everything."},
-    {NULL,              NULL}           /* sentinel */
-};
-
-static struct PyModuleDef xyzzymodule = {
-    {}, /* m_base */
-    "xyzzy",  /* m_name */
-    0,  /* m_doc */
-    0,  /* m_size */
-    xyzzy_methods,  /* m_methods */
-    0,  /* m_reload */
-    0,  /* m_traverse */
-    0,  /* m_clear */
-    0,  /* m_free */
-};
-
-PyObject*
-PyInit_xyzzy(void)
-{
-    return PyModule_Create(&xyzzymodule);
-}
diff --git a/Demo/embed/importexc.c b/Demo/embed/importexc.c
deleted file mode 100644
index 59b1d01..0000000
--- a/Demo/embed/importexc.c
+++ /dev/null
@@ -1,23 +0,0 @@
-#include <Python.h>
-
-#if 0
-char* cmd = "import codecs, encodings.utf_8, types; print(types)";
-#else
-char* cmd = "import types; print(types)";
-#endif
-
-int main()
-{
-	printf("Initialize interpreter\n");
-	Py_Initialize();
-	PyEval_InitThreads();
-	PyRun_SimpleString(cmd);
-	Py_EndInterpreter(PyThreadState_Get());
-
-	printf("\nInitialize subinterpreter\n");
-	Py_NewInterpreter();
-	PyRun_SimpleString(cmd);
-	Py_Finalize();
-
-	return 0;
-}
diff --git a/Demo/embed/loop.c b/Demo/embed/loop.c
deleted file mode 100644
index 4a341fd..0000000
--- a/Demo/embed/loop.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* Simple program that repeatedly calls Py_Initialize(), does something, and
-   then calls Py_Finalize().  This should help finding leaks related to
-   initialization. */
-
-#include "Python.h"
-
-main(int argc, char **argv)
-{
-    int count = -1;
-    char *command;
-
-    if (argc < 2 || argc > 3) {
-        fprintf(stderr, "usage: loop <python-command> [count]\n");
-        exit(2);
-    }
-    command = argv[1];
-
-    if (argc == 3) {
-        count = atoi(argv[2]);
-    }
-
-    Py_SetProgramName(L"loop");
-
-    /* uncomment this if you don't want to load site.py */
-    /* Py_NoSiteFlag = 1; */
-
-    while (count == -1 || --count >= 0 ) {
-        Py_Initialize();
-        PyRun_SimpleString(command);
-        Py_Finalize();
-    }
-    return 0;
-}
diff --git a/Demo/newmetaclasses/Enum.py b/Demo/newmetaclasses/Enum.py
deleted file mode 100644
index 3ff8ddd..0000000
--- a/Demo/newmetaclasses/Enum.py
+++ /dev/null
@@ -1,177 +0,0 @@
-"""Enumeration metaclass."""
-
-class EnumMetaclass(type):
-    """Metaclass for enumeration.
-
-    To define your own enumeration, do something like
-
-    class Color(Enum):
-        red = 1
-        green = 2
-        blue = 3
-
-    Now, Color.red, Color.green and Color.blue behave totally
-    different: they are enumerated values, not integers.
-
-    Enumerations cannot be instantiated; however they can be
-    subclassed.
-    """
-
-    def __init__(cls, name, bases, dict):
-        super(EnumMetaclass, cls).__init__(name, bases, dict)
-        cls._members = []
-        for attr in dict.keys():
-            if not (attr.startswith('__') and attr.endswith('__')):
-                enumval = EnumInstance(name, attr, dict[attr])
-                setattr(cls, attr, enumval)
-                cls._members.append(attr)
-
-    def __getattr__(cls, name):
-        if name == "__members__":
-            return cls._members
-        raise AttributeError(name)
-
-    def __repr__(cls):
-        s1 = s2 = ""
-        enumbases = [base.__name__ for base in cls.__bases__
-                     if isinstance(base, EnumMetaclass) and not base is Enum]
-        if enumbases:
-            s1 = "(%s)" % ", ".join(enumbases)
-        enumvalues = ["%s: %d" % (val, getattr(cls, val))
-                      for val in cls._members]
-        if enumvalues:
-            s2 = ": {%s}" % ", ".join(enumvalues)
-        return "%s%s%s" % (cls.__name__, s1, s2)
-
-class FullEnumMetaclass(EnumMetaclass):
-    """Metaclass for full enumerations.
-
-    A full enumeration displays all the values defined in base classes.
-    """
-
-    def __init__(cls, name, bases, dict):
-        super(FullEnumMetaclass, cls).__init__(name, bases, dict)
-        for obj in cls.__mro__:
-            if isinstance(obj, EnumMetaclass):
-                for attr in obj._members:
-                    # XXX inefficient
-                    if not attr in cls._members:
-                        cls._members.append(attr)
-
-class EnumInstance(int):
-    """Class to represent an enumeration value.
-
-    EnumInstance('Color', 'red', 12) prints as 'Color.red' and behaves
-    like the integer 12 when compared, but doesn't support arithmetic.
-
-    XXX Should it record the actual enumeration rather than just its
-    name?
-    """
-
-    def __new__(cls, classname, enumname, value):
-        return int.__new__(cls, value)
-
-    def __init__(self, classname, enumname, value):
-        self.__classname = classname
-        self.__enumname = enumname
-
-    def __repr__(self):
-        return "EnumInstance(%s, %s, %d)" % (self.__classname, self.__enumname,
-                                             self)
-
-    def __str__(self):
-        return "%s.%s" % (self.__classname, self.__enumname)
-
-class Enum(metaclass=EnumMetaclass):
-    pass
-
-class FullEnum(metaclass=FullEnumMetaclass):
-    pass
-
-def _test():
-
-    class Color(Enum):
-        red = 1
-        green = 2
-        blue = 3
-
-    print(Color.red)
-
-    print(repr(Color.red))
-    print(Color.red == Color.red)
-    print(Color.red == Color.blue)
-    print(Color.red == 1)
-    print(Color.red == 2)
-
-    class ExtendedColor(Color):
-        white = 0
-        orange = 4
-        yellow = 5
-        purple = 6
-        black = 7
-
-    print(ExtendedColor.orange)
-    print(ExtendedColor.red)
-
-    print(Color.red == ExtendedColor.red)
-
-    class OtherColor(Enum):
-        white = 4
-        blue = 5
-
-    class MergedColor(Color, OtherColor):
-        pass
-
-    print(MergedColor.red)
-    print(MergedColor.white)
-
-    print(Color)
-    print(ExtendedColor)
-    print(OtherColor)
-    print(MergedColor)
-
-def _test2():
-
-    class Color(FullEnum):
-        red = 1
-        green = 2
-        blue = 3
-
-    print(Color.red)
-
-    print(repr(Color.red))
-    print(Color.red == Color.red)
-    print(Color.red == Color.blue)
-    print(Color.red == 1)
-    print(Color.red == 2)
-
-    class ExtendedColor(Color):
-        white = 0
-        orange = 4
-        yellow = 5
-        purple = 6
-        black = 7
-
-    print(ExtendedColor.orange)
-    print(ExtendedColor.red)
-
-    print(Color.red == ExtendedColor.red)
-
-    class OtherColor(FullEnum):
-        white = 4
-        blue = 5
-
-    class MergedColor(Color, OtherColor):
-        pass
-
-    print(MergedColor.red)
-    print(MergedColor.white)
-
-    print(Color)
-    print(ExtendedColor)
-    print(OtherColor)
-    print(MergedColor)
-
-if __name__ == '__main__':
-    _test()
-    _test2()
diff --git a/Demo/scripts/README b/Demo/scripts/README
deleted file mode 100644
index b80704c..0000000
--- a/Demo/scripts/README
+++ /dev/null
@@ -1,22 +0,0 @@
-This directory contains a collection of executable Python scripts.
-
-See also the Tools/scripts directory!
-
-beer.py                 Print the classic 'bottles of beer' list
-eqfix.py                Fix .py files to use the correct equality test operator
-fact.py                 Factorize numbers
-find-uname.py           Search for Unicode characters using regexps
-from.py                 Summarize mailbox
-lpwatch.py              Watch BSD line printer queues
-makedir.py              Like mkdir -p
-markov.py               Markov chain simulation of words or characters
-mboxconvert.py          Convert MH or MMDF mailboxes to unix mailbox format
-morse.py                Produce morse code (as an AIFF file)
-newslist.py             List all newsgroups on a NNTP server as HTML pages
-pi.py                   Print all digits of pi -- given enough time and memory
-pp.py                   Emulate some Perl command line options
-primes.py               Print prime numbers
-queens.py               Dijkstra's solution to Wirth's "N Queens problem"
-script.py               Equivalent to BSD script(1) -- by Steen Lumholt
-unbirthday.py           Print unbirthday count
-update.py               Update a bunch of files according to a script
diff --git a/Demo/scripts/fact.py b/Demo/scripts/fact.py
deleted file mode 100755
index 2a3bef2..0000000
--- a/Demo/scripts/fact.py
+++ /dev/null
@@ -1,49 +0,0 @@
-#! /usr/bin/env python3
-
-# Factorize numbers.
-# The algorithm is not efficient, but easy to understand.
-# If there are large factors, it will take forever to find them,
-# because we try all odd numbers between 3 and sqrt(n)...
-
-import sys
-from math import sqrt
-
-def fact(n):
-    if n < 1:
-        raise ValueError('fact() argument should be >= 1')
-    if n == 1:
-        return []  # special case
-    res = []
-    # Treat even factors special, so we can use i += 2 later
-    while n % 2 == 0:
-        res.append(2)
-        n //= 2
-    # Try odd numbers up to sqrt(n)
-    limit = sqrt(n+1)
-    i = 3
-    while i <= limit:
-        if n % i == 0:
-            res.append(i)
-            n //= i
-            limit = sqrt(n+1)
-        else:
-            i += 2
-    if n != 1:
-        res.append(n)
-    return res
-
-def main():
-    if len(sys.argv) > 1:
-        source = sys.argv[1:]
-    else:
-        source = iter(input, '')
-    for arg in source:
-        try:
-            n = int(arg)
-        except ValueError:
-            print(arg, 'is not an integer')
-        else:
-            print(n, fact(n))
-
-if __name__ == "__main__":
-    main()
diff --git a/Demo/scripts/unbirthday.py b/Demo/scripts/unbirthday.py
deleted file mode 100755
index b3c7d23..0000000
--- a/Demo/scripts/unbirthday.py
+++ /dev/null
@@ -1,106 +0,0 @@
-#! /usr/bin/env python3
-
-# Calculate your unbirthday count (see Alice in Wonderland).
-# This is defined as the number of days from your birth until today
-# that weren't your birthday.  (The day you were born is not counted).
-# Leap years make it interesting.
-
-import sys
-import time
-import calendar
-
-def main():
-    if sys.argv[1:]:
-        year = int(sys.argv[1])
-    else:
-        year = int(input('In which year were you born? '))
-    if 0 <= year < 100:
-        print("I'll assume that by", year, end=' ')
-        year = year + 1900
-        print('you mean', year, 'and not the early Christian era')
-    elif not (1850 <= year <= time.localtime()[0]):
-        print("It's hard to believe you were born in", year)
-        return
-
-    if sys.argv[2:]:
-        month = int(sys.argv[2])
-    else:
-        month = int(input('And in which month? (1-12) '))
-    if not (1 <= month <= 12):
-        print('There is no month numbered', month)
-        return
-
-    if sys.argv[3:]:
-        day = int(sys.argv[3])
-    else:
-        day = int(input('And on what day of that month? (1-31) '))
-    if month == 2 and calendar.isleap(year):
-        maxday = 29
-    else:
-        maxday = calendar.mdays[month]
-    if not (1 <= day <= maxday):
-        print('There are no', day, 'days in that month!')
-        return
-
-    bdaytuple = (year, month, day)
-    bdaydate = mkdate(bdaytuple)
-    print('You were born on', format(bdaytuple))
-
-    todaytuple = time.localtime()[:3]
-    todaydate = mkdate(todaytuple)
-    print('Today is', format(todaytuple))
-
-    if bdaytuple > todaytuple:
-        print('You are a time traveler.  Go back to the future!')
-        return
-
-    if bdaytuple == todaytuple:
-        print('You were born today.  Have a nice life!')
-        return
-
-    days = todaydate - bdaydate
-    print('You have lived', days, 'days')
-
-    age = 0
-    for y in range(year, todaytuple[0] + 1):
-        if bdaytuple < (y, month, day) <= todaytuple:
-            age = age + 1
-
-    print('You are', age, 'years old')
-
-    if todaytuple[1:] == bdaytuple[1:]:
-        print('Congratulations!  Today is your', nth(age), 'birthday')
-        print('Yesterday was your', end=' ')
-    else:
-        print('Today is your', end=' ')
-    print(nth(days - age), 'unbirthday')
-
-def format(date):
-    (year, month, day) = date
-    return '%d %s %d' % (day, calendar.month_name[month], year)
-
-def nth(n):
-    if n == 1: return '1st'
-    if n == 2: return '2nd'
-    if n == 3: return '3rd'
-    return '%dth' % n
-
-def mkdate(date):
-    # January 1st, in 0 A.D. is arbitrarily defined to be day 1,
-    # even though that day never actually existed and the calendar
-    # was different then...
-    (year, month, day) = date
-    days = year*365                  # years, roughly
-    days = days + (year+3)//4        # plus leap years, roughly
-    days = days - (year+99)//100     # minus non-leap years every century
-    days = days + (year+399)//400    # plus leap years every 4 centirues
-    for i in range(1, month):
-        if i == 2 and calendar.isleap(year):
-            days = days + 29
-        else:
-            days = days + calendar.mdays[i]
-    days = days + day
-    return days
-
-if __name__ == "__main__":
-    main()
diff --git a/Demo/sockets/README b/Demo/sockets/README
deleted file mode 100644
index eba7c23..0000000
--- a/Demo/sockets/README
+++ /dev/null
@@ -1,14 +0,0 @@
-This directory contains some demonstrations of the socket module:
-
-broadcast.py	 	Broadcast the time to radio.py.
-echosvr.py		About the simplest TCP server possible.
-finger.py		Client for the 'finger' protocol.
-ftp.py			A very simple ftp client.
-gopher.py		A simple gopher client.
-mcast.py		IPv4/v6 multicast example
-radio.py		Receive time broadcasts from broadcast.py.
-telnet.py		Client for the 'telnet' protocol.
-throughput.py		Client and server to measure TCP throughput.
-unixclient.py		Unix socket example, client side
-unixserver.py		Unix socket example, server side
-udpecho.py		Client and server for the UDP echo protocol.
diff --git a/Demo/sockets/broadcast.py b/Demo/sockets/broadcast.py
deleted file mode 100644
index 6d2b1e8..0000000
--- a/Demo/sockets/broadcast.py
+++ /dev/null
@@ -1,15 +0,0 @@
-# Send UDP broadcast packets
-
-MYPORT = 50000
-
-import sys, time
-from socket import *
-
-s = socket(AF_INET, SOCK_DGRAM)
-s.bind(('', 0))
-s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
-
-while 1:
-    data = repr(time.time()) + '\n'
-    s.sendto(data, ('<broadcast>', MYPORT))
-    time.sleep(2)
diff --git a/Demo/sockets/echosvr.py b/Demo/sockets/echosvr.py
deleted file mode 100755
index 6f7030e..0000000
--- a/Demo/sockets/echosvr.py
+++ /dev/null
@@ -1,31 +0,0 @@
-#! /usr/bin/env python3
-
-# Python implementation of an 'echo' tcp server: echo all data it receives.
-#
-# This is the simplest possible server, servicing a single request only.
-
-import sys
-from socket import *
-
-# The standard echo port isn't very useful, it requires root permissions!
-# ECHO_PORT = 7
-ECHO_PORT = 50000 + 7
-BUFSIZE = 1024
-
-def main():
-    if len(sys.argv) > 1:
-        port = int(eval(sys.argv[1]))
-    else:
-        port = ECHO_PORT
-    s = socket(AF_INET, SOCK_STREAM)
-    s.bind(('', port))
-    s.listen(1)
-    conn, (remotehost, remoteport) = s.accept()
-    print('connected by', remotehost, remoteport)
-    while 1:
-        data = conn.recv(BUFSIZE)
-        if not data:
-            break
-        conn.send(data)
-
-main()
diff --git a/Demo/sockets/finger.py b/Demo/sockets/finger.py
deleted file mode 100755
index 4d49391..0000000
--- a/Demo/sockets/finger.py
+++ /dev/null
@@ -1,58 +0,0 @@
-#! /usr/bin/env python3
-
-# Python interface to the Internet finger daemon.
-#
-# Usage: finger [options] [user][@host] ...
-#
-# If no host is given, the finger daemon on the local host is contacted.
-# Options are passed uninterpreted to the finger daemon!
-
-
-import sys, string
-from socket import *
-
-
-# Hardcode the number of the finger port here.
-# It's not likely to change soon...
-#
-FINGER_PORT = 79
-
-
-# Function to do one remote finger invocation.
-# Output goes directly to stdout (although this can be changed).
-#
-def finger(host, args):
-    s = socket(AF_INET, SOCK_STREAM)
-    s.connect((host, FINGER_PORT))
-    s.send(args + '\n')
-    while 1:
-        buf = s.recv(1024)
-        if not buf: break
-        sys.stdout.write(buf)
-    sys.stdout.flush()
-
-
-# Main function: argument parsing.
-#
-def main():
-    options = ''
-    i = 1
-    while i < len(sys.argv) and sys.argv[i][:1] == '-':
-        options = options + sys.argv[i] + ' '
-        i = i+1
-    args = sys.argv[i:]
-    if not args:
-        args = ['']
-    for arg in args:
-        if '@' in arg:
-            at = string.index(arg, '@')
-            host = arg[at+1:]
-            arg = arg[:at]
-        else:
-            host = ''
-        finger(host, options + arg)
-
-
-# Call the main function.
-#
-main()
diff --git a/Demo/sockets/ftp.py b/Demo/sockets/ftp.py
deleted file mode 100644
index 5ea99c7..0000000
--- a/Demo/sockets/ftp.py
+++ /dev/null
@@ -1,152 +0,0 @@
-# A simple FTP client.
-#
-# The information to write this program was gathered from RFC 959,
-# but this is not a complete implementation!  Yet it shows how a simple
-# FTP client can be built, and you are welcome to extend it to suit
-# it to your needs...
-#
-# How it works (assuming you've read the RFC):
-#
-# User commands are passed uninterpreted to the server.  However, the
-# user never needs to send a PORT command.  Rather, the client opens a
-# port right away and sends the appropriate PORT command to the server.
-# When a response code 150 is received, this port is used to receive
-# the data (which is written to stdout in this version), and when the
-# data is exhausted, a new port is opened and a corresponding PORT
-# command sent.  In order to avoid errors when reusing ports quickly
-# (and because there is no s.getsockname() method in Python yet) we
-# cycle through a number of ports in the 50000 range.
-
-
-import sys, posix, string
-from socket import *
-
-
-BUFSIZE = 1024
-
-# Default port numbers used by the FTP protocol.
-#
-FTP_PORT = 21
-FTP_DATA_PORT = FTP_PORT - 1
-
-# Change the data port to something not needing root permissions.
-#
-FTP_DATA_PORT = FTP_DATA_PORT + 50000
-
-
-# Main program (called at the end of this file).
-#
-def main():
-    hostname = sys.argv[1]
-    control(hostname)
-
-
-# Control process (user interface and user protocol interpreter).
-#
-def control(hostname):
-    #
-    # Create control connection
-    #
-    s = socket(AF_INET, SOCK_STREAM)
-    s.connect((hostname, FTP_PORT))
-    f = s.makefile('r') # Reading the replies is easier from a file...
-    #
-    # Control loop
-    #
-    r = None
-    while 1:
-        code = getreply(f)
-        if code in ('221', 'EOF'): break
-        if code == '150':
-            getdata(r)
-            code = getreply(f)
-            r = None
-        if not r:
-            r = newdataport(s, f)
-        cmd = getcommand()
-        if not cmd: break
-        s.send(cmd + '\r\n')
-
-
-# Create a new data port and send a PORT command to the server for it.
-# (Cycle through a number of ports to avoid problems with reusing
-# a port within a short time.)
-#
-nextport = 0
-#
-def newdataport(s, f):
-    global nextport
-    port = nextport + FTP_DATA_PORT
-    nextport = (nextport+1) % 16
-    r = socket(AF_INET, SOCK_STREAM)
-    r.bind((gethostbyname(gethostname()), port))
-    r.listen(1)
-    sendportcmd(s, f, port)
-    return r
-
-
-# Send an appropriate port command.
-#
-def sendportcmd(s, f, port):
-    hostname = gethostname()
-    hostaddr = gethostbyname(hostname)
-    hbytes = string.splitfields(hostaddr, '.')
-    pbytes = [repr(port//256), repr(port%256)]
-    bytes = hbytes + pbytes
-    cmd = 'PORT ' + string.joinfields(bytes, ',')
-    s.send(cmd + '\r\n')
-    code = getreply(f)
-
-
-# Process an ftp reply and return the 3-digit reply code (as a string).
-# The reply should be a line of text starting with a 3-digit number.
-# If the 4th char is '-', it is a multi-line reply and is
-# terminate by a line starting with the same 3-digit number.
-# Any text while receiving the reply is echoed to the file.
-#
-def getreply(f):
-    line = f.readline()
-    if not line: return 'EOF'
-    print(line, end=' ')
-    code = line[:3]
-    if line[3:4] == '-':
-        while 1:
-            line = f.readline()
-            if not line: break # Really an error
-            print(line, end=' ')
-            if line[:3] == code and line[3:4] != '-': break
-    return code
-
-
-# Get the data from the data connection.
-#
-def getdata(r):
-    print('(accepting data connection)')
-    conn, host = r.accept()
-    print('(data connection accepted)')
-    while 1:
-        data = conn.recv(BUFSIZE)
-        if not data: break
-        sys.stdout.write(data)
-    print('(end of data connection)')
-
-def raw_input(prompt):
-    sys.stdout.write(prompt)
-    sys.stdout.flush()
-    return sys.stdin.readline()
-
-# Get a command from the user.
-#
-def getcommand():
-    try:
-        while 1:
-            line = input('ftp.py> ')
-            if line: return line
-    except EOFError:
-        return ''
-
-
-# Call the main program.
-#
-if __name__ == '__main__':
-    main()
diff --git a/Demo/sockets/gopher.py b/Demo/sockets/gopher.py
deleted file mode 100755
index bd29ec0..0000000
--- a/Demo/sockets/gopher.py
+++ /dev/null
@@ -1,352 +0,0 @@
-#! /usr/bin/env python3
-
-# A simple gopher client.
-#
-# Usage: gopher [ [selector] host [port] ]
-
-import sys
-import os
-import socket
-
-# Default selector, host and port
-DEF_SELECTOR = ''
-DEF_HOST     = 'gopher.micro.umn.edu'
-DEF_PORT     = 70
-
-# Recognized file types
-T_TEXTFILE  = '0'
-T_MENU      = '1'
-T_CSO       = '2'
-T_ERROR     = '3'
-T_BINHEX    = '4'
-T_DOS       = '5'
-T_UUENCODE  = '6'
-T_SEARCH    = '7'
-T_TELNET    = '8'
-T_BINARY    = '9'
-T_REDUNDANT = '+'
-T_SOUND     = 's'
-
-# Dictionary mapping types to strings
-typename = {'0': '<TEXT>', '1': '<DIR>', '2': '<CSO>', '3': '<ERROR>', \
-        '4': '<BINHEX>', '5': '<DOS>', '6': '<UUENCODE>', '7': '<SEARCH>', \
-        '8': '<TELNET>', '9': '<BINARY>', '+': '<REDUNDANT>', 's': '<SOUND>'}
-
-# Oft-used characters and strings
-CRLF = '\r\n'
-TAB = '\t'
-
-# Open a TCP connection to a given host and port
-def open_socket(host, port):
-    if not port:
-        port = DEF_PORT
-    elif type(port) == type(''):
-        port = int(port)
-    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-    s.connect((host, port))
-    return s
-
-# Send a selector to a given host and port, return a file with the reply
-def send_request(selector, host, port):
-    s = open_socket(host, port)
-    s.send(selector + CRLF)
-    s.shutdown(1)
-    return s.makefile('r')
-
-# Get a menu in the form of a list of entries
-def get_menu(selector, host, port):
-    f = send_request(selector, host, port)
-    list = []
-    while 1:
-        line = f.readline()
-        if not line:
-            print('(Unexpected EOF from server)')
-            break
-        if line[-2:] == CRLF:
-            line = line[:-2]
-        elif line[-1:] in CRLF:
-            line = line[:-1]
-        if line == '.':
-            break
-        if not line:
-            print('(Empty line from server)')
-            continue
-        typechar = line[0]
-        parts = line[1:].split(TAB)
-        if len(parts) < 4:
-            print('(Bad line from server: %r)' % (line,))
-            continue
-        if len(parts) > 4:
-            print('(Extra info from server: %r)' % (parts[4:],))
-        parts.insert(0, typechar)
-        list.append(parts)
-    f.close()
-    return list
-
-# Get a text file as a list of lines, with trailing CRLF stripped
-def get_textfile(selector, host, port):
-    list = []
-    get_alt_textfile(selector, host, port, list.append)
-    return list
-
-# Get a text file and pass each line to a function, with trailing CRLF stripped
-def get_alt_textfile(selector, host, port, func):
-    f = send_request(selector, host, port)
-    while 1:
-        line = f.readline()
-        if not line:
-            print('(Unexpected EOF from server)')
-            break
-        if line[-2:] == CRLF:
-            line = line[:-2]
-        elif line[-1:] in CRLF:
-            line = line[:-1]
-        if line == '.':
-            break
-        if line[:2] == '..':
-            line = line[1:]
-        func(line)
-    f.close()
-
-# Get a binary file as one solid data block
-def get_binary(selector, host, port):
-    f = send_request(selector, host, port)
-    data = f.read()
-    f.close()
-    return data
-
-# Get a binary file and pass each block to a function
-def get_alt_binary(selector, host, port, func, blocksize):
-    f = send_request(selector, host, port)
-    while 1:
-        data = f.read(blocksize)
-        if not data:
-            break
-        func(data)
-
-# A *very* simple interactive browser
-
-# Browser main command, has default arguments
-def browser(*args):
-    selector = DEF_SELECTOR
-    host = DEF_HOST
-    port = DEF_PORT
-    n = len(args)
-    if n > 0 and args[0]:
-        selector = args[0]
-    if n > 1 and args[1]:
-        host = args[1]
-    if n > 2 and args[2]:
-        port = args[2]
-    if n > 3:
-        raise RuntimeError('too many args')
-    try:
-        browse_menu(selector, host, port)
-    except socket.error as msg:
-        print('Socket error:', msg)
-        sys.exit(1)
-    except KeyboardInterrupt:
-        print('\n[Goodbye]')
-
-# Browse a menu
-def browse_menu(selector, host, port):
-    list = get_menu(selector, host, port)
-    while 1:
-        print('----- MENU -----')
-        print('Selector:', repr(selector))
-        print('Host:', host, ' Port:', port)
-        print()
-        for i in range(len(list)):
-            item = list[i]
-            typechar, description = item[0], item[1]
-            print(repr(i+1).rjust(3) + ':', description, end=' ')
-            if typechar in typename:
-                print(typename[typechar])
-            else:
-                print('<TYPE=' + repr(typechar) + '>')
-        print()
-        while 1:
-            try:
-                str = input('Choice [CR == up a level]: ')
-            except EOFError:
-                print()
-                return
-            if not str:
-                return
-            try:
-                choice = int(str)
-            except ValueError:
-                print('Choice must be a number; try again:')
-                continue
-            if not 0 < choice <= len(list):
-                print('Choice out of range; try again:')
-                continue
-            break
-        item = list[choice-1]
-        typechar = item[0]
-        [i_selector, i_host, i_port] = item[2:5]
-        if typechar in typebrowser:
-            browserfunc = typebrowser[typechar]
-            try:
-                browserfunc(i_selector, i_host, i_port)
-            except (IOError, socket.error):
-                t, v, tb = sys.exc_info()
-                print('***', t, ':', v)
-        else:
-            print('Unsupported object type')
-
-# Browse a text file
-def browse_textfile(selector, host, port):
-    x = None
-    try:
-        p = os.popen('${PAGER-more}', 'w')
-        x = SaveLines(p)
-        get_alt_textfile(selector, host, port, x.writeln)
-    except IOError as msg:
-        print('IOError:', msg)
-    if x:
-        x.close()
-    f = open_savefile()
-    if not f:
-        return
-    x = SaveLines(f)
-    try:
-        get_alt_textfile(selector, host, port, x.writeln)
-        print('Done.')
-    except IOError as msg:
-        print('IOError:', msg)
-    x.close()
-
-def raw_input(prompt):
-    sys.stdout.write(prompt)
-    sys.stdout.flush()
-    return sys.stdin.readline()
-
-# Browse a search index
-def browse_search(selector, host, port):
-    while 1:
-        print('----- SEARCH -----')
-        print('Selector:', repr(selector))
-        print('Host:', host, ' Port:', port)
-        print()
-        try:
-            query = input('Query [CR == up a level]: ')
-        except EOFError:
-            print()
-            break
-        query = query.strip()
-        if not query:
-            break
-        if '\t' in query:
-            print('Sorry, queries cannot contain tabs')
-            continue
-        browse_menu(selector + TAB + query, host, port)
-
-# "Browse" telnet-based information, i.e. open a telnet session
-def browse_telnet(selector, host, port):
-    if selector:
-        print('Log in as', repr(selector))
-    if type(port) != type(''):
-        port = repr(port)
-    sts = os.system('set -x; exec telnet ' + host + ' ' + port)
-    if sts:
-        print('Exit status:', sts)
-
-# "Browse" a binary file, i.e. save it to a file
-def browse_binary(selector, host, port):
-    f = open_savefile()
-    if not f:
-        return
-    x = SaveWithProgress(f)
-    get_alt_binary(selector, host, port, x.write, 8*1024)
-    x.close()
-
-# "Browse" a sound file, i.e. play it or save it
-def browse_sound(selector, host, port):
-    browse_binary(selector, host, port)
-
-# Dictionary mapping types to browser functions
-typebrowser = {'0': browse_textfile, '1': browse_menu, \
-        '4': browse_binary, '5': browse_binary, '6': browse_textfile, \
-        '7': browse_search, \
-        '8': browse_telnet, '9': browse_binary, 's': browse_sound}
-
-# Class used to save lines, appending a newline to each line
-class SaveLines:
-    def __init__(self, f):
-        self.f = f
-    def writeln(self, line):
-        self.f.write(line + '\n')
-    def close(self):
-        sts = self.f.close()
-        if sts:
-            print('Exit status:', sts)
-
-# Class used to save data while showing progress
-class SaveWithProgress:
-    def __init__(self, f):
-        self.f = f
-    def write(self, data):
-        sys.stdout.write('#')
-        sys.stdout.flush()
-        self.f.write(data)
-    def close(self):
-        print()
-        sts = self.f.close()
-        if sts:
-            print('Exit status:', sts)
-
-# Ask for and open a save file, or return None if not to save
-def open_savefile():
-    try:
-        savefile = input( \
-    'Save as file [CR == don\'t save; |pipeline or ~user/... OK]: ')
-    except EOFError:
-        print()
-        return None
-    savefile = savefile.strip()
-    if not savefile:
-        return None
-    if savefile[0] == '|':
-        cmd = savefile[1:].strip()
-        try:
-            p = os.popen(cmd, 'w')
-        except IOError as msg:
-            print(repr(cmd), ':', msg)
-            return None
-        print('Piping through', repr(cmd), '...')
-        return p
-    if savefile[0] == '~':
-        savefile = os.path.expanduser(savefile)
-    try:
-        f = open(savefile, 'w')
-    except IOError as msg:
-        print(repr(savefile), ':', msg)
-        return None
-    print('Saving to', repr(savefile), '...')
-    return f
-
-# Test program
-def test():
-    if sys.argv[4:]:
-        print('usage: gopher [ [selector] host [port] ]')
-        sys.exit(2)
-    elif sys.argv[3:]:
-        browser(sys.argv[1], sys.argv[2], sys.argv[3])
-    elif sys.argv[2:]:
-        try:
-            port = int(sys.argv[2])
-            selector = ''
-            host = sys.argv[1]
-        except ValueError:
-            selector = sys.argv[1]
-            host = sys.argv[2]
-            port = ''
-        browser(selector, host, port)
-    elif sys.argv[1:]:
-        browser('', sys.argv[1])
-    else:
-        browser()
-
-# Call the test program as a main program
-test()
diff --git a/Demo/sockets/radio.py b/Demo/sockets/radio.py
deleted file mode 100644
index fa4ce75..0000000
--- a/Demo/sockets/radio.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Receive UDP packets transmitted by a broadcasting service
-
-MYPORT = 50000
-
-import sys
-from socket import *
-
-s = socket(AF_INET, SOCK_DGRAM)
-s.bind(('', MYPORT))
-
-while 1:
-    data, wherefrom = s.recvfrom(1500, 0)
-    sys.stderr.write(repr(wherefrom) + '\n')
-    sys.stdout.write(data)
diff --git a/Demo/sockets/rpython.py b/Demo/sockets/rpython.py
deleted file mode 100755
index 7dcf979..0000000
--- a/Demo/sockets/rpython.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#! /usr/bin/env python3
-
-# Remote python client.
-# Execute Python commands remotely and send output back.
-
-import sys
-import string
-from socket import *
-
-PORT = 4127
-BUFSIZE = 1024
-
-def main():
-    if len(sys.argv) < 3:
-        print("usage: rpython host command")
-        sys.exit(2)
-    host = sys.argv[1]
-    port = PORT
-    i = string.find(host, ':')
-    if i >= 0:
-        port = string.atoi(port[i+1:])
-        host = host[:i]
-    command = string.join(sys.argv[2:])
-    s = socket(AF_INET, SOCK_STREAM)
-    s.connect((host, port))
-    s.send(command)
-    s.shutdown(1)
-    reply = ''
-    while 1:
-        data = s.recv(BUFSIZE)
-        if not data: break
-        reply = reply + data
-    print(reply, end=' ')
-
-main()
diff --git a/Demo/sockets/telnet.py b/Demo/sockets/telnet.py
deleted file mode 100755
index fb36faf..0000000
--- a/Demo/sockets/telnet.py
+++ /dev/null
@@ -1,109 +0,0 @@
-#! /usr/bin/env python3
-
-# Minimal interface to the Internet telnet protocol.
-#
-# It refuses all telnet options and does not recognize any of the other
-# telnet commands, but can still be used to connect in line-by-line mode.
-# It's also useful to play with a number of other services,
-# like time, finger, smtp and even ftp.
-#
-# Usage: telnet host [port]
-#
-# The port may be a service name or a decimal port number;
-# it defaults to 'telnet'.
-
-
-import sys, posix, time
-from socket import *
-
-BUFSIZE = 1024
-
-# Telnet protocol characters
-
-IAC  = chr(255) # Interpret as command
-DONT = chr(254)
-DO   = chr(253)
-WONT = chr(252)
-WILL = chr(251)
-
-def main():
-    host = sys.argv[1]
-    try:
-        hostaddr = gethostbyname(host)
-    except error:
-        sys.stderr.write(sys.argv[1] + ': bad host name\n')
-        sys.exit(2)
-    #
-    if len(sys.argv) > 2:
-        servname = sys.argv[2]
-    else:
-        servname = 'telnet'
-    #
-    if '0' <= servname[:1] <= '9':
-        port = eval(servname)
-    else:
-        try:
-            port = getservbyname(servname, 'tcp')
-        except error:
-            sys.stderr.write(servname + ': bad tcp service name\n')
-            sys.exit(2)
-    #
-    s = socket(AF_INET, SOCK_STREAM)
-    #
-    try:
-        s.connect((host, port))
-    except error as msg:
-        sys.stderr.write('connect failed: ' + repr(msg) + '\n')
-        sys.exit(1)
-    #
-    pid = posix.fork()
-    #
-    if pid == 0:
-        # child -- read stdin, write socket
-        while 1:
-            line = sys.stdin.readline()
-            s.send(line)
-    else:
-        # parent -- read socket, write stdout
-        iac = 0         # Interpret next char as command
-        opt = ''        # Interpret next char as option
-        while 1:
-            data = s.recv(BUFSIZE)
-            if not data:
-                # EOF; kill child and exit
-                sys.stderr.write( '(Closed by remote host)\n')
-                posix.kill(pid, 9)
-                sys.exit(1)
-            cleandata = ''
-            for c in data:
-                if opt:
-                    print(ord(c))
-                    s.send(opt + c)
-                    opt = ''
-                elif iac:
-                    iac = 0
-                    if c == IAC:
-                        cleandata = cleandata + c
-                    elif c in (DO, DONT):
-                        if c == DO: print('(DO)', end=' ')
-                        else: print('(DONT)', end=' ')
-                        opt = IAC + WONT
-                    elif c in (WILL, WONT):
-                        if c == WILL: print('(WILL)', end=' ')
-                        else: print('(WONT)', end=' ')
-                        opt = IAC + DONT
-                    else:
-                        print('(command)', ord(c))
-                elif c == IAC:
-                    iac = 1
-                    print('(IAC)', end=' ')
-                else:
-                    cleandata = cleandata + c
-            sys.stdout.write(cleandata)
-            sys.stdout.flush()
-
-
-try:
-    main()
-except KeyboardInterrupt:
-    pass
diff --git a/Demo/sockets/throughput.py b/Demo/sockets/throughput.py
deleted file mode 100755
index 5954316..0000000
--- a/Demo/sockets/throughput.py
+++ /dev/null
@@ -1,93 +0,0 @@
-#! /usr/bin/env python3
-
-# Test network throughput.
-#
-# Usage:
-# 1) on host_A: throughput -s [port]                    # start a server
-# 2) on host_B: throughput -c  count host_A [port]      # start a client
-#
-# The server will service multiple clients until it is killed.
-#
-# The client performs one transfer of count*BUFSIZE bytes and
-# measures the time it takes (roundtrip!).
-
-
-import sys, time
-from socket import *
-
-MY_PORT = 50000 + 42
-
-BUFSIZE = 1024
-
-
-def main():
-    if len(sys.argv) < 2:
-        usage()
-    if sys.argv[1] == '-s':
-        server()
-    elif sys.argv[1] == '-c':
-        client()
-    else:
-        usage()
-
-
-def usage():
-    sys.stdout = sys.stderr
-    print('Usage:    (on host_A) throughput -s [port]')
-    print('and then: (on host_B) throughput -c count host_A [port]')
-    sys.exit(2)
-
-
-def server():
-    if len(sys.argv) > 2:
-        port = eval(sys.argv[2])
-    else:
-        port = MY_PORT
-    s = socket(AF_INET, SOCK_STREAM)
-    s.bind(('', port))
-    s.listen(1)
-    print('Server ready...')
-    while 1:
-        conn, (host, remoteport) = s.accept()
-        while 1:
-            data = conn.recv(BUFSIZE)
-            if not data:
-                break
-            del data
-        conn.send('OK\n')
-        conn.close()
-        print('Done with', host, 'port', remoteport)
-
-
-def client():
-    if len(sys.argv) < 4:
-        usage()
-    count = int(eval(sys.argv[2]))
-    host = sys.argv[3]
-    if len(sys.argv) > 4:
-        port = eval(sys.argv[4])
-    else:
-        port = MY_PORT
-    testdata = 'x' * (BUFSIZE-1) + '\n'
-    t1 = time.time()
-    s = socket(AF_INET, SOCK_STREAM)
-    t2 = time.time()
-    s.connect((host, port))
-    t3 = time.time()
-    i = 0
-    while i < count:
-        i = i+1
-        s.send(testdata)
-    s.shutdown(1) # Send EOF
-    t4 = time.time()
-    data = s.recv(BUFSIZE)
-    t5 = time.time()
-    print(data)
-    print('Raw timers:', t1, t2, t3, t4, t5)
-    print('Intervals:', t2-t1, t3-t2, t4-t3, t5-t4)
-    print('Total:', t5-t1)
-    print('Throughput:', round((BUFSIZE*count*0.001) / (t5-t1), 3), end=' ')
-    print('K/sec.')
-
-
-main()
diff --git a/Demo/sockets/udpecho.py b/Demo/sockets/udpecho.py
deleted file mode 100755
index 6983a1f..0000000
--- a/Demo/sockets/udpecho.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#! /usr/bin/env python3
-
-# Client and server for udp (datagram) echo.
-#
-# Usage: udpecho -s [port]            (to start a server)
-# or:    udpecho -c host [port] <file (client)
-
-import sys
-from socket import *
-
-ECHO_PORT = 50000 + 7
-BUFSIZE = 1024
-
-def main():
-    if len(sys.argv) < 2:
-        usage()
-    if sys.argv[1] == '-s':
-        server()
-    elif sys.argv[1] == '-c':
-        client()
-    else:
-        usage()
-
-def usage():
-    sys.stdout = sys.stderr
-    print('Usage: udpecho -s [port]            (server)')
-    print('or:    udpecho -c host [port] <file (client)')
-    sys.exit(2)
-
-def server():
-    if len(sys.argv) > 2:
-        port = eval(sys.argv[2])
-    else:
-        port = ECHO_PORT
-    s = socket(AF_INET, SOCK_DGRAM)
-    s.bind(('', port))
-    print('udp echo server ready')
-    while 1:
-        data, addr = s.recvfrom(BUFSIZE)
-        print('server received %r from %r' % (data, addr))
-        s.sendto(data, addr)
-
-def client():
-    if len(sys.argv) < 3:
-        usage()
-    host = sys.argv[2]
-    if len(sys.argv) > 3:
-        port = eval(sys.argv[3])
-    else:
-        port = ECHO_PORT
-    addr = host, port
-    s = socket(AF_INET, SOCK_DGRAM)
-    s.bind(('', 0))
-    print('udp echo client ready, reading stdin')
-    while 1:
-        line = sys.stdin.readline()
-        if not line:
-            break
-        print('addr = ', addr)
-        s.sendto(bytes(line, 'ascii'), addr)
-        data, fromaddr = s.recvfrom(BUFSIZE)
-        print('client received %r from %r' % (data, fromaddr))
-
-main()
diff --git a/Demo/sockets/unicast.py b/Demo/sockets/unicast.py
deleted file mode 100644
index dd15e3c..0000000
--- a/Demo/sockets/unicast.py
+++ /dev/null
@@ -1,14 +0,0 @@
-# Send UDP broadcast packets
-
-MYPORT = 50000
-
-import sys, time
-from socket import *
-
-s = socket(AF_INET, SOCK_DGRAM)
-s.bind(('', 0))
-
-while 1:
-    data = repr(time.time()) + '\n'
-    s.sendto(data, ('', MYPORT))
-    time.sleep(2)
diff --git a/Demo/sockets/unixclient.py b/Demo/sockets/unixclient.py
deleted file mode 100644
index 5e87eed..0000000
--- a/Demo/sockets/unixclient.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Echo client demo using Unix sockets
-# Piet van Oostrum
-
-from socket import *
-
-FILE = 'unix-socket'
-s = socket(AF_UNIX, SOCK_STREAM)
-s.connect(FILE)
-s.send(b'Hello, world')
-data = s.recv(1024)
-s.close()
-print('Received', repr(data))
diff --git a/Demo/sockets/unixserver.py b/Demo/sockets/unixserver.py
deleted file mode 100644
index c3c9c4f..0000000
--- a/Demo/sockets/unixserver.py
+++ /dev/null
@@ -1,24 +0,0 @@
-# Echo server demo using Unix sockets (handles one connection only)
-# Piet van Oostrum
-
-import os
-from socket import *
-
-FILE = 'unix-socket'
-s = socket(AF_UNIX, SOCK_STREAM)
-s.bind(FILE)
-
-print('Sock name is: ['+s.getsockname()+']')
-
-# Wait for a connection
-s.listen(1)
-conn, addr = s.accept()
-
-while True:
-    data = conn.recv(1024)
-    if not data:
-        break
-    conn.send(data)
-
-conn.close()
-os.unlink(FILE)
diff --git a/Demo/tix/INSTALL.txt b/Demo/tix/INSTALL.txt
deleted file mode 100644
index ac70b68..0000000
--- a/Demo/tix/INSTALL.txt
+++ /dev/null
@@ -1,89 +0,0 @@
-$Id$
-
-Installing Tix.py
-----------------
-
-0) To use Tix.py, you need Tcl/Tk (V8.3.3), Tix (V8.1.1) and Python (V2.1.1).
-   Tix.py has been written and tested on a Intel Pentium running RH Linux 5.2
-   and Mandrake Linux 7.0 and Windows with the above mentioned packages.
-
-   Older versions, e.g. Tix 4.1 and Tk 8.0, might also work.
-
-   There is nothing OS-specific in Tix.py itself so it should work on
-   any machine with Tix and Python installed. You can get Tcl and Tk
-   from http://dev.scriptics.com and Tix from http://tix.sourceforge.net.
-
-1) Build and install Tcl/Tk 8.3. Build and install Tix 8.1.
-   Ensure that Tix is properly installed by running tixwish and executing
-   the demo programs. Under Unix, use the --enable-shared configure option
-   for all three. We recommend tcl8.3.3 for this release of Tix.py.
-
-2a) If you have a distribution like ActiveState with a tcl subdirectory
-   of $PYTHONHOME, which contains the directories tcl8.3 and tk8.3,
-   make a directory tix8.1 as well. Recursively copy the files from
-   <tix>/library to $PYTHONHOME/lib/tix8.1, and copy the dynamic library
-   (tix8183.dll or libtix8.1.8.3.so) to the same place as the tcl dynamic
-   libraries  ($PYTHONHOME/Dlls or lib/python-2.1/lib-dynload). In this
-   case you are all installed, and you can skip to the end.
-
-2b) Modify Modules/Setup.dist and setup.py to change the version of the 
-   tix library from tix4.1.8.0 to tix8.1.8.3
-   These modified files can be used for Tkinter with or without Tix.
-   
-3) The default is to build dynamically, and use the Tcl 'package require'.
-   To build statically, modify the Modules/Setup file to link in the Tix 
-   library according to the comments in the file. On Linux this looks like:
-
-# *** Always uncomment this (leave the leading underscore in!):
-_tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
-# *** Uncomment and edit to reflect where your Tcl/Tk libraries are:
-	-L/usr/local/lib \
-# *** Uncomment and edit to reflect where your Tcl/Tk headers are:
-	-I/usr/local/include \
-# *** Uncomment and edit to reflect where your X11 header files are:
-	-I/usr/X11R6/include \
-# *** Or uncomment this for Solaris:
-#	-I/usr/openwin/include \
-# *** Uncomment and edit for BLT extension only:
-#	-DWITH_BLT -I/usr/local/blt/blt8.0-unoff/include -lBLT8.0 \
-# *** Uncomment and edit for PIL (TkImaging) extension only:
-#     (See http://www.pythonware.com/products/pil/ for more info)
-#	-DWITH_PIL -I../Extensions/Imaging/libImaging  tkImaging.c \
-# *** Uncomment and edit for TOGL extension only:
-#	-DWITH_TOGL togl.c \
-# *** Uncomment and edit for Tix extension only:
-	-DWITH_TIX -ltix8.1.8.3 \
-# *** Uncomment and edit to reflect your Tcl/Tk versions:
-	-ltk8.3 -ltcl8.3 \
-# *** Uncomment and edit to reflect where your X11 libraries are:
-	-L/usr/X11R6/lib \
-# *** Or uncomment this for Solaris:
-#	-L/usr/openwin/lib \
-# *** Uncomment these for TOGL extension only:
-#	-lGL -lGLU -lXext -lXmu \
-# *** Uncomment for AIX:
-#	-lld \
-# *** Always uncomment this; X11 libraries to link with:
-	-lX11
-
-4) Rebuild Python and reinstall.
-
-You should now have a working Tix implementation in Python. To see if all
-is as it should be, run the 'tixwidgets.py' script in the Demo/tix directory.
-Under X windows, do
-	/usr/local/bin/python Demo/tix/tixwidgets.py
-
-If this does not work, you may need to tell python where to find
-the Tcl, Tk and Tix library files. This is done by setting the
-TCL_LIBRARY, TK_LIBRARY and TIX_LIBRARY environment variables. Try this:
-
-	env 	TCL_LIBRARY=/usr/local/lib/tcl8.3 \
-		TK_LIBRARY=/usr/local/lib/tk8.3 \
-		TIX_LIBRARY=/usr/local/lib/tix8.1 \
-		/usr/local/bin/python Demo/tix/tixwidgets.py
-
-
-If you find any bugs or have suggestions for improvement, please report them
-via http://tix.sourceforge.net
-
-
diff --git a/Demo/tix/README.txt b/Demo/tix/README.txt
deleted file mode 100644
index e0196ac..0000000
--- a/Demo/tix/README.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-About Tix.py
------------
-
-Tix.py is based on an idea of Jean-Marc Lugrin (lugrin@ms.com) who wrote
-pytix (another Python-Tix marriage). Tix widgets are an attractive and
-useful extension to Tk. See http://tix.sourceforge.net
-for more details about Tix and how to get it.
-
-Features:
-	1) It is almost complete.
-	2) Tix widgets are represented by classes in Python. Sub-widgets
-	   are members of the mega-widget class. For example, if a
-	   particular TixWidget (e.g. ScrolledText) has an embedded widget
-	   (Text in this case), it is possible to call the methods of the
-	   child directly.
-	3) The members of the class are created automatically. In the case
-	   of widgets like ButtonBox, the members are added dynamically.
-
-
diff --git a/Demo/tix/bitmaps/about.xpm b/Demo/tix/bitmaps/about.xpm
deleted file mode 100755
index 33ffcc0..0000000
--- a/Demo/tix/bitmaps/about.xpm
+++ /dev/null
@@ -1,50 +0,0 @@
-/* XPM */
-static char * about_xpm[] = {
-"50 40 7 1",
-" 	s None	c None",
-".	c black",
-"X	c white",
-"o	c gray70",
-"O	c navy",
-"+	c red",
-"@	c yellow",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"        .................................         ",
-"      ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoo.         ",
-"      .XooooooooooooooooooooooooooooooXo.         ",
-"     .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXooXo.         ",
-"     ..oooooooooooooooooooooooooooooooXo.         ",
-"     ...............................XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.++++     ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo+++       ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Xo+++++       ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Xo++++++      ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Xo+++   +     ",
-"     .OOOOO@@@@@OOOOOOOOOOOOOOOOOOO.Xo++.         ",
-"     .OOOOOOO@OOOOO@OOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOO@OOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOO@OOOO@@OOO@OOO@OOOOOOO.XoXo.         ",
-"     .OOOOOOO@OOOOO@OOOO@O@OOOOOOOO.XoXo.         ",
-"     .OOOOOOO@OOOOO@OOOOO@OOOOOOOOO.XoXo.         ",
-"     .OOOOOOO@OOOOO@OOOOO@OOOOOOOOO.XoXo.         ",
-"     .OOOOOOO@OOOOO@OOOO@O@OOOOOOOO.XoXo.         ",
-"     .OOOOOOO@OOOO@@@OO@OOO@OOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XoXo.         ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Xo..          ",
-"     .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Xo            ",
-"      OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.X.            ",
-"        .............................             ",
-"                                                  ",
-"                                                  ",
-"                                                  "};
diff --git a/Demo/tix/bitmaps/bold.xbm b/Demo/tix/bitmaps/bold.xbm
deleted file mode 100755
index ebff8d1..0000000
--- a/Demo/tix/bitmaps/bold.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define bold_width 16
-#define bold_height 16
-static unsigned char bold_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0xfc, 0x0f, 0x18, 0x1c, 0x18, 0x18,
-   0x18, 0x18, 0x18, 0x1c, 0xf8, 0x0f, 0xf8, 0x0f, 0x18, 0x18, 0x18, 0x30,
-   0x18, 0x30, 0x18, 0x38, 0xfc, 0x3f, 0xfc, 0x1f};
diff --git a/Demo/tix/bitmaps/capital.xbm b/Demo/tix/bitmaps/capital.xbm
deleted file mode 100755
index fb4e070..0000000
--- a/Demo/tix/bitmaps/capital.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define capital_width 16
-#define capital_height 16
-static unsigned char capital_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x08, 0x30, 0x0c, 0x30, 0x06,
-   0x30, 0x03, 0xb0, 0x01, 0xf0, 0x00, 0xf0, 0x00, 0xf0, 0x01, 0xb0, 0x03,
-   0x30, 0x07, 0x30, 0x0e, 0x30, 0x1c, 0x00, 0x00};
diff --git a/Demo/tix/bitmaps/centerj.xbm b/Demo/tix/bitmaps/centerj.xbm
deleted file mode 100755
index 9d2c064..0000000
--- a/Demo/tix/bitmaps/centerj.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define centerj_width 16
-#define centerj_height 16
-static unsigned char centerj_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3e, 0x00, 0x00, 0xc0, 0x0d,
-   0x00, 0x00, 0x58, 0x77, 0x00, 0x00, 0xb0, 0x3b, 0x00, 0x00, 0xdc, 0xf7,
-   0x00, 0x00, 0xf0, 0x3e, 0x00, 0x00, 0xd8, 0x7e};
diff --git a/Demo/tix/bitmaps/combobox.xbm b/Demo/tix/bitmaps/combobox.xbm
deleted file mode 100755
index f5947f5..0000000
--- a/Demo/tix/bitmaps/combobox.xbm
+++ /dev/null
@@ -1,14 +0,0 @@
-#define combobox_width 32
-#define combobox_height 32
-static unsigned char combobox_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0xfc, 0xff, 0xff, 0x3e, 0x04, 0x00, 0x80, 0x2a, 0x04, 0x00, 0x80, 0x2a,
-   0x04, 0x00, 0x80, 0x2a, 0x04, 0x00, 0x80, 0x2b, 0xfc, 0xff, 0xff, 0x3e,
-   0x08, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x2a,
-   0x28, 0x49, 0x00, 0x2a, 0x08, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x22,
-   0x08, 0x00, 0x00, 0x22, 0x28, 0x49, 0x12, 0x22, 0x08, 0x00, 0x00, 0x22,
-   0x08, 0x00, 0x00, 0x22, 0x08, 0x00, 0x00, 0x22, 0x28, 0x49, 0x02, 0x22,
-   0x08, 0x00, 0x00, 0x3e, 0x08, 0x00, 0x00, 0x2a, 0x08, 0x00, 0x00, 0x2a,
-   0xf8, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/Demo/tix/bitmaps/combobox.xpm b/Demo/tix/bitmaps/combobox.xpm
deleted file mode 100755
index d0234ab..0000000
--- a/Demo/tix/bitmaps/combobox.xpm
+++ /dev/null
@@ -1,49 +0,0 @@
-/* XPM */
-static char * combobox_xpm[] = {
-"50 40 6 1",
-" 	s None	c None",
-".	c black",
-"X	c white",
-"o	c #FFFF80808080",
-"O	c gray70",
-"+	c #808000008080",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"   ....................................  XXXXXXX  ",
-"   .ooooooooooooooooooooooooooooooooooX  X  .  .  ",
-"   .ooooooooooooooooooooooooooooooooooX  X  .  .  ",
-"   .oooo.oooooooooooooooooooooooooooooX  X  .  .  ",
-"   .oo.o..oo.o.oo.o.ooooooooooooooooooX  X  .  .  ",
-"   .o..o.o.o.oo.oo.oo.ooooooooooooooooX  X ... .  ",
-"   .oo.oo.oo.o.oo.ooo.ooooooooooooooooX  X  .  .  ",
-"   .ooooooooooooooooooooooooooooooooooX  X     .  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  X......  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"   XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX  ",
-"   X............................................  ",
-"   X.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX.OOOOX.  ",
-"   X.O+OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX.OX OX.  ",
-"   X.O++OOO+OO+++OOOOOOOOOOOOOOOOOOOOOOOX.X ..X.  ",
-"   X.O+O+O+OOO+O+OOOOOOOOOOOOOOOOOOOOOOOX.OOOOX.  ",
-"   X.O++OOO+OO+++OOOOOOOOOOOOOOOOOOOOOOOX.OOOOX.  ",
-"   X.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX.XXXXX.  ",
-"   X.O.....X..........................OOX.X  .X.  ",
-"   X.OX...XXX.X.XX.XX.................OOX.X  .X.  ",
-"   X.OX.X..X..X.XX..XX.X..............OOX.X  .X.  ",
-"   X.O.X...X..X.X...X..X..............OOX.X  .X.  ",
-"   X.OOOOOOOOOOOOOOOOOOOOOOOO+OOOOOOOOOOX.X  .X.  ",
-"   X.OOOOOOOOO+OOO+OOOOO+OOOO+OOOOOOOOOOX.X  .X.  ",
-"   X.O+++OO+OO+O+OO++O++OO+OO+OOOOOOOOOOX.X...X.  ",
-"   X.OO+OO++OO+O+OO+OOO+OO+O++OOOOOOOOOOX.OOOOX.  ",
-"   X.OOOOOOOO+OOOOO++OO+OOOOOOOOOOOOOOOOX.OOOOX.  ",
-"   X.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX.X  .X.  ",
-"   X.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX.O .OX.  ",
-"   X.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOX.OOOOX.  ",
-"   X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXX.  ",
-"   X............................................  ",
-"                                                  ",
-"                                                  ",
-"                                                  "};
diff --git a/Demo/tix/bitmaps/combobox.xpm.1 b/Demo/tix/bitmaps/combobox.xpm.1
deleted file mode 100755
index 63792a4..0000000
--- a/Demo/tix/bitmaps/combobox.xpm.1
+++ /dev/null
@@ -1,47 +0,0 @@
-/* XPM */
-static char * combobox_xpm[] = {
-"50 40 4 1",
-" 	s None	c None",
-".	c black",
-"X	c #FFFF80808080",
-"o	c gray70",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"   ....................................  .......  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.  .  .  .  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.  .  .  .  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.  .  .  .  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.  .  .  .  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.  . ... .  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.  .  .  .  ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.  .     .  ",
-"   ....................................  .......  ",
-"                                                  ",
-"   .............................................  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .o...................................o.ooooo.  ",
-"   .o...................................o.ooooo.  ",
-"   .o...................................o.ooooo.  ",
-"   .o...................................o.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .ooooooooooooooooooooooooooooooooooooo.ooooo.  ",
-"   .............................................  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  "};
diff --git a/Demo/tix/bitmaps/drivea.xbm b/Demo/tix/bitmaps/drivea.xbm
deleted file mode 100755
index 83c636c..0000000
--- a/Demo/tix/bitmaps/drivea.xbm
+++ /dev/null
@@ -1,14 +0,0 @@
-#define drivea_width 32
-#define drivea_height 32
-static unsigned char drivea_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0xf8, 0xff, 0xff, 0x1f, 0x08, 0x00, 0x00, 0x18, 0xa8, 0xaa, 0xaa, 0x1a,
-   0x48, 0x55, 0xd5, 0x1d, 0xa8, 0xaa, 0xaa, 0x1b, 0x48, 0x55, 0x55, 0x1d,
-   0xa8, 0xfa, 0xaf, 0x1a, 0xc8, 0xff, 0xff, 0x1d, 0xa8, 0xfa, 0xaf, 0x1a,
-   0x48, 0x55, 0x55, 0x1d, 0xa8, 0xaa, 0xaa, 0x1a, 0x48, 0x55, 0x55, 0x1d,
-   0xa8, 0xaa, 0xaa, 0x1a, 0xf8, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x1f,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/Demo/tix/bitmaps/drivea.xpm b/Demo/tix/bitmaps/drivea.xpm
deleted file mode 100755
index 4d274b9..0000000
--- a/Demo/tix/bitmaps/drivea.xpm
+++ /dev/null
@@ -1,43 +0,0 @@
-/* XPM */
-static char * drivea_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"32 32 5 1",
-/* colors */
-" 	s None	c None",
-".	c #000000000000",
-"X	c white",
-"o	c #c000c000c000",
-"O	c #800080008000",
-/* pixels */
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"   ..........................   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXo.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .Xooooooooooooooooo..oooO.   ",
-"   .Xooooooooooooooooo..oooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .Xoooooooo.......oooooooO.   ",
-"   .Xoo...................oO.   ",
-"   .Xoooooooo.......oooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .oOOOOOOOOOOOOOOOOOOOOOOO.   ",
-"   ..........................   ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                "};
diff --git a/Demo/tix/bitmaps/exit.xpm b/Demo/tix/bitmaps/exit.xpm
deleted file mode 100755
index 505a07b..0000000
--- a/Demo/tix/bitmaps/exit.xpm
+++ /dev/null
@@ -1,48 +0,0 @@
-/* XPM */
-static char * exit_xpm[] = {
-"50 40 5 1",
-" 	s None	c None",
-".	c black",
-"X	c white",
-"o	c #000080800000",
-"O	c yellow",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"     .......................................      ",
-"     .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.      ",
-"     .XoooooooooooooooooooooooooooooooooooX.      ",
-"     .XoooooooooooooooooooooooooooooooooooX.      ",
-"     .XoooooooooooooooooooooooOoooooooooooX.      ",
-"     .XoooooooooooooooooooooooOOooooooooooX.      ",
-"     .XoooooooooooooooooooooooOOOoooooooooX.      ",
-"     .XoooooOOOOOOOOOOOOOOOOOOOOOOooooooooX.      ",
-"     .XoooooOOOOOOOOOOOOOOOOOOOOOOOoooooooX.      ",
-"     .XoooooOOOOOOOOOOOOOOOOOOOOOOOOooooooX.      ",
-"     .XoooooOOOOOOOOOOOOOOOOOOOOOOOOOoooooX.      ",
-"     .XoooooOOOOOOOOOOOOOOOOOOOOOOOOooooooX.      ",
-"     .XoooooOOOOOOOOOOOOOOOOOOOOOOOoooooooX.      ",
-"     .XoooooOOOOOOOOOOOOOOOOOOOOOOooooooooX.      ",
-"     .XoooooooooooooooooooooooOOOoooooooooX.      ",
-"     .XoooooooooooooooooooooooOOooooooooooX.      ",
-"     .XoooooooooooooooooooooooOoooooooooooX.      ",
-"     .XoooooooooooooooooooooooooooooooooooX.      ",
-"     .XoooooooooooooooooooooooooooooooooooX.      ",
-"     .XoooooooooooooooooooooooooooooooooooX.      ",
-"     .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.      ",
-"     .......................................      ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  "};
diff --git a/Demo/tix/bitmaps/filebox.xbm b/Demo/tix/bitmaps/filebox.xbm
deleted file mode 100755
index c8f7ac2..0000000
--- a/Demo/tix/bitmaps/filebox.xbm
+++ /dev/null
@@ -1,14 +0,0 @@
-#define filebox_width 32
-#define filebox_height 32
-static unsigned char filebox_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x3f, 0x04, 0x00, 0x00, 0x20,
-   0xe4, 0xff, 0xff, 0x27, 0x24, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x24,
-   0xe4, 0xff, 0xff, 0x27, 0x04, 0x00, 0x00, 0x20, 0xe4, 0x7f, 0xfe, 0x27,
-   0x24, 0x50, 0x02, 0x25, 0x24, 0x40, 0x02, 0x24, 0x24, 0x50, 0x02, 0x25,
-   0x24, 0x40, 0x02, 0x24, 0x24, 0x50, 0x02, 0x25, 0x24, 0x40, 0x02, 0x24,
-   0x24, 0x50, 0x02, 0x25, 0xe4, 0x7f, 0xfe, 0x27, 0x04, 0x00, 0x00, 0x20,
-   0xe4, 0xff, 0xff, 0x27, 0x24, 0x00, 0x00, 0x24, 0x24, 0x00, 0x00, 0x24,
-   0xe4, 0xff, 0xff, 0x27, 0x04, 0x00, 0x00, 0x20, 0xfc, 0xff, 0xff, 0x3f,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/Demo/tix/bitmaps/filebox.xpm b/Demo/tix/bitmaps/filebox.xpm
deleted file mode 100755
index 7377ee6..0000000
--- a/Demo/tix/bitmaps/filebox.xpm
+++ /dev/null
@@ -1,49 +0,0 @@
-/* XPM */
-static char * filebox_xpm[] = {
-"50 40 6 1",
-" 	s None	c None",
-".	c white",
-"X	c gray80",
-"o	c black",
-"O	c #FFFF80808080",
-"+	c gray70",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"   ............................................   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXooXooXoXooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXooXooXoXooXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXooooooooooooooooooooooooooooooooooooo.XXo   ",
-"   .XXoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XXo   ",
-"   .XXoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.XXo   ",
-"   .XX......................................XXo   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXoooooooooooooooo.XXXXoooooooooooooooo.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XXo+++++++++++++++.XXXXo+++++++++++++++.XXo   ",
-"   .XX.................XXXX.................XXo   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXooXooXoXooXoXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXooXooXoXooXoXooXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .XXoooooooooooooooooooooooooooooooooooooo.Xo   ",
-"   .XXoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Xo   ",
-"   .XXoOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Xo   ",
-"   .XX.......................................Xo   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXo   ",
-"   .ooooooooooooooooooooooooooooooooooooooooooo   ",
-"                                                  ",
-"                                                  ",
-"                                                  "};
diff --git a/Demo/tix/bitmaps/italic.xbm b/Demo/tix/bitmaps/italic.xbm
deleted file mode 100755
index 169c3cb..0000000
--- a/Demo/tix/bitmaps/italic.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define italic_width 16
-#define italic_height 16
-static unsigned char italic_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x80, 0x3f, 0x00, 0x06, 0x00, 0x06,
-   0x00, 0x03, 0x00, 0x03, 0x80, 0x01, 0x80, 0x01, 0xc0, 0x00, 0xc0, 0x00,
-   0x60, 0x00, 0x60, 0x00, 0xfc, 0x01, 0xfc, 0x01};
diff --git a/Demo/tix/bitmaps/justify.xbm b/Demo/tix/bitmaps/justify.xbm
deleted file mode 100755
index bba660a..0000000
--- a/Demo/tix/bitmaps/justify.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define justify_width 16
-#define justify_height 16
-static unsigned char justify_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xec, 0xdb, 0x00, 0x00, 0x7c, 0xdb,
-   0x00, 0x00, 0xbc, 0xf7, 0x00, 0x00, 0xdc, 0xde, 0x00, 0x00, 0x6c, 0xdf,
-   0x00, 0x00, 0x6c, 0xef, 0x00, 0x00, 0xdc, 0xdf};
diff --git a/Demo/tix/bitmaps/leftj.xbm b/Demo/tix/bitmaps/leftj.xbm
deleted file mode 100755
index 5f8e006..0000000
--- a/Demo/tix/bitmaps/leftj.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define leftj_width 16
-#define leftj_height 16
-static unsigned char leftj_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x6d, 0x00, 0x00, 0xdc, 0x01,
-   0x00, 0x00, 0xec, 0x0e, 0x00, 0x00, 0xfc, 0x7e, 0x00, 0x00, 0xdc, 0x03,
-   0x00, 0x00, 0x6c, 0x3b, 0x00, 0x00, 0x6c, 0x1f};
diff --git a/Demo/tix/bitmaps/netw.xbm b/Demo/tix/bitmaps/netw.xbm
deleted file mode 100755
index a684d65..0000000
--- a/Demo/tix/bitmaps/netw.xbm
+++ /dev/null
@@ -1,14 +0,0 @@
-#define netw_width 32
-#define netw_height 32
-static unsigned char netw_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x02, 0x40,
-   0x00, 0x00, 0xfa, 0x5f, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x52,
-   0x00, 0x00, 0x0a, 0x52, 0x00, 0x00, 0x8a, 0x51, 0x00, 0x00, 0x0a, 0x50,
-   0x00, 0x00, 0x4a, 0x50, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x50,
-   0x00, 0x00, 0xfa, 0x5f, 0x00, 0x00, 0x02, 0x40, 0xfe, 0x7f, 0x52, 0x55,
-   0x02, 0x40, 0xaa, 0x6a, 0xfa, 0x5f, 0xfe, 0x7f, 0x0a, 0x50, 0xfe, 0x7f,
-   0x0a, 0x52, 0x80, 0x00, 0x0a, 0x52, 0x80, 0x00, 0x8a, 0x51, 0x80, 0x00,
-   0x0a, 0x50, 0x80, 0x00, 0x4a, 0x50, 0x80, 0x00, 0x0a, 0x50, 0xe0, 0x03,
-   0x0a, 0x50, 0x20, 0x02, 0xfa, 0xdf, 0x3f, 0x03, 0x02, 0x40, 0xa0, 0x02,
-   0x52, 0x55, 0xe0, 0x03, 0xaa, 0x6a, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00,
-   0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/Demo/tix/bitmaps/netw.xpm b/Demo/tix/bitmaps/netw.xpm
deleted file mode 100755
index fff6593..0000000
--- a/Demo/tix/bitmaps/netw.xpm
+++ /dev/null
@@ -1,45 +0,0 @@
-/* XPM */
-static char * netw_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"32 32 7 1",
-/* colors */
-" 	s None	c None",
-".	c #000000000000",
-"X	c white",
-"o	c #c000c000c000",
-"O	c #404040",
-"+	c blue",
-"@	c red",
-/* pixels */
-"                                ",
-"                 .............. ",
-"                 .XXXXXXXXXXXX. ",
-"                 .XooooooooooO. ",
-"                 .Xo.......XoO. ",
-"                 .Xo.++++o+XoO. ",
-"                 .Xo.++++o+XoO. ",
-"                 .Xo.++oo++XoO. ",
-"                 .Xo.++++++XoO. ",
-"                 .Xo.+o++++XoO. ",
-"                 .Xo.++++++XoO. ",
-"                 .Xo.XXXXXXXoO. ",
-"                 .XooooooooooO. ",
-"                 .Xo@ooo....oO. ",
-" ..............  .XooooooooooO. ",
-" .XXXXXXXXXXXX.  .XooooooooooO. ",
-" .XooooooooooO.  .OOOOOOOOOOOO. ",
-" .Xo.......XoO.  .............. ",
-" .Xo.++++o+XoO.        @        ",
-" .Xo.++++o+XoO.        @        ",
-" .Xo.++oo++XoO.        @        ",
-" .Xo.++++++XoO.        @        ",
-" .Xo.+o++++XoO.        @        ",
-" .Xo.++++++XoO.      .....      ",
-" .Xo.XXXXXXXoO.      .XXX.      ",
-" .XooooooooooO.@@@@@@.X O.      ",
-" .Xo@ooo....oO.      .OOO.      ",
-" .XooooooooooO.      .....      ",
-" .XooooooooooO.                 ",
-" .OOOOOOOOOOOO.                 ",
-" ..............                 ",
-"                                "};
diff --git a/Demo/tix/bitmaps/optmenu.xpm b/Demo/tix/bitmaps/optmenu.xpm
deleted file mode 100755
index 63bab81..0000000
--- a/Demo/tix/bitmaps/optmenu.xpm
+++ /dev/null
@@ -1,48 +0,0 @@
-/* XPM */
-static char * optmenu_xpm[] = {
-"50 40 5 1",
-" 	s None	c None",
-".	c white",
-"X	c gray80",
-"o	c gray50",
-"O	c black",
-"                                                  ",
-"                                                  ",
-"   ..............................                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXOXOXXOXXOXXXXOOXXXXXXXXXXo                 ",
-"   .XXXOXOXXOXOXXXOXXOXXXXXXXXXXo                 ",
-"   .XXXXOXXOXXOXXXOXXXOXXXXXXXXXo                 ",
-"   .XXXXOXXXOXXOOXXOXOXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo.............o   ",
-"   .............................o             o   ",
-"   ..XXXOXXXXXOXXXXXXXXOXXXXXXXOo             o   ",
-"   ..XXOXOXOXXOXOXXXOXXOXXXXXXXOo     ......  o   ",
-"   ..XXXOXXXOXXOXXXOXXXOXXXXXXXOo     .    o  o   ",
-"   ..XXOXXXOXXXOXOXXOXXOXXXXXXXOo     .    o  o   ",
-"   ..XXXXXXXXXXXXXXXXXXXXXXXXXXOo     .ooooo  o   ",
-"   .OOOOOOOOOOOOOOOOOOOOOOOOOOOOo             o   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo             o   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXooooooooooooooo   ",
-"   .XXXXOXXXXXOXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXOXXXXXXXXXOXXXXXXXXXXXXXXo                 ",
-"   .XXXXOXXOXXOXOXOXXXXXXXXXXXXXo                 ",
-"   .XXXXXOXXOXOXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXOXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXOXOXXXXXXXOXOXXXXXOXXXXXXo                 ",
-"   .XXXXXOXOXOXXOXXXXXOXXOXXXXXXo                 ",
-"   .XXXXOXXOXOXOXXXOXOXOXXOXXXXXo                 ",
-"   .XXXOXXXXOXXOXXXOXXOXXXXOXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXXXXXXo                 ",
-"   oooooooooooooooooooooooooooooo                 ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  "};
diff --git a/Demo/tix/bitmaps/rightj.xbm b/Demo/tix/bitmaps/rightj.xbm
deleted file mode 100755
index 1d438e0..0000000
--- a/Demo/tix/bitmaps/rightj.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define rightj_width 16
-#define rightj_height 16
-static unsigned char rightj_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xdb, 0x00, 0x00, 0x70, 0xdb,
-   0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0xd8, 0xde, 0x00, 0x00, 0xc0, 0xdd,
-   0x00, 0x00, 0xa0, 0xef, 0x00, 0x00, 0xd8, 0xde};
diff --git a/Demo/tix/bitmaps/select.xpm b/Demo/tix/bitmaps/select.xpm
deleted file mode 100755
index 392e5a0..0000000
--- a/Demo/tix/bitmaps/select.xpm
+++ /dev/null
@@ -1,52 +0,0 @@
-/* XPM */
-static char * select_xpm[] = {
-"50 40 9 1",
-" 	s None	c None",
-".	c black",
-"X	c gray95",
-"o	c gray50",
-"O	c gray70",
-"+	c navy",
-"@	c #000080800000",
-"#	c #808000000000",
-"$	c white",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"  ..............................................  ",
-"  .XXXXXXXXXXooooooooooooXXXXXXXXXXXoXXXXXXXXXX.  ",
-"  .X         ooOOOOOOOOOOXX         oX        o.  ",
-"  .X         ooOOOOOOOOOOXX         oX        o.  ",
-"  .X   ++++  ooOOOOOOOOOOXX  ...    oX  @     o.  ",
-"  .X  +++++  ooOOOOOOOOOOXX .   .   oX  @@@   o.  ",
-"  .X +++   + ooOOOOOOOOOOXX .    .  oX @  @   o.  ",
-"  .X +     + ooOO#####OOOXX .    .  oX @  @   o.  ",
-"  .X +     + ooOO#OOO##OOXX .       oX @   @  o.  ",
-"  .X +     + ooO##OOOO##OXX .       oX @    @ o.  ",
-"  .X ++   ++ ooO###OOO#OOXX .       oX @    @ o.  ",
-"  .X +++++++ ooO#######OOXX .       oX @    @ o.  ",
-"  .X +     + ooO##O#OO#OOXX .       oX @    @ o.  ",
-"  .X +    ++ ooO##OOOOO#OXX .    .  oX @    @ o.  ",
-"  .X +     + ooOO#OOOOO#OXX .    .  oX @   @@ o.  ",
-"  .X +    ++ ooOO#OOOOO#OXX  ....   oX @@@@@  o.  ",
-"  .X         ooOO######OOXX         oX        o.  ",
-"  .X         ooOOOOOOOOOOXX        $oX        o.  ",
-"  .XoooooooooooXXXXXXXXXXXoooooooooooXooooooooo.  ",
-"  ..............................................  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  ",
-"                                                  "};
diff --git a/Demo/tix/bitmaps/tix.gif b/Demo/tix/bitmaps/tix.gif
deleted file mode 100755
index e7d51a0..0000000
--- a/Demo/tix/bitmaps/tix.gif
+++ /dev/null
Binary files differ
diff --git a/Demo/tix/bitmaps/underline.xbm b/Demo/tix/bitmaps/underline.xbm
deleted file mode 100755
index f07bb46..0000000
--- a/Demo/tix/bitmaps/underline.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define underline_width 16
-#define underline_height 16
-static unsigned char underline_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1c, 0x38, 0x1c,
-   0x30, 0x0c, 0x30, 0x0c, 0x30, 0x0c, 0x30, 0x0c, 0x30, 0x0c, 0x70, 0x0e,
-   0xf0, 0x0f, 0xe0, 0x07, 0x00, 0x00, 0xf8, 0x1f};
diff --git a/Demo/tix/grid.py b/Demo/tix/grid.py
deleted file mode 100644
index 4268f07..0000000
--- a/Demo/tix/grid.py
+++ /dev/null
@@ -1,28 +0,0 @@
-###
-import tkinter.tix as tk
-from pprint import pprint
-
-r= tk.Tk()
-r.title("test")
-
-l=tk.Label(r, name="a_label")
-l.pack()
-
-class MyGrid(tk.Grid):
-    def __init__(self, *args, **kwargs):
-        kwargs['editnotify']= self.editnotify
-        tk.Grid.__init__(self, *args, **kwargs)
-    def editnotify(self, x, y):
-        return True
-
-g = MyGrid(r, name="a_grid",
-selectunit="cell")
-g.pack(fill=tk.BOTH)
-for x in range(5):
-    for y in range(5):
-        g.set(x,y,text=str((x,y)))
-
-c = tk.Button(r, text="Close", command=r.destroy)
-c.pack()
-
-tk.mainloop()
diff --git a/Demo/tix/samples/Balloon.py b/Demo/tix/samples/Balloon.py
deleted file mode 100644
index bc25a2e..0000000
--- a/Demo/tix/samples/Balloon.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the tixBalloon widget, which provides
-# a interesting way to give help tips about elements in your user interface.
-# Your can display the help message in a "balloon" and a status bar widget.
-#
-
-import tkinter.tix
-
-TCL_ALL_EVENTS          = 0
-
-def RunSample (root):
-    balloon = DemoBalloon(root)
-    balloon.mainloop()
-    balloon.destroy()
-
-class DemoBalloon:
-    def __init__(self, w):
-        self.root = w
-        self.exit = -1
-
-        z = w.winfo_toplevel()
-        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
-
-        status = tkinter.tix.Label(w, width=40, relief=tkinter.tix.SUNKEN, bd=1)
-        status.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.Y, padx=2, pady=1)
-
-        # Create two mysterious widgets that need balloon help
-        button1 = tkinter.tix.Button(w, text='Something Unexpected',
-                             command=self.quitcmd)
-        button2 = tkinter.tix.Button(w, text='Something Else Unexpected')
-        button2['command'] = lambda w=button2: w.destroy()
-        button1.pack(side=tkinter.tix.TOP, expand=1)
-        button2.pack(side=tkinter.tix.TOP, expand=1)
-
-        # Create the balloon widget and associate it with the widgets that we want
-        # to provide tips for:
-        b = tkinter.tix.Balloon(w, statusbar=status)
-
-        b.bind_widget(button1, balloonmsg='Close Window',
-                      statusmsg='Press this button to close this window')
-        b.bind_widget(button2, balloonmsg='Self-destruct button',
-                      statusmsg='Press this button and it will destroy itself')
-
-    def quitcmd (self):
-        self.exit = 0
-
-    def mainloop(self):
-        foundEvent = 1
-        while self.exit < 0 and foundEvent > 0:
-            foundEvent = self.root.tk.dooneevent(TCL_ALL_EVENTS)
-
-    def destroy (self):
-        self.root.destroy()
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
diff --git a/Demo/tix/samples/BtnBox.py b/Demo/tix/samples/BtnBox.py
deleted file mode 100644
index 3b9ee4b..0000000
--- a/Demo/tix/samples/BtnBox.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the tixButtonBox widget, which is a
-# group of TK buttons. You can use it to manage the buttons in a dialog box,
-# for example.
-#
-
-import tkinter.tix
-
-def RunSample(w):
-    # Create the label on the top of the dialog box
-    #
-    top = tkinter.tix.Label(w, padx=20, pady=10, bd=1, relief=tkinter.tix.RAISED,
-                    anchor=tkinter.tix.CENTER, text='This dialog box is\n a demonstration of the\n tixButtonBox widget')
-
-    # Create the button box and add a few buttons in it. Set the
-    # -width of all the buttons to the same value so that they
-    # appear in the same size.
-    #
-    # Note that the -text, -underline, -command and -width options are all
-    # standard options of the button widgets.
-    #
-    box = tkinter.tix.ButtonBox(w, orientation=tkinter.tix.HORIZONTAL)
-    box.add('ok', text='OK', underline=0, width=5,
-            command=lambda w=w: w.destroy())
-    box.add('close', text='Cancel', underline=0, width=5,
-            command=lambda w=w: w.destroy())
-    box.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-    top.pack(side=tkinter.tix.TOP, fill=tkinter.tix.BOTH, expand=1)
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
-    root.mainloop()
diff --git a/Demo/tix/samples/CmpImg.py b/Demo/tix/samples/CmpImg.py
deleted file mode 100644
index ad49181..0000000
--- a/Demo/tix/samples/CmpImg.py
+++ /dev/null
@@ -1,196 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the compound images: it uses compound
-# images to display a text string together with a pixmap inside
-# buttons
-#
-
-import tkinter.tix
-
-network_pixmap = """/* XPM */
-static char * netw_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"32 32 7 1",
-/* colors */
-"       s None  c None",
-".      c #000000000000",
-"X      c white",
-"o      c #c000c000c000",
-"O      c #404040",
-"+      c blue",
-"@      c red",
-/* pixels */
-"                                ",
-"                 .............. ",
-"                 .XXXXXXXXXXXX. ",
-"                 .XooooooooooO. ",
-"                 .Xo.......XoO. ",
-"                 .Xo.++++o+XoO. ",
-"                 .Xo.++++o+XoO. ",
-"                 .Xo.++oo++XoO. ",
-"                 .Xo.++++++XoO. ",
-"                 .Xo.+o++++XoO. ",
-"                 .Xo.++++++XoO. ",
-"                 .Xo.XXXXXXXoO. ",
-"                 .XooooooooooO. ",
-"                 .Xo@ooo....oO. ",
-" ..............  .XooooooooooO. ",
-" .XXXXXXXXXXXX.  .XooooooooooO. ",
-" .XooooooooooO.  .OOOOOOOOOOOO. ",
-" .Xo.......XoO.  .............. ",
-" .Xo.++++o+XoO.        @        ",
-" .Xo.++++o+XoO.        @        ",
-" .Xo.++oo++XoO.        @        ",
-" .Xo.++++++XoO.        @        ",
-" .Xo.+o++++XoO.        @        ",
-" .Xo.++++++XoO.      .....      ",
-" .Xo.XXXXXXXoO.      .XXX.      ",
-" .XooooooooooO.@@@@@@.X O.      ",
-" .Xo@ooo....oO.      .OOO.      ",
-" .XooooooooooO.      .....      ",
-" .XooooooooooO.                 ",
-" .OOOOOOOOOOOO.                 ",
-" ..............                 ",
-"                                "};
-"""
-
-hard_disk_pixmap = """/* XPM */
-static char * drivea_xpm[] = {
-/* width height ncolors chars_per_pixel */
-"32 32 5 1",
-/* colors */
-"       s None  c None",
-".      c #000000000000",
-"X      c white",
-"o      c #c000c000c000",
-"O      c #800080008000",
-/* pixels */
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"   ..........................   ",
-"   .XXXXXXXXXXXXXXXXXXXXXXXo.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .Xooooooooooooooooo..oooO.   ",
-"   .Xooooooooooooooooo..oooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .Xoooooooo.......oooooooO.   ",
-"   .Xoo...................oO.   ",
-"   .Xoooooooo.......oooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .XooooooooooooooooooooooO.   ",
-"   .oOOOOOOOOOOOOOOOOOOOOOOO.   ",
-"   ..........................   ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                ",
-"                                "};
-"""
-
-network_bitmap = """
-#define netw_width 32
-#define netw_height 32
-static unsigned char netw_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x02, 0x40,
-   0x00, 0x00, 0xfa, 0x5f, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x52,
-   0x00, 0x00, 0x0a, 0x52, 0x00, 0x00, 0x8a, 0x51, 0x00, 0x00, 0x0a, 0x50,
-   0x00, 0x00, 0x4a, 0x50, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x50,
-   0x00, 0x00, 0xfa, 0x5f, 0x00, 0x00, 0x02, 0x40, 0xfe, 0x7f, 0x52, 0x55,
-   0x02, 0x40, 0xaa, 0x6a, 0xfa, 0x5f, 0xfe, 0x7f, 0x0a, 0x50, 0xfe, 0x7f,
-   0x0a, 0x52, 0x80, 0x00, 0x0a, 0x52, 0x80, 0x00, 0x8a, 0x51, 0x80, 0x00,
-   0x0a, 0x50, 0x80, 0x00, 0x4a, 0x50, 0x80, 0x00, 0x0a, 0x50, 0xe0, 0x03,
-   0x0a, 0x50, 0x20, 0x02, 0xfa, 0xdf, 0x3f, 0x03, 0x02, 0x40, 0xa0, 0x02,
-   0x52, 0x55, 0xe0, 0x03, 0xaa, 0x6a, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00,
-   0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-"""
-
-hard_disk_bitmap = """
-#define drivea_width 32
-#define drivea_height 32
-static unsigned char drivea_bits[] = {
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0xf8, 0xff, 0xff, 0x1f, 0x08, 0x00, 0x00, 0x18, 0xa8, 0xaa, 0xaa, 0x1a,
-   0x48, 0x55, 0xd5, 0x1d, 0xa8, 0xaa, 0xaa, 0x1b, 0x48, 0x55, 0x55, 0x1d,
-   0xa8, 0xfa, 0xaf, 0x1a, 0xc8, 0xff, 0xff, 0x1d, 0xa8, 0xfa, 0xaf, 0x1a,
-   0x48, 0x55, 0x55, 0x1d, 0xa8, 0xaa, 0xaa, 0x1a, 0x48, 0x55, 0x55, 0x1d,
-   0xa8, 0xaa, 0xaa, 0x1a, 0xf8, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x1f,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-"""
-
-def RunSample(w):
-    w.img0 = tkinter.tix.Image('pixmap', data=network_pixmap)
-    if not w.img0:
-        w.img0 = tkinter.tix.Image('bitmap', data=network_bitmap)
-    w.img1 = tkinter.tix.Image('pixmap', data=hard_disk_pixmap)
-    if not w.img0:
-        w.img1 = tkinter.tix.Image('bitmap', data=hard_disk_bitmap)
-
-    hdd = tkinter.tix.Button(w, padx=4, pady=1, width=120)
-    net = tkinter.tix.Button(w, padx=4, pady=1, width=120)
-
-    # Create the first image: we create a line, then put a string,
-    # a space and a image into this line, from left to right.
-    # The result: we have a one-line image that consists of three
-    # individual items
-    #
-    # The tk.calls should be methods in Tix ...
-    w.hdd_img = tkinter.tix.Image('compound', window=hdd)
-    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'line')
-    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'text', '-text', 'Hard Disk',
-                    '-underline', '0')
-    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'space', '-width', '7')
-    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'image', '-image', w.img1)
-
-    # Put this image into the first button
-    #
-    hdd['image'] = w.hdd_img
-
-    # Next button
-    w.net_img = tkinter.tix.Image('compound', window=net)
-    w.net_img.tk.call(str(w.net_img), 'add', 'line')
-    w.net_img.tk.call(str(w.net_img), 'add', 'text', '-text', 'Network',
-                    '-underline', '0')
-    w.net_img.tk.call(str(w.net_img), 'add', 'space', '-width', '7')
-    w.net_img.tk.call(str(w.net_img), 'add', 'image', '-image', w.img0)
-
-    # Put this image into the first button
-    #
-    net['image'] = w.net_img
-
-    close = tkinter.tix.Button(w, pady=1, text='Close',
-                       command=lambda w=w: w.destroy())
-
-    hdd.pack(side=tkinter.tix.LEFT, padx=10, pady=10, fill=tkinter.tix.Y, expand=1)
-    net.pack(side=tkinter.tix.LEFT, padx=10, pady=10, fill=tkinter.tix.Y, expand=1)
-    close.pack(side=tkinter.tix.LEFT, padx=10, pady=10, fill=tkinter.tix.Y, expand=1)
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
-    root.mainloop()
diff --git a/Demo/tix/samples/ComboBox.py b/Demo/tix/samples/ComboBox.py
deleted file mode 100644
index 80d78f2..0000000
--- a/Demo/tix/samples/ComboBox.py
+++ /dev/null
@@ -1,102 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the tixComboBox widget, which is close
-# to the MS Window Combo Box control.
-#
-import tkinter.tix
-
-def RunSample(w):
-    global demo_month, demo_year
-
-    top = tkinter.tix.Frame(w, bd=1, relief=tkinter.tix.RAISED)
-
-    demo_month = tkinter.tix.StringVar()
-    demo_year = tkinter.tix.StringVar()
-
-    # $w.top.a is a drop-down combo box. It is not editable -- who wants
-    # to invent new months?
-    #
-    # [Hint] The -options switch sets the options of the subwidgets.
-    # [Hint] We set the label.width subwidget option of both comboboxes to
-    #        be 10 so that their labels appear to be aligned.
-    #
-    a = tkinter.tix.ComboBox(top, label="Month: ", dropdown=1,
-        command=select_month, editable=0, variable=demo_month,
-        options='listbox.height 6 label.width 10 label.anchor e')
-
-    # $w.top.b is a non-drop-down combo box. It is not editable: we provide
-    # four choices for the user, but he can enter an alternative year if he
-    # wants to.
-    #
-    # [Hint] Use the padY and anchor options of the label subwidget to
-    #        align the label with the entry subwidget.
-    # [Hint] Notice that you should use padY (the NAME of the option) and not
-    #        pady (the SWITCH of the option).
-    #
-    b = tkinter.tix.ComboBox(top, label="Year: ", dropdown=0,
-        command=select_year, editable=1, variable=demo_year,
-        options='listbox.height 4 label.padY 5 label.width 10 label.anchor ne')
-
-    a.pack(side=tkinter.tix.TOP, anchor=tkinter.tix.W)
-    b.pack(side=tkinter.tix.TOP, anchor=tkinter.tix.W)
-
-    a.insert(tkinter.tix.END, 'January')
-    a.insert(tkinter.tix.END, 'February')
-    a.insert(tkinter.tix.END, 'March')
-    a.insert(tkinter.tix.END, 'April')
-    a.insert(tkinter.tix.END, 'May')
-    a.insert(tkinter.tix.END, 'June')
-    a.insert(tkinter.tix.END, 'July')
-    a.insert(tkinter.tix.END, 'August')
-    a.insert(tkinter.tix.END, 'September')
-    a.insert(tkinter.tix.END, 'October')
-    a.insert(tkinter.tix.END, 'November')
-    a.insert(tkinter.tix.END, 'December')
-
-    b.insert(tkinter.tix.END, '1992')
-    b.insert(tkinter.tix.END, '1993')
-    b.insert(tkinter.tix.END, '1994')
-    b.insert(tkinter.tix.END, '1995')
-    b.insert(tkinter.tix.END, '1996')
-
-    # Use "tixSetSilent" to set the values of the combo box if you
-    # don't want your -command procedures (cbx:select_month and
-    # cbx:select_year) to be called.
-    #
-    a.set_silent('January')
-    b.set_silent('1995')
-
-    box = tkinter.tix.ButtonBox(w, orientation=tkinter.tix.HORIZONTAL)
-    box.add('ok', text='Ok', underline=0, width=6,
-            command=lambda w=w: ok_command(w))
-    box.add('cancel', text='Cancel', underline=0, width=6,
-            command=lambda w=w: w.destroy())
-    box.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-    top.pack(side=tkinter.tix.TOP, fill=tkinter.tix.BOTH, expand=1)
-
-def select_month(event=None):
-    # tixDemo:Status "Month = %s" % demo_month.get()
-    pass
-
-def select_year(event=None):
-    # tixDemo:Status "Year = %s" % demo_year.get()
-    pass
-
-def ok_command(w):
-    # tixDemo:Status "Month = %s, Year= %s" % (demo_month.get(), demo_year.get())
-    w.destroy()
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
-    root.mainloop()
diff --git a/Demo/tix/samples/Control.py b/Demo/tix/samples/Control.py
deleted file mode 100644
index fbc5e64..0000000
--- a/Demo/tix/samples/Control.py
+++ /dev/null
@@ -1,122 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the tixControl widget -- it is an
-# entry widget with up/down arrow buttons. You can use the arrow buttons
-# to adjust the value inside the entry widget.
-#
-# This example program uses three Control widgets. One lets you select
-# integer values; one lets you select floating point values and the last
-# one lets you select a few names.
-
-import tkinter.tix
-
-TCL_ALL_EVENTS          = 0
-
-def RunSample (root):
-    control = DemoControl(root)
-    control.mainloop()
-    control.destroy()
-
-class DemoControl:
-    def __init__(self, w):
-        self.root = w
-        self.exit = -1
-
-        global demo_maker, demo_thrust, demo_num_engines
-
-        demo_maker = tkinter.tix.StringVar()
-        demo_thrust = tkinter.tix.DoubleVar()
-        demo_num_engines = tkinter.tix.IntVar()
-        demo_maker.set('P&W')
-        demo_thrust.set(20000.0)
-        demo_num_engines.set(2)
-
-        top = tkinter.tix.Frame(w, bd=1, relief=tkinter.tix.RAISED)
-
-        # $w.top.a allows only integer values
-        #
-        # [Hint] The -options switch sets the options of the subwidgets.
-        # [Hint] We set the label.width subwidget option of the Controls to
-        #        be 16 so that their labels appear to be aligned.
-        #
-        a = tkinter.tix.Control(top, label='Number of Engines: ', integer=1,
-                        variable=demo_num_engines, min=1, max=4,
-                        options='entry.width 10 label.width 20 label.anchor e')
-
-        b = tkinter.tix.Control(top, label='Thrust: ', integer=0,
-                        min='10000.0', max='60000.0', step=500,
-                        variable=demo_thrust,
-                        options='entry.width 10 label.width 20 label.anchor e')
-
-        c = tkinter.tix.Control(top, label='Engine Maker: ', value='P&W',
-                        variable=demo_maker,
-                        options='entry.width 10 label.width 20 label.anchor e')
-
-        # We can't define these in the init because the widget 'c' doesn't
-        # exist yet and we need to reference it
-        c['incrcmd'] = lambda w=c: adjust_maker(w, 1)
-        c['decrcmd'] = lambda w=c: adjust_maker(w, -1)
-        c['validatecmd'] = lambda w=c: validate_maker(w)
-
-        a.pack(side=tkinter.tix.TOP, anchor=tkinter.tix.W)
-        b.pack(side=tkinter.tix.TOP, anchor=tkinter.tix.W)
-        c.pack(side=tkinter.tix.TOP, anchor=tkinter.tix.W)
-
-        box = tkinter.tix.ButtonBox(w, orientation=tkinter.tix.HORIZONTAL)
-        box.add('ok', text='Ok', underline=0, width=6,
-                command=self.okcmd)
-        box.add('cancel', text='Cancel', underline=0, width=6,
-                command=self.quitcmd)
-        box.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-        top.pack(side=tkinter.tix.TOP, fill=tkinter.tix.BOTH, expand=1)
-
-    def okcmd (self):
-        # tixDemo:Status "Selected %d of %s engines each of thrust %d", (demo_num_engines.get(), demo_maker.get(), demo_thrust.get())
-        self.quitcmd()
-
-    def quitcmd (self):
-        self.exit = 0
-
-    def mainloop(self):
-        while self.exit < 0:
-            self.root.tk.dooneevent(TCL_ALL_EVENTS)
-
-    def destroy (self):
-        self.root.destroy()
-
-maker_list = ['P&W', 'GE', 'Rolls Royce']
-
-def adjust_maker(w, inc):
-    i = maker_list.index(demo_maker.get())
-    i = i + inc
-    if i >= len(maker_list):
-        i = 0
-    elif i < 0:
-        i = len(maker_list) - 1
-
-    # In Tcl/Tix we should return the string maker_list[i]. We can't
-    # do that in Tkinter so we set the global variable. (This works).
-    demo_maker.set(maker_list[i])
-
-def validate_maker(w):
-    try:
-        i = maker_list.index(demo_maker.get())
-    except ValueError:
-        # Works here though. Why ? Beats me.
-        return maker_list[0]
-    # Works here though. Why ? Beats me.
-    return maker_list[i]
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
diff --git a/Demo/tix/samples/DirList.py b/Demo/tix/samples/DirList.py
deleted file mode 100644
index 6d28ca3..0000000
--- a/Demo/tix/samples/DirList.py
+++ /dev/null
@@ -1,131 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-#       $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py":  it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program using tixwish.
-
-# This file demonstrates the use of the tixDirList widget -- you can
-# use it for the user to select a directory. For example, an installation
-# program can use the tixDirList widget to ask the user to select the
-# installation directory for an application.
-#
-
-import tkinter.tix, os, copy
-from tkinter.constants import *
-
-TCL_ALL_EVENTS          = 0
-
-def RunSample (root):
-    dirlist = DemoDirList(root)
-    dirlist.mainloop()
-    dirlist.destroy()
-
-class DemoDirList:
-    def __init__(self, w):
-        self.root = w
-        self.exit = -1
-
-        z = w.winfo_toplevel()
-        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
-
-        # Create the tixDirList and the tixLabelEntry widgets on the on the top
-        # of the dialog box
-
-        # bg = root.tk.eval('tix option get bg')
-        # adding bg=bg crashes Windows pythonw tk8.3.3 Python 2.1.0
-
-        top = tkinter.tix.Frame( w, relief=RAISED, bd=1)
-
-        # Create the DirList widget. By default it will show the current
-        # directory
-        #
-        #
-        top.dir = tkinter.tix.DirList(top)
-        top.dir.hlist['width'] = 40
-
-        # When the user presses the ".." button, the selected directory
-        # is "transferred" into the entry widget
-        #
-        top.btn = tkinter.tix.Button(top, text = "  >>  ", pady = 0)
-
-        # We use a LabelEntry to hold the installation directory. The user
-        # can choose from the DirList widget, or he can type in the directory
-        # manually
-        #
-        top.ent = tkinter.tix.LabelEntry(top, label="Installation Directory:",
-                                  labelside = 'top',
-                                  options = '''
-                                  entry.width 40
-                                  label.anchor w
-                                  ''')
-
-        font = self.root.tk.eval('tix option get fixed_font')
-        # font = self.root.master.tix_option_get('fixed_font')
-        top.ent.entry['font'] = font
-
-        self.dlist_dir = copy.copy(os.curdir)
-        # This should work setting the entry's textvariable
-        top.ent.entry['textvariable'] = self.dlist_dir
-        top.btn['command'] = lambda dir=top.dir, ent=top.ent, self=self: \
-                             self.copy_name(dir,ent)
-
-        # top.ent.entry.insert(0,'tix'+repr(self))
-        top.ent.entry.bind('<Return>', lambda self=self: self.okcmd () )
-
-        top.pack( expand='yes', fill='both', side=TOP)
-        top.dir.pack( expand=1, fill=BOTH, padx=4, pady=4, side=LEFT)
-        top.btn.pack( anchor='s', padx=4, pady=4, side=LEFT)
-        top.ent.pack( expand=1, fill=X, anchor='s', padx=4, pady=4, side=LEFT)
-
-        # Use a ButtonBox to hold the buttons.
-        #
-        box = tkinter.tix.ButtonBox (w, orientation='horizontal')
-        box.add ('ok', text='Ok', underline=0, width=6,
-                     command = lambda self=self: self.okcmd () )
-        box.add ('cancel', text='Cancel', underline=0, width=6,
-                     command = lambda self=self: self.quitcmd () )
-
-        box.pack( anchor='s', fill='x', side=BOTTOM)
-
-    def copy_name (self, dir, ent):
-        # This should work as it is the entry's textvariable
-        self.dlist_dir = dir.cget('value')
-        # but it isn't so I'll do it manually
-        ent.entry.delete(0,'end')
-        ent.entry.insert(0, self.dlist_dir)
-
-    def okcmd (self):
-        # tixDemo:Status "You have selected the directory" + self.dlist_dir
-        self.quitcmd()
-
-    def quitcmd (self):
-        self.exit = 0
-
-    def mainloop(self):
-        while self.exit < 0:
-            self.root.tk.dooneevent(TCL_ALL_EVENTS)
-
-    def destroy (self):
-        self.root.destroy()
-
-# This "if" statement makes it possible to run this script file inside or
-# outside of the main demo program "tixwidgets.py".
-#
-if __name__== '__main__' :
-    import tkinter.messagebox, traceback
-
-    try:
-        root=tkinter.tix.Tk()
-        RunSample(root)
-    except:
-        t, v, tb = sys.exc_info()
-        text = "Error running the demo script:\n"
-        for line in traceback.format_exception(t,v,tb):
-            text = text + line + '\n'
-            d = tkinter.messagebox.showerror ( 'Tix Demo Error', text)
diff --git a/Demo/tix/samples/DirTree.py b/Demo/tix/samples/DirTree.py
deleted file mode 100644
index 5411ded..0000000
--- a/Demo/tix/samples/DirTree.py
+++ /dev/null
@@ -1,117 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-#       $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py":  it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program using tixwish.
-
-# This file demonstrates the use of the tixDirTree widget -- you can
-# use it for the user to select a directory. For example, an installation
-# program can use the tixDirTree widget to ask the user to select the
-# installation directory for an application.
-#
-
-import tkinter.tix, os, copy
-from tkinter.constants import *
-
-TCL_ALL_EVENTS          = 0
-
-def RunSample (root):
-    dirtree = DemoDirTree(root)
-    dirtree.mainloop()
-    dirtree.destroy()
-
-class DemoDirTree:
-    def __init__(self, w):
-        self.root = w
-        self.exit = -1
-
-        z = w.winfo_toplevel()
-        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
-
-        # Create the tixDirTree and the tixLabelEntry widgets on the on the top
-        # of the dialog box
-
-        # bg = root.tk.eval('tix option get bg')
-        # adding bg=bg crashes Windows pythonw tk8.3.3 Python 2.1.0
-
-        top = tkinter.tix.Frame( w, relief=RAISED, bd=1)
-
-        # Create the DirTree widget. By default it will show the current
-        # directory
-        #
-        #
-        top.dir = tkinter.tix.DirTree(top)
-        top.dir.hlist['width'] = 40
-
-        # When the user presses the ".." button, the selected directory
-        # is "transferred" into the entry widget
-        #
-        top.btn = tkinter.tix.Button(top, text = "  >>  ", pady = 0)
-
-        # We use a LabelEntry to hold the installation directory. The user
-        # can choose from the DirTree widget, or he can type in the directory
-        # manually
-        #
-        top.ent = tkinter.tix.LabelEntry(top, label="Installation Directory:",
-                                  labelside = 'top',
-                                  options = '''
-                                  entry.width 40
-                                  label.anchor w
-                                  ''')
-
-        self.dlist_dir = copy.copy(os.curdir)
-        top.ent.entry['textvariable'] = self.dlist_dir
-        top.btn['command'] = lambda dir=top.dir, ent=top.ent, self=self: \
-                             self.copy_name(dir,ent)
-
-        top.ent.entry.bind('<Return>', lambda self=self: self.okcmd () )
-
-        top.pack( expand='yes', fill='both', side=TOP)
-        top.dir.pack( expand=1, fill=BOTH, padx=4, pady=4, side=LEFT)
-        top.btn.pack( anchor='s', padx=4, pady=4, side=LEFT)
-        top.ent.pack( expand=1, fill=X, anchor='s', padx=4, pady=4, side=LEFT)
-
-        # Use a ButtonBox to hold the buttons.
-        #
-        box = tkinter.tix.ButtonBox (w, orientation='horizontal')
-        box.add ('ok', text='Ok', underline=0, width=6,
-                     command = lambda self=self: self.okcmd () )
-        box.add ('cancel', text='Cancel', underline=0, width=6,
-                     command = lambda self=self: self.quitcmd () )
-
-        box.pack( anchor='s', fill='x', side=BOTTOM)
-
-    def copy_name (self, dir, ent):
-        # This should work as it is the entry's textvariable
-        self.dlist_dir = dir.cget('value')
-        # but it isn't so I'll do it manually
-        ent.entry.delete(0,'end')
-        ent.entry.insert(0, self.dlist_dir)
-
-    def okcmd (self):
-        # tixDemo:Status "You have selected the directory" + self.dlist_dir
-        self.quitcmd()
-
-    def quitcmd (self):
-        # tixDemo:Status "You have selected the directory" + self.dlist_dir
-        self.exit = 0
-
-    def mainloop(self):
-        while self.exit < 0:
-            self.root.tk.dooneevent(TCL_ALL_EVENTS)
-
-    def destroy (self):
-        self.root.destroy()
-
-# This "if" statement makes it possible to run this script file inside or
-# outside of the main demo program "tixwidgets.py".
-#
-if __name__== '__main__' :
-    root=tkinter.tix.Tk()
-    RunSample(root)
diff --git a/Demo/tix/samples/NoteBook.py b/Demo/tix/samples/NoteBook.py
deleted file mode 100644
index d8b5fa8..0000000
--- a/Demo/tix/samples/NoteBook.py
+++ /dev/null
@@ -1,119 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the tixNoteBook widget, which allows
-# you to lay out your interface using a "notebook" metaphore
-#
-import tkinter.tix
-
-def RunSample(w):
-    global root
-    root = w
-
-    # We use these options to set the sizes of the subwidgets inside the
-    # notebook, so that they are well-aligned on the screen.
-    prefix = tkinter.tix.OptionName(w)
-    if prefix:
-        prefix = '*'+prefix
-    else:
-        prefix = ''
-    w.option_add(prefix+'*TixControl*entry.width', 10)
-    w.option_add(prefix+'*TixControl*label.width', 18)
-    w.option_add(prefix+'*TixControl*label.anchor', tkinter.tix.E)
-    w.option_add(prefix+'*TixNoteBook*tagPadX', 8)
-
-    # Create the notebook widget and set its backpagecolor to gray.
-    # Note that the -backpagecolor option belongs to the "nbframe"
-    # subwidget.
-    nb = tkinter.tix.NoteBook(w, name='nb', ipadx=6, ipady=6)
-    nb['bg'] = 'gray'
-    nb.nbframe['backpagecolor'] = 'gray'
-
-    # Create the two tabs on the notebook. The -underline option
-    # puts a underline on the first character of the labels of the tabs.
-    # Keyboard accelerators will be defined automatically according
-    # to the underlined character.
-    nb.add('hard_disk', label="Hard Disk", underline=0)
-    nb.add('network', label="Network", underline=0)
-
-    nb.pack(expand=1, fill=tkinter.tix.BOTH, padx=5, pady=5 ,side=tkinter.tix.TOP)
-
-    #----------------------------------------
-    # Create the first page
-    #----------------------------------------
-    # Create two frames: one for the common buttons, one for the
-    # other widgets
-    #
-    tab=nb.hard_disk
-    f = tkinter.tix.Frame(tab)
-    common = tkinter.tix.Frame(tab)
-
-    f.pack(side=tkinter.tix.LEFT, padx=2, pady=2, fill=tkinter.tix.BOTH, expand=1)
-    common.pack(side=tkinter.tix.RIGHT, padx=2, fill=tkinter.tix.Y)
-
-    a = tkinter.tix.Control(f, value=12,   label='Access time: ')
-    w = tkinter.tix.Control(f, value=400,  label='Write Throughput: ')
-    r = tkinter.tix.Control(f, value=400,  label='Read Throughput: ')
-    c = tkinter.tix.Control(f, value=1021, label='Capacity: ')
-
-    a.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    w.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    r.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    c.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-
-    # Create the common buttons
-    createCommonButtons(common)
-
-    #----------------------------------------
-    # Create the second page
-    #----------------------------------------
-
-    tab = nb.network
-
-    f = tkinter.tix.Frame(tab)
-    common = tkinter.tix.Frame(tab)
-
-    f.pack(side=tkinter.tix.LEFT, padx=2, pady=2, fill=tkinter.tix.BOTH, expand=1)
-    common.pack(side=tkinter.tix.RIGHT, padx=2, fill=tkinter.tix.Y)
-
-    a = tkinter.tix.Control(f, value=12,   label='Access time: ')
-    w = tkinter.tix.Control(f, value=400,  label='Write Throughput: ')
-    r = tkinter.tix.Control(f, value=400,  label='Read Throughput: ')
-    c = tkinter.tix.Control(f, value=1021, label='Capacity: ')
-    u = tkinter.tix.Control(f, value=10,   label='Users: ')
-
-    a.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    w.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    r.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    c.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    u.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-
-    createCommonButtons(common)
-
-def doDestroy():
-    global root
-    root.destroy()
-
-def createCommonButtons(master):
-    ok = tkinter.tix.Button(master, name='ok', text='OK', width=6,
-                command=doDestroy)
-    cancel = tkinter.tix.Button(master, name='cancel',
-                    text='Cancel', width=6,
-                    command=doDestroy)
-
-    ok.pack(side=tkinter.tix.TOP, padx=2, pady=2)
-    cancel.pack(side=tkinter.tix.TOP, padx=2, pady=2)
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
-    root.mainloop()
diff --git a/Demo/tix/samples/OptMenu.py b/Demo/tix/samples/OptMenu.py
deleted file mode 100644
index d1dd46d..0000000
--- a/Demo/tix/samples/OptMenu.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the tixOptionMenu widget -- you can
-# use it for the user to choose from a fixed set of options
-#
-import tkinter.tix
-
-options = {'text':'Plain Text', 'post':'PostScript', 'html':'HTML',
-           'tex':'LaTeX', 'rtf':'Rich Text Format'}
-
-def RunSample(w):
-    global demo_opt_from, demo_opt_to
-
-    demo_opt_from = tkinter.tix.StringVar()
-    demo_opt_to = tkinter.tix.StringVar()
-
-    top = tkinter.tix.Frame(w, bd=1, relief=tkinter.tix.RAISED)
-
-    from_file = tkinter.tix.OptionMenu(top, label="From File Format : ",
-                               variable=demo_opt_from,
-                               options = 'label.width  19 label.anchor e menubutton.width 15')
-
-    to_file = tkinter.tix.OptionMenu(top, label="To File Format : ",
-                             variable=demo_opt_to,
-                             options='label.width  19 label.anchor e menubutton.width 15')
-
-    # Add the available options to the two OptionMenu widgets
-    #
-    # [Hint] You have to add the options first before you set the
-    #        global variables "demo_opt_from" and "demo_opt_to". Otherwise
-    #        the OptionMenu widget will complain about "unknown options"!
-    #
-    for opt in options.keys():
-        from_file.add_command(opt, label=options[opt])
-        to_file.add_command(opt, label=options[opt])
-
-    demo_opt_from.set('html')
-    demo_opt_to.set('post')
-
-    from_file.pack(side=tkinter.tix.TOP, anchor=tkinter.tix.W, pady=3, padx=6)
-    to_file.pack(side=tkinter.tix.TOP, anchor=tkinter.tix.W, pady=3, padx=6)
-
-    box = tkinter.tix.ButtonBox(w, orientation=tkinter.tix.HORIZONTAL)
-    box.add('ok', text='Ok', underline=0, width=6,
-            command=lambda w=w: ok_command(w))
-    box.add('cancel', text='Cancel', underline=0, width=6,
-            command=lambda w=w: w.destroy())
-    box.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-    top.pack(side=tkinter.tix.TOP, fill=tkinter.tix.BOTH, expand=1)
-
-def ok_command(w):
-    # tixDemo:Status "Convert file from %s to %s" % ( demo_opt_from.get(), demo_opt_to.get())
-    w.destroy()
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
-    root.mainloop()
diff --git a/Demo/tix/samples/PanedWin.py b/Demo/tix/samples/PanedWin.py
deleted file mode 100644
index 1ffc470..0000000
--- a/Demo/tix/samples/PanedWin.py
+++ /dev/null
@@ -1,98 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates the use of the tixPanedWindow widget. This program
-# is a dummy news reader: the user can adjust the sizes of the list
-# of artical names and the size of the text widget that shows the body
-# of the article.
-
-import tkinter.tix
-
-TCL_ALL_EVENTS          = 0
-
-def RunSample (root):
-    panedwin = DemoPanedwin(root)
-    panedwin.mainloop()
-    panedwin.destroy()
-
-class DemoPanedwin:
-    def __init__(self, w):
-        self.root = w
-        self.exit = -1
-
-        z = w.winfo_toplevel()
-        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
-
-        group = tkinter.tix.LabelEntry(w, label='Newsgroup:', options='entry.width 25')
-        group.entry.insert(0,'comp.lang.python')
-        pane = tkinter.tix.PanedWindow(w, orientation='vertical')
-
-        p1 = pane.add('list', min=70, size=100)
-        p2 = pane.add('text', min=70)
-        list = tkinter.tix.ScrolledListBox(p1)
-        list.listbox['width'] = 80
-        list.listbox['height'] = 5
-        text = tkinter.tix.ScrolledText(p2)
-        text.text['width'] = 80
-        text.text['height'] = 20
-
-        list.listbox.insert(tkinter.tix.END, "  12324 Re: Tkinter is good for your health")
-        list.listbox.insert(tkinter.tix.END, "+ 12325 Re: Tkinter is good for your health")
-        list.listbox.insert(tkinter.tix.END, "+ 12326 Re: Tix is even better for your health (Was: Tkinter is good...)")
-        list.listbox.insert(tkinter.tix.END, "  12327 Re: Tix is even better for your health (Was: Tkinter is good...)")
-        list.listbox.insert(tkinter.tix.END, "+ 12328 Re: Tix is even better for your health (Was: Tkinter is good...)")
-        list.listbox.insert(tkinter.tix.END, "  12329 Re: Tix is even better for your health (Was: Tkinter is good...)")
-        list.listbox.insert(tkinter.tix.END, "+ 12330 Re: Tix is even better for your health (Was: Tkinter is good...)")
-
-        text.text['bg'] = list.listbox['bg']
-        text.text['wrap'] = 'none'
-        text.text.insert(tkinter.tix.END, """
-    Mon, 19 Jun 1995 11:39:52        comp.lang.python              Thread   34 of  220
-    Lines 353       A new way to put text and bitmaps together iNo responses
-    ioi@blue.seas.upenn.edu                Ioi K. Lam at University of Pennsylvania
-
-    Hi,
-
-    I have implemented a new image type called "compound". It allows you
-    to glue together a bunch of bitmaps, images and text strings together
-    to form a bigger image. Then you can use this image with widgets that
-    support the -image option. For example, you can display a text string string
-    together with a bitmap, at the same time, inside a TK button widget.
-    """)
-        text.text['state'] = 'disabled'
-
-        list.pack(expand=1, fill=tkinter.tix.BOTH, padx=4, pady=6)
-        text.pack(expand=1, fill=tkinter.tix.BOTH, padx=4, pady=6)
-
-        group.pack(side=tkinter.tix.TOP, padx=3, pady=3, fill=tkinter.tix.BOTH)
-        pane.pack(side=tkinter.tix.TOP, padx=3, pady=3, fill=tkinter.tix.BOTH, expand=1)
-
-        box = tkinter.tix.ButtonBox(w, orientation=tkinter.tix.HORIZONTAL)
-        box.add('ok', text='Ok', underline=0, width=6,
-                command=self.quitcmd)
-        box.add('cancel', text='Cancel', underline=0, width=6,
-                command=self.quitcmd)
-        box.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-
-    def quitcmd (self):
-        self.exit = 0
-
-    def mainloop(self):
-        while self.exit < 0:
-            self.root.tk.dooneevent(TCL_ALL_EVENTS)
-
-    def destroy (self):
-        self.root.destroy()
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
diff --git a/Demo/tix/samples/PopMenu.py b/Demo/tix/samples/PopMenu.py
deleted file mode 100644
index cb75d85..0000000
--- a/Demo/tix/samples/PopMenu.py
+++ /dev/null
@@ -1,57 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-#       $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program using tixwish.
-
-# This file demonstrates the use of the tixPopupMenu widget.
-#
-import tkinter.tix
-
-def RunSample(w):
-    # We create the frame and the button, then we'll bind the PopupMenu
-    # to both widgets. The result is, when you press the right mouse
-    # button over $w.top or $w.top.but, the PopupMenu will come up.
-    #
-    top = tkinter.tix.Frame(w, relief=tkinter.tix.RAISED, bd=1)
-    but = tkinter.tix.Button(top, text='Press the right mouse button over this button or its surrounding area')
-    but.pack(expand=1, fill=tkinter.tix.BOTH, padx=50, pady=50)
-
-    p = tkinter.tix.PopupMenu(top, title='Popup Test')
-    p.bind_widget(top)
-    p.bind_widget(but)
-
-    # Set the entries inside the PopupMenu widget.
-    # [Hint] You have to manipulate the "menu" subwidget.
-    #        $w.top.p itself is NOT a menu widget.
-    # [Hint] Watch carefully how the sub-menu is created
-    #
-    p.menu.add_command(label='Desktop', underline=0)
-    p.menu.add_command(label='Select', underline=0)
-    p.menu.add_command(label='Find', underline=0)
-    p.menu.add_command(label='System', underline=1)
-    p.menu.add_command(label='Help', underline=0)
-    m1 = tkinter.tix.Menu(p.menu)
-    m1.add_command(label='Hello')
-    p.menu.add_cascade(label='More', menu=m1)
-
-    but.pack(side=tkinter.tix.TOP, padx=40, pady=50)
-
-    box = tkinter.tix.ButtonBox(w, orientation=tkinter.tix.HORIZONTAL)
-    box.add('ok', text='Ok', underline=0, width=6,
-            command=lambda w=w: w.destroy())
-    box.add('cancel', text='Cancel', underline=0, width=6,
-            command=lambda w=w: w.destroy())
-    box.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-    top.pack(side=tkinter.tix.TOP, fill=tkinter.tix.BOTH, expand=1)
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
-    root.mainloop()
diff --git a/Demo/tix/samples/SHList1.py b/Demo/tix/samples/SHList1.py
deleted file mode 100644
index bf46020..0000000
--- a/Demo/tix/samples/SHList1.py
+++ /dev/null
@@ -1,131 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program using tixwish.
-
-# This file demonstrates the use of the tixScrolledHList widget.
-#
-
-import tkinter.tix
-
-TCL_ALL_EVENTS          = 0
-
-def RunSample (root):
-    shlist = DemoSHList(root)
-    shlist.mainloop()
-    shlist.destroy()
-
-class DemoSHList:
-    def __init__(self, w):
-        self.root = w
-        self.exit = -1
-
-        z = w.winfo_toplevel()
-        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
-
-        # We create the frame and the ScrolledHList widget
-        # at the top of the dialog box
-        #
-        top = tkinter.tix.Frame( w, relief=tkinter.tix.RAISED, bd=1)
-
-        # Put a simple hierachy into the HList (two levels). Use colors and
-        # separator widgets (frames) to make the list look fancy
-        #
-        top.a = tkinter.tix.ScrolledHList(top)
-        top.a.pack( expand=1, fill=tkinter.tix.BOTH, padx=10, pady=10, side=tkinter.tix.TOP)
-
-        # This is our little relational database
-        #
-        bosses = [
-            ('jeff',  'Jeff Waxman'),
-            ('john',  'John Lee'),
-            ('peter', 'Peter Kenson')
-        ]
-
-        employees = [
-            ('alex',  'john',  'Alex Kellman'),
-            ('alan',  'john',  'Alan Adams'),
-            ('andy',  'peter', 'Andreas Crawford'),
-            ('doug',  'jeff',  'Douglas Bloom'),
-            ('jon',   'peter', 'Jon Baraki'),
-            ('chris', 'jeff',  'Chris Geoffrey'),
-            ('chuck', 'jeff',  'Chuck McLean')
-        ]
-
-        hlist=top.a.hlist
-
-        # Let configure the appearance of the HList subwidget
-        #
-        hlist.config( separator='.', width=25, drawbranch=0, indent=10)
-
-        count=0
-        for boss,name in bosses :
-            if count :
-                f=tkinter.tix.Frame(hlist, name='sep%d' % count, height=2, width=150,
-                    bd=2, relief=tkinter.tix.SUNKEN )
-
-                hlist.add_child( itemtype=tkinter.tix.WINDOW,
-                    window=f, state=tkinter.tix.DISABLED )
-
-            hlist.add(boss, itemtype=tkinter.tix.TEXT, text=name)
-            count = count+1
-
-
-        for person,boss,name in employees :
-            # '.' is the separator character we chose above
-            #
-            key= boss    + '.'     + person
-            #    ^^^^                ^^^^^^
-            #    parent entryPath /  child's name
-
-            hlist.add( key, text=name )
-
-            # [Hint] Make sure the keys (e.g. 'boss.person') you choose
-            #    are unique names. If you cannot be sure of this (because of
-            #    the structure of your database, e.g.) you can use the
-            #    "add_child" command instead:
-            #
-            #  hlist.addchild( boss,  text=name)
-            #                  ^^^^
-            #                  parent entryPath
-
-
-        # Use a ButtonBox to hold the buttons.
-        #
-        box= tkinter.tix.ButtonBox(top, orientation=tkinter.tix.HORIZONTAL )
-        box.add( 'ok',  text='Ok', underline=0,  width=6,
-            command = self.okcmd)
-
-        box.add( 'cancel', text='Cancel', underline=0, width=6,
-            command = self.quitcmd)
-
-        box.pack( side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-        top.pack( side=tkinter.tix.TOP,    fill=tkinter.tix.BOTH, expand=1 )
-
-    def okcmd (self):
-        self.quitcmd()
-
-    def quitcmd (self):
-        self.exit = 0
-
-    def mainloop(self):
-        while self.exit < 0:
-            self.root.tk.dooneevent(TCL_ALL_EVENTS)
-
-    def destroy (self):
-        self.root.destroy()
-
-
-# This "if" statement makes it possible to run this script file inside or
-# outside of the main demo program "tixwidgets.py".
-#
-if __name__== '__main__' :
-    root=tkinter.tix.Tk()
-    RunSample(root)
diff --git a/Demo/tix/samples/SHList2.py b/Demo/tix/samples/SHList2.py
deleted file mode 100644
index 370c765..0000000
--- a/Demo/tix/samples/SHList2.py
+++ /dev/null
@@ -1,168 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidget": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program using tixwish.
-
-# This file demonstrates how to use multiple columns and multiple styles
-# in the tixHList widget
-#
-# In a tixHList widget, you can have one ore more columns.
-#
-
-import tkinter.tix
-
-TCL_ALL_EVENTS          = 0
-
-def RunSample (root):
-    shlist = DemoSHList(root)
-    shlist.mainloop()
-    shlist.destroy()
-
-class DemoSHList:
-    def __init__(self, w):
-        self.root = w
-        self.exit = -1
-
-        z = w.winfo_toplevel()
-        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
-
-        # We create the frame and the ScrolledHList widget
-        # at the top of the dialog box
-        #
-        top = tkinter.tix.Frame( w, relief=tkinter.tix.RAISED, bd=1)
-
-        # Put a simple hierachy into the HList (two levels). Use colors and
-        # separator widgets (frames) to make the list look fancy
-        #
-        top.a = tkinter.tix.ScrolledHList(top, options='hlist.columns 3 hlist.header 1' )
-        top.a.pack( expand=1, fill=tkinter.tix.BOTH, padx=10, pady=10, side=tkinter.tix.TOP)
-
-        hlist=top.a.hlist
-
-        # Create the title for the HList widget
-        #       >> Notice that we have set the hlist.header subwidget option to true
-        #      so that the header is displayed
-        #
-
-        boldfont=hlist.tk.call('tix','option','get','bold_font')
-
-        # First some styles for the headers
-        style={}
-        style['header'] = tkinter.tix.DisplayStyle(tkinter.tix.TEXT, refwindow=hlist,
-            anchor=tkinter.tix.CENTER, padx=8, pady=2, font = boldfont )
-
-        hlist.header_create(0, itemtype=tkinter.tix.TEXT, text='Name',
-            style=style['header'])
-        hlist.header_create(1, itemtype=tkinter.tix.TEXT, text='Position',
-            style=style['header'])
-
-        # Notice that we use 3 columns in the hlist widget. This way when the user
-        # expands the windows wide, the right side of the header doesn't look
-        # chopped off. The following line ensures that the 3 column header is
-        # not shown unless the hlist window is wider than its contents.
-        #
-        hlist.column_width(2,0)
-
-        # This is our little relational database
-        #
-        boss = ('doe', 'John Doe',      'Director')
-
-        managers = [
-            ('jeff',  'Jeff Waxman',    'Manager'),
-            ('john',  'John Lee',               'Manager'),
-            ('peter', 'Peter Kenson',   'Manager')
-        ]
-
-        employees = [
-            ('alex',  'john',   'Alex Kellman',         'Clerk'),
-            ('alan',  'john',       'Alan Adams',               'Clerk'),
-            ('andy',  'peter',      'Andreas Crawford', 'Salesman'),
-            ('doug',  'jeff',       'Douglas Bloom',    'Clerk'),
-            ('jon',   'peter',      'Jon Baraki',               'Salesman'),
-            ('chris', 'jeff',       'Chris Geoffrey',   'Clerk'),
-            ('chuck', 'jeff',       'Chuck McLean',             'Cleaner')
-        ]
-
-        style['mgr_name'] = tkinter.tix.DisplayStyle(tkinter.tix.TEXT, refwindow=hlist)
-
-        style['mgr_posn'] = tkinter.tix.DisplayStyle(tkinter.tix.TEXT, padx=8, refwindow=hlist)
-
-        style['empl_name'] = tkinter.tix.DisplayStyle(tkinter.tix.TEXT, refwindow=hlist)
-
-        style['empl_posn'] = tkinter.tix.DisplayStyle(tkinter.tix.TEXT, padx=8, refwindow=hlist)
-
-        # Let configure the appearance of the HList subwidget
-        #
-        hlist.config(separator='.', width=25, drawbranch=0, indent=10)
-        hlist.column_width(0, chars=20)
-
-        # Create the boss
-        #
-        hlist.add ('.',           itemtype=tkinter.tix.TEXT, text=boss[1],
-            style=style['mgr_name'])
-        hlist.item_create('.', 1, itemtype=tkinter.tix.TEXT, text=boss[2],
-            style=style['mgr_posn'])
-
-        # Create the managers
-        #
-
-        for key,name,posn in managers :
-            e= '.'+ key
-            hlist.add(e, itemtype=tkinter.tix.TEXT, text=name,
-                style=style['mgr_name'])
-            hlist.item_create(e, 1, itemtype=tkinter.tix.TEXT, text=posn,
-                style=style['mgr_posn'])
-
-
-        for key,mgr,name,posn in employees :
-            # "." is the separator character we chose above
-
-            entrypath = '.' + mgr        + '.' + key
-
-            #           ^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^
-            #       parent entryPath / child's name
-
-            hlist.add(entrypath, text=name, style=style['empl_name'])
-            hlist.item_create(entrypath, 1, itemtype=tkinter.tix.TEXT,
-                text = posn, style = style['empl_posn'] )
-
-
-        # Use a ButtonBox to hold the buttons.
-        #
-        box= tkinter.tix.ButtonBox(top, orientation=tkinter.tix.HORIZONTAL )
-        box.add( 'ok',  text='Ok', underline=0,  width=6,
-            command = self.okcmd )
-
-        box.add( 'cancel', text='Cancel', underline=0, width=6,
-            command = self.quitcmd )
-
-        box.pack( side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-        top.pack( side=tkinter.tix.TOP,    fill=tkinter.tix.BOTH, expand=1 )
-
-    def okcmd (self):
-        self.quitcmd()
-
-    def quitcmd (self):
-        self.exit = 0
-
-    def mainloop(self):
-        while self.exit < 0:
-            self.root.tk.dooneevent(TCL_ALL_EVENTS)
-
-    def destroy (self):
-        self.root.destroy()
-
-
-# This "if" statement makes it possible to run this script file inside or
-# outside of the main demo program "tixwidgets.py".
-#
-if __name__== '__main__' :
-    root=tkinter.tix.Tk()
-    RunSample(root)
diff --git a/Demo/tix/samples/Tree.py b/Demo/tix/samples/Tree.py
deleted file mode 100644
index e46ff60..0000000
--- a/Demo/tix/samples/Tree.py
+++ /dev/null
@@ -1,80 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# Tix Demostration Program
-#
-# This sample program is structured in such a way so that it can be
-# executed from the Tix demo program "tixwidgets.py": it must have a
-# procedure called "RunSample". It should also have the "if" statment
-# at the end of this file so that it can be run as a standalone
-# program.
-
-# This file demonstrates how to use the TixTree widget to display
-# dynamic hierachical data (the files in the Unix file system)
-#
-
-import tkinter.tix, os
-
-def RunSample(w):
-    top = tkinter.tix.Frame(w, relief=tkinter.tix.RAISED, bd=1)
-    tree = tkinter.tix.Tree(top, options='separator "/"')
-    tree.pack(expand=1, fill=tkinter.tix.BOTH, padx=10, pady=10, side=tkinter.tix.LEFT)
-    tree['opencmd'] = lambda dir=None, w=tree: opendir(w, dir)
-
-    # The / directory is added in the "open" mode. The user can open it
-    # and then browse its subdirectories ...
-    adddir(tree, "/")
-
-    box = tkinter.tix.ButtonBox(w, orientation=tkinter.tix.HORIZONTAL)
-    box.add('ok', text='Ok', underline=0, command=w.destroy, width=6)
-    box.add('cancel', text='Cancel', underline=0, command=w.destroy, width=6)
-    box.pack(side=tkinter.tix.BOTTOM, fill=tkinter.tix.X)
-    top.pack(side=tkinter.tix.TOP, fill=tkinter.tix.BOTH, expand=1)
-
-def adddir(tree, dir):
-    if dir == '/':
-        text = '/'
-    else:
-        text = os.path.basename(dir)
-    tree.hlist.add(dir, itemtype=tkinter.tix.IMAGETEXT, text=text,
-                   image=tree.tk.call('tix', 'getimage', 'folder'))
-    try:
-        os.listdir(dir)
-        tree.setmode(dir, 'open')
-    except os.error:
-        # No read permission ?
-        pass
-
-# This function is called whenever the user presses the (+) indicator or
-# double clicks on a directory whose mode is "open". It loads the files
-# inside that directory into the Tree widget.
-#
-# Note we didn't specify the closecmd option for the Tree widget, so it
-# performs the default action when the user presses the (-) indicator or
-# double clicks on a directory whose mode is "close": hide all of its child
-# entries
-def opendir(tree, dir):
-    entries = tree.hlist.info_children(dir)
-    if entries:
-        # We have already loaded this directory. Let's just
-        # show all the child entries
-        #
-        # Note: since we load the directory only once, it will not be
-        #       refreshed if the you add or remove files from this
-        #       directory.
-        #
-        for entry in entries:
-            tree.hlist.show_entry(entry)
-    files = os.listdir(dir)
-    for file in files:
-        if os.path.isdir(dir + '/' + file):
-            adddir(tree, dir + '/' + file)
-        else:
-            tree.hlist.add(dir + '/' + file, itemtype=tkinter.tix.IMAGETEXT, text=file,
-                           image=tree.tk.call('tix', 'getimage', 'file'))
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunSample(root)
-    root.mainloop()
diff --git a/Demo/tix/tixwidgets.py b/Demo/tix/tixwidgets.py
deleted file mode 100644
index 42bcedc..0000000
--- a/Demo/tix/tixwidgets.py
+++ /dev/null
@@ -1,1002 +0,0 @@
-# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
-#
-# $Id$
-#
-# tixwidgets.py --
-#
-#       For Tix, see http://tix.sourceforge.net
-#
-#       This is a demo program of some of the Tix widgets available in Python.
-#       If you have installed Python & Tix properly, you can execute this as
-#
-#               % python tixwidgets.py
-#
-
-import os, os.path, sys, tkinter.tix
-from tkinter.constants import *
-import traceback, tkinter.messagebox
-
-TCL_DONT_WAIT           = 1<<1
-TCL_WINDOW_EVENTS       = 1<<2
-TCL_FILE_EVENTS         = 1<<3
-TCL_TIMER_EVENTS        = 1<<4
-TCL_IDLE_EVENTS         = 1<<5
-TCL_ALL_EVENTS          = 0
-
-class Demo:
-    def __init__(self, top):
-        self.root = top
-        self.exit = -1
-
-        self.dir = None                         # script directory
-        self.balloon = None                     # balloon widget
-        self.useBalloons = tkinter.tix.StringVar()
-        self.useBalloons.set('0')
-        self.statusbar = None                   # status bar widget
-        self.welmsg = None                      # Msg widget
-        self.welfont = ''                       # font name
-        self.welsize = ''                       # font size
-
-        progname = sys.argv[0]
-        dirname = os.path.dirname(progname)
-        if dirname and dirname != os.curdir:
-            self.dir = dirname
-            index = -1
-            for i in range(len(sys.path)):
-                p = sys.path[i]
-                if p in ("", os.curdir):
-                    index = i
-            if index >= 0:
-                sys.path[index] = dirname
-            else:
-                sys.path.insert(0, dirname)
-        else:
-            self.dir = os.getcwd()
-        sys.path.insert(0, self.dir+'/samples')
-
-    def MkMainMenu(self):
-        top = self.root
-        w = tkinter.tix.Frame(top, bd=2, relief=RAISED)
-        file = tkinter.tix.Menubutton(w, text='File', underline=0, takefocus=0)
-        help = tkinter.tix.Menubutton(w, text='Help', underline=0, takefocus=0)
-        file.pack(side=LEFT)
-        help.pack(side=RIGHT)
-        fm = tkinter.tix.Menu(file, tearoff=0)
-        file['menu'] = fm
-        hm = tkinter.tix.Menu(help, tearoff=0)
-        help['menu'] = hm
-
-        fm.add_command(label='Exit', underline=1,
-                     command = lambda self=self: self.quitcmd () )
-        hm.add_checkbutton(label='BalloonHelp', underline=0, command=ToggleHelp,
-                           variable=self.useBalloons)
-        # The trace variable option doesn't seem to work, instead I use 'command'
-        #w.tk.call('trace', 'variable', self.useBalloons, 'w', ToggleHelp))
-
-        return w
-
-    def MkMainNotebook(self):
-        top = self.root
-        w = tkinter.tix.NoteBook(top, ipadx=5, ipady=5, options="""
-        tagPadX 6
-        tagPadY 4
-        borderWidth 2
-        """)
-        # This may be required if there is no *Background option
-        top['bg'] = w['bg']
-
-        w.add('wel', label='Welcome', underline=0,
-              createcmd=lambda w=w, name='wel': MkWelcome(w, name))
-        w.add('cho', label='Choosers', underline=0,
-              createcmd=lambda w=w, name='cho': MkChoosers(w, name))
-        w.add('scr', label='Scrolled Widgets', underline=0,
-              createcmd=lambda w=w, name='scr': MkScroll(w, name))
-        w.add('mgr', label='Manager Widgets', underline=0,
-              createcmd=lambda w=w, name='mgr': MkManager(w, name))
-        w.add('dir', label='Directory List', underline=0,
-              createcmd=lambda w=w, name='dir': MkDirList(w, name))
-        w.add('exp', label='Run Sample Programs', underline=0,
-              createcmd=lambda w=w, name='exp': MkSample(w, name))
-        return w
-
-    def MkMainStatus(self):
-        global demo
-        top = self.root
-
-        w = tkinter.tix.Frame(top, relief=tkinter.tix.RAISED, bd=1)
-        demo.statusbar = tkinter.tix.Label(w, relief=tkinter.tix.SUNKEN, bd=1)
-        demo.statusbar.form(padx=3, pady=3, left=0, right='%70')
-        return w
-
-    def build(self):
-        root = self.root
-        z = root.winfo_toplevel()
-        z.wm_title('Tix Widget Demonstration')
-        if z.winfo_screenwidth() <= 800:
-            z.geometry('790x590+10+10')
-        else:
-            z.geometry('890x640+10+10')
-        demo.balloon = tkinter.tix.Balloon(root)
-        frame1 = self.MkMainMenu()
-        frame2 = self.MkMainNotebook()
-        frame3 = self.MkMainStatus()
-        frame1.pack(side=TOP, fill=X)
-        frame3.pack(side=BOTTOM, fill=X)
-        frame2.pack(side=TOP, expand=1, fill=BOTH, padx=4, pady=4)
-        demo.balloon['statusbar'] = demo.statusbar
-        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
-
-        # To show Tcl errors - uncomment this to see the listbox bug.
-        # Tkinter defines a Tcl tkerror procedure that in effect
-        # silences all background Tcl error reporting.
-        # root.tk.eval('if {[info commands tkerror] != ""} {rename tkerror pytkerror}')
-    def quitcmd (self):
-        """Quit our mainloop. It is up to you to call root.destroy() after."""
-        self.exit = 0
-
-    def loop(self):
-        """This is an explict replacement for _tkinter mainloop()
-        It lets you catch keyboard interrupts easier, and avoids
-        the 20 msec. dead sleep() which burns a constant CPU."""
-        while self.exit < 0:
-            # There are 2 whiles here. The outer one lets you continue
-            # after a ^C interrupt.
-            try:
-                # This is the replacement for _tkinter mainloop()
-                # It blocks waiting for the next Tcl event using select.
-                while self.exit < 0:
-                    self.root.tk.dooneevent(TCL_ALL_EVENTS)
-            except SystemExit:
-                # Tkinter uses SystemExit to exit
-                #print 'Exit'
-                self.exit = 1
-                return
-            except KeyboardInterrupt:
-                if tkinter.messagebox.askquestion ('Interrupt', 'Really Quit?') == 'yes':
-                    # self.tk.eval('exit')
-                    self.exit = 1
-                    return
-                continue
-            except:
-                # Otherwise it's some other error - be nice and say why
-                t, v, tb = sys.exc_info()
-                text = ""
-                for line in traceback.format_exception(t,v,tb):
-                    text += line + '\n'
-                try: tkinter.messagebox.showerror ('Error', text)
-                except: pass
-                self.exit = 1
-                raise SystemExit(1)
-
-    def destroy (self):
-        self.root.destroy()
-
-def RunMain(root):
-    global demo
-
-    demo = Demo(root)
-
-    demo.build()
-    demo.loop()
-    demo.destroy()
-
-# Tabs
-def MkWelcome(nb, name):
-    w = nb.page(name)
-    bar = MkWelcomeBar(w)
-    text = MkWelcomeText(w)
-    bar.pack(side=TOP, fill=X, padx=2, pady=2)
-    text.pack(side=TOP, fill=BOTH, expand=1)
-
-def MkWelcomeBar(top):
-    global demo
-
-    w = tkinter.tix.Frame(top, bd=2, relief=tkinter.tix.GROOVE)
-    b1 = tkinter.tix.ComboBox(w, command=lambda w=top: MainTextFont(w))
-    b2 = tkinter.tix.ComboBox(w, command=lambda w=top: MainTextFont(w))
-    b1.entry['width'] = 15
-    b1.slistbox.listbox['height'] = 3
-    b2.entry['width'] = 4
-    b2.slistbox.listbox['height'] = 3
-
-    demo.welfont = b1
-    demo.welsize = b2
-
-    b1.insert(tkinter.tix.END, 'Courier')
-    b1.insert(tkinter.tix.END, 'Helvetica')
-    b1.insert(tkinter.tix.END, 'Lucida')
-    b1.insert(tkinter.tix.END, 'Times Roman')
-
-    b2.insert(tkinter.tix.END, '8')
-    b2.insert(tkinter.tix.END, '10')
-    b2.insert(tkinter.tix.END, '12')
-    b2.insert(tkinter.tix.END, '14')
-    b2.insert(tkinter.tix.END, '18')
-
-    b1.pick(1)
-    b2.pick(3)
-
-    b1.pack(side=tkinter.tix.LEFT, padx=4, pady=4)
-    b2.pack(side=tkinter.tix.LEFT, padx=4, pady=4)
-
-    demo.balloon.bind_widget(b1, msg='Choose\na font',
-                             statusmsg='Choose a font for this page')
-    demo.balloon.bind_widget(b2, msg='Point size',
-                             statusmsg='Choose the font size for this page')
-    return w
-
-def MkWelcomeText(top):
-    global demo
-
-    w = tkinter.tix.ScrolledWindow(top, scrollbar='auto')
-    win = w.window
-    text = 'Welcome to TIX in Python'
-    title = tkinter.tix.Label(win,
-                      bd=0, width=30, anchor=tkinter.tix.N, text=text)
-    msg = tkinter.tix.Message(win,
-                      bd=0, width=400, anchor=tkinter.tix.N,
-                      text='Tix is a set of mega-widgets based on TK. This program \
-demonstrates the widgets in the Tix widget set. You can choose the pages \
-in this window to look at the corresponding widgets. \n\n\
-To quit this program, choose the "File | Exit" command.\n\n\
-For more information, see http://tix.sourceforge.net.')
-    title.pack(expand=1, fill=tkinter.tix.BOTH, padx=10, pady=10)
-    msg.pack(expand=1, fill=tkinter.tix.BOTH, padx=10, pady=10)
-    demo.welmsg = msg
-    return w
-
-def MainTextFont(w):
-    global demo
-
-    if not demo.welmsg:
-        return
-    font = demo.welfont['value']
-    point = demo.welsize['value']
-    if font == 'Times Roman':
-        font = 'times'
-    fontstr = '%s %s' % (font, point)
-    demo.welmsg['font'] = fontstr
-
-def ToggleHelp():
-    if demo.useBalloons.get() == '1':
-        demo.balloon['state'] = 'both'
-    else:
-        demo.balloon['state'] = 'none'
-
-def MkChoosers(nb, name):
-    w = nb.page(name)
-    options = "label.padX 4"
-
-    til = tkinter.tix.LabelFrame(w, label='Chooser Widgets', options=options)
-    cbx = tkinter.tix.LabelFrame(w, label='tixComboBox', options=options)
-    ctl = tkinter.tix.LabelFrame(w, label='tixControl', options=options)
-    sel = tkinter.tix.LabelFrame(w, label='tixSelect', options=options)
-    opt = tkinter.tix.LabelFrame(w, label='tixOptionMenu', options=options)
-    fil = tkinter.tix.LabelFrame(w, label='tixFileEntry', options=options)
-    fbx = tkinter.tix.LabelFrame(w, label='tixFileSelectBox', options=options)
-    tbr = tkinter.tix.LabelFrame(w, label='Tool Bar', options=options)
-
-    MkTitle(til.frame)
-    MkCombo(cbx.frame)
-    MkControl(ctl.frame)
-    MkSelect(sel.frame)
-    MkOptMenu(opt.frame)
-    MkFileEnt(fil.frame)
-    MkFileBox(fbx.frame)
-    MkToolBar(tbr.frame)
-
-    # First column: comBox and selector
-    cbx.form(top=0, left=0, right='%33')
-    sel.form(left=0, right='&'+str(cbx), top=cbx)
-    opt.form(left=0, right='&'+str(cbx), top=sel, bottom=-1)
-
-    # Second column: title .. etc
-    til.form(left=cbx, top=0,right='%66')
-    ctl.form(left=cbx, right='&'+str(til), top=til)
-    fil.form(left=cbx, right='&'+str(til), top=ctl)
-    tbr.form(left=cbx, right='&'+str(til), top=fil, bottom=-1)
-
-    #
-    # Third column: file selection
-    fbx.form(right=-1, top=0, left='%66')
-
-def MkCombo(w):
-    options="label.width %d label.anchor %s entry.width %d" % (10, tkinter.tix.E, 14)
-
-    static = tkinter.tix.ComboBox(w, label='Static', editable=0, options=options)
-    editable = tkinter.tix.ComboBox(w, label='Editable', editable=1, options=options)
-    history = tkinter.tix.ComboBox(w, label='History', editable=1, history=1,
-                           anchor=tkinter.tix.E, options=options)
-    static.insert(tkinter.tix.END, 'January')
-    static.insert(tkinter.tix.END, 'February')
-    static.insert(tkinter.tix.END, 'March')
-    static.insert(tkinter.tix.END, 'April')
-    static.insert(tkinter.tix.END, 'May')
-    static.insert(tkinter.tix.END, 'June')
-    static.insert(tkinter.tix.END, 'July')
-    static.insert(tkinter.tix.END, 'August')
-    static.insert(tkinter.tix.END, 'September')
-    static.insert(tkinter.tix.END, 'October')
-    static.insert(tkinter.tix.END, 'November')
-    static.insert(tkinter.tix.END, 'December')
-
-    editable.insert(tkinter.tix.END, 'Angola')
-    editable.insert(tkinter.tix.END, 'Bangladesh')
-    editable.insert(tkinter.tix.END, 'China')
-    editable.insert(tkinter.tix.END, 'Denmark')
-    editable.insert(tkinter.tix.END, 'Ecuador')
-
-    history.insert(tkinter.tix.END, '/usr/bin/ksh')
-    history.insert(tkinter.tix.END, '/usr/local/lib/python')
-    history.insert(tkinter.tix.END, '/var/adm')
-
-    static.pack(side=tkinter.tix.TOP, padx=5, pady=3)
-    editable.pack(side=tkinter.tix.TOP, padx=5, pady=3)
-    history.pack(side=tkinter.tix.TOP, padx=5, pady=3)
-
-states = ['Bengal', 'Delhi', 'Karnataka', 'Tamil Nadu']
-
-def spin_cmd(w, inc):
-    idx = states.index(demo_spintxt.get()) + inc
-    if idx < 0:
-        idx = len(states) - 1
-    elif idx >= len(states):
-        idx = 0
-# following doesn't work.
-#    return states[idx]
-    demo_spintxt.set(states[idx])       # this works
-
-def spin_validate(w):
-    global states, demo_spintxt
-
-    try:
-        i = states.index(demo_spintxt.get())
-    except ValueError:
-        return states[0]
-    return states[i]
-    # why this procedure works as opposed to the previous one beats me.
-
-def MkControl(w):
-    global demo_spintxt
-
-    options="label.width %d label.anchor %s entry.width %d" % (10, tkinter.tix.E, 13)
-
-    demo_spintxt = tkinter.tix.StringVar()
-    demo_spintxt.set(states[0])
-    simple = tkinter.tix.Control(w, label='Numbers', options=options)
-    spintxt = tkinter.tix.Control(w, label='States', variable=demo_spintxt,
-                          options=options)
-    spintxt['incrcmd'] = lambda w=spintxt: spin_cmd(w, 1)
-    spintxt['decrcmd'] = lambda w=spintxt: spin_cmd(w, -1)
-    spintxt['validatecmd'] = lambda w=spintxt: spin_validate(w)
-
-    simple.pack(side=tkinter.tix.TOP, padx=5, pady=3)
-    spintxt.pack(side=tkinter.tix.TOP, padx=5, pady=3)
-
-def MkSelect(w):
-    options = "label.anchor %s" % tkinter.tix.CENTER
-
-    sel1 = tkinter.tix.Select(w, label='Mere Mortals', allowzero=1, radio=1,
-                      orientation=tkinter.tix.VERTICAL,
-                      labelside=tkinter.tix.TOP,
-                      options=options)
-    sel2 = tkinter.tix.Select(w, label='Geeks', allowzero=1, radio=0,
-                      orientation=tkinter.tix.VERTICAL,
-                      labelside= tkinter.tix.TOP,
-                      options=options)
-
-    sel1.add('eat', text='Eat')
-    sel1.add('work', text='Work')
-    sel1.add('play', text='Play')
-    sel1.add('party', text='Party')
-    sel1.add('sleep', text='Sleep')
-
-    sel2.add('eat', text='Eat')
-    sel2.add('prog1', text='Program')
-    sel2.add('prog2', text='Program')
-    sel2.add('prog3', text='Program')
-    sel2.add('sleep', text='Sleep')
-
-    sel1.pack(side=tkinter.tix.LEFT, padx=5, pady=3, fill=tkinter.tix.X)
-    sel2.pack(side=tkinter.tix.LEFT, padx=5, pady=3, fill=tkinter.tix.X)
-
-def MkOptMenu(w):
-    options='menubutton.width 15 label.anchor %s' % tkinter.tix.E
-
-    m = tkinter.tix.OptionMenu(w, label='File Format : ', options=options)
-    m.add_command('text', label='Plain Text')
-    m.add_command('post', label='PostScript')
-    m.add_command('format', label='Formatted Text')
-    m.add_command('html', label='HTML')
-    m.add_command('sep')
-    m.add_command('tex', label='LaTeX')
-    m.add_command('rtf', label='Rich Text Format')
-
-    m.pack(fill=tkinter.tix.X, padx=5, pady=3)
-
-def MkFileEnt(w):
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='Press the "open file" icon button and a TixFileSelectDialog will popup.')
-    ent = tkinter.tix.FileEntry(w, label='Select a file : ')
-    msg.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=3, pady=3)
-    ent.pack(side=tkinter.tix.TOP, fill=tkinter.tix.X, padx=3, pady=3)
-
-def MkFileBox(w):
-    """The FileSelectBox is a Motif-style box with various enhancements.
-    For example, you can adjust the size of the two listboxes
-    and your past selections are recorded.
-    """
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='The Tix FileSelectBox is a Motif-style box with various enhancements. For example, you can adjust the size of the two listboxes and your past selections are recorded.')
-    box = tkinter.tix.FileSelectBox(w)
-    msg.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=3, pady=3)
-    box.pack(side=tkinter.tix.TOP, fill=tkinter.tix.X, padx=3, pady=3)
-
-def MkToolBar(w):
-    """The Select widget is also good for arranging buttons in a tool bar.
-    """
-    global demo
-
-    options='frame.borderWidth 1'
-
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='The Select widget is also good for arranging buttons in a tool bar.')
-    bar = tkinter.tix.Frame(w, bd=2, relief=tkinter.tix.RAISED)
-    font = tkinter.tix.Select(w, allowzero=1, radio=0, label='', options=options)
-    para = tkinter.tix.Select(w, allowzero=0, radio=1, label='', options=options)
-
-    font.add('bold', bitmap='@' + demo.dir + '/bitmaps/bold.xbm')
-    font.add('italic', bitmap='@' + demo.dir + '/bitmaps/italic.xbm')
-    font.add('underline', bitmap='@' + demo.dir + '/bitmaps/underline.xbm')
-    font.add('capital', bitmap='@' + demo.dir + '/bitmaps/capital.xbm')
-
-    para.add('left', bitmap='@' + demo.dir + '/bitmaps/leftj.xbm')
-    para.add('right', bitmap='@' + demo.dir + '/bitmaps/rightj.xbm')
-    para.add('center', bitmap='@' + demo.dir + '/bitmaps/centerj.xbm')
-    para.add('justify', bitmap='@' + demo.dir + '/bitmaps/justify.xbm')
-
-    msg.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=3, pady=3)
-    bar.pack(side=tkinter.tix.TOP, fill=tkinter.tix.X, padx=3, pady=3)
-    font.pack({'in':bar}, side=tkinter.tix.LEFT, padx=3, pady=3)
-    para.pack({'in':bar}, side=tkinter.tix.LEFT, padx=3, pady=3)
-
-def MkTitle(w):
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='There are many types of "chooser" widgets that allow the user to input different types of information')
-    msg.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=3, pady=3)
-
-def MkScroll(nb, name):
-    w = nb.page(name)
-    options='label.padX 4'
-
-    sls = tkinter.tix.LabelFrame(w, label='Tix.ScrolledListBox', options=options)
-    swn = tkinter.tix.LabelFrame(w, label='Tix.ScrolledWindow', options=options)
-    stx = tkinter.tix.LabelFrame(w, label='Tix.ScrolledText', options=options)
-
-    MkSList(sls.frame)
-    MkSWindow(swn.frame)
-    MkSText(stx.frame)
-
-    sls.form(top=0, left=0, right='%33', bottom=-1)
-    swn.form(top=0, left=sls, right='%66', bottom=-1)
-    stx.form(top=0, left=swn, right=-1, bottom=-1)
-
-
-def MkSList(w):
-    """This TixScrolledListBox is configured so that it uses scrollbars
-    only when it is necessary. Use the handles to resize the listbox and
-    watch the scrollbars automatically appear and disappear.  """
-    top = tkinter.tix.Frame(w, width=300, height=330)
-    bot = tkinter.tix.Frame(w)
-    msg = tkinter.tix.Message(top,
-                      relief=tkinter.tix.FLAT, width=200, anchor=tkinter.tix.N,
-                      text='This TixScrolledListBox is configured so that it uses scrollbars only when it is necessary. Use the handles to resize the listbox and watch the scrollbars automatically appear and disappear.')
-
-    list = tkinter.tix.ScrolledListBox(top, scrollbar='auto')
-    list.place(x=50, y=150, width=120, height=80)
-    list.listbox.insert(tkinter.tix.END, 'Alabama')
-    list.listbox.insert(tkinter.tix.END, 'California')
-    list.listbox.insert(tkinter.tix.END, 'Montana')
-    list.listbox.insert(tkinter.tix.END, 'New Jersey')
-    list.listbox.insert(tkinter.tix.END, 'New York')
-    list.listbox.insert(tkinter.tix.END, 'Pennsylvania')
-    list.listbox.insert(tkinter.tix.END, 'Washington')
-
-    rh = tkinter.tix.ResizeHandle(top, bg='black',
-                          relief=tkinter.tix.RAISED,
-                          handlesize=8, gridded=1, minwidth=50, minheight=30)
-    btn = tkinter.tix.Button(bot, text='Reset', command=lambda w=rh, x=list: SList_reset(w,x))
-    top.propagate(0)
-    msg.pack(fill=tkinter.tix.X)
-    btn.pack(anchor=tkinter.tix.CENTER)
-    top.pack(expand=1, fill=tkinter.tix.BOTH)
-    bot.pack(fill=tkinter.tix.BOTH)
-    list.bind('<Map>', func=lambda arg=0, rh=rh, list=list:
-              list.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(list)))
-
-def SList_reset(rh, list):
-    list.place(x=50, y=150, width=120, height=80)
-    list.update()
-    rh.attach_widget(list)
-
-def MkSWindow(w):
-    """The ScrolledWindow widget allows you to scroll any kind of Tk
-    widget. It is more versatile than a scrolled canvas widget.
-    """
-    global demo
-
-    text = 'The Tix ScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.'
-
-    file = os.path.join(demo.dir, 'bitmaps', 'tix.gif')
-    if not os.path.isfile(file):
-        text += ' (Image missing)'
-
-    top = tkinter.tix.Frame(w, width=330, height=330)
-    bot = tkinter.tix.Frame(w)
-    msg = tkinter.tix.Message(top,
-                      relief=tkinter.tix.FLAT, width=200, anchor=tkinter.tix.N,
-                      text=text)
-
-    win = tkinter.tix.ScrolledWindow(top, scrollbar='auto')
-
-    image1 = win.window.image_create('photo', file=file)
-    lbl = tkinter.tix.Label(win.window, image=image1)
-    lbl.pack(expand=1, fill=tkinter.tix.BOTH)
-
-    win.place(x=30, y=150, width=190, height=120)
-
-    rh = tkinter.tix.ResizeHandle(top, bg='black',
-                          relief=tkinter.tix.RAISED,
-                          handlesize=8, gridded=1, minwidth=50, minheight=30)
-    btn = tkinter.tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SWindow_reset(w,x))
-    top.propagate(0)
-    msg.pack(fill=tkinter.tix.X)
-    btn.pack(anchor=tkinter.tix.CENTER)
-    top.pack(expand=1, fill=tkinter.tix.BOTH)
-    bot.pack(fill=tkinter.tix.BOTH)
-
-    win.bind('<Map>', func=lambda arg=0, rh=rh, win=win:
-             win.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(win)))
-
-def SWindow_reset(rh, win):
-    win.place(x=30, y=150, width=190, height=120)
-    win.update()
-    rh.attach_widget(win)
-
-def MkSText(w):
-    """The TixScrolledWindow widget allows you to scroll any kind of Tk
-    widget. It is more versatile than a scrolled canvas widget."""
-    top = tkinter.tix.Frame(w, width=330, height=330)
-    bot = tkinter.tix.Frame(w)
-    msg = tkinter.tix.Message(top,
-                      relief=tkinter.tix.FLAT, width=200, anchor=tkinter.tix.N,
-                      text='The Tix ScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.')
-
-    win = tkinter.tix.ScrolledText(top, scrollbar='auto')
-    win.text['wrap'] = 'none'
-    win.text.insert(tkinter.tix.END, '''When -scrollbar is set to "auto", the
-scrollbars are shown only when needed.
-Additional modifiers can be used to force a
-scrollbar to be shown or hidden. For example,
-"auto -y" means the horizontal scrollbar
-should be shown when needed but the vertical
-scrollbar should always be hidden;
-"auto +x" means the vertical scrollbar
-should be shown when needed but the horizontal
-scrollbar should always be shown, and so on.'''
-)
-    win.place(x=30, y=150, width=190, height=100)
-
-    rh = tkinter.tix.ResizeHandle(top, bg='black',
-                          relief=tkinter.tix.RAISED,
-                          handlesize=8, gridded=1, minwidth=50, minheight=30)
-    btn = tkinter.tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SText_reset(w,x))
-    top.propagate(0)
-    msg.pack(fill=tkinter.tix.X)
-    btn.pack(anchor=tkinter.tix.CENTER)
-    top.pack(expand=1, fill=tkinter.tix.BOTH)
-    bot.pack(fill=tkinter.tix.BOTH)
-    win.bind('<Map>', func=lambda arg=0, rh=rh, win=win:
-             win.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(win)))
-
-def SText_reset(rh, win):
-    win.place(x=30, y=150, width=190, height=120)
-    win.update()
-    rh.attach_widget(win)
-
-def MkManager(nb, name):
-    w = nb.page(name)
-    options='label.padX 4'
-
-    pane = tkinter.tix.LabelFrame(w, label='Tix.PanedWindow', options=options)
-    note = tkinter.tix.LabelFrame(w, label='Tix.NoteBook', options=options)
-
-    MkPanedWindow(pane.frame)
-    MkNoteBook(note.frame)
-
-    pane.form(top=0, left=0, right=note, bottom=-1)
-    note.form(top=0, right=-1, bottom=-1)
-
-def MkPanedWindow(w):
-    """The PanedWindow widget allows the user to interactively manipulate
-    the sizes of several panes. The panes can be arranged either vertically
-    or horizontally.
-    """
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='The PanedWindow widget allows the user to interactively manipulate the sizes of several panes. The panes can be arranged either vertically or horizontally.')
-    group = tkinter.tix.LabelEntry(w, label='Newsgroup:', options='entry.width 25')
-    group.entry.insert(0,'comp.lang.python')
-    pane = tkinter.tix.PanedWindow(w, orientation='vertical')
-
-    p1 = pane.add('list', min=70, size=100)
-    p2 = pane.add('text', min=70)
-    list = tkinter.tix.ScrolledListBox(p1)
-    text = tkinter.tix.ScrolledText(p2)
-
-    list.listbox.insert(tkinter.tix.END, "  12324 Re: Tkinter is good for your health")
-    list.listbox.insert(tkinter.tix.END, "+ 12325 Re: Tkinter is good for your health")
-    list.listbox.insert(tkinter.tix.END, "+ 12326 Re: Tix is even better for your health (Was: Tkinter is good...)")
-    list.listbox.insert(tkinter.tix.END, "  12327 Re: Tix is even better for your health (Was: Tkinter is good...)")
-    list.listbox.insert(tkinter.tix.END, "+ 12328 Re: Tix is even better for your health (Was: Tkinter is good...)")
-    list.listbox.insert(tkinter.tix.END, "  12329 Re: Tix is even better for your health (Was: Tkinter is good...)")
-    list.listbox.insert(tkinter.tix.END, "+ 12330 Re: Tix is even better for your health (Was: Tkinter is good...)")
-
-    text.text['bg'] = list.listbox['bg']
-    text.text['wrap'] = 'none'
-    text.text.insert(tkinter.tix.END, """
-Mon, 19 Jun 1995 11:39:52        comp.lang.python              Thread   34 of  220
-Lines 353       A new way to put text and bitmaps together iNo responses
-ioi@blue.seas.upenn.edu                Ioi K. Lam at University of Pennsylvania
-
-Hi,
-
-I have implemented a new image type called "compound". It allows you
-to glue together a bunch of bitmaps, images and text strings together
-to form a bigger image. Then you can use this image with widgets that
-support the -image option. For example, you can display a text string string
-together with a bitmap, at the same time, inside a TK button widget.
-""")
-    list.pack(expand=1, fill=tkinter.tix.BOTH, padx=4, pady=6)
-    text.pack(expand=1, fill=tkinter.tix.BOTH, padx=4, pady=6)
-
-    msg.pack(side=tkinter.tix.TOP, padx=3, pady=3, fill=tkinter.tix.BOTH)
-    group.pack(side=tkinter.tix.TOP, padx=3, pady=3, fill=tkinter.tix.BOTH)
-    pane.pack(side=tkinter.tix.TOP, padx=3, pady=3, fill=tkinter.tix.BOTH, expand=1)
-
-def MkNoteBook(w):
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='The NoteBook widget allows you to layout a complex interface into individual pages.')
-    # prefix = Tix.OptionName(w)
-    # if not prefix: prefix = ''
-    # w.option_add('*' + prefix + '*TixNoteBook*tagPadX', 8)
-    options = "entry.width %d label.width %d label.anchor %s" % (10, 18, tkinter.tix.E)
-
-    nb = tkinter.tix.NoteBook(w, ipadx=6, ipady=6, options=options)
-    nb.add('hard_disk', label="Hard Disk", underline=0)
-    nb.add('network', label="Network", underline=0)
-
-    # Frame for the buttons that are present on all pages
-    common = tkinter.tix.Frame(nb.hard_disk)
-    common.pack(side=tkinter.tix.RIGHT, padx=2, pady=2, fill=tkinter.tix.Y)
-    CreateCommonButtons(common)
-
-    # Widgets belonging only to this page
-    a = tkinter.tix.Control(nb.hard_disk, value=12, label='Access Time: ')
-    w = tkinter.tix.Control(nb.hard_disk, value=400, label='Write Throughput: ')
-    r = tkinter.tix.Control(nb.hard_disk, value=400, label='Read Throughput: ')
-    c = tkinter.tix.Control(nb.hard_disk, value=1021, label='Capacity: ')
-    a.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    w.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    r.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    c.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-
-    common = tkinter.tix.Frame(nb.network)
-    common.pack(side=tkinter.tix.RIGHT, padx=2, pady=2, fill=tkinter.tix.Y)
-    CreateCommonButtons(common)
-
-    a = tkinter.tix.Control(nb.network, value=12, label='Access Time: ')
-    w = tkinter.tix.Control(nb.network, value=400, label='Write Throughput: ')
-    r = tkinter.tix.Control(nb.network, value=400, label='Read Throughput: ')
-    c = tkinter.tix.Control(nb.network, value=1021, label='Capacity: ')
-    u = tkinter.tix.Control(nb.network, value=10, label='Users: ')
-    a.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    w.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    r.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    c.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-    u.pack(side=tkinter.tix.TOP, padx=20, pady=2)
-
-    msg.pack(side=tkinter.tix.TOP, padx=3, pady=3, fill=tkinter.tix.BOTH)
-    nb.pack(side=tkinter.tix.TOP, padx=5, pady=5, fill=tkinter.tix.BOTH, expand=1)
-
-def CreateCommonButtons(f):
-    ok = tkinter.tix.Button(f, text='OK', width = 6)
-    cancel = tkinter.tix.Button(f, text='Cancel', width = 6)
-    ok.pack(side=tkinter.tix.TOP, padx=2, pady=2)
-    cancel.pack(side=tkinter.tix.TOP, padx=2, pady=2)
-
-def MkDirList(nb, name):
-    w = nb.page(name)
-    options = "label.padX 4"
-
-    dir = tkinter.tix.LabelFrame(w, label='Tix.DirList', options=options)
-    fsbox = tkinter.tix.LabelFrame(w, label='Tix.ExFileSelectBox', options=options)
-    MkDirListWidget(dir.frame)
-    MkExFileWidget(fsbox.frame)
-    dir.form(top=0, left=0, right='%40', bottom=-1)
-    fsbox.form(top=0, left='%40', right=-1, bottom=-1)
-
-def MkDirListWidget(w):
-    """The TixDirList widget gives a graphical representation of the file
-    system directory and makes it easy for the user to choose and access
-    directories.
-    """
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='The Tix DirList widget gives a graphical representation of the file system directory and makes it easy for the user to choose and access directories.')
-    dirlist = tkinter.tix.DirList(w, options='hlist.padY 1 hlist.width 25 hlist.height 16')
-    msg.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=3, pady=3)
-    dirlist.pack(side=tkinter.tix.TOP, padx=3, pady=3)
-
-def MkExFileWidget(w):
-    """The TixExFileSelectBox widget is more user friendly than the Motif
-    style FileSelectBox.  """
-    msg = tkinter.tix.Message(w,
-                      relief=tkinter.tix.FLAT, width=240, anchor=tkinter.tix.N,
-                      text='The Tix ExFileSelectBox widget is more user friendly than the Motif style FileSelectBox.')
-    # There's a bug in the ComboBoxes - the scrolledlistbox is destroyed
-    box = tkinter.tix.ExFileSelectBox(w, bd=2, relief=tkinter.tix.RAISED)
-    msg.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=3, pady=3)
-    box.pack(side=tkinter.tix.TOP, padx=3, pady=3)
-
-###
-### List of all the demos we want to show off
-comments = {'widget' : 'Widget Demos', 'image' : 'Image Demos'}
-samples = {'Balloon'            : 'Balloon',
-           'Button Box'         : 'BtnBox',
-           'Combo Box'          : 'ComboBox',
-           'Compound Image'     : 'CmpImg',
-           'Directory List'     : 'DirList',
-           'Directory Tree'     : 'DirTree',
-           'Control'            : 'Control',
-           'Notebook'           : 'NoteBook',
-           'Option Menu'        : 'OptMenu',
-           'Paned Window'       : 'PanedWin',
-           'Popup Menu'         : 'PopMenu',
-           'ScrolledHList (1)'  : 'SHList1',
-           'ScrolledHList (2)'  : 'SHList2',
-           'Tree (dynamic)'     : 'Tree'
-}
-
-# There are still a lot of demos to be translated:
-##      set root {
-##          {d "File Selectors"         file    }
-##          {d "Hierachical ListBox"    hlist   }
-##          {d "Tabular ListBox"        tlist   {c tixTList}}
-##          {d "Grid Widget"            grid    {c tixGrid}}
-##          {d "Manager Widgets"        manager }
-##          {d "Scrolled Widgets"       scroll  }
-##          {d "Miscellaneous Widgets"  misc    }
-##          {d "Image Types"            image   }
-##      }
-##
-##      set image {
-##          {d "Compound Image"         cmpimg  }
-##          {d "XPM Image"              xpm     {i pixmap}}
-##      }
-##
-##      set cmpimg {
-##done      {f "In Buttons"             CmpImg.tcl      }
-##          {f "In NoteBook"            CmpImg2.tcl     }
-##          {f "Notebook Color Tabs"    CmpImg4.tcl     }
-##          {f "Icons"                  CmpImg3.tcl     }
-##      }
-##
-##      set xpm {
-##          {f "In Button"              Xpm.tcl         {i pixmap}}
-##          {f "In Menu"                Xpm1.tcl        {i pixmap}}
-##      }
-##
-##      set file {
-##added     {f DirList                          DirList.tcl     }
-##added     {f DirTree                          DirTree.tcl     }
-##          {f DirSelectDialog                  DirDlg.tcl      }
-##          {f ExFileSelectDialog               EFileDlg.tcl    }
-##          {f FileSelectDialog                 FileDlg.tcl     }
-##          {f FileEntry                        FileEnt.tcl     }
-##      }
-##
-##      set hlist {
-##          {f HList                    HList1.tcl      }
-##          {f CheckList                ChkList.tcl     {c tixCheckList}}
-##done      {f "ScrolledHList (1)"      SHList.tcl      }
-##done      {f "ScrolledHList (2)"      SHList2.tcl     }
-##done      {f Tree                     Tree.tcl        }
-##done      {f "Tree (Dynamic)"         DynTree.tcl     {v win}}
-##      }
-##
-##      set tlist {
-##          {f "ScrolledTList (1)"      STList1.tcl     {c tixTList}}
-##          {f "ScrolledTList (2)"      STList2.tcl     {c tixTList}}
-##      }
-##      global tcl_platform
-##      #  This demo hangs windows
-##      if {$tcl_platform(platform) != "windows"} {
-##na    lappend tlist     {f "TList File Viewer"        STList3.tcl     {c tixTList}}
-##      }
-##
-##      set grid {
-##na        {f "Simple Grid"            SGrid0.tcl      {c tixGrid}}
-##na        {f "ScrolledGrid"           SGrid1.tcl      {c tixGrid}}
-##na        {f "Editable Grid"          EditGrid.tcl    {c tixGrid}}
-##      }
-##
-##      set scroll {
-##          {f ScrolledListBox          SListBox.tcl    }
-##          {f ScrolledText             SText.tcl       }
-##          {f ScrolledWindow           SWindow.tcl     }
-##na        {f "Canvas Object View"     CObjView.tcl    {c tixCObjView}}
-##      }
-##
-##      set manager {
-##          {f ListNoteBook             ListNBK.tcl     }
-##done      {f NoteBook                 NoteBook.tcl    }
-##done      {f PanedWindow              PanedWin.tcl    }
-##      }
-##
-##      set misc {
-##done      {f Balloon                  Balloon.tcl     }
-##done      {f ButtonBox                BtnBox.tcl      }
-##done      {f ComboBox                 ComboBox.tcl    }
-##done      {f Control                  Control.tcl     }
-##          {f LabelEntry               LabEntry.tcl    }
-##          {f LabelFrame               LabFrame.tcl    }
-##          {f Meter                    Meter.tcl       {c tixMeter}}
-##done      {f OptionMenu               OptMenu.tcl     }
-##done      {f PopupMenu                PopMenu.tcl     }
-##          {f Select                   Select.tcl      }
-##          {f StdButtonBox             StdBBox.tcl     }
-##      }
-##
-
-stypes = {}
-stypes['widget'] = ['Balloon', 'Button Box', 'Combo Box', 'Control',
-                    'Directory List', 'Directory Tree',
-                    'Notebook', 'Option Menu', 'Popup Menu', 'Paned Window',
-                    'ScrolledHList (1)', 'ScrolledHList (2)', 'Tree (dynamic)']
-stypes['image'] = ['Compound Image']
-
-def MkSample(nb, name):
-    w = nb.page(name)
-    options = "label.padX 4"
-
-    pane = tkinter.tix.PanedWindow(w, orientation='horizontal')
-    pane.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH)
-    f1 = pane.add('list', expand='1')
-    f2 = pane.add('text', expand='5')
-    f1['relief'] = 'flat'
-    f2['relief'] = 'flat'
-
-    lab = tkinter.tix.LabelFrame(f1, label='Select a sample program:')
-    lab.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=5, pady=5)
-    lab1 = tkinter.tix.LabelFrame(f2, label='Source:')
-    lab1.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=5, pady=5)
-
-    slb = tkinter.tix.Tree(lab.frame, options='hlist.width 20')
-    slb.pack(side=tkinter.tix.TOP, expand=1, fill=tkinter.tix.BOTH, padx=5)
-
-    stext = tkinter.tix.ScrolledText(lab1.frame, name='stext')
-    font = root.tk.eval('tix option get fixed_font')
-    stext.text.config(font=font)
-
-    frame = tkinter.tix.Frame(lab1.frame, name='frame')
-
-    run = tkinter.tix.Button(frame, text='Run ...', name='run')
-    view = tkinter.tix.Button(frame, text='View Source ...', name='view')
-    run.pack(side=tkinter.tix.LEFT, expand=0, fill=tkinter.tix.NONE)
-    view.pack(side=tkinter.tix.LEFT, expand=0, fill=tkinter.tix.NONE)
-
-    stext.text['bg'] = slb.hlist['bg']
-    stext.text['state'] = 'disabled'
-    stext.text['wrap'] = 'none'
-    stext.text['width'] = 80
-
-    frame.pack(side=tkinter.tix.BOTTOM, expand=0, fill=tkinter.tix.X, padx=7)
-    stext.pack(side=tkinter.tix.TOP, expand=0, fill=tkinter.tix.BOTH, padx=7)
-
-    slb.hlist['separator'] = '.'
-    slb.hlist['width'] = 25
-    slb.hlist['drawbranch'] = 0
-    slb.hlist['indent'] = 10
-    slb.hlist['wideselect'] = 1
-    slb.hlist['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'run')
-    slb.hlist['browsecmd'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'browse')
-
-    run['command']      = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'run')
-    view['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'view')
-
-    for type in ['widget', 'image']:
-        if type != 'widget':
-            x = tkinter.tix.Frame(slb.hlist, bd=2, height=2, width=150,
-                          relief=tkinter.tix.SUNKEN, bg=slb.hlist['bg'])
-            slb.hlist.add_child(itemtype=tkinter.tix.WINDOW, window=x, state='disabled')
-        x = slb.hlist.add_child(itemtype=tkinter.tix.TEXT, state='disabled',
-                                text=comments[type])
-        for key in stypes[type]:
-            slb.hlist.add_child(x, itemtype=tkinter.tix.TEXT, data=key,
-                                text=key)
-    slb.hlist.selection_clear()
-
-    run['state'] = 'disabled'
-    view['state'] = 'disabled'
-
-def Sample_Action(w, slb, stext, run, view, action):
-    global demo
-
-    hlist = slb.hlist
-    anchor = hlist.info_anchor()
-    if not anchor:
-        run['state'] = 'disabled'
-        view['state'] = 'disabled'
-    elif not hlist.info_parent(anchor):
-        # a comment
-        return
-
-    run['state'] = 'normal'
-    view['state'] = 'normal'
-    key = hlist.info_data(anchor)
-    title = key
-    prog = samples[key]
-
-    if action == 'run':
-        exec('import ' + prog)
-        w = tkinter.tix.Toplevel()
-        w.title(title)
-        rtn = eval(prog + '.RunSample')
-        rtn(w)
-    elif action == 'view':
-        w = tkinter.tix.Toplevel()
-        w.title('Source view: ' + title)
-        LoadFile(w, demo.dir + '/samples/' + prog + '.py')
-    elif action == 'browse':
-        ReadFile(stext.text, demo.dir + '/samples/' + prog + '.py')
-
-def LoadFile(w, fname):
-    global root
-    b = tkinter.tix.Button(w, text='Close', command=w.destroy)
-    t = tkinter.tix.ScrolledText(w)
-    #    b.form(left=0, bottom=0, padx=4, pady=4)
-    #    t.form(left=0, bottom=b, right='-0', top=0)
-    t.pack()
-    b.pack()
-
-    font = root.tk.eval('tix option get fixed_font')
-    t.text.config(font=font)
-    t.text['bd'] = 2
-    t.text['wrap'] = 'none'
-
-    ReadFile(t.text, fname)
-
-def ReadFile(w, fname):
-    old_state = w['state']
-    w['state'] = 'normal'
-    w.delete('0.0', tkinter.tix.END)
-
-    try:
-        f = open(fname)
-        lines = f.readlines()
-        for s in lines:
-            w.insert(tkinter.tix.END, s)
-        f.close()
-    finally:
-#       w.see('1.0')
-        w['state'] = old_state
-
-if __name__ == '__main__':
-    root = tkinter.tix.Tk()
-    RunMain(root)
diff --git a/Demo/tkinter/README b/Demo/tkinter/README
deleted file mode 100644
index c9f18df..0000000
--- a/Demo/tkinter/README
+++ /dev/null
@@ -1,11 +0,0 @@
-Several collections of example code for Tkinter.
-
-See the toplevel README for an explanation of the difference between
-Tkinter and _tkinter, how to enable the Python Tk interface, and where
-to get Matt Conway's lifesaver document.
-
-Subdirectories:
-
-guido		my original example set (fairly random collection)
-matt		Matt Conway's examples, to go with his lifesaver document
-ttk         Examples using the ttk module
diff --git a/Demo/tkinter/guido/attr_dialog.py b/Demo/tkinter/guido/attr_dialog.py
deleted file mode 100644
index 229a558..0000000
--- a/Demo/tkinter/guido/attr_dialog.py
+++ /dev/null
@@ -1,460 +0,0 @@
-
-# The options of a widget are described by the following attributes
-# of the Pack and Widget dialogs:
-#
-# Dialog.current: {name: value}
-# -- changes during Widget's lifetime
-#
-# Dialog.options: {name: (default, klass)}
-# -- depends on widget class only
-#
-# Dialog.classes: {klass: (v0, v1, v2, ...) | 'boolean' | 'other'}
-# -- totally static, though different between PackDialog and WidgetDialog
-#    (but even that could be unified)
-
-from tkinter import *
-
-
-class Option:
-
-    varclass = StringVar            # May be overridden
-
-    def __init__(self, dialog, option):
-        self.dialog = dialog
-        self.option = option
-        self.master = dialog.top
-        self.default, self.klass = dialog.options[option]
-        self.var = self.varclass(self.master)
-        self.frame = Frame(self.master)
-        self.frame.pack(fill=X)
-        self.label = Label(self.frame, text=(option + ":"))
-        self.label.pack(side=LEFT)
-        self.update()
-        self.addoption()
-
-    def refresh(self):
-        self.dialog.refresh()
-        self.update()
-
-    def update(self):
-        try:
-            self.current = self.dialog.current[self.option]
-        except KeyError:
-            self.current = self.default
-        self.var.set(self.current)
-
-    def set(self, e=None):          # Should be overridden
-        pass
-
-
-class BooleanOption(Option):
-
-    varclass = BooleanVar
-
-    def addoption(self):
-        self.button = Checkbutton(self.frame,
-                                 text='on/off',
-                                 onvalue=1,
-                                 offvalue=0,
-                                 variable=self.var,
-                                 relief=RAISED,
-                                 borderwidth=2,
-                                 command=self.set)
-        self.button.pack(side=RIGHT)
-
-
-class EnumOption(Option):
-
-    def addoption(self):
-        self.button = Menubutton(self.frame,
-                                 textvariable=self.var,
-                                 relief=RAISED, borderwidth=2)
-        self.button.pack(side=RIGHT)
-        self.menu = Menu(self.button)
-        self.button['menu'] = self.menu
-        for v in self.dialog.classes[self.klass]:
-            self.menu.add_radiobutton(
-                label=v,
-                variable=self.var,
-                value=v,
-                command=self.set)
-
-
-class StringOption(Option):
-
-    def addoption(self):
-        self.entry = Entry(self.frame,
-                           textvariable=self.var,
-                           width=10,
-                           relief=SUNKEN,
-                           borderwidth=2)
-        self.entry.pack(side=RIGHT, fill=X, expand=1)
-        self.entry.bind('<Return>', self.set)
-
-
-class ReadonlyOption(Option):
-
-    def addoption(self):
-        self.label = Label(self.frame, textvariable=self.var,
-                           anchor=E)
-        self.label.pack(side=RIGHT)
-
-
-class Dialog:
-
-    def __init__(self, master):
-        self.master = master
-        self.fixclasses()
-        self.refresh()
-        self.top = Toplevel(self.master)
-        self.top.title(self.__class__.__name__)
-        self.top.minsize(1, 1)
-        self.addchoices()
-
-    def refresh(self): pass         # Must override
-
-    def fixclasses(self): pass      # May override
-
-    def addchoices(self):
-        self.choices = {}
-        list = []
-        for k, dc in self.options.items():
-            list.append((k, dc))
-        list.sort()
-        for k, (d, c) in list:
-            try:
-                cl = self.classes[c]
-            except KeyError:
-                cl = 'unknown'
-            if type(cl) is tuple:
-                cl = self.enumoption
-            elif cl == 'boolean':
-                cl = self.booleanoption
-            elif cl == 'readonly':
-                cl = self.readonlyoption
-            else:
-                cl = self.stringoption
-            self.choices[k] = cl(self, k)
-
-    # Must override:
-    options = {}
-    classes = {}
-
-    # May override:
-    booleanoption = BooleanOption
-    stringoption = StringOption
-    enumoption = EnumOption
-    readonlyoption = ReadonlyOption
-
-
-class PackDialog(Dialog):
-
-    def __init__(self, widget):
-        self.widget = widget
-        Dialog.__init__(self, widget)
-
-    def refresh(self):
-        self.current = self.widget.info()
-        self.current['.class'] = self.widget.winfo_class()
-        self.current['.name'] = self.widget._w
-
-    class packoption: # Mix-in class
-        def set(self, e=None):
-            self.current = self.var.get()
-            try:
-                self.dialog.widget.pack(**{self.option: self.current})
-            except TclError as msg:
-                print(msg)
-                self.refresh()
-
-    class booleanoption(packoption, BooleanOption): pass
-    class enumoption(packoption, EnumOption): pass
-    class stringoption(packoption, StringOption): pass
-    class readonlyoption(packoption, ReadonlyOption): pass
-
-    options = {
-            '.class': (None, 'Class'),
-            '.name': (None, 'Name'),
-            'after': (None, 'Widget'),
-            'anchor': ('center', 'Anchor'),
-            'before': (None, 'Widget'),
-            'expand': ('no', 'Boolean'),
-            'fill': ('none', 'Fill'),
-            'in': (None, 'Widget'),
-            'ipadx': (0, 'Pad'),
-            'ipady': (0, 'Pad'),
-            'padx': (0, 'Pad'),
-            'pady': (0, 'Pad'),
-            'side': ('top', 'Side'),
-            }
-
-    classes = {
-            'Anchor': (N, NE, E, SE, S, SW, W, NW, CENTER),
-            'Boolean': 'boolean',
-            'Class': 'readonly',
-            'Expand': 'boolean',
-            'Fill': (NONE, X, Y, BOTH),
-            'Name': 'readonly',
-            'Pad': 'pixel',
-            'Side': (TOP, RIGHT, BOTTOM, LEFT),
-            'Widget': 'readonly',
-            }
-
-class RemotePackDialog(PackDialog):
-
-    def __init__(self, master, app, widget):
-        self.master = master
-        self.app = app
-        self.widget = widget
-        self.refresh()
-        self.top = Toplevel(self.master)
-        self.top.title(self.app + ' PackDialog')
-        self.top.minsize(1, 1)
-        self.addchoices()
-
-    def refresh(self):
-        try:
-            words = self.master.tk.splitlist(
-                    self.master.send(self.app,
-                                     'pack',
-                                     'info',
-                                     self.widget))
-        except TclError as msg:
-            print(msg)
-            return
-        dict = {}
-        for i in range(0, len(words), 2):
-            key = words[i][1:]
-            value = words[i+1]
-            dict[key] = value
-        dict['.class'] = self.master.send(self.app,
-                                          'winfo',
-                                          'class',
-                                          self.widget)
-        dict['.name'] = self.widget
-        self.current = dict
-
-    class remotepackoption: # Mix-in class
-        def set(self, e=None):
-            self.current = self.var.get()
-            try:
-                self.dialog.master.send(
-                        self.dialog.app,
-                        'pack',
-                        'config',
-                        self.dialog.widget,
-                        '-'+self.option,
-                        self.dialog.master.tk.merge(
-                                self.current))
-            except TclError as msg:
-                print(msg)
-                self.refresh()
-
-    class booleanoption(remotepackoption, BooleanOption): pass
-    class enumoption(remotepackoption, EnumOption): pass
-    class stringoption(remotepackoption, StringOption): pass
-    class readonlyoption(remotepackoption, ReadonlyOption): pass
-
-
-class WidgetDialog(Dialog):
-
-    def __init__(self, widget):
-        self.widget = widget
-        self.klass = widget.winfo_class()
-        Dialog.__init__(self, widget)
-
-    def fixclasses(self):
-        if self.klass in self.addclasses:
-            classes = {}
-            for c in (self.classes,
-                      self.addclasses[self.klass]):
-                for k in c.keys():
-                    classes[k] = c[k]
-            self.classes = classes
-
-    def refresh(self):
-        self.configuration = self.widget.config()
-        self.update()
-        self.current['.class'] = self.widget.winfo_class()
-        self.current['.name'] = self.widget._w
-
-    def update(self):
-        self.current = {}
-        self.options = {}
-        for k, v in self.configuration.items():
-            if len(v) > 4:
-                self.current[k] = v[4]
-                self.options[k] = v[3], v[2] # default, klass
-        self.options['.class'] = (None, 'Class')
-        self.options['.name'] = (None, 'Name')
-
-    class widgetoption: # Mix-in class
-        def set(self, e=None):
-            self.current = self.var.get()
-            try:
-                self.dialog.widget[self.option] = self.current
-            except TclError as msg:
-                print(msg)
-                self.refresh()
-
-    class booleanoption(widgetoption, BooleanOption): pass
-    class enumoption(widgetoption, EnumOption): pass
-    class stringoption(widgetoption, StringOption): pass
-    class readonlyoption(widgetoption, ReadonlyOption): pass
-
-    # Universal classes
-    classes = {
-            'Anchor': (N, NE, E, SE, S, SW, W, NW, CENTER),
-            'Aspect': 'integer',
-            'Background': 'color',
-            'Bitmap': 'bitmap',
-            'BorderWidth': 'pixel',
-            'Class': 'readonly',
-            'CloseEnough': 'double',
-            'Command': 'command',
-            'Confine': 'boolean',
-            'Cursor': 'cursor',
-            'CursorWidth': 'pixel',
-            'DisabledForeground': 'color',
-            'ExportSelection': 'boolean',
-            'Font': 'font',
-            'Foreground': 'color',
-            'From': 'integer',
-            'Geometry': 'geometry',
-            'Height': 'pixel',
-            'InsertWidth': 'time',
-            'Justify': (LEFT, CENTER, RIGHT),
-            'Label': 'string',
-            'Length': 'pixel',
-            'MenuName': 'widget',
-            'Name': 'readonly',
-            'OffTime': 'time',
-            'OnTime': 'time',
-            'Orient': (HORIZONTAL, VERTICAL),
-            'Pad': 'pixel',
-            'Relief': (RAISED, SUNKEN, FLAT, RIDGE, GROOVE),
-            'RepeatDelay': 'time',
-            'RepeatInterval': 'time',
-            'ScrollCommand': 'command',
-            'ScrollIncrement': 'pixel',
-            'ScrollRegion': 'rectangle',
-            'ShowValue': 'boolean',
-            'SetGrid': 'boolean',
-            'Sliderforeground': 'color',
-            'SliderLength': 'pixel',
-            'Text': 'string',
-            'TickInterval': 'integer',
-            'To': 'integer',
-            'Underline': 'index',
-            'Variable': 'variable',
-            'Value': 'string',
-            'Width': 'pixel',
-            'Wrap': (NONE, CHAR, WORD),
-            }
-
-    # Classes that (may) differ per widget type
-    _tristate = {'State': (NORMAL, ACTIVE, DISABLED)}
-    _bistate = {'State': (NORMAL, DISABLED)}
-    addclasses = {
-            'Button': _tristate,
-            'Radiobutton': _tristate,
-            'Checkbutton': _tristate,
-            'Entry': _bistate,
-            'Text': _bistate,
-            'Menubutton': _tristate,
-            'Slider': _bistate,
-            }
-
-
-class RemoteWidgetDialog(WidgetDialog):
-
-    def __init__(self, master, app, widget):
-        self.app = app
-        self.widget = widget
-        self.klass = master.send(self.app,
-                                 'winfo',
-                                 'class',
-                                 self.widget)
-        Dialog.__init__(self, master)
-
-    def refresh(self):
-        try:
-            items = self.master.tk.splitlist(
-                    self.master.send(self.app,
-                                     self.widget,
-                                     'config'))
-        except TclError as msg:
-            print(msg)
-            return
-        dict = {}
-        for item in items:
-            words = self.master.tk.splitlist(item)
-            key = words[0][1:]
-            value = (key,) + words[1:]
-            dict[key] = value
-        self.configuration = dict
-        self.update()
-        self.current['.class'] = self.klass
-        self.current['.name'] = self.widget
-
-    class remotewidgetoption: # Mix-in class
-        def set(self, e=None):
-            self.current = self.var.get()
-            try:
-                self.dialog.master.send(
-                        self.dialog.app,
-                        self.dialog.widget,
-                        'config',
-                        '-'+self.option,
-                        self.current)
-            except TclError as msg:
-                print(msg)
-                self.refresh()
-
-    class booleanoption(remotewidgetoption, BooleanOption): pass
-    class enumoption(remotewidgetoption, EnumOption): pass
-    class stringoption(remotewidgetoption, StringOption): pass
-    class readonlyoption(remotewidgetoption, ReadonlyOption): pass
-
-
-def test():
-    import sys
-    root = Tk()
-    root.minsize(1, 1)
-    if sys.argv[1:]:
-        remotetest(root, sys.argv[1])
-    else:
-        frame = Frame(root, name='frame')
-        frame.pack(expand=1, fill=BOTH)
-        button = Button(frame, name='button', text='button')
-        button.pack(expand=1)
-        canvas = Canvas(frame, name='canvas')
-        canvas.pack()
-        fpd = PackDialog(frame)
-        fwd = WidgetDialog(frame)
-        bpd = PackDialog(button)
-        bwd = WidgetDialog(button)
-        cpd = PackDialog(canvas)
-        cwd = WidgetDialog(canvas)
-    root.mainloop()
-
-def remotetest(root, app):
-    from listtree import listtree
-    list = listtree(root, app)
-    list.bind('<Any-Double-1>', opendialogs)
-    list.app = app                  # Pass it on to handler
-
-def opendialogs(e):
-    list = e.widget
-    sel = list.curselection()
-    for i in sel:
-        item = list.get(i)
-        widget = item.split()[0]
-        RemoteWidgetDialog(list, list.app, widget)
-        if widget == '.': continue
-        try:
-            RemotePackDialog(list, list.app, widget)
-        except TclError as msg:
-            print(msg)
-
-test()
diff --git a/Demo/tkinter/guido/brownian.py b/Demo/tkinter/guido/brownian.py
deleted file mode 100644
index 7ab3e67..0000000
--- a/Demo/tkinter/guido/brownian.py
+++ /dev/null
@@ -1,50 +0,0 @@
-# Brownian motion -- an example of a multi-threaded Tkinter program.
-
-from tkinter import *
-import random
-import threading
-import time
-import sys
-
-WIDTH = 400
-HEIGHT = 300
-SIGMA = 10
-BUZZ = 2
-RADIUS = 2
-LAMBDA = 10
-FILL = 'red'
-
-stop = 0                                # Set when main loop exits
-
-def particle(canvas):
-    r = RADIUS
-    x = random.gauss(WIDTH/2.0, SIGMA)
-    y = random.gauss(HEIGHT/2.0, SIGMA)
-    p = canvas.create_oval(x-r, y-r, x+r, y+r, fill=FILL)
-    while not stop:
-        dx = random.gauss(0, BUZZ)
-        dy = random.gauss(0, BUZZ)
-        dt = random.expovariate(LAMBDA)
-        try:
-            canvas.move(p, dx, dy)
-        except TclError:
-            break
-        time.sleep(dt)
-
-def main():
-    global stop
-    root = Tk()
-    canvas = Canvas(root, width=WIDTH, height=HEIGHT)
-    canvas.pack(fill='both', expand=1)
-    np = 30
-    if sys.argv[1:]:
-        np = int(sys.argv[1])
-    for i in range(np):
-        t = threading.Thread(target=particle, args=(canvas,))
-        t.start()
-    try:
-        root.mainloop()
-    finally:
-        stop = 1
-
-main()
diff --git a/Demo/tkinter/guido/brownian2.py b/Demo/tkinter/guido/brownian2.py
deleted file mode 100644
index 3adcd68..0000000
--- a/Demo/tkinter/guido/brownian2.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Brownian motion -- an example of a NON multi-threaded Tkinter program ;)
-# By Michele Simoniato, inspired by brownian.py
-
-from tkinter import *
-import random
-import sys
-
-WIDTH = 400
-HEIGHT = 300
-SIGMA = 10
-BUZZ = 2
-RADIUS = 2
-LAMBDA = 10
-FILL = 'red'
-
-stop = 0                                # Set when main loop exits
-root = None                             # main window
-
-def particle(canvas):                   # particle = iterator over the moves
-    r = RADIUS
-    x = random.gauss(WIDTH/2.0, SIGMA)
-    y = random.gauss(HEIGHT/2.0, SIGMA)
-    p = canvas.create_oval(x-r, y-r, x+r, y+r, fill=FILL)
-    while not stop:
-        dx = random.gauss(0, BUZZ)
-        dy = random.gauss(0, BUZZ)
-        try:
-            canvas.move(p, dx, dy)
-        except TclError:
-            break
-        else:
-            yield None
-
-def move(particle): # move the particle at random time
-    next(particle)
-    dt = random.expovariate(LAMBDA)
-    root.after(int(dt*1000), move, particle)
-
-def main():
-    global root, stop
-    root = Tk()
-    canvas = Canvas(root, width=WIDTH, height=HEIGHT)
-    canvas.pack(fill='both', expand=1)
-    np = 30
-    if sys.argv[1:]:
-        np = int(sys.argv[1])
-    for i in range(np):                  # start the dance
-        move(particle(canvas))
-    try:
-        root.mainloop()
-    finally:
-        stop = 1
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/canvasevents.py b/Demo/tkinter/guido/canvasevents.py
deleted file mode 100644
index 16312b5..0000000
--- a/Demo/tkinter/guido/canvasevents.py
+++ /dev/null
@@ -1,264 +0,0 @@
-#! /usr/bin/env python3
-
-from tkinter import *
-
-
-# Since Canvas.Group is no longer present, the following class reproduces
-# a subset of the old Group class that is used by this app.
-
-class Group:
-    def __init__(self, canvas, tag=None):
-        if tag is None:
-            tag = 'Group%d' % id(self)
-
-        self.tag = self.id = tag
-        self.canvas = canvas
-        self.canvas.dtag(self.tag)
-
-    def __str__(self):
-        return self.tag
-
-    def _do(self, cmd, *args):
-        return self.canvas.tk.call(self.canvas._w, cmd, self.tag, *args)
-
-    def addtag_withtag(self, tagOrId):
-        self._do('addtag', 'withtag', tagOrId)
-
-    def bind(self, sequence=None, command=None, add=None):
-        return self.canvas.tag_bind(self.id, sequence, command, add)
-
-    def move(self, x_amount, y_amount):
-        self._do('move', x_amount, y_amount)
-
-    def dtag(self, tagToDelete=None):
-        self._do('dtag', tagToDelete)
-
-    def tkraise(self, aboveThis=None):
-        self._do('raise', aboveThis)
-
-
-class Object:
-
-    """Base class for composite graphical objects.
-
-    Objects belong to a canvas, and can be moved around on the canvas.
-    They also belong to at most one ``pile'' of objects, and can be
-    transferred between piles (or removed from their pile).
-
-    Objects have a canonical ``x, y'' position which is moved when the
-    object is moved.  Where the object is relative to this position
-    depends on the object; for simple objects, it may be their center.
-
-    Objects have mouse sensitivity.  They can be clicked, dragged and
-    double-clicked.  The behavior may actually determined by the pile
-    they are in.
-
-    All instance attributes are public since the derived class may
-    need them.
-    """
-
-    def __init__(self, canvas, x=0, y=0, fill='red', text='object'):
-        self.canvas = canvas
-        self.x = x
-        self.y = y
-        self.pile = None
-        self.group = Group(self.canvas)
-        self.createitems(fill, text)
-
-    def __str__(self):
-        return str(self.group)
-
-    def createitems(self, fill, text):
-        self.__oval = self.canvas.create_oval(self.x - 20, self.y - 10,
-            self.x + 20, self.y + 20, fill=fill, width=3)
-        self.group.addtag_withtag(self.__oval)
-        self.__text = self.canvas.create_text(self.x, self.y, text=text)
-        self.group.addtag_withtag(self.__text)
-
-    def moveby(self, dx, dy):
-        if dx == dy == 0:
-            return
-        self.group.move(dx, dy)
-        self.x = self.x + dx
-        self.y = self.y + dy
-
-    def moveto(self, x, y):
-        self.moveby(x - self.x, y - self.y)
-
-    def transfer(self, pile):
-        if self.pile:
-            self.pile.delete(self)
-            self.pile = None
-        self.pile = pile
-        if self.pile:
-            self.pile.add(self)
-
-    def tkraise(self):
-        self.group.tkraise()
-
-
-class Bottom(Object):
-    """An object to serve as the bottom of a pile."""
-
-    def createitems(self, *args):
-        self.__oval = self.canvas.create_oval(self.x - 20, self.y - 10,
-            self.x + 20, self.y + 10, fill='gray', outline='')
-        self.group.addtag_withtag(self.__oval)
-
-
-class Pile:
-    """A group of graphical objects."""
-
-    def __init__(self, canvas, x, y, tag=None):
-        self.canvas = canvas
-        self.x = x
-        self.y = y
-        self.objects = []
-        self.bottom = Bottom(self.canvas, self.x, self.y)
-        self.group = Group(self.canvas, tag=tag)
-        self.group.addtag_withtag(self.bottom.group)
-        self.bindhandlers()
-
-    def bindhandlers(self):
-        self.group.bind('<1>', self.clickhandler)
-        self.group.bind('<Double-1>', self.doubleclickhandler)
-
-    def add(self, object):
-        self.objects.append(object)
-        self.group.addtag_withtag(object.group)
-        self.position(object)
-
-    def delete(self, object):
-        object.group.dtag(self.group)
-        self.objects.remove(object)
-
-    def position(self, object):
-        object.tkraise()
-        i = self.objects.index(object)
-        object.moveto(self.x + i*4, self.y + i*8)
-
-    def clickhandler(self, event):
-        pass
-
-    def doubleclickhandler(self, event):
-        pass
-
-
-class MovingPile(Pile):
-
-    def bindhandlers(self):
-        Pile.bindhandlers(self)
-        self.group.bind('<B1-Motion>', self.motionhandler)
-        self.group.bind('<ButtonRelease-1>', self.releasehandler)
-
-    movethis = None
-
-    def clickhandler(self, event):
-        tags = self.canvas.gettags('current')
-        for i in range(len(self.objects)):
-            o = self.objects[i]
-            if o.group.tag in tags:
-                break
-        else:
-            self.movethis = None
-            return
-        self.movethis = self.objects[i:]
-        for o in self.movethis:
-            o.tkraise()
-        self.lastx = event.x
-        self.lasty = event.y
-
-    doubleclickhandler = clickhandler
-
-    def motionhandler(self, event):
-        if not self.movethis:
-            return
-        dx = event.x - self.lastx
-        dy = event.y - self.lasty
-        self.lastx = event.x
-        self.lasty = event.y
-        for o in self.movethis:
-            o.moveby(dx, dy)
-
-    def releasehandler(self, event):
-        objects = self.movethis
-        if not objects:
-            return
-        self.movethis = None
-        self.finishmove(objects)
-
-    def finishmove(self, objects):
-        for o in objects:
-            self.position(o)
-
-
-class Pile1(MovingPile):
-
-    x = 50
-    y = 50
-    tag = 'p1'
-
-    def __init__(self, demo):
-        self.demo = demo
-        MovingPile.__init__(self, self.demo.canvas, self.x, self.y, self.tag)
-
-    def doubleclickhandler(self, event):
-        try:
-            o = self.objects[-1]
-        except IndexError:
-            return
-        o.transfer(self.other())
-        MovingPile.doubleclickhandler(self, event)
-
-    def other(self):
-        return self.demo.p2
-
-    def finishmove(self, objects):
-        o = objects[0]
-        p = self.other()
-        x, y = o.x, o.y
-        if (x-p.x)**2 + (y-p.y)**2 < (x-self.x)**2 + (y-self.y)**2:
-            for o in objects:
-                o.transfer(p)
-        else:
-            MovingPile.finishmove(self, objects)
-
-class Pile2(Pile1):
-
-    x = 150
-    y = 50
-    tag = 'p2'
-
-    def other(self):
-        return self.demo.p1
-
-
-class Demo:
-
-    def __init__(self, master):
-        self.master = master
-        self.canvas = Canvas(master,
-                             width=200, height=200,
-                             background='yellow',
-                             relief=SUNKEN, borderwidth=2)
-        self.canvas.pack(expand=1, fill=BOTH)
-        self.p1 = Pile1(self)
-        self.p2 = Pile2(self)
-        o1 = Object(self.canvas, fill='red', text='o1')
-        o2 = Object(self.canvas, fill='green', text='o2')
-        o3 = Object(self.canvas, fill='light blue', text='o3')
-        o1.transfer(self.p1)
-        o2.transfer(self.p1)
-        o3.transfer(self.p2)
-
-
-# Main function, run when invoked as a stand-alone Python program.
-
-def main():
-    root = Tk()
-    demo = Demo(root)
-    root.protocol('WM_DELETE_WINDOW', root.quit)
-    root.mainloop()
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/dialog.py b/Demo/tkinter/guido/dialog.py
deleted file mode 100755
index eae9c7e..0000000
--- a/Demo/tkinter/guido/dialog.py
+++ /dev/null
@@ -1,108 +0,0 @@
-#! /usr/bin/env python3
-
-# A Python function that generates dialog boxes with a text message,
-# optional bitmap, and any number of buttons.
-# Cf. Ousterhout, Tcl and the Tk Toolkit, Figs. 27.2-3, pp. 269-270.
-
-from tkinter import *
-import sys
-
-
-def dialog(master, title, text, bitmap, default, *args):
-
-    # 1. Create the top-level window and divide it into top
-    # and bottom parts.
-
-    w = Toplevel(master, class_='Dialog')
-    w.title(title)
-    w.iconname('Dialog')
-
-    top = Frame(w, relief=RAISED, borderwidth=1)
-    top.pack(side=TOP, fill=BOTH)
-    bot = Frame(w, relief=RAISED, borderwidth=1)
-    bot.pack(side=BOTTOM, fill=BOTH)
-
-    # 2. Fill the top part with the bitmap and message.
-
-    msg = Message(top, width='3i', text=text)
-    msg.pack(side=RIGHT, expand=1, fill=BOTH, padx='3m', pady='3m')
-    if bitmap:
-        bm = Label(top, bitmap=bitmap)
-        bm.pack(side=LEFT, padx='3m', pady='3m')
-
-    # 3. Create a row of buttons at the bottom of the dialog.
-
-    var = IntVar()
-    buttons = []
-    i = 0
-    for but in args:
-        b = Button(bot, text=but, command=lambda v=var,i=i: v.set(i))
-        buttons.append(b)
-        if i == default:
-            bd = Frame(bot, relief=SUNKEN, borderwidth=1)
-            bd.pack(side=LEFT, expand=1, padx='3m', pady='2m')
-            b.lift()
-            b.pack (in_=bd, side=LEFT,
-                    padx='2m', pady='2m', ipadx='2m', ipady='1m')
-        else:
-            b.pack (side=LEFT, expand=1,
-                    padx='3m', pady='3m', ipadx='2m', ipady='1m')
-        i = i+1
-
-    # 4. Set up a binding for <Return>, if there's a default,
-    # set a grab, and claim the focus too.
-
-    if default >= 0:
-        w.bind('<Return>',
-               lambda e, b=buttons[default], v=var, i=default:
-               (b.flash(),
-                v.set(i)))
-
-    oldFocus = w.focus_get()
-    w.grab_set()
-    w.focus_set()
-
-    # 5. Wait for the user to respond, then restore the focus
-    # and return the index of the selected button.
-
-    w.waitvar(var)
-    w.destroy()
-    if oldFocus: oldFocus.focus_set()
-    return var.get()
-
-# The rest is the test program.
-
-def go():
-    i = dialog(mainWidget,
-               'Not Responding',
-               "The file server isn't responding right now; "
-               "I'll keep trying.",
-               '',
-               -1,
-               'OK')
-    print('pressed button', i)
-    i = dialog(mainWidget,
-               'File Modified',
-               'File "tcl.h" has been modified since '
-               'the last time it was saved. '
-               'Do you want to save it before exiting the application?',
-               'warning',
-               0,
-               'Save File',
-               'Discard Changes',
-               'Return To Editor')
-    print('pressed button', i)
-
-def test():
-    import sys
-    global mainWidget
-    mainWidget = Frame()
-    Pack.config(mainWidget)
-    start = Button(mainWidget, text='Press Here To Start', command=go)
-    start.pack()
-    endit = Button(mainWidget, text="Exit", command=sys.exit)
-    endit.pack(fill=BOTH)
-    mainWidget.mainloop()
-
-if __name__ == '__main__':
-    test()
diff --git a/Demo/tkinter/guido/electrons.py b/Demo/tkinter/guido/electrons.py
deleted file mode 100755
index 896e079..0000000
--- a/Demo/tkinter/guido/electrons.py
+++ /dev/null
@@ -1,91 +0,0 @@
-#! /usr/bin/env python3
-
-# Simulate "electrons" migrating across the screen.
-# An optional bitmap file in can be in the background.
-#
-# Usage: electrons [n [bitmapfile]]
-#
-# n is the number of electrons to animate; default is 30.
-#
-# The bitmap file can be any X11 bitmap file (look in
-# /usr/include/X11/bitmaps for samples); it is displayed as the
-# background of the animation.  Default is no bitmap.
-
-from tkinter import *
-import random
-
-
-# The graphical interface
-class Electrons:
-
-    # Create our objects
-    def __init__(self, n, bitmap = None):
-        self.n = n
-        self.tk = tk = Tk()
-        self.canvas = c = Canvas(tk)
-        c.pack()
-        width, height = tk.getint(c['width']), tk.getint(c['height'])
-
-        # Add background bitmap
-        if bitmap:
-            self.bitmap = c.create_bitmap(width/2, height/2,
-                                          bitmap=bitmap,
-                                          foreground='blue')
-
-        self.pieces = []
-        x1, y1, x2, y2 = 10,70,14,74
-        for i in range(n):
-            p = c.create_oval(x1, y1, x2, y2, fill='red')
-            self.pieces.append(p)
-            y1, y2 = y1 +2, y2 + 2
-        self.tk.update()
-
-    def random_move(self, n):
-        c = self.canvas
-        for p in self.pieces:
-            x = random.choice(range(-2,4))
-            y = random.choice(range(-3,4))
-            c.move(p, x, y)
-        self.tk.update()
-
-    # Run -- allow 500 movemens
-    def run(self):
-        try:
-            for i in range(500):
-                self.random_move(self.n)
-        except TclError:
-            try:
-                self.tk.destroy()
-            except TclError:
-                pass
-
-
-# Main program
-def main():
-    import sys
-
-    # First argument is number of electrons, default 30
-    if sys.argv[1:]:
-        n = int(sys.argv[1])
-    else:
-        n = 30
-
-    # Second argument is bitmap file, default none
-    if sys.argv[2:]:
-        bitmap = sys.argv[2]
-        # Reverse meaning of leading '@' compared to Tk
-        if bitmap[0] == '@': bitmap = bitmap[1:]
-        else: bitmap = '@' + bitmap
-    else:
-        bitmap = None
-
-    # Create the graphical objects...
-    h = Electrons(n, bitmap)
-
-    # ...and run!
-    h.run()
-
-
-# Call main when run as script
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/hello.py b/Demo/tkinter/guido/hello.py
deleted file mode 100644
index f10fb7a..0000000
--- a/Demo/tkinter/guido/hello.py
+++ /dev/null
@@ -1,17 +0,0 @@
-# Display hello, world in a button; clicking it quits the program
-
-import sys
-from tkinter import *
-
-def main():
-    root = Tk()
-    button = Button(root)
-    button['text'] = 'Hello, world'
-    button['command'] = quit_callback       # See below
-    button.pack()
-    root.mainloop()
-
-def quit_callback():
-    sys.exit(0)
-
-main()
diff --git a/Demo/tkinter/guido/imagedraw.py b/Demo/tkinter/guido/imagedraw.py
deleted file mode 100644
index a168831..0000000
--- a/Demo/tkinter/guido/imagedraw.py
+++ /dev/null
@@ -1,23 +0,0 @@
-"""Draw on top of an image"""
-
-from tkinter import *
-import sys
-
-def main():
-    filename = sys.argv[1]
-    root = Tk()
-    img = PhotoImage(file=filename)
-    w, h = img.width(), img.height()
-    canv = Canvas(root, width=w, height=h)
-    canv.create_image(0, 0, anchor=NW, image=img)
-    canv.pack()
-    canv.bind('<Button-1>', blob)
-    root.mainloop()
-
-def blob(event):
-    x, y = event.x, event.y
-    canv = event.widget
-    r = 5
-    canv.create_oval(x-r, y-r, x+r, y+r, fill='red', outline="")
-
-main()
diff --git a/Demo/tkinter/guido/imageview.py b/Demo/tkinter/guido/imageview.py
deleted file mode 100644
index 276858a..0000000
--- a/Demo/tkinter/guido/imageview.py
+++ /dev/null
@@ -1,12 +0,0 @@
-from tkinter import *
-import sys
-
-def main():
-    filename = sys.argv[1]
-    root = Tk()
-    img = PhotoImage(file=filename)
-    label = Label(root, image=img)
-    label.pack()
-    root.mainloop()
-
-main()
diff --git a/Demo/tkinter/guido/kill.py b/Demo/tkinter/guido/kill.py
deleted file mode 100755
index 44a6b9b..0000000
--- a/Demo/tkinter/guido/kill.py
+++ /dev/null
@@ -1,96 +0,0 @@
-#! /usr/bin/env python3
-# Tkinter interface to Linux `kill' command.
-
-from tkinter import *
-import subprocess
-import os
-
-class BarButton(Menubutton):
-    def __init__(self, master=None, **cnf):
-        Menubutton.__init__(self, master, **cnf)
-        self.pack(side=LEFT)
-        self.menu = Menu(self, name='menu')
-        self['menu'] = self.menu
-
-class Kill(Frame):
-    # List of (name, option, pid_column)
-    format_list = [('Default', '', 0),
-                   ('Long', '-l', 2),
-                   ('User', '-u', 1),
-                   ('Jobs', '-j', 1),
-                   ('Signal', '-s', 1),
-                   ('Memory', '-m', 0),
-                   ('VM', '-v', 0),
-                   ('Hex', '-X', 0)]
-    def kill(self, selected):
-        c = self.format_list[self.format.get()][2]
-        pid = selected.split()[c]
-        os.system('kill -9 ' + pid)
-        self.do_update()
-    def do_update(self):
-        name, option, column = self.format_list[self.format.get()]
-        s = subprocess.getoutput('ps -w ' + option)
-        list = s.split('\n')
-        self.header.set(list[0])
-        del list[0]
-        y = self.frame.vscroll.get()[0]
-        self.frame.list.delete(0, AtEnd())
-        for line in list:
-            self.frame.list.insert(0, line)
-        self.frame.list.yview(int(y))
-    def do_motion(self, e):
-        e.widget.select_clear(0, END)
-        e.widget.select_set(e.widget.nearest(e.y))
-    def do_leave(self, e):
-        e.widget.select_clear(0, END)
-    def do_1(self, e):
-        self.kill(e.widget.get(e.widget.nearest(e.y)))
-    def __init__(self, master=None, **cnf):
-        Frame.__init__(self, master, cnf)
-        self.pack(expand=1, fill=BOTH)
-        self.bar = Frame(self, name='bar', relief=RAISED,
-                         borderwidth=2)
-        self.bar.pack(fill=X)
-        self.bar.file = BarButton(self.bar, text='File')
-        self.bar.file.menu.add_command(
-                label='Quit', command=self.quit)
-        self.bar.view = BarButton(self.bar, text='View')
-        self.format = IntVar(self)
-        self.format.set(2)
-        for num in range(len(self.format_list)):
-            self.bar.view.menu.add_radiobutton(
-                    label=self.format_list[num][0],
-                    command=self.do_update,
-                    variable=self.format,
-                    value=num)
-        #self.bar.view.menu.add_separator()
-        #XXX ...
-        self.bar.tk_menuBar(self.bar.file, self.bar.view)
-        self.frame = Frame(self, relief=RAISED, borderwidth=2)
-        self.frame.pack(expand=1, fill=BOTH)
-        self.header = StringVar(self)
-        self.frame.label = Label(self.frame, relief=FLAT, anchor=NW,
-                                 borderwidth=0,
-                                 textvariable=self.header)
-        self.frame.label.pack(fill=X)
-        self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
-        self.frame.list = Listbox(self.frame, relief=SUNKEN,
-                                  selectbackground='#eed5b7',
-                                  selectborderwidth=0,
-                                  yscroll=self.frame.vscroll.set)
-        self.frame.vscroll['command'] = self.frame.list.yview
-        self.frame.vscroll.pack(side=RIGHT, fill=Y)
-        self.frame.list.pack(expand=1, fill=BOTH)
-        self.update = Button(self, text="Update",
-                             command=self.do_update)
-        self.update.pack(expand=1, fill=X)
-        self.frame.list.bind('<Motion>', self.do_motion)
-        self.frame.list.bind('<Leave>', self.do_leave)
-        self.frame.list.bind('<1>', self.do_1)
-        self.do_update()
-
-if __name__ == '__main__':
-    kill = Kill(None, borderwidth=5)
-    kill.winfo_toplevel().title('Tkinter Process Killer')
-    kill.winfo_toplevel().minsize(1, 1)
-    kill.mainloop()
diff --git a/Demo/tkinter/guido/listtree.py b/Demo/tkinter/guido/listtree.py
deleted file mode 100644
index 8db5b60..0000000
--- a/Demo/tkinter/guido/listtree.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# List a remote app's widget tree (names and classes only)
-
-import sys
-
-from tkinter import *
-
-def listtree(master, app):
-    list = Listbox(master, name='list')
-    list.pack(expand=1, fill=BOTH)
-    listnodes(list, app, '.', 0)
-    return list
-
-def listnodes(list, app, widget, level):
-    klass = list.send(app, 'winfo', 'class', widget)
-    list.insert(END, '%s (%s)' % (widget, klass))
-    children = list.tk.splitlist(
-            list.send(app, 'winfo', 'children', widget))
-    for c in children:
-        listnodes(list, app, c, level+1)
-
-def main():
-    if not sys.argv[1:]:
-        sys.stderr.write('Usage: listtree appname\n')
-        sys.exit(2)
-    app = sys.argv[1]
-    tk = Tk()
-    tk.minsize(1, 1)
-    f = Frame(tk, name='f')
-    f.pack(expand=1, fill=BOTH)
-    list = listtree(f, app)
-    tk.mainloop()
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/manpage.py b/Demo/tkinter/guido/manpage.py
deleted file mode 100644
index 750c675..0000000
--- a/Demo/tkinter/guido/manpage.py
+++ /dev/null
@@ -1,215 +0,0 @@
-# Widget to display a man page
-
-import os
-import re
-import sys
-
-from tkinter import *
-from tkinter.font import Font
-from tkinter.scrolledtext import ScrolledText
-
-# XXX Recognizing footers is system dependent
-# (This one works for IRIX 5.2 and Solaris 2.2)
-footerprog = re.compile(
-        '^     Page [1-9][0-9]*[ \t]+\|^.*Last change:.*[1-9][0-9]*\n')
-emptyprog = re.compile('^[ \t]*\n')
-ulprog = re.compile('^[ \t]*[Xv!_][Xv!_ \t]*\n')
-
-
-class EditableManPage(ScrolledText):
-    """Basic Man Page class -- does not disable editing."""
-
-    def __init__(self, master=None, **cnf):
-        ScrolledText.__init__(self, master, **cnf)
-
-        bold = Font(font=self['font']).copy()
-        bold.config(weight='bold')
-        italic = Font(font=self['font']).copy()
-        italic.config(slant='italic')
-
-        # Define tags for formatting styles
-        self.tag_config('X', underline=1)
-        self.tag_config('!', font=bold)
-        self.tag_config('_', font=italic)
-
-        # Set state to idle
-        self.fp = None
-        self.lineno = 0
-
-    def busy(self):
-        """Test whether we are busy parsing a file."""
-        return self.fp != None
-
-    def kill(self):
-        """Ensure we're not busy."""
-        if self.busy():
-            self._endparser()
-
-    def asyncparsefile(self, fp):
-        """Parse a file, in the background."""
-        self._startparser(fp)
-        self.tk.createfilehandler(fp, READABLE,
-                                  self._filehandler)
-
-    parsefile = asyncparsefile   # Alias
-
-    def _filehandler(self, fp, mask):
-        """I/O handler used by background parsing."""
-        nextline = self.fp.readline()
-        if not nextline:
-            self._endparser()
-            return
-        self._parseline(nextline)
-
-    def syncparsefile(self, fp):
-        """Parse a file, now (cannot be aborted)."""
-        self._startparser(fp)
-        while True:
-            nextline = fp.readline()
-            if not nextline:
-                break
-            self._parseline(nextline)
-        self._endparser()
-
-    def _startparser(self, fp):
-        """Initialize parsing from a particular file -- must not be busy."""
-        if self.busy():
-            raise RuntimeError('startparser: still busy')
-        fp.fileno()             # Test for file-ness
-        self.fp = fp
-        self.lineno = 0
-        self.ok = 0
-        self.empty = 0
-        self.buffer = None
-        savestate = self['state']
-        self['state'] = NORMAL
-        self.delete('1.0', END)
-        self['state'] = savestate
-
-    def _endparser(self):
-        """End parsing -- must be busy, need not be at EOF."""
-        if not self.busy():
-            raise RuntimeError('endparser: not busy')
-        if self.buffer:
-            self._parseline('')
-        try:
-            self.tk.deletefilehandler(self.fp)
-        except TclError:
-            pass
-        self.fp.close()
-        self.fp = None
-        del self.ok, self.empty, self.buffer
-
-    def _parseline(self, nextline):
-        """Parse a single line."""
-        if not self.buffer:
-            # Save this line -- we need one line read-ahead
-            self.buffer = nextline
-            return
-        if emptyprog.match(self.buffer):
-            # Buffered line was empty -- set a flag
-            self.empty = 1
-            self.buffer = nextline
-            return
-        textline = self.buffer
-        if ulprog.match(nextline):
-            # Next line is properties for buffered line
-            propline = nextline
-            self.buffer = None
-        else:
-            # Next line is read-ahead
-            propline = None
-            self.buffer = nextline
-        if not self.ok:
-            # First non blank line after footer must be header
-            # -- skip that too
-            self.ok = 1
-            self.empty = 0
-            return
-        if footerprog.match(textline):
-            # Footer -- start skipping until next non-blank line
-            self.ok = 0
-            self.empty = 0
-            return
-        savestate = self['state']
-        self['state'] = NORMAL
-        if TkVersion >= 4.0:
-            self.mark_set('insert', 'end-1c')
-        else:
-            self.mark_set('insert', END)
-        if self.empty:
-            # One or more previous lines were empty
-            # -- insert one blank line in the text
-            self._insert_prop('\n')
-            self.lineno = self.lineno + 1
-            self.empty = 0
-        if not propline:
-            # No properties
-            self._insert_prop(textline)
-        else:
-            # Search for properties
-            p = ''
-            j = 0
-            for i in range(min(len(propline), len(textline))):
-                if propline[i] != p:
-                    if j < i:
-                        self._insert_prop(textline[j:i], p)
-                        j = i
-                    p = propline[i]
-            self._insert_prop(textline[j:])
-        self.lineno = self.lineno + 1
-        self['state'] = savestate
-
-    def _insert_prop(self, str, prop = ' '):
-        """Insert a string at the end, with at most one property (tag)."""
-        here = self.index(AtInsert())
-        self.insert(AtInsert(), str)
-        if TkVersion <= 4.0:
-            tags = self.tag_names(here)
-            for tag in tags:
-                self.tag_remove(tag, here, AtInsert())
-        if prop != ' ':
-            self.tag_add(prop, here, AtInsert())
-
-
-class ReadonlyManPage(EditableManPage):
-    """Readonly Man Page class -- disables editing, otherwise the same."""
-
-    def __init__(self, master=None, **cnf):
-        cnf['state'] = DISABLED
-        EditableManPage.__init__(self, master, **cnf)
-
-# Alias
-ManPage = ReadonlyManPage
-
-# usage: ManPage [manpage]; or ManPage [-f] file
-# -f means that the file is nroff -man output run through ul -i
-def main():
-    # XXX This directory may be different on your system
-    MANDIR = ''
-    DEFAULTPAGE = 'Tcl'
-    formatted = 0
-    if sys.argv[1:] and sys.argv[1] == '-f':
-        formatted = 1
-        del sys.argv[1]
-    if sys.argv[1:]:
-        name = sys.argv[1]
-    else:
-        name = DEFAULTPAGE
-    if not formatted:
-        if name[-2:-1] != '.':
-            name = name + '.n'
-        name = os.path.join(MANDIR, name)
-    root = Tk()
-    root.minsize(1, 1)
-    manpage = ManPage(root, relief=SUNKEN, borderwidth=2)
-    manpage.pack(expand=1, fill=BOTH)
-    if formatted:
-        fp = open(name, 'r')
-    else:
-        fp = os.popen('nroff -man -c %s | ul -i' % name, 'r')
-    manpage.parsefile(fp)
-    root.mainloop()
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/mbox.py b/Demo/tkinter/guido/mbox.py
deleted file mode 100755
index 0a421cf..0000000
--- a/Demo/tkinter/guido/mbox.py
+++ /dev/null
@@ -1,286 +0,0 @@
-#! /usr/bin/env python3
-
-# Scan MH folder, display results in window
-
-import os
-import re
-import sys
-import getopt
-import mailbox
-from tkinter import *
-
-from dialog import dialog
-
-MBOXPATH = os.environ['HOME'] + '/Mail'
-
-def main():
-    global root, tk, top, mid, bot
-    global folderbox, foldermenu, scanbox, scanmenu, viewer
-    global folder, seq
-    global mh, mhf
-
-    # Parse command line options
-
-    folder = 'inbox'
-    seq = 'all'
-    try:
-        opts, args = getopt.getopt(sys.argv[1:], '')
-    except getopt.error as msg:
-        print(msg)
-        sys.exit(2)
-    for arg in args:
-        if arg[:1] == '+':
-            folder = arg[1:]
-        else:
-            seq = arg
-
-    # Initialize MH
-
-    mh = mailbox.MH(MBOXPATH)
-    mhf = mh.get_folder(folder)
-
-    # Build widget hierarchy
-
-    root = Tk()
-    tk = root.tk
-
-    top = Frame(root)
-    top.pack({'expand': 1, 'fill': 'both'})
-
-    # Build right part: folder list
-
-    right = Frame(top)
-    right.pack({'fill': 'y', 'side': 'right'})
-
-    folderbar = Scrollbar(right, {'relief': 'sunken', 'bd': 2})
-    folderbar.pack({'fill': 'y', 'side': 'right'})
-
-    folderbox = Listbox(right, {'exportselection': 0})
-    folderbox.pack({'expand': 1, 'fill': 'both', 'side': 'left'})
-
-    foldermenu = Menu(root)
-    foldermenu.add('command',
-                   {'label': 'Open Folder',
-                    'command': open_folder})
-    foldermenu.add('separator')
-    foldermenu.add('command',
-                   {'label': 'Quit',
-                    'command': 'exit'})
-    foldermenu.bind('<ButtonRelease-3>', folder_unpost)
-
-    folderbox['yscrollcommand'] = (folderbar, 'set')
-    folderbar['command'] = (folderbox, 'yview')
-    folderbox.bind('<Double-1>', open_folder, 1)
-    folderbox.bind('<3>', folder_post)
-
-    # Build left part: scan list
-
-    left = Frame(top)
-    left.pack({'expand': 1, 'fill': 'both', 'side': 'left'})
-
-    scanbar = Scrollbar(left, {'relief': 'sunken', 'bd': 2})
-    scanbar.pack({'fill': 'y', 'side': 'right'})
-
-    scanbox = Listbox(left, {'font': 'fixed'})
-    scanbox.pack({'expand': 1, 'fill': 'both', 'side': 'left'})
-
-    scanmenu = Menu(root)
-    scanmenu.add('command',
-                 {'label': 'Open Message',
-                  'command': open_message})
-    scanmenu.add('command',
-                 {'label': 'Remove Message',
-                  'command': remove_message})
-    scanmenu.add('command',
-                 {'label': 'Refile Message',
-                  'command': refile_message})
-    scanmenu.add('separator')
-    scanmenu.add('command',
-                 {'label': 'Quit',
-                  'command': 'exit'})
-    scanmenu.bind('<ButtonRelease-3>', scan_unpost)
-
-    scanbox['yscrollcommand'] = (scanbar, 'set')
-    scanbar['command'] = (scanbox, 'yview')
-    scanbox.bind('<Double-1>', open_message)
-    scanbox.bind('<3>', scan_post)
-
-    # Separator between middle and bottom part
-
-    rule2 = Frame(root, {'bg': 'black'})
-    rule2.pack({'fill': 'x'})
-
-    # Build bottom part: current message
-
-    bot = Frame(root)
-    bot.pack({'expand': 1, 'fill': 'both'})
-    #
-    viewer = None
-
-    # Window manager commands
-
-    root.minsize(800, 1) # Make window resizable
-
-    # Fill folderbox with text
-
-    setfolders()
-
-    # Fill scanbox with text
-
-    rescan()
-
-    # Enter mainloop
-
-    root.mainloop()
-
-def folder_post(e):
-    x, y = e.x_root, e.y_root
-    foldermenu.post(x - 10, y - 10)
-    foldermenu.grab_set()
-
-def folder_unpost(e):
-    tk.call('update', 'idletasks')
-    foldermenu.grab_release()
-    foldermenu.unpost()
-    foldermenu.invoke('active')
-
-def scan_post(e):
-    x, y = e.x_root, e.y_root
-    scanmenu.post(x - 10, y - 10)
-    scanmenu.grab_set()
-
-def scan_unpost(e):
-    tk.call('update', 'idletasks')
-    scanmenu.grab_release()
-    scanmenu.unpost()
-    scanmenu.invoke('active')
-
-scanparser = re.compile('^ *([0-9]+)')
-
-def open_folder(e=None):
-    global folder, mhf
-    sel = folderbox.curselection()
-    if len(sel) != 1:
-        if len(sel) > 1:
-            msg = "Please open one folder at a time"
-        else:
-            msg = "Please select a folder to open"
-        dialog(root, "Can't Open Folder", msg, "", 0, "OK")
-        return
-    i = sel[0]
-    folder = folderbox.get(i)
-    mhf = mh.get_folder(folder)
-    rescan()
-
-def open_message(e=None):
-    global viewer
-    sel = scanbox.curselection()
-    if len(sel) != 1:
-        if len(sel) > 1:
-            msg = "Please open one message at a time"
-        else:
-            msg = "Please select a message to open"
-        dialog(root, "Can't Open Message", msg, "", 0, "OK")
-        return
-    cursor = scanbox['cursor']
-    scanbox['cursor'] = 'watch'
-    tk.call('update', 'idletasks')
-    i = sel[0]
-    line = scanbox.get(i)
-    m = scanparser.match(line)
-    if m:
-        num = int(m.group(1))
-        m = mhf.get_message(num)
-        if viewer: viewer.destroy()
-        from mimeviewer import MimeViewer
-        viewer = MimeViewer(bot, '+%s/%d' % (folder, num), m)
-        viewer.pack()
-        viewer.show()
-    scanbox['cursor'] = cursor
-
-def interestingheader(header):
-    return header != 'received'
-
-def remove_message(e=None):
-    itop = scanbox.nearest(0)
-    sel = scanbox.curselection()
-    if not sel:
-        dialog(root, "No Message To Remove",
-               "Please select a message to remove", "", 0, "OK")
-        return
-    todo = []
-    for i in sel:
-        line = scanbox.get(i)
-        m = scanparser.match(line)
-        if m:
-            toremove = int(m.group(1))
-            todo.append(toremove)
-            mhf.remove(toremove)
-    rescan()
-    fixfocus(min(todo), itop)
-
-lastrefile = ''
-tofolder = None
-def refile_message(e=None):
-    global lastrefile, tofolder
-    itop = scanbox.nearest(0)
-    sel = scanbox.curselection()
-    if not sel:
-        dialog(root, "No Message To Refile",
-               "Please select a message to refile", "", 0, "OK")
-        return
-    foldersel = folderbox.curselection()
-    if len(foldersel) != 1:
-        if not foldersel:
-            msg = "Please select a folder to refile to"
-        else:
-            msg = "Please select exactly one folder to refile to"
-        dialog(root, "No Folder To Refile", msg, "", 0, "OK")
-        return
-    refileto = folderbox.get(foldersel[0])
-    todo = []
-    for i in sel:
-        line = scanbox.get(i)
-        m = scanparser.match(line)
-        if m:
-            todo.append(int(m.group(1)))
-    if lastrefile != refileto or not tofolder:
-        lastrefile = refileto
-        tofolder = None
-        tofolder = mh.get_folder(lastrefile)
-    mhf.refilemessages(todo, tofolder)
-    rescan()
-    fixfocus(min(todo), itop)
-
-def fixfocus(near, itop):
-    n = scanbox.size()
-    for i in range(n):
-        line = scanbox.get(repr(i))
-        m = scanparser.match(line)
-        if m:
-            num = int(m.group(1))
-            if num >= near:
-                break
-    else:
-        i = 'end'
-    scanbox.yview(itop)
-
-def setfolders():
-    folderbox.delete(0, 'end')
-    for fn in mh.list_folders():
-        folderbox.insert('end', fn)
-
-def rescan():
-    global viewer
-    if viewer:
-        viewer.destroy()
-        viewer = None
-    scanbox.delete(0, 'end')
-    for line in scanfolder(folder, seq):
-        scanbox.insert('end', line)
-
-def scanfolder(folder = 'inbox', sequence = 'all'):
-    return [line[:-1] for line in
-            os.popen('scan +%s %s' % (folder, sequence), 'r').readlines()]
-
-main()
diff --git a/Demo/tkinter/guido/mimeviewer.py b/Demo/tkinter/guido/mimeviewer.py
deleted file mode 100755
index babed8f..0000000
--- a/Demo/tkinter/guido/mimeviewer.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#! /usr/bin/env python3
-
-# View a single MIME multipart message.
-# Display each part as a box.
-
-import os
-import sys
-import getopt
-import mailbox
-from tkinter import *
-from tkinter.scrolledtext import ScrolledText
-
-MBOXPATH = os.environ['HOME'] + '/Mail'
-
-class Error(Exception):
-    pass
-
-def getcurrent(self):
-    """Return the current message.  Raise Error when there is none."""
-    seqs = self.get_sequences()
-    try:
-        return max(seqs['cur'])
-    except (ValueError, KeyError):
-        raise Error("no cur message")
-
-
-class MimeViewer:
-    def __init__(self, parent, title, msg):
-        self.title = title
-        self.msg = msg
-        self.frame = Frame(parent, {'relief': 'raised', 'bd': 2})
-        self.frame.packing = {'expand': 0, 'fill': 'both'}
-        self.button = Checkbutton(self.frame,
-                             {'text': title,
-                              'command': self.toggle})
-        self.button.pack({'anchor': 'w'})
-        headertext = []
-        for item in msg.items():
-            headertext.append("%s: %s" % item)
-        headertext = '\n'.join(headertext)
-        height = countlines(headertext, 4)
-        if height:
-            self.htext = ScrolledText(self.frame,
-                              {'height': height,
-                               'width': 80,
-                               'wrap': 'none',
-                               'relief': 'raised',
-                               'bd': 2})
-            self.htext.packing = {'expand': 1, 'fill': 'both',
-                                  'after': self.button}
-            self.htext.insert('end', headertext)
-        else:
-            self.htext = Frame(self.frame,
-                               {'relief': 'raised', 'bd': 2})
-            self.htext.packing = {'side': 'top',
-                                  'ipady': 2,
-                                  'fill': 'x',
-                                  'after': self.button}
-        body = msg.get_payload()
-        if type(body) == str:
-            self.pad = None
-            height = countlines(body, 10)
-            if height:
-                self.btext = ScrolledText(self.frame,
-                                  {'height': height,
-                                   'width': 80,
-                                   'wrap': 'none',
-                                   'relief': 'raised',
-                                   'bd': 2})
-                self.btext.packing = {'expand': 1,
-                                      'fill': 'both'}
-                self.btext.insert('end', body)
-            else:
-                self.btext = None
-            self.parts = None
-        else:
-            self.pad = Frame(self.frame,
-                             {'relief': 'flat', 'bd': 2})
-            self.pad.packing = {'side': 'left', 'ipadx': 10,
-                                'fill': 'y', 'after': self.htext}
-            self.parts = []
-            for i in range(len(body)):
-                p = MimeViewer(self.frame,
-                               '%s.%d' % (title, i+1),
-                               body[i])
-                self.parts.append(p)
-            self.btext = None
-        self.collapsed = 1
-    def pack(self):
-        self.frame.pack(self.frame.packing)
-    def destroy(self):
-        self.frame.destroy()
-    def show(self):
-        if self.collapsed:
-            self.button.invoke()
-    def toggle(self):
-        if self.collapsed:
-            self.explode()
-        else:
-            self.collapse()
-    def collapse(self):
-        self.collapsed = 1
-        for comp in self.htext, self.btext, self.pad:
-            if comp:
-                comp.forget()
-        if self.parts:
-            for part in self.parts:
-                part.frame.forget()
-        self.frame.pack({'expand': 0})
-    def explode(self):
-        self.collapsed = 0
-        for comp in self.htext, self.btext, self.pad:
-            if comp: comp.pack(comp.packing)
-        if self.parts:
-            for part in self.parts:
-                part.pack()
-        self.frame.pack({'expand': 1})
-
-def countlines(str, limit):
-    i = 0
-    n = 0
-    while  n < limit:
-        i = str.find('\n', i)
-        if i < 0: break
-        n = n+1
-        i = i+1
-    return n
-
-def main():
-    opts, args = getopt.getopt(sys.argv[1:], '')
-    for o, a in opts:
-        pass
-    message = None
-    folder = 'inbox'
-    for arg in args:
-        if arg[:1] == '+':
-            folder = arg[1:]
-        else:
-            message = int(arg)
-
-    mh = mailbox.MH(MBOXPATH)
-    f = mh.get_folder(folder)
-    if message is None:
-        message = getcurrent(f)
-    m = mailbox.MHMessage(f.get(message))
-
-    root = Tk()
-    tk = root.tk
-
-    top = MimeViewer(root, '+%s/%d' % (folder, message), m)
-    top.pack()
-    top.show()
-
-    root.minsize(1, 1)
-
-    tk.mainloop()
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/newmenubardemo.py b/Demo/tkinter/guido/newmenubardemo.py
deleted file mode 100644
index 09ac566..0000000
--- a/Demo/tkinter/guido/newmenubardemo.py
+++ /dev/null
@@ -1,47 +0,0 @@
-#! /usr/bin/env python3
-
-"""Play with the new Tk 8.0 toplevel menu option."""
-
-from tkinter import *
-
-class App:
-
-    def __init__(self, master):
-        self.master = master
-
-        self.menubar = Menu(self.master)
-
-        self.filemenu = Menu(self.menubar)
-
-        self.filemenu.add_command(label="New")
-        self.filemenu.add_command(label="Open...")
-        self.filemenu.add_command(label="Close")
-        self.filemenu.add_separator()
-        self.filemenu.add_command(label="Quit", command=self.master.quit)
-
-        self.editmenu = Menu(self.menubar)
-
-        self.editmenu.add_command(label="Cut")
-        self.editmenu.add_command(label="Copy")
-        self.editmenu.add_command(label="Paste")
-
-        self.helpmenu = Menu(self.menubar, name='help')
-
-        self.helpmenu.add_command(label="About...")
-
-        self.menubar.add_cascade(label="File", menu=self.filemenu)
-        self.menubar.add_cascade(label="Edit", menu=self.editmenu)
-        self.menubar.add_cascade(label="Help", menu=self.helpmenu)
-
-        self.top = Toplevel(menu=self.menubar)
-
-        # Rest of app goes here...
-
-def main():
-    root = Tk()
-    root.withdraw()
-    app = App(root)
-    root.mainloop()
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/optionmenu.py b/Demo/tkinter/guido/optionmenu.py
deleted file mode 100644
index 1e72aa5..0000000
--- a/Demo/tkinter/guido/optionmenu.py
+++ /dev/null
@@ -1,27 +0,0 @@
-# option menu sample (Fredrik Lundh, September 1997)
-
-from tkinter import *
-
-root = Tk()
-
-#
-# standard usage
-
-var1  = StringVar()
-var1.set("One") # default selection
-
-menu1 = OptionMenu(root, var1, "One", "Two", "Three")
-menu1.pack()
-
-#
-# initialize from a sequence
-
-CHOICES = "Aah", "Bee", "Cee", "Dee", "Eff"
-
-var2  = StringVar()
-var2.set(CHOICES[0])
-
-menu2 = OptionMenu(root, var2, *CHOICES)
-menu2.pack()
-
-root.mainloop()
diff --git a/Demo/tkinter/guido/paint.py b/Demo/tkinter/guido/paint.py
deleted file mode 100644
index 65f2353..0000000
--- a/Demo/tkinter/guido/paint.py
+++ /dev/null
@@ -1,60 +0,0 @@
-""""Paint program by Dave Michell.
-
-Subject: tkinter "paint" example
-From: Dave Mitchell <davem@magnet.com>
-To: python-list@cwi.nl
-Date: Fri, 23 Jan 1998 12:18:05 -0500 (EST)
-
-  Not too long ago (last week maybe?) someone posted a request
-for an example of a paint program using Tkinter. Try as I might
-I can't seem to find it in the archive, so i'll just post mine
-here and hope that the person who requested it sees this!
-
-  All this does is put up a canvas and draw a smooth black line
-whenever you have the mouse button down, but hopefully it will
-be enough to start with.. It would be easy enough to add some
-options like other shapes or colors...
-
-                                                yours,
-                                                dave mitchell
-                                                davem@magnet.com
-"""
-
-from tkinter import *
-
-"""paint.py: not exactly a paint program.. just a smooth line drawing demo."""
-
-b1 = "up"
-xold, yold = None, None
-
-def main():
-    root = Tk()
-    drawing_area = Canvas(root)
-    drawing_area.pack()
-    drawing_area.bind("<Motion>", motion)
-    drawing_area.bind("<ButtonPress-1>", b1down)
-    drawing_area.bind("<ButtonRelease-1>", b1up)
-    root.mainloop()
-
-def b1down(event):
-    global b1
-    b1 = "down"           # you only want to draw when the button is down
-                          # because "Motion" events happen -all the time-
-
-def b1up(event):
-    global b1, xold, yold
-    b1 = "up"
-    xold = None           # reset the line when you let go of the button
-    yold = None
-
-def motion(event):
-    if b1 == "down":
-        global xold, yold
-        if xold is not None and yold is not None:
-            event.widget.create_line(xold,yold,event.x,event.y,smooth=TRUE)
-                          # here's where you draw it. smooth. neat.
-        xold = event.x
-        yold = event.y
-
-if __name__ == "__main__":
-    main()
diff --git a/Demo/tkinter/guido/rmt.py b/Demo/tkinter/guido/rmt.py
deleted file mode 100755
index d11edb0..0000000
--- a/Demo/tkinter/guido/rmt.py
+++ /dev/null
@@ -1,159 +0,0 @@
-#! /usr/bin/env python3
-
-# A Python program implementing rmt, an application for remotely
-# controlling other Tk applications.
-# Cf. Ousterhout, Tcl and the Tk Toolkit, Figs. 27.5-8, pp. 273-276.
-
-# Note that because of forward references in the original, we
-# sometimes delay bindings until after the corresponding procedure is
-# defined.  We also introduce names for some unnamed code blocks in
-# the original because of restrictions on lambda forms in Python.
-
-# XXX This should be written in a more Python-like style!!!
-
-from tkinter import *
-import sys
-
-# 1. Create basic application structure: menu bar on top of
-# text widget, scrollbar on right.
-
-root = Tk()
-tk = root.tk
-mBar = Frame(root, relief=RAISED, borderwidth=2)
-mBar.pack(fill=X)
-
-f = Frame(root)
-f.pack(expand=1, fill=BOTH)
-s = Scrollbar(f, relief=FLAT)
-s.pack(side=RIGHT, fill=Y)
-t = Text(f, relief=RAISED, borderwidth=2, yscrollcommand=s.set, setgrid=1)
-t.pack(side=LEFT, fill=BOTH, expand=1)
-t.tag_config('bold')
-s['command'] = t.yview
-
-root.title('Tk Remote Controller')
-root.iconname('Tk Remote')
-
-# 2. Create menu button and menus.
-
-file = Menubutton(mBar, text='File', underline=0)
-file.pack(side=LEFT)
-file_m = Menu(file)
-file['menu'] = file_m
-file_m_apps = Menu(file_m, tearoff=0)
-file_m.add_cascade(label='Select Application', underline=0,
-                   menu=file_m_apps)
-file_m.add_command(label='Quit', underline=0, command=sys.exit)
-
-# 3. Create bindings for text widget to allow commands to be
-# entered and information to be selected.  New characters
-# can only be added at the end of the text (can't ever move
-# insertion point).
-
-def single1(e):
-    x = e.x
-    y = e.y
-    t.setvar('tk_priv(selectMode)', 'char')
-    t.mark_set('anchor', At(x, y))
-    # Should focus W
-t.bind('<1>', single1)
-
-def double1(e):
-    x = e.x
-    y = e.y
-    t.setvar('tk_priv(selectMode)', 'word')
-    t.tk_textSelectTo(At(x, y))
-t.bind('<Double-1>', double1)
-
-def triple1(e):
-    x = e.x
-    y = e.y
-    t.setvar('tk_priv(selectMode)', 'line')
-    t.tk_textSelectTo(At(x, y))
-t.bind('<Triple-1>', triple1)
-
-def returnkey(e):
-    t.insert(AtInsert(), '\n')
-    invoke()
-t.bind('<Return>', returnkey)
-
-def controlv(e):
-    t.insert(AtInsert(), t.selection_get())
-    t.yview_pickplace(AtInsert())
-    if t.index(AtInsert())[-2:] == '.0':
-        invoke()
-t.bind('<Control-v>', controlv)
-
-# 4. Procedure to backspace over one character, as long as
-# the character isn't part of the prompt.
-
-def backspace(e):
-    if t.index('promptEnd') != t.index('insert - 1 char'):
-        t.delete('insert - 1 char', AtInsert())
-        t.yview_pickplace(AtInsert())
-t.bind('<BackSpace>', backspace)
-t.bind('<Control-h>', backspace)
-t.bind('<Delete>', backspace)
-
-
-# 5. Procedure that's invoked when return is typed:  if
-# there's not yet a complete command (e.g. braces are open)
-# then do nothing.  Otherwise, execute command (locally or
-# remotely), output the result or error message, and issue
-# a new prompt.
-
-def invoke():
-    cmd = t.get('promptEnd + 1 char', AtInsert())
-    if t.getboolean(tk.call('info', 'complete', cmd)): # XXX
-        if app == root.winfo_name():
-            msg = tk.call('eval', cmd) # XXX
-        else:
-            msg = t.send(app, cmd)
-        if msg:
-            t.insert(AtInsert(), msg + '\n')
-        prompt()
-    t.yview_pickplace(AtInsert())
-
-def prompt():
-    t.insert(AtInsert(), app + ': ')
-    t.mark_set('promptEnd', 'insert - 1 char')
-    t.tag_add('bold', 'insert linestart', 'promptEnd')
-
-# 6. Procedure to select a new application.  Also changes
-# the prompt on the current command line to reflect the new
-# name.
-
-def newApp(appName):
-    global app
-    app = appName
-    t.delete('promptEnd linestart', 'promptEnd')
-    t.insert('promptEnd', appName + ':')
-    t.tag_add('bold', 'promptEnd linestart', 'promptEnd')
-
-def fillAppsMenu():
-    file_m_apps.add('command')
-    file_m_apps.delete(0, 'last')
-    names = root.winfo_interps()
-    names = list(names) # convert tuple to list
-    names.sort()
-    for name in names:
-        try:
-            root.send(name, 'winfo name .')
-        except TclError:
-            # Inoperative window -- ignore it
-            pass
-        else:
-            file_m_apps.add_command(
-                label=name,
-                command=lambda name=name: newApp(name))
-
-file_m_apps['postcommand'] = fillAppsMenu
-mBar.tk_menuBar(file)
-
-# 7. Miscellaneous initialization.
-
-app = root.winfo_name()
-prompt()
-t.focus()
-
-root.mainloop()
diff --git a/Demo/tkinter/guido/shell_window.py b/Demo/tkinter/guido/shell_window.py
deleted file mode 100644
index c5a0401..0000000
--- a/Demo/tkinter/guido/shell_window.py
+++ /dev/null
@@ -1,146 +0,0 @@
-import os
-import sys
-from tkinter import *
-from tkinter.scrolledtext import ScrolledText
-from tkinter.dialog import Dialog
-import signal
-
-BUFSIZE = 512
-
-class ShellWindow(ScrolledText):
-
-    def __init__(self, master=None, shell=None, **cnf):
-        if not shell:
-            try:
-                shell = os.environ['SHELL']
-            except KeyError:
-                shell = '/bin/sh'
-            shell = shell + ' -i'
-        args = shell.split()
-        shell = args[0]
-
-        ScrolledText.__init__(self, master, **cnf)
-        self.pos = '1.0'
-        self.bind('<Return>', self.inputhandler)
-        self.bind('<Control-c>', self.sigint)
-        self.bind('<Control-t>', self.sigterm)
-        self.bind('<Control-k>', self.sigkill)
-        self.bind('<Control-d>', self.sendeof)
-
-        self.pid, self.fromchild, self.tochild = spawn(shell, args)
-        self.tk.createfilehandler(self.fromchild, READABLE,
-                                  self.outputhandler)
-
-    def outputhandler(self, file, mask):
-        data = os.read(file, BUFSIZE).decode()
-        if not data:
-            self.tk.deletefilehandler(file)
-            pid, sts = os.waitpid(self.pid, 0)
-            print('pid', pid, 'status', sts)
-            self.pid = None
-            detail = sts>>8
-            cause = sts & 0xff
-            if cause == 0:
-                msg = "exit status %d" % detail
-            else:
-                msg = "killed by signal %d" % (cause & 0x7f)
-                if cause & 0x80:
-                    msg = msg + " -- core dumped"
-            Dialog(self.master,
-                   text=msg,
-                   title="Exit status",
-                   bitmap='warning',
-                   default=0,
-                   strings=('OK',))
-            return
-        self.insert(END, data)
-        self.pos = self.index("end - 1 char")
-        self.yview_pickplace(END)
-
-    def inputhandler(self, *args):
-        if not self.pid:
-            self.no_process()
-            return "break"
-        self.insert(END, "\n")
-        line = self.get(self.pos, "end - 1 char")
-        self.pos = self.index(END)
-        os.write(self.tochild, line.encode())
-        return "break"
-
-    def sendeof(self, *args):
-        if not self.pid:
-            self.no_process()
-            return "break"
-        os.close(self.tochild)
-        return "break"
-
-    def sendsig(self, sig):
-        if not self.pid:
-            self.no_process()
-            return "break"
-        os.kill(self.pid, sig)
-        return "break"
-
-    def sigint(self, *args):
-        return self.sendsig(signal.SIGINT)
-
-    def sigquit(self, *args):
-        return self.sendsig(signal.SIGQUIT)
-
-    def sigterm(self, *args):
-        return self.sendsig(signal.SIGTERM)
-
-    def sigkill(self, *args):
-        return self.sendsig(signal.SIGKILL)
-
-    def no_process(self):
-        Dialog(self.master,
-               text="No active process",
-               title="No process",
-               bitmap='error',
-               default=0,
-               strings=('OK',))
-
-MAXFD = 100     # Max number of file descriptors (os.getdtablesize()???)
-
-def spawn(prog, args):
-    p2cread, p2cwrite = os.pipe()
-    c2pread, c2pwrite = os.pipe()
-    pid = os.fork()
-    if pid == 0:
-        # Child
-        for i in 0, 1, 2:
-            try:
-                os.close(i)
-            except os.error:
-                pass
-        if os.dup(p2cread) != 0:
-            sys.stderr.write('popen2: bad read dup\n')
-        if os.dup(c2pwrite) != 1:
-            sys.stderr.write('popen2: bad write dup\n')
-        if os.dup(c2pwrite) != 2:
-            sys.stderr.write('popen2: bad write dup\n')
-        os.closerange(3, MAXFD)
-        try:
-            os.execvp(prog, args)
-        finally:
-            sys.stderr.write('execvp failed\n')
-            os._exit(1)
-    os.close(p2cread)
-    os.close(c2pwrite)
-    return pid, c2pread, p2cwrite
-
-def test():
-    shell = ' '.join(sys.argv[1: ])
-    root = Tk()
-    root.minsize(1, 1)
-    if shell:
-        w = ShellWindow(root, shell=shell)
-    else:
-        w = ShellWindow(root)
-    w.pack(expand=1, fill=BOTH)
-    w.focus_set()
-    w.tk.mainloop()
-
-if __name__ == '__main__':
-    test()
diff --git a/Demo/tkinter/guido/solitaire.py b/Demo/tkinter/guido/solitaire.py
deleted file mode 100755
index d0f5dee..0000000
--- a/Demo/tkinter/guido/solitaire.py
+++ /dev/null
@@ -1,626 +0,0 @@
-#! /usr/bin/env python3
-
-"""Solitaire game, much like the one that comes with MS Windows.
-
-Limitations:
-
-- No cute graphical images for the playing cards faces or backs.
-- No scoring or timer.
-- No undo.
-- No option to turn 3 cards at a time.
-- No keyboard shortcuts.
-- Less fancy animation when you win.
-- The determination of which stack you drag to is more relaxed.
-
-Apology:
-
-I'm not much of a card player, so my terminology in these comments may
-at times be a little unusual.  If you have suggestions, please let me
-know!
-
-"""
-
-# Imports
-
-import random
-
-from tkinter import *
-from canvasevents import Group
-
-
-# Constants determining the size and lay-out of cards and stacks.  We
-# work in a "grid" where each card/stack is surrounded by MARGIN
-# pixels of space on each side, so adjacent stacks are separated by
-# 2*MARGIN pixels.  OFFSET is the offset used for displaying the
-# face down cards in the row stacks.
-
-CARDWIDTH = 100
-CARDHEIGHT = 150
-MARGIN = 10
-XSPACING = CARDWIDTH + 2*MARGIN
-YSPACING = CARDHEIGHT + 4*MARGIN
-OFFSET = 5
-
-# The background color, green to look like a playing table.  The
-# standard green is way too bright, and dark green is way to dark, so
-# we use something in between.  (There are a few more colors that
-# could be customized, but they are less controversial.)
-
-BACKGROUND = '#070'
-
-
-# Suits and colors.  The values of the symbolic suit names are the
-# strings used to display them (you change these and VALNAMES to
-# internationalize the game).  The COLOR dictionary maps suit names to
-# colors (red and black) which must be Tk color names.  The keys() of
-# the COLOR dictionary conveniently provides us with a list of all
-# suits (in arbitrary order).
-
-HEARTS = 'Heart'
-DIAMONDS = 'Diamond'
-CLUBS = 'Club'
-SPADES = 'Spade'
-
-RED = 'red'
-BLACK = 'black'
-
-COLOR = {}
-for s in (HEARTS, DIAMONDS):
-    COLOR[s] = RED
-for s in (CLUBS, SPADES):
-    COLOR[s] = BLACK
-
-ALLSUITS = list(COLOR.keys())
-NSUITS = len(ALLSUITS)
-
-
-# Card values are 1-13.  We also define symbolic names for the picture
-# cards.  ALLVALUES is a list of all card values.
-
-ACE = 1
-JACK = 11
-QUEEN = 12
-KING = 13
-ALLVALUES = range(1, 14) # (one more than the highest value)
-NVALUES = len(ALLVALUES)
-
-
-# VALNAMES is a list that maps a card value to string.  It contains a
-# dummy element at index 0 so it can be indexed directly with the card
-# value.
-
-VALNAMES = ["", "A"] + list(map(str, range(2, 11))) + ["J", "Q", "K"]
-
-
-# Solitaire constants.  The only one I can think of is the number of
-# row stacks.
-
-NROWS = 7
-
-
-# The rest of the program consists of class definitions.  These are
-# further described in their documentation strings.
-
-
-class Card:
-
-    """A playing card.
-
-    A card doesn't record to which stack it belongs; only the stack
-    records this (it turns out that we always know this from the
-    context, and this saves a ``double update'' with potential for
-    inconsistencies).
-
-    Public methods:
-
-    moveto(x, y) -- move the card to an absolute position
-    moveby(dx, dy) -- move the card by a relative offset
-    tkraise() -- raise the card to the top of its stack
-    showface(), showback() -- turn the card face up or down & raise it
-
-    Public read-only instance variables:
-
-    suit, value, color -- the card's suit, value and color
-    face_shown -- true when the card is shown face up, else false
-
-    Semi-public read-only instance variables (XXX should be made
-    private):
-
-    group -- the Canvas.Group representing the card
-    x, y -- the position of the card's top left corner
-
-    Private instance variables:
-
-    __back, __rect, __text -- the canvas items making up the card
-
-    (To show the card face up, the text item is placed in front of
-    rect and the back is placed behind it.  To show it face down, this
-    is reversed.  The card is created face down.)
-
-    """
-
-    def __init__(self, suit, value, canvas):
-        """Card constructor.
-
-        Arguments are the card's suit and value, and the canvas widget.
-
-        The card is created at position (0, 0), with its face down
-        (adding it to a stack will position it according to that
-        stack's rules).
-
-        """
-        self.suit = suit
-        self.value = value
-        self.color = COLOR[suit]
-        self.face_shown = 0
-
-        self.x = self.y = 0
-        self.canvas = canvas
-        self.group = Group(canvas)
-
-        text = "%s  %s" % (VALNAMES[value], suit)
-        self.__text = canvas.create_text(CARDWIDTH // 2, 0, anchor=N,
-                                         fill=self.color, text=text)
-        self.group.addtag_withtag(self.__text)
-
-        self.__rect = canvas.create_rectangle(0, 0, CARDWIDTH, CARDHEIGHT,
-                                              outline='black', fill='white')
-        self.group.addtag_withtag(self.__rect)
-
-        self.__back = canvas.create_rectangle(MARGIN, MARGIN,
-                                              CARDWIDTH - MARGIN,
-                                              CARDHEIGHT - MARGIN,
-                                              outline='black', fill='blue')
-        self.group.addtag_withtag(self.__back)
-
-    def __repr__(self):
-        """Return a string for debug print statements."""
-        return "Card(%r, %r)" % (self.suit, self.value)
-
-    def moveto(self, x, y):
-        """Move the card to absolute position (x, y)."""
-        self.moveby(x - self.x, y - self.y)
-
-    def moveby(self, dx, dy):
-        """Move the card by (dx, dy)."""
-        self.x = self.x + dx
-        self.y = self.y + dy
-        self.group.move(dx, dy)
-
-    def tkraise(self):
-        """Raise the card above all other objects in its canvas."""
-        self.group.tkraise()
-
-    def showface(self):
-        """Turn the card's face up."""
-        self.tkraise()
-        self.canvas.tag_raise(self.__rect)
-        self.canvas.tag_raise(self.__text)
-        self.face_shown = 1
-
-    def showback(self):
-        """Turn the card's face down."""
-        self.tkraise()
-        self.canvas.tag_raise(self.__rect)
-        self.canvas.tag_raise(self.__back)
-        self.face_shown = 0
-
-
-class Stack:
-
-    """A generic stack of cards.
-
-    This is used as a base class for all other stacks (e.g. the deck,
-    the suit stacks, and the row stacks).
-
-    Public methods:
-
-    add(card) -- add a card to the stack
-    delete(card) -- delete a card from the stack
-    showtop() -- show the top card (if any) face up
-    deal() -- delete and return the top card, or None if empty
-
-    Method that subclasses may override:
-
-    position(card) -- move the card to its proper (x, y) position
-
-        The default position() method places all cards at the stack's
-        own (x, y) position.
-
-    userclickhandler(), userdoubleclickhandler() -- called to do
-    subclass specific things on single and double clicks
-
-        The default user (single) click handler shows the top card
-        face up.  The default user double click handler calls the user
-        single click handler.
-
-    usermovehandler(cards) -- called to complete a subpile move
-
-        The default user move handler moves all moved cards back to
-        their original position (by calling the position() method).
-
-    Private methods:
-
-    clickhandler(event), doubleclickhandler(event),
-    motionhandler(event), releasehandler(event) -- event handlers
-
-        The default event handlers turn the top card of the stack with
-        its face up on a (single or double) click, and also support
-        moving a subpile around.
-
-    startmoving(event) -- begin a move operation
-    finishmoving() -- finish a move operation
-
-    """
-
-    def __init__(self, x, y, game=None):
-        """Stack constructor.
-
-        Arguments are the stack's nominal x and y position (the top
-        left corner of the first card placed in the stack), and the
-        game object (which is used to get the canvas; subclasses use
-        the game object to find other stacks).
-
-        """
-        self.x = x
-        self.y = y
-        self.game = game
-        self.cards = []
-        self.group = Group(self.game.canvas)
-        self.group.bind('<1>', self.clickhandler)
-        self.group.bind('<Double-1>', self.doubleclickhandler)
-        self.group.bind('<B1-Motion>', self.motionhandler)
-        self.group.bind('<ButtonRelease-1>', self.releasehandler)
-        self.makebottom()
-
-    def makebottom(self):
-        pass
-
-    def __repr__(self):
-        """Return a string for debug print statements."""
-        return "%s(%d, %d)" % (self.__class__.__name__, self.x, self.y)
-
-    # Public methods
-
-    def add(self, card):
-        self.cards.append(card)
-        card.tkraise()
-        self.position(card)
-        self.group.addtag_withtag(card.group)
-
-    def delete(self, card):
-        self.cards.remove(card)
-        card.group.dtag(self.group)
-
-    def showtop(self):
-        if self.cards:
-            self.cards[-1].showface()
-
-    def deal(self):
-        if not self.cards:
-            return None
-        card = self.cards[-1]
-        self.delete(card)
-        return card
-
-    # Subclass overridable methods
-
-    def position(self, card):
-        card.moveto(self.x, self.y)
-
-    def userclickhandler(self):
-        self.showtop()
-
-    def userdoubleclickhandler(self):
-        self.userclickhandler()
-
-    def usermovehandler(self, cards):
-        for card in cards:
-            self.position(card)
-
-    # Event handlers
-
-    def clickhandler(self, event):
-        self.finishmoving()             # In case we lost an event
-        self.userclickhandler()
-        self.startmoving(event)
-
-    def motionhandler(self, event):
-        self.keepmoving(event)
-
-    def releasehandler(self, event):
-        self.keepmoving(event)
-        self.finishmoving()
-
-    def doubleclickhandler(self, event):
-        self.finishmoving()             # In case we lost an event
-        self.userdoubleclickhandler()
-        self.startmoving(event)
-
-    # Move internals
-
-    moving = None
-
-    def startmoving(self, event):
-        self.moving = None
-        tags = self.game.canvas.gettags('current')
-        for i in range(len(self.cards)):
-            card = self.cards[i]
-            if card.group.tag in tags:
-                break
-        else:
-            return
-        if not card.face_shown:
-            return
-        self.moving = self.cards[i:]
-        self.lastx = event.x
-        self.lasty = event.y
-        for card in self.moving:
-            card.tkraise()
-
-    def keepmoving(self, event):
-        if not self.moving:
-            return
-        dx = event.x - self.lastx
-        dy = event.y - self.lasty
-        self.lastx = event.x
-        self.lasty = event.y
-        if dx or dy:
-            for card in self.moving:
-                card.moveby(dx, dy)
-
-    def finishmoving(self):
-        cards = self.moving
-        self.moving = None
-        if cards:
-            self.usermovehandler(cards)
-
-
-class Deck(Stack):
-
-    """The deck is a stack with support for shuffling.
-
-    New methods:
-
-    fill() -- create the playing cards
-    shuffle() -- shuffle the playing cards
-
-    A single click moves the top card to the game's open deck and
-    moves it face up; if we're out of cards, it moves the open deck
-    back to the deck.
-
-    """
-
-    def makebottom(self):
-        bottom = self.game.canvas.create_rectangle(self.x, self.y,
-            self.x + CARDWIDTH, self.y + CARDHEIGHT, outline='black',
-            fill=BACKGROUND)
-        self.group.addtag_withtag(bottom)
-
-    def fill(self):
-        for suit in ALLSUITS:
-            for value in ALLVALUES:
-                self.add(Card(suit, value, self.game.canvas))
-
-    def shuffle(self):
-        n = len(self.cards)
-        newcards = []
-        for i in randperm(n):
-            newcards.append(self.cards[i])
-        self.cards = newcards
-
-    def userclickhandler(self):
-        opendeck = self.game.opendeck
-        card = self.deal()
-        if not card:
-            while 1:
-                card = opendeck.deal()
-                if not card:
-                    break
-                self.add(card)
-                card.showback()
-        else:
-            self.game.opendeck.add(card)
-            card.showface()
-
-
-def randperm(n):
-    """Function returning a random permutation of range(n)."""
-    r = list(range(n))
-    x = []
-    while r:
-        i = random.choice(r)
-        x.append(i)
-        r.remove(i)
-    return x
-
-
-class OpenStack(Stack):
-
-    def acceptable(self, cards):
-        return 0
-
-    def usermovehandler(self, cards):
-        card = cards[0]
-        stack = self.game.closeststack(card)
-        if not stack or stack is self or not stack.acceptable(cards):
-            Stack.usermovehandler(self, cards)
-        else:
-            for card in cards:
-                self.delete(card)
-                stack.add(card)
-            self.game.wincheck()
-
-    def userdoubleclickhandler(self):
-        if not self.cards:
-            return
-        card = self.cards[-1]
-        if not card.face_shown:
-            self.userclickhandler()
-            return
-        for s in self.game.suits:
-            if s.acceptable([card]):
-                self.delete(card)
-                s.add(card)
-                self.game.wincheck()
-                break
-
-
-class SuitStack(OpenStack):
-
-    def makebottom(self):
-        bottom = self.game.canvas.create_rectangle(self.x, self.y,
-            self.x + CARDWIDTH, self.y + CARDHEIGHT, outline='black', fill='')
-
-    def userclickhandler(self):
-        pass
-
-    def userdoubleclickhandler(self):
-        pass
-
-    def acceptable(self, cards):
-        if len(cards) != 1:
-            return 0
-        card = cards[0]
-        if not self.cards:
-            return card.value == ACE
-        topcard = self.cards[-1]
-        return card.suit == topcard.suit and card.value == topcard.value + 1
-
-
-class RowStack(OpenStack):
-
-    def acceptable(self, cards):
-        card = cards[0]
-        if not self.cards:
-            return card.value == KING
-        topcard = self.cards[-1]
-        if not topcard.face_shown:
-            return 0
-        return card.color != topcard.color and card.value == topcard.value - 1
-
-    def position(self, card):
-        y = self.y
-        for c in self.cards:
-            if c == card:
-                break
-            if c.face_shown:
-                y = y + 2*MARGIN
-            else:
-                y = y + OFFSET
-        card.moveto(self.x, y)
-
-
-class Solitaire:
-
-    def __init__(self, master):
-        self.master = master
-
-        self.canvas = Canvas(self.master,
-                             background=BACKGROUND,
-                             highlightthickness=0,
-                             width=NROWS*XSPACING,
-                             height=3*YSPACING + 20 + MARGIN)
-        self.canvas.pack(fill=BOTH, expand=TRUE)
-
-        self.dealbutton = Button(self.canvas,
-                                 text="Deal",
-                                 highlightthickness=0,
-                                 background=BACKGROUND,
-                                 activebackground="green",
-                                 command=self.deal)
-        self.canvas.create_window(MARGIN, 3 * YSPACING + 20,
-            window=self.dealbutton, anchor=SW)
-
-        x = MARGIN
-        y = MARGIN
-
-        self.deck = Deck(x, y, self)
-
-        x = x + XSPACING
-        self.opendeck = OpenStack(x, y, self)
-
-        x = x + XSPACING
-        self.suits = []
-        for i in range(NSUITS):
-            x = x + XSPACING
-            self.suits.append(SuitStack(x, y, self))
-
-        x = MARGIN
-        y = y + YSPACING
-
-        self.rows = []
-        for i in range(NROWS):
-            self.rows.append(RowStack(x, y, self))
-            x = x + XSPACING
-
-        self.openstacks = [self.opendeck] + self.suits + self.rows
-
-        self.deck.fill()
-        self.deal()
-
-    def wincheck(self):
-        for s in self.suits:
-            if len(s.cards) != NVALUES:
-                return
-        self.win()
-        self.deal()
-
-    def win(self):
-        """Stupid animation when you win."""
-        cards = []
-        for s in self.openstacks:
-            cards = cards + s.cards
-        while cards:
-            card = random.choice(cards)
-            cards.remove(card)
-            self.animatedmoveto(card, self.deck)
-
-    def animatedmoveto(self, card, dest):
-        for i in range(10, 0, -1):
-            dx, dy = (dest.x-card.x)//i, (dest.y-card.y)//i
-            card.moveby(dx, dy)
-            self.master.update_idletasks()
-
-    def closeststack(self, card):
-        closest = None
-        cdist = 999999999
-        # Since we only compare distances,
-        # we don't bother to take the square root.
-        for stack in self.openstacks:
-            dist = (stack.x - card.x)**2 + (stack.y - card.y)**2
-            if dist < cdist:
-                closest = stack
-                cdist = dist
-        return closest
-
-    def deal(self):
-        self.reset()
-        self.deck.shuffle()
-        for i in range(NROWS):
-            for r in self.rows[i:]:
-                card = self.deck.deal()
-                r.add(card)
-        for r in self.rows:
-            r.showtop()
-
-    def reset(self):
-        for stack in self.openstacks:
-            while 1:
-                card = stack.deal()
-                if not card:
-                    break
-                self.deck.add(card)
-                card.showback()
-
-
-# Main function, run when invoked as a stand-alone Python program.
-
-def main():
-    root = Tk()
-    game = Solitaire(root)
-    root.protocol('WM_DELETE_WINDOW', root.quit)
-    root.mainloop()
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/svkill.py b/Demo/tkinter/guido/svkill.py
deleted file mode 100755
index 5ed8f0f..0000000
--- a/Demo/tkinter/guido/svkill.py
+++ /dev/null
@@ -1,124 +0,0 @@
-#! /usr/bin/env python3
-
-# Tkinter interface to SYSV `ps' and `kill' commands.
-
-from tkinter import *
-
-if TkVersion < 4.0:
-    raise ImportError("This version of svkill requires Tk 4.0 or later")
-
-import subprocess
-import os
-
-user = os.environ['LOGNAME']
-
-class BarButton(Menubutton):
-    def __init__(self, master=None, **cnf):
-        Menubutton.__init__(self, master, **cnf)
-        self.pack(side=LEFT)
-        self.menu = Menu(self, name='menu')
-        self['menu'] = self.menu
-
-class Kill(Frame):
-    # List of (name, option, pid_column)
-    view_list = [
-            ('Default', ''),
-            ('Every (-e)', '-e'),
-            ('Non process group leaders (-d)', '-d'),
-            ('Non leaders with tty (-a)', '-a'),
-            ('For this user (-u %s)' % user, '-u %s' % user),
-            ]
-    format_list = [
-            ('Default', '', 0),
-            ('Long (-l)', '-l', 3),
-            ('Full (-f)', '-f', 1),
-            ('Full Long (-f -l)', '-l -f', 3),
-            ('Session and group ID (-j)', '-j', 0),
-            ('Scheduler properties (-c)', '-c', 0),
-            ]
-    def kill(self, selected):
-        c = self.format_list[self.format.get()][2]
-        pid = selected.split()[c]
-        os.system('kill -9 ' + pid)
-        self.do_update()
-    def do_update(self):
-        format = self.format_list[self.format.get()][1]
-        view = self.view_list[self.view.get()][1]
-        s = subprocess.getoutput('ps %s %s' % (view, format))
-        list = s.split('\n')
-        self.header.set(list[0] + '          ')
-        del list[0]
-        self.frame.list.delete(0, AtEnd())
-        for line in list:
-            self.frame.list.insert(0, line)
-    def do_motion(self, e):
-        e.widget.select_clear('0', 'end')
-        e.widget.select_set(e.widget.nearest(e.y))
-    def do_leave(self, e):
-        e.widget.select_clear('0', 'end')
-    def do_1(self, e):
-        self.kill(e.widget.get(e.widget.nearest(e.y)))
-    def __init__(self, master=None, **cnf):
-        Frame.__init__(self, master, **cnf)
-        self.pack(expand=1, fill=BOTH)
-        self.bar = Frame(self, name='bar', relief=RAISED,
-                         borderwidth=2)
-        self.bar.pack(fill=X)
-        self.bar.file = BarButton(self.bar, text='File')
-        self.bar.file.menu.add_command(
-                label='Quit', command=self.quit)
-        self.bar.view = BarButton(self.bar, text='View')
-        self.bar.format = BarButton(self.bar, text='Format')
-        self.view = IntVar(self)
-        self.view.set(0)
-        self.format = IntVar(self)
-        self.format.set(0)
-        for num in range(len(self.view_list)):
-            label, option = self.view_list[num]
-            self.bar.view.menu.add_radiobutton(
-                    label=label,
-                    command=self.do_update,
-                    variable=self.view,
-                    value=num)
-        for num in range(len(self.format_list)):
-            label, option, col = self.format_list[num]
-            self.bar.format.menu.add_radiobutton(
-                    label=label,
-                    command=self.do_update,
-                    variable=self.format,
-                    value=num)
-        self.bar.tk_menuBar(self.bar.file,
-                            self.bar.view,
-                            self.bar.format)
-        self.frame = Frame(self, relief=RAISED, borderwidth=2)
-        self.frame.pack(expand=1, fill=BOTH)
-        self.header = StringVar(self)
-        self.frame.label = Label(
-                self.frame, relief=FLAT, anchor=NW, borderwidth=0,
-                textvariable=self.header)
-        self.frame.label.pack(fill=Y, anchor=W)
-        self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
-        self.frame.list = Listbox(
-                self.frame,
-                relief=SUNKEN,
-                width=40, height=10,
-                selectbackground='#eed5b7',
-                selectborderwidth=0,
-                selectmode=BROWSE,
-                yscroll=self.frame.vscroll.set)
-        self.frame.vscroll['command'] = self.frame.list.yview
-        self.frame.vscroll.pack(side=RIGHT, fill=Y)
-        self.frame.list.pack(expand=1, fill=BOTH)
-        self.update = Button(self, text='Update',
-                             command=self.do_update)
-        self.update.pack(fill=X)
-        self.frame.list.bind('<Motion>', self.do_motion)
-        self.frame.list.bind('<Leave>', self.do_leave)
-        self.frame.list.bind('<1>', self.do_1)
-        self.do_update()
-
-if __name__ == '__main__':
-    kill = Kill(None, borderwidth=5)
-    kill.winfo_toplevel().title('Tkinter Process Killer (SYSV)')
-    kill.winfo_toplevel().minsize(1, 1)
-    kill.mainloop()
diff --git a/Demo/tkinter/guido/switch.py b/Demo/tkinter/guido/switch.py
deleted file mode 100644
index 3f43925..0000000
--- a/Demo/tkinter/guido/switch.py
+++ /dev/null
@@ -1,55 +0,0 @@
-# Show how to do switchable panels.
-
-from tkinter import *
-
-class App:
-
-    def __init__(self, top=None, master=None):
-        if top is None:
-            if master is None:
-                top = Tk()
-            else:
-                top = Toplevel(master)
-        self.top = top
-        self.buttonframe = Frame(top)
-        self.buttonframe.pack()
-        self.panelframe = Frame(top,  borderwidth=2, relief=GROOVE)
-        self.panelframe.pack(expand=1, fill=BOTH)
-        self.panels = {}
-        self.curpanel = None
-
-    def addpanel(self, name, klass):
-        button = Button(self.buttonframe, text=name,
-                        command=lambda self=self, name=name: self.show(name))
-        button.pack(side=LEFT)
-        frame = Frame(self.panelframe)
-        instance = klass(frame)
-        self.panels[name] = (button, frame, instance)
-        if self.curpanel is None:
-            self.show(name)
-
-    def show(self, name):
-        (button, frame, instance) = self.panels[name]
-        if self.curpanel:
-            self.curpanel.pack_forget()
-        self.curpanel = frame
-        frame.pack(expand=1, fill="both")
-
-class LabelPanel:
-    def __init__(self, frame):
-        self.label = Label(frame, text="Hello world")
-        self.label.pack()
-
-class ButtonPanel:
-    def __init__(self, frame):
-        self.button = Button(frame, text="Press me")
-        self.button.pack()
-
-def main():
-    app = App()
-    app.addpanel("label", LabelPanel)
-    app.addpanel("button", ButtonPanel)
-    app.top.mainloop()
-
-if __name__ == '__main__':
-    main()
diff --git a/Demo/tkinter/guido/tkman.py b/Demo/tkinter/guido/tkman.py
deleted file mode 100755
index c7081a6..0000000
--- a/Demo/tkinter/guido/tkman.py
+++ /dev/null
@@ -1,267 +0,0 @@
-#! /usr/bin/env python3
-
-# Tk man page browser -- currently only shows the Tcl/Tk man pages
-
-import os
-import re
-import sys
-from tkinter import *
-
-from manpage import ManPage
-
-MANNDIRLIST = ['/usr/local/man/mann', '/usr/share/man/mann']
-MAN3DIRLIST = ['/usr/local/man/man3', '/usr/share/man/man3']
-
-foundmanndir = 0
-for dir in MANNDIRLIST:
-    if os.path.exists(dir):
-        MANNDIR = dir
-        foundmanndir = 1
-
-foundman3dir = 0
-for dir in MAN3DIRLIST:
-    if os.path.exists(dir):
-        MAN3DIR = dir
-        foundman3dir =  1
-
-if not foundmanndir or not foundman3dir:
-    sys.stderr.write('\n')
-    if not foundmanndir:
-        msg = """\
-Failed to find mann directory.
-Please add the correct entry to the MANNDIRLIST
-at the top of %s script.""" % \
-sys.argv[0]
-        sys.stderr.write("%s\n\n" % msg)
-    if not foundman3dir:
-        msg = """\
-Failed to find man3 directory.
-Please add the correct entry to the MAN3DIRLIST
-at the top of %s script.""" % \
-sys.argv[0]
-        sys.stderr.write("%s\n\n" % msg)
-    sys.exit(1)
-
-del foundmanndir
-del foundman3dir
-
-def listmanpages(mandir):
-    files = os.listdir(mandir)
-    names = []
-    for file in files:
-        if file[-2:-1] == '.' and  (file[-1] in 'ln123456789'):
-            names.append(file[:-2])
-    names.sort()
-    return names
-
-class SelectionBox:
-
-    def __init__(self, master=None):
-        self.choices = []
-
-        self.frame = Frame(master, name="frame")
-        self.frame.pack(expand=1, fill=BOTH)
-        self.master = self.frame.master
-        self.subframe = Frame(self.frame, name="subframe")
-        self.subframe.pack(expand=0, fill=BOTH)
-        self.leftsubframe = Frame(self.subframe, name='leftsubframe')
-        self.leftsubframe.pack(side=LEFT, expand=1, fill=BOTH)
-        self.rightsubframe = Frame(self.subframe, name='rightsubframe')
-        self.rightsubframe.pack(side=RIGHT, expand=1, fill=BOTH)
-        self.chaptervar = StringVar(master)
-        self.chapter = Menubutton(self.rightsubframe, name='chapter',
-                                  text='Directory', relief=RAISED,
-                                  borderwidth=2)
-        self.chapter.pack(side=TOP)
-        self.chaptermenu = Menu(self.chapter, name='chaptermenu')
-        self.chaptermenu.add_radiobutton(label='C functions',
-                                         value=MAN3DIR,
-                                         variable=self.chaptervar,
-                                         command=self.newchapter)
-        self.chaptermenu.add_radiobutton(label='Tcl/Tk functions',
-                                         value=MANNDIR,
-                                         variable=self.chaptervar,
-                                         command=self.newchapter)
-        self.chapter['menu'] = self.chaptermenu
-        self.listbox = Listbox(self.rightsubframe, name='listbox',
-                               relief=SUNKEN, borderwidth=2,
-                               width=20, height=5)
-        self.listbox.pack(expand=1, fill=BOTH)
-        self.l1 = Button(self.leftsubframe, name='l1',
-                         text='Display manual page named:',
-                         command=self.entry_cb)
-        self.l1.pack(side=TOP)
-        self.entry = Entry(self.leftsubframe, name='entry',
-                            relief=SUNKEN, borderwidth=2,
-                            width=20)
-        self.entry.pack(expand=0, fill=X)
-        self.l2frame = Frame(self.leftsubframe, name='l2frame')
-        self.l2frame.pack(expand=0, fill=NONE)
-        self.l2 = Button(self.l2frame, name='l2',
-                         text='Search regexp:',
-                         command=self.search_cb)
-        self.l2.pack(side=LEFT)
-        self.casevar = BooleanVar()
-        self.casesense = Checkbutton(self.l2frame, name='casesense',
-                                     text='Case sensitive',
-                                     variable=self.casevar,
-                                     relief=FLAT)
-        self.casesense.pack(side=LEFT)
-        self.search = Entry(self.leftsubframe, name='search',
-                            relief=SUNKEN, borderwidth=2,
-                            width=20)
-        self.search.pack(expand=0, fill=X)
-        self.title = Label(self.leftsubframe, name='title',
-                           text='(none)')
-        self.title.pack(side=BOTTOM)
-        self.text = ManPage(self.frame, name='text',
-                            relief=SUNKEN, borderwidth=2,
-                            wrap=NONE, width=72,
-                            selectbackground='pink')
-        self.text.pack(expand=1, fill=BOTH)
-
-        self.entry.bind('<Return>', self.entry_cb)
-        self.search.bind('<Return>', self.search_cb)
-        self.listbox.bind('<Double-1>', self.listbox_cb)
-
-        self.entry.bind('<Tab>', self.entry_tab)
-        self.search.bind('<Tab>', self.search_tab)
-        self.text.bind('<Tab>', self.text_tab)
-
-        self.entry.focus_set()
-
-        self.chaptervar.set(MANNDIR)
-        self.newchapter()
-
-    def newchapter(self):
-        mandir = self.chaptervar.get()
-        self.choices = []
-        self.addlist(listmanpages(mandir))
-
-    def addchoice(self, choice):
-        if choice not in self.choices:
-            self.choices.append(choice)
-            self.choices.sort()
-        self.update()
-
-    def addlist(self, list):
-        self.choices[len(self.choices):] = list
-        self.choices.sort()
-        self.update()
-
-    def entry_cb(self, *e):
-        self.update()
-
-    def listbox_cb(self, e):
-        selection = self.listbox.curselection()
-        if selection and len(selection) == 1:
-            name = self.listbox.get(selection[0])
-            self.show_page(name)
-
-    def search_cb(self, *e):
-        self.search_string(self.search.get())
-
-    def entry_tab(self, e):
-        self.search.focus_set()
-
-    def search_tab(self, e):
-        self.entry.focus_set()
-
-    def text_tab(self, e):
-        self.entry.focus_set()
-
-    def updatelist(self):
-        key = self.entry.get()
-        ok = list(filter(lambda name, key=key, n=len(key): name[:n]==key,
-                 self.choices))
-        if not ok:
-            self.frame.bell()
-        self.listbox.delete(0, AtEnd())
-        exactmatch = 0
-        for item in ok:
-            if item == key: exactmatch = 1
-            self.listbox.insert(AtEnd(), item)
-        if exactmatch:
-            return key
-        n = self.listbox.size()
-        if n == 1:
-            return self.listbox.get(0)
-        # Else return None, meaning not a unique selection
-
-    def update(self):
-        name = self.updatelist()
-        if name:
-            self.show_page(name)
-            self.entry.delete(0, AtEnd())
-            self.updatelist()
-
-    def show_page(self, name):
-        file = '%s/%s.?' % (self.chaptervar.get(), name)
-        fp = os.popen('nroff -man -c %s | ul -i' % file, 'r')
-        self.text.kill()
-        self.title['text'] = name
-        self.text.parsefile(fp)
-
-    def search_string(self, search):
-        if not search:
-            self.frame.bell()
-            print('Empty search string')
-            return
-        if not self.casevar.get():
-            map = re.IGNORECASE
-        else:
-            map = None
-        try:
-            if map:
-                prog = re.compile(search, map)
-            else:
-                prog = re.compile(search)
-        except re.error as msg:
-            self.frame.bell()
-            print('Regex error:', msg)
-            return
-        here = self.text.index(AtInsert())
-        lineno = int(here[:here.find('.')])
-        end = self.text.index(AtEnd())
-        endlineno = int(end[:end.find('.')])
-        wraplineno = lineno
-        found = 0
-        while 1:
-            lineno = lineno + 1
-            if lineno > endlineno:
-                if wraplineno <= 0:
-                    break
-                endlineno = wraplineno
-                lineno = 0
-                wraplineno = 0
-            line = self.text.get('%d.0 linestart' % lineno,
-                                 '%d.0 lineend' % lineno)
-            i = prog.search(line)
-            if i:
-                found = 1
-                n = max(1, len(i.group(0)))
-                try:
-                    self.text.tag_remove('sel',
-                                         AtSelFirst(),
-                                         AtSelLast())
-                except TclError:
-                    pass
-                self.text.tag_add('sel',
-                                  '%d.%d' % (lineno, i.start()),
-                                  '%d.%d' % (lineno, i.start()+n))
-                self.text.mark_set(AtInsert(),
-                                   '%d.%d' % (lineno, i.start()))
-                self.text.yview_pickplace(AtInsert())
-                break
-        if not found:
-            self.frame.bell()
-
-def main():
-    root = Tk()
-    sb = SelectionBox(root)
-    if sys.argv[1:]:
-        sb.show_page(sys.argv[1])
-    root.minsize(1, 1)
-    root.mainloop()
-
-main()
diff --git a/Demo/tkinter/guido/wish.py b/Demo/tkinter/guido/wish.py
deleted file mode 100644
index 332501d..0000000
--- a/Demo/tkinter/guido/wish.py
+++ /dev/null
@@ -1,34 +0,0 @@
-# This is about all it requires to write a wish shell in Python!
-
-import _tkinter
-import os
-import sys
-
-tk = _tkinter.create(os.environ['DISPLAY'], 'wish', 'Tk', 1, 1)
-tk.call('update')
-
-cmd = ''
-
-while True:
-    if cmd:
-        prompt = ''
-    else:
-        prompt = '% '
-    try:
-        sys.stdout.write(prompt)
-        sys.stdout.flush()
-        line = sys.stdin.readline()
-        if not line:
-            break
-    except EOFError:
-        break
-    cmd += line
-    if tk.getboolean(tk.call('info', 'complete', cmd)):
-        tk.record(line)
-        try:
-            result = tk.call('eval', cmd)
-        except _tkinter.TclError as msg:
-            print('TclError:', msg)
-        else:
-            if result: print(result)
-        cmd = ''
diff --git a/Demo/tkinter/matt/00-HELLO-WORLD.py b/Demo/tkinter/matt/00-HELLO-WORLD.py
deleted file mode 100644
index 3b4092a..0000000
--- a/Demo/tkinter/matt/00-HELLO-WORLD.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from tkinter import *
-
-# note that there is no explicit call to start Tk.
-# Tkinter is smart enough to start the system if it's not already going.
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        # a hello button
-        self.hi_there = Button(self, text='Hello',
-                               command=self.printit)
-        self.hi_there.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/README b/Demo/tkinter/matt/README
deleted file mode 100644
index eb9d302..0000000
--- a/Demo/tkinter/matt/README
+++ /dev/null
@@ -1,30 +0,0 @@
-This directory contains some ad-hoc examples of Tkinter widget
-creation. The files named 
-
-		*-simple.py
-
-are the ones to start with if you're looking for a bare-bones usage of
-a widget. The other files are meant to show common usage patters that
-are a tad more involved. 
-
-If you have a suggestion for an example program, please send mail to 
-	
-	conway@virginia.edu
-
-and I'll include it.
-
-
-matt
-
-TODO
--------
-The X selection
-Dialog Boxes
-More canvas examples
-Message widgets
-Text Editors
-Scrollbars
-Listboxes
-
-
-
diff --git a/Demo/tkinter/matt/animation-simple.py b/Demo/tkinter/matt/animation-simple.py
deleted file mode 100644
index 4120d66..0000000
--- a/Demo/tkinter/matt/animation-simple.py
+++ /dev/null
@@ -1,35 +0,0 @@
-from tkinter import *
-
-# This program shows how to use the "after" function to make animation.
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        self.draw = Canvas(self, width="5i", height="5i")
-
-        # all of these work..
-        self.draw.create_rectangle(0, 0, 10, 10, tags="thing", fill="blue")
-        self.draw.pack(side=LEFT)
-
-    def moveThing(self, *args):
-        # move 1/10 of an inch every 1/10 sec (1" per second, smoothly)
-        self.draw.move("thing", "0.01i", "0.01i")
-        self.after(10, self.moveThing)
-
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-        self.after(10, self.moveThing)
-
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/animation-w-velocity-ctrl.py b/Demo/tkinter/matt/animation-w-velocity-ctrl.py
deleted file mode 100644
index 88309ca..0000000
--- a/Demo/tkinter/matt/animation-w-velocity-ctrl.py
+++ /dev/null
@@ -1,44 +0,0 @@
-from tkinter import *
-
-# this is the same as simple-demo-1.py, but uses
-# subclassing.
-# note that there is no explicit call to start Tk.
-# Tkinter is smart enough to start the system if it's not already going.
-
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-        self.draw = Canvas(self, width="5i", height="5i")
-
-        self.speed = Scale(self, orient=HORIZONTAL, from_=-100, to=100)
-
-        self.speed.pack(side=BOTTOM, fill=X)
-
-        # all of these work..
-        self.draw.create_rectangle(0, 0, 10, 10, tags="thing", fill="blue")
-        self.draw.pack(side=LEFT)
-
-    def moveThing(self, *args):
-        velocity = self.speed.get()
-        str = float(velocity) / 1000.0
-        str = "%ri" % (str,)
-        self.draw.move("thing",  str, str)
-        self.after(10, self.moveThing)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-        self.after(10, self.moveThing)
-
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/bind-w-mult-calls-p-type.py b/Demo/tkinter/matt/bind-w-mult-calls-p-type.py
deleted file mode 100644
index 0da7c37..0000000
--- a/Demo/tkinter/matt/bind-w-mult-calls-p-type.py
+++ /dev/null
@@ -1,43 +0,0 @@
-from tkinter import *
-
-# This program  shows how to use a simple type-in box
-
-class App(Frame):
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        self.pack()
-
-        self.entrythingy = Entry()
-        self.entrythingy.pack()
-
-        # and here we get a callback when the user hits return. we could
-        # make the key that triggers the callback anything we wanted to.
-        # other typical options might be <Key-Tab> or <Key> (for anything)
-        self.entrythingy.bind('<Key-Return>', self.print_contents)
-
-        # Note that here is where we bind a completely different callback to
-        # the same event. We pass "+" here to indicate that we wish to ADD
-        # this callback to the list associated with this event type.
-        # Not specifying "+" would simply override whatever callback was
-        # defined on this event.
-        self.entrythingy.bind('<Key-Return>', self.print_something_else, "+")
-
-    def print_contents(self, event):
-        print("hi. contents of entry is now ---->", self.entrythingy.get())
-
-
-    def print_something_else(self, event):
-        print("hi. Now doing something completely different")
-
-
-root = App()
-root.master.title("Foo")
-root.mainloop()
-
-
-
-# secret tip for experts: if you pass *any* non-false value as
-# the third parameter to bind(), Tkinter.py will accumulate
-# callbacks instead of overwriting. I use "+" here because that's
-# the Tk notation for getting this sort of behavior. The perfect GUI
-# interface would use a less obscure notation.
diff --git a/Demo/tkinter/matt/canvas-demo-simple.py b/Demo/tkinter/matt/canvas-demo-simple.py
deleted file mode 100644
index 7f2c17b..0000000
--- a/Demo/tkinter/matt/canvas-demo-simple.py
+++ /dev/null
@@ -1,28 +0,0 @@
-from tkinter import *
-
-# this program creates a canvas and puts a single polygon on the canvas
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-        self.draw = Canvas(self, width="5i", height="5i")
-
-        # see the other demos for other ways of specifying coords for a polygon
-        self.draw.create_rectangle(0, 0, "3i", "3i", fill="black")
-
-        self.draw.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/canvas-gridding.py b/Demo/tkinter/matt/canvas-gridding.py
deleted file mode 100644
index 2f9d23a..0000000
--- a/Demo/tkinter/matt/canvas-gridding.py
+++ /dev/null
@@ -1,61 +0,0 @@
-from tkinter import *
-
-# this is the same as simple-demo-1.py, but uses
-# subclassing.
-# note that there is no explicit call to start Tk.
-# Tkinter is smart enough to start the system if it's not already going.
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT',
-                                  background='red',
-                                  foreground='white',
-                                  height=3,
-                                  command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-        self.canvasObject = Canvas(self, width="5i", height="5i")
-        self.canvasObject.pack(side=LEFT)
-
-    def mouseDown(self, event):
-        # canvas x and y take the screen coords from the event and translate
-        # them into the coordinate system of the canvas object
-        self.startx = self.canvasObject.canvasx(event.x, self.griddingSize)
-        self.starty = self.canvasObject.canvasy(event.y, self.griddingSize)
-
-    def mouseMotion(self, event):
-        # canvas x and y take the screen coords from the event and translate
-        # them into the coordinate system of the canvas object
-        x = self.canvasObject.canvasx(event.x, self.griddingSize)
-        y = self.canvasObject.canvasy(event.y, self.griddingSize)
-
-        if (self.startx != event.x)  and (self.starty != event.y) :
-            self.canvasObject.delete(self.rubberbandBox)
-            self.rubberbandBox = self.canvasObject.create_rectangle(
-                self.startx, self.starty, x, y)
-            # this flushes the output, making sure that
-            # the rectangle makes it to the screen
-            # before the next event is handled
-            self.update_idletasks()
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-        # this is a "tagOrId" for the rectangle we draw on the canvas
-        self.rubberbandBox = None
-
-        # this is the size of the gridding squares
-        self.griddingSize = 50
-
-        Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
-        Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)
-
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/canvas-moving-or-creating.py b/Demo/tkinter/matt/canvas-moving-or-creating.py
deleted file mode 100644
index edd64f7..0000000
--- a/Demo/tkinter/matt/canvas-moving-or-creating.py
+++ /dev/null
@@ -1,62 +0,0 @@
-from tkinter import *
-
-# this file demonstrates a more sophisticated movement --
-# move dots or create new ones if you click outside the dots
-
-class Test(Frame):
-    ###################################################################
-    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
-    ###################################################################
-    def mouseDown(self, event):
-        # see if we're inside a dot. If we are, it
-        # gets tagged as CURRENT for free by tk.
-        if not event.widget.find_withtag(CURRENT):
-            # there is no dot here, so we can make one,
-            # and bind some interesting behavior to it.
-            # ------
-            # create a dot, and mark it as CURRENT
-            fred = self.draw.create_oval(
-                event.x - 10, event.y -10, event.x +10, event.y + 10,
-                fill="green", tags=CURRENT)
-
-            self.draw.tag_bind(fred, "<Any-Enter>", self.mouseEnter)
-            self.draw.tag_bind(fred, "<Any-Leave>", self.mouseLeave)
-
-        self.lastx = event.x
-        self.lasty = event.y
-
-    def mouseMove(self, event):
-        self.draw.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
-        self.lastx = event.x
-        self.lasty = event.y
-
-    ###################################################################
-    ###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
-    ###################################################################
-    def mouseEnter(self, event):
-        # the CURRENT tag is applied to the object the cursor is over.
-        # this happens automatically.
-        self.draw.itemconfig(CURRENT, fill="red")
-
-    def mouseLeave(self, event):
-        # the CURRENT tag is applied to the object the cursor is over.
-        # this happens automatically.
-        self.draw.itemconfig(CURRENT, fill="blue")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-        self.draw = Canvas(self, width="5i", height="5i")
-        self.draw.pack(side=LEFT)
-
-        Widget.bind(self.draw, "<1>", self.mouseDown)
-        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/canvas-moving-w-mouse.py b/Demo/tkinter/matt/canvas-moving-w-mouse.py
deleted file mode 100644
index 21d724f..0000000
--- a/Demo/tkinter/matt/canvas-moving-w-mouse.py
+++ /dev/null
@@ -1,55 +0,0 @@
-from tkinter import *
-
-# this file demonstrates the movement of a single canvas item under mouse control
-
-class Test(Frame):
-    ###################################################################
-    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
-    ###################################################################
-    def mouseDown(self, event):
-        # remember where the mouse went down
-        self.lastx = event.x
-        self.lasty = event.y
-
-    def mouseMove(self, event):
-        # whatever the mouse is over gets tagged as CURRENT for free by tk.
-        self.draw.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
-        self.lastx = event.x
-        self.lasty = event.y
-
-    ###################################################################
-    ###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
-    ###################################################################
-    def mouseEnter(self, event):
-        # the CURRENT tag is applied to the object the cursor is over.
-        # this happens automatically.
-        self.draw.itemconfig(CURRENT, fill="red")
-
-    def mouseLeave(self, event):
-        # the CURRENT tag is applied to the object the cursor is over.
-        # this happens automatically.
-        self.draw.itemconfig(CURRENT, fill="blue")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-        self.draw = Canvas(self, width="5i", height="5i")
-        self.draw.pack(side=LEFT)
-
-        fred = self.draw.create_oval(0, 0, 20, 20,
-                                     fill="green", tags="selected")
-
-        self.draw.tag_bind(fred, "<Any-Enter>", self.mouseEnter)
-        self.draw.tag_bind(fred, "<Any-Leave>", self.mouseLeave)
-
-        Widget.bind(self.draw, "<1>", self.mouseDown)
-        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/canvas-mult-item-sel.py b/Demo/tkinter/matt/canvas-mult-item-sel.py
deleted file mode 100644
index 4875b44..0000000
--- a/Demo/tkinter/matt/canvas-mult-item-sel.py
+++ /dev/null
@@ -1,78 +0,0 @@
-from tkinter import *
-
-# allows moving dots with multiple selection.
-
-SELECTED_COLOR = "red"
-UNSELECTED_COLOR = "blue"
-
-class Test(Frame):
-    ###################################################################
-    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
-    ###################################################################
-    def mouseDown(self, event):
-        # see if we're inside a dot. If we are, it
-        # gets tagged as CURRENT for free by tk.
-
-        if not event.widget.find_withtag(CURRENT):
-            # we clicked outside of all dots on the canvas. unselect all.
-
-            # re-color everything back to an unselected color
-            self.draw.itemconfig("selected", fill=UNSELECTED_COLOR)
-            # unselect everything
-            self.draw.dtag("selected")
-        else:
-            # mark as "selected" the thing the cursor is under
-            self.draw.addtag("selected", "withtag", CURRENT)
-            # color it as selected
-            self.draw.itemconfig("selected", fill=SELECTED_COLOR)
-
-        self.lastx = event.x
-        self.lasty = event.y
-
-
-    def mouseMove(self, event):
-        self.draw.move("selected", event.x - self.lastx, event.y - self.lasty)
-        self.lastx = event.x
-        self.lasty = event.y
-
-    def makeNewDot(self):
-        # create a dot, and mark it as current
-        fred = self.draw.create_oval(0, 0, 20, 20,
-                                     fill=SELECTED_COLOR, tags=CURRENT)
-        # and make it selected
-        self.draw.addtag("selected", "withtag", CURRENT)
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-
-        ################
-        # make the canvas and bind some behavior to it
-        ################
-        self.draw = Canvas(self, width="5i", height="5i")
-        Widget.bind(self.draw, "<1>", self.mouseDown)
-        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
-
-        # and other things.....
-        self.button = Button(self, text="make a new dot", foreground="blue",
-                             command=self.makeNewDot)
-
-        message = ("%s dots are selected and can be dragged.\n"
-                   "%s are not selected.\n"
-                   "Click in a dot to select it.\n"
-                   "Click on empty space to deselect all dots."
-                   ) % (SELECTED_COLOR, UNSELECTED_COLOR)
-        self.label = Message(self, width="5i", text=message)
-
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-        self.label.pack(side=BOTTOM, fill=X, expand=1)
-        self.button.pack(side=BOTTOM, fill=X)
-        self.draw.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/canvas-reading-tag-info.py b/Demo/tkinter/matt/canvas-reading-tag-info.py
deleted file mode 100644
index 265f0a1..0000000
--- a/Demo/tkinter/matt/canvas-reading-tag-info.py
+++ /dev/null
@@ -1,49 +0,0 @@
-from tkinter import *
-
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-        self.drawing = Canvas(self, width="5i", height="5i")
-
-        # make a shape
-        pgon = self.drawing.create_polygon(
-            10, 10, 110, 10, 110, 110, 10 , 110,
-            fill="red", tags=("weee", "foo", "groo"))
-
-        # this is how you query an object for its attributes
-        # config options FOR CANVAS ITEMS always come back in tuples of length 5.
-        # 0 attribute name
-        # 1 BLANK
-        # 2 BLANK
-        # 3 default value
-        # 4 current value
-        # the blank spots are for consistency with the config command that
-        # is used for widgets. (remember, this is for ITEMS drawn
-        # on a canvas widget, not widgets)
-        option_value = self.drawing.itemconfig(pgon, "stipple")
-        print("pgon's current stipple value is -->", option_value[4], "<--")
-        option_value = self.drawing.itemconfig(pgon,  "fill")
-        print("pgon's current fill value is -->", option_value[4], "<--")
-        print("  when he is usually colored -->", option_value[3], "<--")
-
-        ## here we print out all the tags associated with this object
-        option_value = self.drawing.itemconfig(pgon,  "tags")
-        print("pgon's tags are", option_value[4])
-
-        self.drawing.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/canvas-w-widget-draw-el.py b/Demo/tkinter/matt/canvas-w-widget-draw-el.py
deleted file mode 100644
index ca96583..0000000
--- a/Demo/tkinter/matt/canvas-w-widget-draw-el.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from tkinter import *
-
-# this file demonstrates the creation of widgets as part of a canvas object
-
-class Test(Frame):
-    def printhi(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-        self.draw = Canvas(self, width="5i", height="5i")
-
-        self.button = Button(self, text="this is a button",
-                             command=self.printhi)
-
-        # note here the coords are given in pixels (form the
-        # upper right and corner of the window, as usual for X)
-        # but might just have well been given in inches or points or
-        # whatever...use the "anchor" option to control what point of the
-        # widget (in this case the button) gets mapped to the given x, y.
-        # you can specify corners, edges, center, etc...
-        self.draw.create_window(300, 300, window=self.button)
-
-        self.draw.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/canvas-with-scrollbars.py b/Demo/tkinter/matt/canvas-with-scrollbars.py
deleted file mode 100644
index 1c5681a..0000000
--- a/Demo/tkinter/matt/canvas-with-scrollbars.py
+++ /dev/null
@@ -1,60 +0,0 @@
-from tkinter import *
-
-# This example program creates a scroling canvas, and demonstrates
-# how to tie scrollbars and canvses together. The mechanism
-# is analogus for listboxes and other widgets with
-# "xscroll" and "yscroll" configuration options.
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.question = Label(self, text="Can Find The BLUE Square??????")
-        self.question.pack()
-
-        self.QUIT = Button(self, text='QUIT', background='red',
-                           height=3, command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-        spacer = Frame(self, height="0.25i")
-        spacer.pack(side=BOTTOM)
-
-        # notice that the scroll region (20" x 20") is larger than
-        # displayed size of the widget (5" x 5")
-        self.draw = Canvas(self, width="5i", height="5i",
-                           background="white",
-                           scrollregion=(0, 0, "20i", "20i"))
-
-        self.draw.scrollX = Scrollbar(self, orient=HORIZONTAL)
-        self.draw.scrollY = Scrollbar(self, orient=VERTICAL)
-
-        # now tie the three together. This is standard boilerplate text
-        self.draw['xscrollcommand'] = self.draw.scrollX.set
-        self.draw['yscrollcommand'] = self.draw.scrollY.set
-        self.draw.scrollX['command'] = self.draw.xview
-        self.draw.scrollY['command'] = self.draw.yview
-
-        # draw something. Note that the first square
-        # is visible, but you need to scroll to see the second one.
-        self.draw.create_rectangle(0, 0, "3.5i", "3.5i", fill="black")
-        self.draw.create_rectangle("10i", "10i", "13.5i", "13.5i", fill="blue")
-
-        # pack 'em up
-        self.draw.scrollX.pack(side=BOTTOM, fill=X)
-        self.draw.scrollY.pack(side=RIGHT, fill=Y)
-        self.draw.pack(side=LEFT)
-
-
-    def scrollCanvasX(self, *args):
-        print("scrolling", args)
-        print(self.draw.scrollX.get())
-
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/dialog-box.py b/Demo/tkinter/matt/dialog-box.py
deleted file mode 100644
index c0b8825..0000000
--- a/Demo/tkinter/matt/dialog-box.py
+++ /dev/null
@@ -1,64 +0,0 @@
-from tkinter import *
-from tkinter.dialog import Dialog
-
-# this shows how to create a new window with a button in it
-# that can create new windows
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def makeWindow(self):
-        """Create a top-level dialog with some buttons.
-
-        This uses the Dialog class, which is a wrapper around the Tcl/Tk
-        tk_dialog script.  The function returns 0 if the user clicks 'yes'
-        or 1 if the user clicks 'no'.
-        """
-        # the parameters to this call are as follows:
-        d = Dialog(
-            self,                       ## name of a toplevel window
-            title="fred the dialog box",## title on the window
-            text="click on a choice",   ## message to appear in window
-            bitmap="info",              ## bitmap (if any) to appear;
-                                        ## if none, use ""
-            #     legal values here are:
-            #      string      what it looks like
-            #      ----------------------------------------------
-            #      error       a circle with a slash through it
-            #      grey25      grey square
-            #      grey50      darker grey square
-            #      hourglass   use for "wait.."
-            #      info        a large, lower case "i"
-            #      questhead   a human head with a "?" in it
-            #      question    a large "?"
-            #      warning     a large "!"
-            #        @fname    X bitmap where fname is the path to the file
-            #
-            default=0,    # the index of the default button choice.
-                          # hitting return selects this
-            strings=("yes", "no"))
-                          # values of the 'strings' key are the labels for the
-                          # buttons that appear left to right in the dialog box
-        return d.num
-
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        # a hello button
-        self.hi_there = Button(self, text='Make a New Window',
-                               command=self.makeWindow)
-        self.hi_there.pack(side=LEFT)
-
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.windownum = 0
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/entry-simple.py b/Demo/tkinter/matt/entry-simple.py
deleted file mode 100644
index 1f55df5..0000000
--- a/Demo/tkinter/matt/entry-simple.py
+++ /dev/null
@@ -1,24 +0,0 @@
-from tkinter import *
-import string
-
-# This program  shows how to use a simple type-in box
-
-class App(Frame):
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        self.pack()
-
-        self.entrythingy = Entry()
-        self.entrythingy.pack()
-
-        # and here we get a callback when the user hits return. we could
-        # make the key that triggers the callback anything we wanted to.
-        # other typical options might be <Key-Tab> or <Key> (for anything)
-        self.entrythingy.bind('<Key-Return>', self.print_contents)
-
-    def print_contents(self, event):
-        print("hi. contents of entry is now ---->", self.entrythingy.get())
-
-root = App()
-root.master.title("Foo")
-root.mainloop()
diff --git a/Demo/tkinter/matt/entry-with-shared-variable.py b/Demo/tkinter/matt/entry-with-shared-variable.py
deleted file mode 100644
index 7d93da7..0000000
--- a/Demo/tkinter/matt/entry-with-shared-variable.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from tkinter import *
-
-# This program  shows how to make a typein box shadow a program variable.
-
-class App(Frame):
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        self.pack()
-
-        self.entrythingy = Entry(self)
-        self.entrythingy.pack()
-
-        self.button = Button(self, text="Uppercase The Entry",
-                             command=self.upper)
-        self.button.pack()
-
-        # here we have the text in the entry widget tied to a variable.
-        # changes in the variable are echoed in the widget and vice versa.
-        # Very handy.
-        # there are other Variable types. See Tkinter.py for all
-        # the other variable types that can be shadowed
-        self.contents = StringVar()
-        self.contents.set("this is a variable")
-        self.entrythingy.config(textvariable=self.contents)
-
-        # and here we get a callback when the user hits return. we could
-        # make the key that triggers the callback anything we wanted to.
-        # other typical options might be <Key-Tab> or <Key> (for anything)
-        self.entrythingy.bind('<Key-Return>', self.print_contents)
-
-    def upper(self):
-        # notice here, we don't actually refer to the entry box.
-        # we just operate on the string variable and we
-        # because it's being looked at by the entry widget, changing
-        # the variable changes the entry widget display automatically.
-        # the strange get/set operators are clunky, true...
-        str = self.contents.get().upper()
-        self.contents.set(str)
-
-    def print_contents(self, event):
-        print("hi. contents of entry is now ---->", self.contents.get())
-
-root = App()
-root.master.title("Foo")
-root.mainloop()
diff --git a/Demo/tkinter/matt/killing-window-w-wm.py b/Demo/tkinter/matt/killing-window-w-wm.py
deleted file mode 100644
index b4034d1..0000000
--- a/Demo/tkinter/matt/killing-window-w-wm.py
+++ /dev/null
@@ -1,42 +0,0 @@
-from tkinter import *
-
-# This file shows how to trap the killing of a window
-# when the user uses window manager menus (typ. upper left hand corner
-# menu in the decoration border).
-
-
-### ******* this isn't really called -- read the comments
-def my_delete_callback():
-    print("whoops -- tried to delete me!")
-
-class Test(Frame):
-    def deathHandler(self, event):
-        print(self, "is now getting nuked. performing some save here....")
-
-    def createWidgets(self):
-        # a hello button
-        self.hi_there = Button(self, text='Hello')
-        self.hi_there.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-        ###
-        ###  PREVENT WM kills from happening
-        ###
-
-        # the docs would have you do this:
-
-#       self.master.protocol("WM_DELETE_WINDOW", my_delete_callback)
-
-        # unfortunately, some window managers will not send this request to a window.
-        # the "protocol" function seems incapable of trapping these "aggressive" window kills.
-        # this line of code catches everything, tho. The window is deleted, but you have a chance
-        # of cleaning up first.
-        self.bind_all("<Destroy>", self.deathHandler)
-
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/menu-all-types-of-entries.py b/Demo/tkinter/matt/menu-all-types-of-entries.py
deleted file mode 100644
index 84f162e..0000000
--- a/Demo/tkinter/matt/menu-all-types-of-entries.py
+++ /dev/null
@@ -1,244 +0,0 @@
-from tkinter import *
-
-# some vocabulary to keep from getting confused. This terminology
-# is something I cooked up for this file, but follows the man pages
-# pretty closely
-#
-#
-#
-#       This is a MENUBUTTON
-#       V
-# +-------------+
-# |             |
-#
-# +------------++------------++------------+
-# |            ||            ||            |
-# |  File      ||  Edit      || Options    |   <-------- the MENUBAR
-# |            ||            ||            |
-# +------------++------------++------------+
-# | New...         |
-# | Open...        |
-# | Print          |
-# |                |  <-------- This is a MENU. The lines of text in the menu are
-# |                |                            MENU ENTRIES
-# |                +---------------+
-# | Open Files >   | file1         |
-# |                | file2         |
-# |                | another file  | <------ this cascading part is also a MENU
-# +----------------|               |
-#                  |               |
-#                  |               |
-#                  |               |
-#                  +---------------+
-
-
-
-# some miscellaneous callbacks
-def new_file():
-    print("opening new file")
-
-def open_file():
-    print("opening OLD file")
-
-def print_something():
-    print("picked a menu item")
-
-
-
-anchovies = 0
-
-def print_anchovies():
-    global anchovies
-    anchovies = not anchovies
-    print("anchovies?", anchovies)
-
-def makeCommandMenu():
-    # make menu button
-    Command_button = Menubutton(mBar, text='Simple Button Commands',
-                                underline=0)
-    Command_button.pack(side=LEFT, padx="2m")
-
-    # make the pulldown part of the File menu. The parameter passed is the master.
-    # we attach it to the button as a python attribute called "menu" by convention.
-    # hopefully this isn't too confusing...
-    Command_button.menu = Menu(Command_button)
-
-    # just to be cute, let's disable the undo option:
-    Command_button.menu.add_command(label="Undo")
-    # undo is the 0th entry...
-    Command_button.menu.entryconfig(0, state=DISABLED)
-
-    Command_button.menu.add_command(label='New...', underline=0,
-                                    command=new_file)
-    Command_button.menu.add_command(label='Open...', underline=0,
-                                    command=open_file)
-    Command_button.menu.add_command(label='Different Font', underline=0,
-                                    font='-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*',
-                                    command=print_something)
-
-    # we can make bitmaps be menu entries too. File format is X11 bitmap.
-    # if you use XV, save it under X11 bitmap format. duh-uh.,..
-    Command_button.menu.add_command(
-        bitmap="info")
-        #bitmap='@/home/mjc4y/dilbert/project.status.is.doomed.last.panel.bm')
-
-    # this is just a line
-    Command_button.menu.add('separator')
-
-    # change the color
-    Command_button.menu.add_command(label='Quit', underline=0,
-                                    background='red',
-                                    activebackground='green',
-                                    command=Command_button.quit)
-
-    # set up a pointer from the file menubutton back to the file menu
-    Command_button['menu'] = Command_button.menu
-
-    return Command_button
-
-
-
-def makeCascadeMenu():
-    # make menu button
-    Cascade_button = Menubutton(mBar, text='Cascading Menus', underline=0)
-    Cascade_button.pack(side=LEFT, padx="2m")
-
-    # the primary pulldown
-    Cascade_button.menu = Menu(Cascade_button)
-
-    # this is the menu that cascades from the primary pulldown....
-    Cascade_button.menu.choices = Menu(Cascade_button.menu)
-
-    # ...and this is a menu that cascades from that.
-    Cascade_button.menu.choices.weirdones = Menu(Cascade_button.menu.choices)
-
-    # then you define the menus from the deepest level on up.
-    Cascade_button.menu.choices.weirdones.add_command(label='avacado')
-    Cascade_button.menu.choices.weirdones.add_command(label='belgian endive')
-    Cascade_button.menu.choices.weirdones.add_command(label='beefaroni')
-
-    # definition of the menu one level up...
-    Cascade_button.menu.choices.add_command(label='Chocolate')
-    Cascade_button.menu.choices.add_command(label='Vanilla')
-    Cascade_button.menu.choices.add_command(label='TuttiFruiti')
-    Cascade_button.menu.choices.add_command(label='WopBopaLoopBapABopBamBoom')
-    Cascade_button.menu.choices.add_command(label='Rocky Road')
-    Cascade_button.menu.choices.add_command(label='BubbleGum')
-    Cascade_button.menu.choices.add_cascade(
-        label='Weird Flavors',
-        menu=Cascade_button.menu.choices.weirdones)
-
-    # and finally, the definition for the top level
-    Cascade_button.menu.add_cascade(label='more choices',
-                                    menu=Cascade_button.menu.choices)
-
-    Cascade_button['menu'] = Cascade_button.menu
-
-    return Cascade_button
-
-def makeCheckbuttonMenu():
-    global fred
-    # make menu button
-    Checkbutton_button = Menubutton(mBar, text='Checkbutton Menus',
-                                    underline=0)
-    Checkbutton_button.pack(side=LEFT, padx='2m')
-
-    # the primary pulldown
-    Checkbutton_button.menu = Menu(Checkbutton_button)
-
-    # and all the check buttons. Note that the "variable" "onvalue" and "offvalue" options
-    # are not supported correctly at present. You have to do all your application
-    # work through the calback.
-    Checkbutton_button.menu.add_checkbutton(label='Pepperoni')
-    Checkbutton_button.menu.add_checkbutton(label='Sausage')
-    Checkbutton_button.menu.add_checkbutton(label='Extra Cheese')
-
-    # so here's a callback
-    Checkbutton_button.menu.add_checkbutton(label='Anchovy',
-                                            command=print_anchovies)
-
-    # and start with anchovies selected to be on. Do this by
-    # calling invoke on this menu option. To refer to the "anchovy" menu
-    # entry we need to know it's index. To do this, we use the index method
-    # which takes arguments of several forms:
-    #
-    # argument        what it does
-    # -----------------------------------
-    # a number        -- this is useless.
-    # "last"          -- last option in the menu
-    # "none"          -- used with the activate command. see the man page on menus
-    # "active"        -- the currently active menu option. A menu option is made active
-    #                         with the 'activate' method
-    # "@number"       -- where 'number' is an integer and is treated like a y coordinate in pixels
-    # string pattern  -- this is the option used below, and attempts to match "labels" using the
-    #                    rules of Tcl_StringMatch
-    Checkbutton_button.menu.invoke(Checkbutton_button.menu.index('Anchovy'))
-
-    # set up a pointer from the file menubutton back to the file menu
-    Checkbutton_button['menu'] = Checkbutton_button.menu
-
-    return Checkbutton_button
-
-
-def makeRadiobuttonMenu():
-    # make menu button
-    Radiobutton_button = Menubutton(mBar, text='Radiobutton Menus',
-                                    underline=0)
-    Radiobutton_button.pack(side=LEFT, padx='2m')
-
-    # the primary pulldown
-    Radiobutton_button.menu = Menu(Radiobutton_button)
-
-    # and all the Radio buttons. Note that the "variable" "onvalue" and "offvalue" options
-    # are not supported correctly at present. You have to do all your application
-    # work through the calback.
-    Radiobutton_button.menu.add_radiobutton(label='Republican')
-    Radiobutton_button.menu.add_radiobutton(label='Democrat')
-    Radiobutton_button.menu.add_radiobutton(label='Libertarian')
-    Radiobutton_button.menu.add_radiobutton(label='Commie')
-    Radiobutton_button.menu.add_radiobutton(label='Facist')
-    Radiobutton_button.menu.add_radiobutton(label='Labor Party')
-    Radiobutton_button.menu.add_radiobutton(label='Torie')
-    Radiobutton_button.menu.add_radiobutton(label='Independent')
-    Radiobutton_button.menu.add_radiobutton(label='Anarchist')
-    Radiobutton_button.menu.add_radiobutton(label='No Opinion')
-
-    # set up a pointer from the file menubutton back to the file menu
-    Radiobutton_button['menu'] = Radiobutton_button.menu
-
-    return Radiobutton_button
-
-
-def makeDisabledMenu():
-    Dummy_button = Menubutton(mBar, text='Dead Menu', underline=0)
-    Dummy_button.pack(side=LEFT, padx='2m')
-
-    # this is the standard way of turning off a whole menu
-    Dummy_button["state"] = DISABLED
-    return Dummy_button
-
-
-#################################################
-#### Main starts here ...
-root = Tk()
-
-
-# make a menu bar
-mBar = Frame(root, relief=RAISED, borderwidth=2)
-mBar.pack(fill=X)
-
-Command_button     = makeCommandMenu()
-Cascade_button     = makeCascadeMenu()
-Checkbutton_button = makeCheckbuttonMenu()
-Radiobutton_button = makeRadiobuttonMenu()
-NoMenu             = makeDisabledMenu()
-
-# finally, install the buttons in the menu bar.
-# This allows for scanning from one menubutton to the next.
-mBar.tk_menuBar(Command_button, Cascade_button, Checkbutton_button, Radiobutton_button, NoMenu)
-
-
-root.title('menu demo')
-root.iconname('menu demo')
-
-root.mainloop()
diff --git a/Demo/tkinter/matt/menu-simple.py b/Demo/tkinter/matt/menu-simple.py
deleted file mode 100644
index 5d3303f..0000000
--- a/Demo/tkinter/matt/menu-simple.py
+++ /dev/null
@@ -1,112 +0,0 @@
-from tkinter import *
-
-# some vocabulary to keep from getting confused. This terminology
-# is something I cooked up for this file, but follows the man pages
-# pretty closely
-#
-#
-#
-#       This is a MENUBUTTON
-#       V
-# +-------------+
-# |             |
-#
-# +------------++------------++------------+
-# |            ||            ||            |
-# |  File      ||  Edit      || Options    |   <-------- the MENUBAR
-# |            ||            ||            |
-# +------------++------------++------------+
-# | New...         |
-# | Open...        |
-# | Print          |
-# |                |  <------ This is a MENU. The lines of text in the menu are
-# |                |                          MENU ENTRIES
-# |                +---------------+
-# | Open Files >   | file1         |
-# |                | file2         |
-# |                | another file  | <------ this cascading part is also a MENU
-# +----------------|               |
-#                  |               |
-#                  |               |
-#                  |               |
-#                  +---------------+
-
-
-
-def new_file():
-    print("opening new file")
-
-
-def open_file():
-    print("opening OLD file")
-
-
-def makeFileMenu():
-    # make menu button : "File"
-    File_button = Menubutton(mBar, text='File', underline=0)
-    File_button.pack(side=LEFT, padx="1m")
-    File_button.menu = Menu(File_button)
-
-    # add an item. The first param is a menu entry type,
-    # must be one of: "cascade", "checkbutton", "command", "radiobutton", "separator"
-    # see menu-demo-2.py for examples of use
-    File_button.menu.add_command(label='New...', underline=0,
-                                 command=new_file)
-
-
-    File_button.menu.add_command(label='Open...', underline=0,
-                                 command=open_file)
-
-    File_button.menu.add_command(label='Quit', underline=0,
-                                 command='exit')
-
-    # set up a pointer from the file menubutton back to the file menu
-    File_button['menu'] = File_button.menu
-
-    return File_button
-
-
-
-def makeEditMenu():
-    Edit_button = Menubutton(mBar, text='Edit', underline=0)
-    Edit_button.pack(side=LEFT, padx="1m")
-    Edit_button.menu = Menu(Edit_button)
-
-    # just to be cute, let's disable the undo option:
-    Edit_button.menu.add('command', label="Undo")
-    # Since the tear-off bar is the 0th entry,
-    # undo is the 1st entry...
-    Edit_button.menu.entryconfig(1, state=DISABLED)
-
-    # and these are just for show. No "command" callbacks attached.
-    Edit_button.menu.add_command(label="Cut")
-    Edit_button.menu.add_command(label="Copy")
-    Edit_button.menu.add_command(label="Paste")
-
-    # set up a pointer from the file menubutton back to the file menu
-    Edit_button['menu'] = Edit_button.menu
-
-    return Edit_button
-
-
-#################################################
-
-#### Main starts here ...
-root = Tk()
-
-
-# make a menu bar
-mBar = Frame(root, relief=RAISED, borderwidth=2)
-mBar.pack(fill=X)
-
-File_button = makeFileMenu()
-Edit_button = makeEditMenu()
-
-# finally, install the buttons in the menu bar.
-# This allows for scanning from one menubutton to the next.
-mBar.tk_menuBar(File_button, Edit_button)
-
-root.title('menu demo')
-root.iconname('packer')
-
-root.mainloop()
diff --git a/Demo/tkinter/matt/not-what-you-might-think-1.py b/Demo/tkinter/matt/not-what-you-might-think-1.py
deleted file mode 100644
index 85c65c8..0000000
--- a/Demo/tkinter/matt/not-what-you-might-think-1.py
+++ /dev/null
@@ -1,28 +0,0 @@
-from tkinter import *
-
-
-class Test(Frame):
-    def createWidgets(self):
-
-        self.Gpanel = Frame(self, width='1i', height='1i',
-                            background='green')
-        self.Gpanel.pack(side=LEFT)
-
-        # a QUIT button
-        self.Gpanel.QUIT = Button(self.Gpanel, text='QUIT',
-                                  foreground='red',
-                                  command=self.quit)
-        self.Gpanel.QUIT.pack(side=LEFT)
-
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-
-test.master.title('packer demo')
-test.master.iconname('packer')
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/not-what-you-might-think-2.py b/Demo/tkinter/matt/not-what-you-might-think-2.py
deleted file mode 100644
index 4512063..0000000
--- a/Demo/tkinter/matt/not-what-you-might-think-2.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from tkinter import *
-
-
-class Test(Frame):
-    def createWidgets(self):
-
-        self.Gpanel = Frame(self, width='1i', height='1i',
-                            background='green')
-
-        # this line turns off the recalculation of geometry by masters.
-        self.Gpanel.propagate(0)
-
-        self.Gpanel.pack(side=LEFT)
-
-        # a QUIT button
-        self.Gpanel.QUIT = Button(self.Gpanel, text='QUIT', foreground='red',
-                                  command=self.quit)
-        self.Gpanel.QUIT.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-
-test.master.title('packer demo')
-test.master.iconname('packer')
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/packer-and-placer-together.py b/Demo/tkinter/matt/packer-and-placer-together.py
deleted file mode 100644
index 3cf6c45..0000000
--- a/Demo/tkinter/matt/packer-and-placer-together.py
+++ /dev/null
@@ -1,41 +0,0 @@
-from tkinter import *
-
-# This is a program that tests the placer geom manager in conjunction with
-# the packer. The background (green) is packed, while the widget inside is placed
-
-
-def do_motion(event):
-    app.button.place(x=event.x, y=event.y)
-
-def dothis():
-    print('calling me!')
-
-def createWidgets(top):
-    # make a frame. Note that the widget is 200 x 200
-    # and the window containing is 400x400. We do this
-    # simply to show that this is possible. The rest of the
-    # area is inaccesssible.
-    f = Frame(top, width=200, height=200, background='green')
-
-    # note that we use a different manager here.
-    # This way, the top level frame widget resizes when the
-    # application window does.
-    f.pack(fill=BOTH, expand=1)
-
-    # now make a button
-    f.button = Button(f, foreground='red', text='amazing', command=dothis)
-
-    # and place it so that the nw corner is
-    # 1/2 way along the top X edge of its' parent
-    f.button.place(relx=0.5, rely=0.0, anchor=NW)
-
-    # allow the user to move the button SUIT-style.
-    f.bind('<Control-Shift-Motion>', do_motion)
-
-    return f
-
-root = Tk()
-app = createWidgets(root)
-root.geometry("400x400")
-root.maxsize(1000, 1000)
-root.mainloop()
diff --git a/Demo/tkinter/matt/packer-simple.py b/Demo/tkinter/matt/packer-simple.py
deleted file mode 100644
index 64f61d5..0000000
--- a/Demo/tkinter/matt/packer-simple.py
+++ /dev/null
@@ -1,32 +0,0 @@
-from tkinter import *
-
-
-class Test(Frame):
-    def printit(self):
-        print(self.hi_there["command"])
-
-    def createWidgets(self):
-        # a hello button
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        self.hi_there = Button(self, text='Hello',
-                               command=self.printit)
-        self.hi_there.pack(side=LEFT)
-
-        # note how Packer defaults to side=TOP
-
-        self.guy2 = Button(self, text='button 2')
-        self.guy2.pack()
-
-        self.guy3 = Button(self, text='button 3')
-        self.guy3.pack()
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/placer-simple.py b/Demo/tkinter/matt/placer-simple.py
deleted file mode 100644
index 6be0de9..0000000
--- a/Demo/tkinter/matt/placer-simple.py
+++ /dev/null
@@ -1,39 +0,0 @@
-from tkinter import *
-
-# This is a program that tests the placer geom manager
-
-def do_motion(event):
-    app.button.place(x=event.x, y=event.y)
-
-def dothis():
-    print('calling me!')
-
-def createWidgets(top):
-    # make a frame. Note that the widget is 200 x 200
-    # and the window containing is 400x400. We do this
-    # simply to show that this is possible. The rest of the
-    # area is inaccesssible.
-    f = Frame(top, width=200, height=200, background='green')
-
-    # place it so the upper left hand corner of
-    # the frame is in the upper left corner of
-    # the parent
-    f.place(relx=0.0, rely=0.0)
-
-    # now make a button
-    f.button = Button(f, foreground='red', text='amazing', command=dothis)
-
-    # and place it so that the nw corner is
-    # 1/2 way along the top X edge of its' parent
-    f.button.place(relx=0.5, rely=0.0, anchor=NW)
-
-    # allow the user to move the button SUIT-style.
-    f.bind('<Control-Shift-Motion>', do_motion)
-
-    return f
-
-root = Tk()
-app = createWidgets(root)
-root.geometry("400x400")
-root.maxsize(1000, 1000)
-root.mainloop()
diff --git a/Demo/tkinter/matt/pong-demo-1.py b/Demo/tkinter/matt/pong-demo-1.py
deleted file mode 100644
index 82a5dc0..0000000
--- a/Demo/tkinter/matt/pong-demo-1.py
+++ /dev/null
@@ -1,52 +0,0 @@
-from tkinter import *
-
-
-class Pong(Frame):
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        ## The playing field
-        self.draw = Canvas(self, width="5i", height="5i")
-
-        ## The speed control for the ball
-        self.speed = Scale(self, orient=HORIZONTAL, label="ball speed",
-                           from_=-100, to=100)
-
-        self.speed.pack(side=BOTTOM, fill=X)
-
-        # The ball
-        self.ball = self.draw.create_oval("0i", "0i", "0.10i", "0.10i",
-                                          fill="red")
-        self.x = 0.05
-        self.y = 0.05
-        self.velocity_x = 0.3
-        self.velocity_y = 0.5
-
-        self.draw.pack(side=LEFT)
-
-    def moveBall(self, *args):
-        if (self.x > 5.0) or (self.x < 0.0):
-            self.velocity_x = -1.0 * self.velocity_x
-        if (self.y > 5.0) or (self.y < 0.0):
-            self.velocity_y = -1.0 * self.velocity_y
-
-        deltax = (self.velocity_x * self.speed.get() / 100.0)
-        deltay = (self.velocity_y * self.speed.get() / 100.0)
-        self.x = self.x + deltax
-        self.y = self.y + deltay
-
-        self.draw.move(self.ball,  "%ri" % deltax, "%ri" % deltay)
-        self.after(10, self.moveBall)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-        self.after(10, self.moveBall)
-
-
-game = Pong()
-
-game.mainloop()
diff --git a/Demo/tkinter/matt/printing-coords-of-items.py b/Demo/tkinter/matt/printing-coords-of-items.py
deleted file mode 100644
index 771a60d..0000000
--- a/Demo/tkinter/matt/printing-coords-of-items.py
+++ /dev/null
@@ -1,61 +0,0 @@
-from tkinter import *
-
-# this file demonstrates the creation of widgets as part of a canvas object
-
-class Test(Frame):
-    ###################################################################
-    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
-    ###################################################################
-    def mouseDown(self, event):
-        # see if we're inside a dot. If we are, it
-        # gets tagged as CURRENT for free by tk.
-
-        if not event.widget.find_withtag(CURRENT):
-            # there is no dot here, so we can make one,
-            # and bind some interesting behavior to it.
-            # ------
-            # create a dot, and mark it as current
-            fred = self.draw.create_oval(
-                event.x - 10, event.y -10, event.x +10, event.y + 10,
-                fill="green")
-            self.draw.tag_bind(fred, "<Enter>", self.mouseEnter)
-            self.draw.tag_bind(fred, "<Leave>", self.mouseLeave)
-        self.lastx = event.x
-        self.lasty = event.y
-
-    def mouseMove(self, event):
-        self.draw.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
-        self.lastx = event.x
-        self.lasty = event.y
-
-    ###################################################################
-    ###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
-    ###################################################################
-    def mouseEnter(self, event):
-        # the "current" tag is applied to the object the cursor is over.
-        # this happens automatically.
-        self.draw.itemconfig(CURRENT, fill="red")
-        print(list(self.draw.coords(CURRENT)))
-
-    def mouseLeave(self, event):
-        # the "current" tag is applied to the object the cursor is over.
-        # this happens automatically.
-        self.draw.itemconfig(CURRENT, fill="blue")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-        self.draw = Canvas(self, width="5i", height="5i")
-        self.draw.pack(side=LEFT)
-
-        Widget.bind(self.draw, "<1>", self.mouseDown)
-        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/radiobutton-simple.py b/Demo/tkinter/matt/radiobutton-simple.py
deleted file mode 100644
index a2719b8..0000000
--- a/Demo/tkinter/matt/radiobutton-simple.py
+++ /dev/null
@@ -1,62 +0,0 @@
-from tkinter import *
-
-# This is a demo program that shows how to
-# create radio buttons and how to get other widgets to
-# share the information in a radio button.
-#
-# There are other ways of doing this too, but
-# the "variable" option of radiobuttons seems to be the easiest.
-#
-# note how each button has a value it sets the variable to as it gets hit.
-
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-
-        self.flavor = StringVar()
-        self.flavor.set("chocolate")
-
-        self.radioframe = Frame(self)
-        self.radioframe.pack()
-
-        # 'text' is the label
-        # 'variable' is the name of the variable that all these radio buttons share
-        # 'value' is the value this variable takes on when the radio button is selected
-        # 'anchor' makes the text appear left justified (default is centered. ick)
-        self.radioframe.choc = Radiobutton(
-            self.radioframe, text="Chocolate Flavor",
-            variable=self.flavor, value="chocolate",
-            anchor=W)
-        self.radioframe.choc.pack(fill=X)
-
-        self.radioframe.straw = Radiobutton(
-            self.radioframe, text="Strawberry Flavor",
-            variable=self.flavor, value="strawberry",
-            anchor=W)
-        self.radioframe.straw.pack(fill=X)
-
-        self.radioframe.lemon = Radiobutton(
-            self.radioframe, text="Lemon Flavor",
-            variable=self.flavor, value="lemon",
-            anchor=W)
-        self.radioframe.lemon.pack(fill=X)
-
-        # this is a text entry that lets you type in the name of a flavor too.
-        self.entry = Entry(self, textvariable=self.flavor)
-        self.entry.pack(fill=X)
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/rubber-band-box-demo-1.py b/Demo/tkinter/matt/rubber-band-box-demo-1.py
deleted file mode 100644
index 48526d8..0000000
--- a/Demo/tkinter/matt/rubber-band-box-demo-1.py
+++ /dev/null
@@ -1,58 +0,0 @@
-from tkinter import *
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT',
-                                  background='red',
-                                  foreground='white',
-                                  height=3,
-                                  command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-        self.canvasObject = Canvas(self, width="5i", height="5i")
-        self.canvasObject.pack(side=LEFT)
-
-    def mouseDown(self, event):
-        # canvas x and y take the screen coords from the event and translate
-        # them into the coordinate system of the canvas object
-        self.startx = self.canvasObject.canvasx(event.x)
-        self.starty = self.canvasObject.canvasy(event.y)
-
-    def mouseMotion(self, event):
-        # canvas x and y take the screen coords from the event and translate
-        # them into the coordinate system of the canvas object
-        x = self.canvasObject.canvasx(event.x)
-        y = self.canvasObject.canvasy(event.y)
-
-        if (self.startx != event.x)  and (self.starty != event.y) :
-            self.canvasObject.delete(self.rubberbandBox)
-            self.rubberbandBox = self.canvasObject.create_rectangle(
-                self.startx, self.starty, x, y)
-            # this flushes the output, making sure that
-            # the rectangle makes it to the screen
-            # before the next event is handled
-            self.update_idletasks()
-
-    def mouseUp(self, event):
-        self.canvasObject.delete(self.rubberbandBox)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-        # this is a "tagOrId" for the rectangle we draw on the canvas
-        self.rubberbandBox = None
-
-        # and the bindings that make it work..
-        Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
-        Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)
-        Widget.bind(self.canvasObject, "<Button1-ButtonRelease>", self.mouseUp)
-
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/rubber-line-demo-1.py b/Demo/tkinter/matt/rubber-line-demo-1.py
deleted file mode 100644
index cfc4882..0000000
--- a/Demo/tkinter/matt/rubber-line-demo-1.py
+++ /dev/null
@@ -1,51 +0,0 @@
-from tkinter import *
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT',
-                                  background='red',
-                                  foreground='white',
-                                  height=3,
-                                  command=self.quit)
-        self.QUIT.pack(side=BOTTOM, fill=BOTH)
-
-        self.canvasObject = Canvas(self, width="5i", height="5i")
-        self.canvasObject.pack(side=LEFT)
-
-    def mouseDown(self, event):
-        # canvas x and y take the screen coords from the event and translate
-        # them into the coordinate system of the canvas object
-        self.startx = self.canvasObject.canvasx(event.x)
-        self.starty = self.canvasObject.canvasy(event.y)
-
-    def mouseMotion(self, event):
-        # canvas x and y take the screen coords from the event and translate
-        # them into the coordinate system of the canvas object
-        x = self.canvasObject.canvasx(event.x)
-        y = self.canvasObject.canvasy(event.y)
-
-        if (self.startx != event.x)  and (self.starty != event.y) :
-            self.canvasObject.delete(self.rubberbandLine)
-            self.rubberbandLine = self.canvasObject.create_line(
-                self.startx, self.starty, x, y)
-            # this flushes the output, making sure that
-            # the rectangle makes it to the screen
-            # before the next event is handled
-            self.update_idletasks()
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-        # this is a "tagOrId" for the rectangle we draw on the canvas
-        self.rubberbandLine = None
-        Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
-        Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)
-
-
-test = Test()
-
-test.mainloop()
diff --git a/Demo/tkinter/matt/slider-demo-1.py b/Demo/tkinter/matt/slider-demo-1.py
deleted file mode 100644
index 687f8a3..0000000
--- a/Demo/tkinter/matt/slider-demo-1.py
+++ /dev/null
@@ -1,36 +0,0 @@
-from tkinter import *
-
-# shows how to make a slider, set and get its value under program control
-
-
-class Test(Frame):
-    def print_value(self, val):
-        print("slider now at", val)
-
-    def reset(self):
-        self.slider.set(0)
-
-    def createWidgets(self):
-        self.slider = Scale(self, from_=0, to=100,
-                            orient=HORIZONTAL,
-                            length="3i",
-                            label="happy slider",
-                            command=self.print_value)
-
-        self.reset = Button(self, text='reset slider',
-                            command=self.reset)
-
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-
-        self.slider.pack(side=LEFT)
-        self.reset.pack(side=LEFT)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/subclass-existing-widgets.py b/Demo/tkinter/matt/subclass-existing-widgets.py
deleted file mode 100644
index ce97f35..0000000
--- a/Demo/tkinter/matt/subclass-existing-widgets.py
+++ /dev/null
@@ -1,28 +0,0 @@
-from tkinter import *
-
-# This is a program that makes a simple two button application
-
-
-class New_Button(Button):
-    def callback(self):
-        print(self.counter)
-        self.counter = self.counter + 1
-
-def createWidgets(top):
-    f = Frame(top)
-    f.pack()
-    f.QUIT = Button(f, text='QUIT', foreground='red', command=top.quit)
-
-    f.QUIT.pack(side=LEFT, fill=BOTH)
-
-    # a hello button
-    f.hi_there = New_Button(f, text='Hello')
-    # we do this on a different line because we need to reference f.hi_there
-    f.hi_there.config(command=f.hi_there.callback)
-    f.hi_there.pack(side=LEFT)
-    f.hi_there.counter = 43
-
-
-root = Tk()
-createWidgets(root)
-root.mainloop()
diff --git a/Demo/tkinter/matt/two-radio-groups.py b/Demo/tkinter/matt/two-radio-groups.py
deleted file mode 100644
index 38b61b1..0000000
--- a/Demo/tkinter/matt/two-radio-groups.py
+++ /dev/null
@@ -1,110 +0,0 @@
-from tkinter import *
-
-#       The way to think about this is that each radio button menu
-#       controls a different variable -- clicking on one of the
-#       mutually exclusive choices in a radiobutton assigns some value
-#       to an application variable you provide. When you define a
-#       radiobutton menu choice, you have the option of specifying the
-#       name of a varaible and value to assign to that variable when
-#       that choice is selected. This clever mechanism relieves you,
-#       the programmer, from having to write a dumb callback that
-#       probably wouldn't have done anything more than an assignment
-#       anyway. The Tkinter options for this follow their Tk
-#       counterparts:
-#       {"variable" : my_flavor_variable, "value" : "strawberry"}
-#       where my_flavor_variable is an instance of one of the
-#       subclasses of Variable, provided in Tkinter.py (there is
-#       StringVar(), IntVar(), DoubleVar() and BooleanVar() to choose
-#       from)
-
-
-
-def makePoliticalParties(var):
-    # make menu button
-    Radiobutton_button = Menubutton(mBar, text='Political Party',
-                                    underline=0)
-    Radiobutton_button.pack(side=LEFT, padx='2m')
-
-    # the primary pulldown
-    Radiobutton_button.menu = Menu(Radiobutton_button)
-
-    Radiobutton_button.menu.add_radiobutton(label='Republican',
-                                            variable=var, value=1)
-
-    Radiobutton_button.menu.add('radiobutton', {'label': 'Democrat',
-                                                'variable' : var,
-                                                'value' : 2})
-
-    Radiobutton_button.menu.add('radiobutton', {'label': 'Libertarian',
-                                                'variable' : var,
-                                                'value' : 3})
-
-    var.set(2)
-
-    # set up a pointer from the file menubutton back to the file menu
-    Radiobutton_button['menu'] = Radiobutton_button.menu
-
-    return Radiobutton_button
-
-
-def makeFlavors(var):
-    # make menu button
-    Radiobutton_button = Menubutton(mBar, text='Flavors',
-                                    underline=0)
-    Radiobutton_button.pack(side=LEFT, padx='2m')
-
-    # the primary pulldown
-    Radiobutton_button.menu = Menu(Radiobutton_button)
-
-    Radiobutton_button.menu.add_radiobutton(label='Strawberry',
-                                            variable=var, value='Strawberry')
-
-    Radiobutton_button.menu.add_radiobutton(label='Chocolate',
-                                            variable=var, value='Chocolate')
-
-    Radiobutton_button.menu.add_radiobutton(label='Rocky Road',
-                                            variable=var, value='Rocky Road')
-
-    # choose a default
-    var.set("Chocolate")
-
-    # set up a pointer from the file menubutton back to the file menu
-    Radiobutton_button['menu'] = Radiobutton_button.menu
-
-    return Radiobutton_button
-
-
-def printStuff():
-    print("party is", party.get())
-    print("flavor is", flavor.get())
-    print()
-
-#################################################
-#### Main starts here ...
-root = Tk()
-
-
-# make a menu bar
-mBar = Frame(root, relief=RAISED, borderwidth=2)
-mBar.pack(fill=X)
-
-# make two application variables,
-# one to control each radio button set
-party = IntVar()
-flavor = StringVar()
-
-Radiobutton_button = makePoliticalParties(party)
-Radiobutton_button2 = makeFlavors(flavor)
-
-# finally, install the buttons in the menu bar.
-# This allows for scanning from one menubutton to the next.
-mBar.tk_menuBar(Radiobutton_button, Radiobutton_button2)
-
-b = Button(root, text="print party and flavor", foreground="red",
-           command=printStuff)
-b.pack(side=TOP)
-
-root.title('menu demo')
-root.iconname('menu demo')
-
-root.mainloop()
diff --git a/Demo/tkinter/matt/window-creation-more.py b/Demo/tkinter/matt/window-creation-more.py
deleted file mode 100644
index 32c8b70..0000000
--- a/Demo/tkinter/matt/window-creation-more.py
+++ /dev/null
@@ -1,35 +0,0 @@
-from tkinter import *
-
-# this shows how to create a new window with a button in it
-# that can create new windows
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def makeWindow(self):
-        fred = Toplevel()
-        fred.label = Button(fred,
-                            text="This is window number %d." % self.windownum,
-                            command=self.makeWindow)
-        fred.label.pack()
-        self.windownum = self.windownum + 1
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        # a hello button
-        self.hi_there = Button(self, text='Make a New Window',
-                               command=self.makeWindow)
-        self.hi_there.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.windownum = 0
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/window-creation-simple.py b/Demo/tkinter/matt/window-creation-simple.py
deleted file mode 100644
index f5e6230..0000000
--- a/Demo/tkinter/matt/window-creation-simple.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from tkinter import *
-
-# this shows how to spawn off new windows at a button press
-
-class Test(Frame):
-    def printit(self):
-        print("hi")
-
-    def makeWindow(self):
-        fred = Toplevel()
-        fred.label = Label(fred, text="Here's a new window")
-        fred.label.pack()
-
-    def createWidgets(self):
-        self.QUIT = Button(self, text='QUIT', foreground='red',
-                           command=self.quit)
-
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        # a hello button
-        self.hi_there = Button(self, text='Make a New Window',
-                               command=self.makeWindow)
-        self.hi_there.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/matt/window-creation-w-location.py b/Demo/tkinter/matt/window-creation-w-location.py
deleted file mode 100644
index 9f82367..0000000
--- a/Demo/tkinter/matt/window-creation-w-location.py
+++ /dev/null
@@ -1,45 +0,0 @@
-from tkinter import *
-
-import sys
-##sys.path.append("/users/mjc4y/projects/python/tkinter/utils")
-##from TkinterUtils  import *
-
-# this shows how to create a new window with a button in it that
-# can create new windows
-
-class QuitButton(Button):
-    def __init__(self, master, *args, **kwargs):
-        if "text" not in kwargs:
-            kwargs["text"] = "QUIT"
-        if "command" not in kwargs:
-            kwargs["command"] = master.quit
-        Button.__init__(self, master, *args, **kwargs)
-
-class Test(Frame):
-    def makeWindow(self, *args):
-        fred = Toplevel()
-
-        fred.label = Canvas (fred, width="2i", height="2i")
-
-        fred.label.create_line("0", "0", "2i", "2i")
-        fred.label.create_line("0", "2i", "2i", "0")
-        fred.label.pack()
-
-        ##centerWindow(fred, self.master)
-
-    def createWidgets(self):
-        self.QUIT = QuitButton(self)
-        self.QUIT.pack(side=LEFT, fill=BOTH)
-
-        self.makeWindow = Button(self, text='Make a New Window',
-                                 width=50, height=20,
-                                 command=self.makeWindow)
-        self.makeWindow.pack(side=LEFT)
-
-    def __init__(self, master=None):
-        Frame.__init__(self, master)
-        Pack.config(self)
-        self.createWidgets()
-
-test = Test()
-test.mainloop()
diff --git a/Demo/tkinter/ttk/combo_themes.py b/Demo/tkinter/ttk/combo_themes.py
deleted file mode 100644
index 45eee2d..0000000
--- a/Demo/tkinter/ttk/combo_themes.py
+++ /dev/null
@@ -1,46 +0,0 @@
-"""Ttk Theme Selector.
-
-Although it is a theme selector, you won't notice many changes since
-there is only a combobox and a frame around.
-"""
-from tkinter import ttk
-
-class App(ttk.Frame):
-    def __init__(self):
-        ttk.Frame.__init__(self)
-
-        self.style = ttk.Style()
-        self._setup_widgets()
-
-    def _change_theme(self, event):
-        if event.widget.current(): # value #0 is not a theme
-            newtheme = event.widget.get()
-            # change to the new theme and refresh all the widgets
-            self.style.theme_use(newtheme)
-
-    def _setup_widgets(self):
-        themes = list(self.style.theme_names())
-        themes.insert(0, "Pick a theme")
-        # Create a readonly Combobox which will display 4 values at max,
-        # which will cause it to create a scrollbar if there are more
-        # than 4 values in total.
-        themes_combo = ttk.Combobox(self, values=themes, state="readonly",
-                                    height=4)
-        themes_combo.set(themes[0]) # sets the combobox value to "Pick a theme"
-        # Combobox widget generates a <<ComboboxSelected>> virtual event
-        # when the user selects an element. This event is generated after
-        # the listbox is unposted (after you select an item, the combobox's
-        # listbox disappears, then it is said that listbox is now unposted).
-        themes_combo.bind("<<ComboboxSelected>>", self._change_theme)
-        themes_combo.pack(fill='x')
-
-        self.pack(fill='both', expand=1)
-
-
-def main():
-    app = App()
-    app.master.title("Ttk Combobox")
-    app.mainloop()
-
-if __name__ == "__main__":
-    main()
diff --git a/Demo/tkinter/ttk/dirbrowser.py b/Demo/tkinter/ttk/dirbrowser.py
deleted file mode 100644
index bacddb5..0000000
--- a/Demo/tkinter/ttk/dirbrowser.py
+++ /dev/null
@@ -1,93 +0,0 @@
-"""A directory browser using Ttk Treeview.
-
-Based on the demo found in Tk 8.5 library/demos/browse
-"""
-import os
-import glob
-import tkinter
-from tkinter import ttk
-
-def populate_tree(tree, node):
-    if tree.set(node, "type") != 'directory':
-        return
-
-    path = tree.set(node, "fullpath")
-    tree.delete(*tree.get_children(node))
-
-    parent = tree.parent(node)
-    special_dirs = [] if parent else glob.glob('.') + glob.glob('..')
-
-    for p in special_dirs + os.listdir(path):
-        ptype = None
-        p = os.path.join(path, p).replace('\\', '/')
-        if os.path.isdir(p): ptype = "directory"
-        elif os.path.isfile(p): ptype = "file"
-
-        fname = os.path.split(p)[1]
-        id = tree.insert(node, "end", text=fname, values=[p, ptype])
-
-        if ptype == 'directory':
-            if fname not in ('.', '..'):
-                tree.insert(id, 0, text="dummy")
-                tree.item(id, text=fname)
-        elif ptype == 'file':
-            size = os.stat(p).st_size
-            tree.set(id, "size", "%d bytes" % size)
-
-
-def populate_roots(tree):
-    dir = os.path.abspath('.').replace('\\', '/')
-    node = tree.insert('', 'end', text=dir, values=[dir, "directory"])
-    populate_tree(tree, node)
-
-def update_tree(event):
-    tree = event.widget
-    populate_tree(tree, tree.focus())
-
-def change_dir(event):
-    tree = event.widget
-    node = tree.focus()
-    if tree.parent(node):
-        path = os.path.abspath(tree.set(node, "fullpath"))
-        if os.path.isdir(path):
-            os.chdir(path)
-            tree.delete(tree.get_children(''))
-            populate_roots(tree)
-
-def autoscroll(sbar, first, last):
-    """Hide and show scrollbar as needed."""
-    first, last = float(first), float(last)
-    if first <= 0 and last >= 1:
-        sbar.grid_remove()
-    else:
-        sbar.grid()
-    sbar.set(first, last)
-
-root = tkinter.Tk()
-
-vsb = ttk.Scrollbar(orient="vertical")
-hsb = ttk.Scrollbar(orient="horizontal")
-
-tree = ttk.Treeview(columns=("fullpath", "type", "size"),
-    displaycolumns="size", yscrollcommand=lambda f, l: autoscroll(vsb, f, l),
-    xscrollcommand=lambda f, l:autoscroll(hsb, f, l))
-
-vsb['command'] = tree.yview
-hsb['command'] = tree.xview
-
-tree.heading("#0", text="Directory Structure", anchor='w')
-tree.heading("size", text="File Size", anchor='w')
-tree.column("size", stretch=0, width=100)
-
-populate_roots(tree)
-tree.bind('<<TreeviewOpen>>', update_tree)
-tree.bind('<Double-Button-1>', change_dir)
-
-# Arrange the tree and its scrollbars in the toplevel
-tree.grid(column=0, row=0, sticky='nswe')
-vsb.grid(column=1, row=0, sticky='ns')
-hsb.grid(column=0, row=1, sticky='ew')
-root.grid_columnconfigure(0, weight=1)
-root.grid_rowconfigure(0, weight=1)
-
-root.mainloop()
diff --git a/Demo/tkinter/ttk/img/close.gif b/Demo/tkinter/ttk/img/close.gif
deleted file mode 100644
index 18cf6c7..0000000
--- a/Demo/tkinter/ttk/img/close.gif
+++ /dev/null
Binary files differ
diff --git a/Demo/tkinter/ttk/img/close_active.gif b/Demo/tkinter/ttk/img/close_active.gif
deleted file mode 100644
index db7f392..0000000
--- a/Demo/tkinter/ttk/img/close_active.gif
+++ /dev/null
Binary files differ
diff --git a/Demo/tkinter/ttk/img/close_pressed.gif b/Demo/tkinter/ttk/img/close_pressed.gif
deleted file mode 100644
index 5616954..0000000
--- a/Demo/tkinter/ttk/img/close_pressed.gif
+++ /dev/null
Binary files differ
diff --git a/Demo/tkinter/ttk/listbox_scrollcmd.py b/Demo/tkinter/ttk/listbox_scrollcmd.py
deleted file mode 100644
index 05faf63..0000000
--- a/Demo/tkinter/ttk/listbox_scrollcmd.py
+++ /dev/null
@@ -1,37 +0,0 @@
-"""Sample taken from: http://www.tkdocs.com/tutorial/morewidgets.html and
-converted to Python, mainly to demonstrate xscrollcommand option.
-
-grid [tk::listbox .l -yscrollcommand ".s set" -height 5] -column 0 -row 0 -sticky nwes
-grid [ttk::scrollbar .s -command ".l yview" -orient vertical] -column 1 -row 0 -sticky ns
-grid [ttk::label .stat -text "Status message here" -anchor w] -column 0 -row 1 -sticky we
-grid [ttk::sizegrip .sz] -column 1 -row 1 -sticky se
-grid columnconfigure . 0 -weight 1; grid rowconfigure . 0 -weight 1
-for {set i 0} {$i<100} {incr i} {
-   .l insert end "Line $i of 100"
-   }
-"""
-import tkinter
-from tkinter import ttk
-
-root = tkinter.Tk()
-
-l = tkinter.Listbox(height=5)
-l.grid(column=0, row=0, sticky='nwes')
-
-s = ttk.Scrollbar(command=l.yview, orient='vertical')
-l['yscrollcommand'] = s.set
-s.grid(column=1, row=0, sticky="ns")
-
-stat = ttk.Label(text="Status message here", anchor='w')
-stat.grid(column=0, row=1, sticky='we')
-
-sz = ttk.Sizegrip()
-sz.grid(column=1, row=1, sticky='se')
-
-root.grid_columnconfigure(0, weight=1)
-root.grid_rowconfigure(0, weight=1)
-
-for i in range(100):
-    l.insert('end', "Line %d of 100" % i)
-
-root.mainloop()
diff --git a/Demo/tkinter/ttk/mac_searchentry.py b/Demo/tkinter/ttk/mac_searchentry.py
deleted file mode 100644
index 97b1eaf..0000000
--- a/Demo/tkinter/ttk/mac_searchentry.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""Mac style search widget
-
-Translated from Tcl code by Schelte Bron, http://wiki.tcl.tk/18188
-"""
-import tkinter
-from tkinter import ttk
-
-root = tkinter.Tk()
-
-data = """
-R0lGODlhKgAaAOfnAFdZVllbWFpcWVtdWlxeW11fXF9hXmBiX2ZnZWhpZ2lraGxua25wbXJ0
-cXR2c3V3dHZ4dXh6d3x+e31/fH6AfYSGg4eJhoiKh4qMiYuNio2PjHmUqnqVq3yXrZGTkJKU
-kX+asJSWk32cuJWXlIGcs5aYlX6euZeZloOetZial4SftpqbmIWgt4GhvYahuIKivpudmYei
-uYOjv5yem4ijuoSkwIWlwYmlu56gnYamwp+hnoenw4unvaCin4ioxJCnuZykrImpxZmlsoaq
-zI2pv6KkoZGouoqqxpqms4erzaOloo6qwYurx5Kqu5untIiszqSmo5CrwoysyJeqtpOrvJyo
-tZGsw42typSsvaaopZKtxJWtvp6qt4+uy6epppOuxZCvzKiqp5quuZSvxoyx06mrqJWwx42y
-1JKxzpmwwaqsqZaxyI6z1ZqxwqutqpOzz4+01qyuq56yvpizypS00Jm0y5W10Zq1zJa20rCy
-rpu3zqizwbGzr6C3yZy4z7K0saG4yp250LO1sqK5y5660Z+70qO7zKy4xaC806S8zba4taG9
-1KW9zq66x6+7yLi6t6S/1rC8yrm7uLO8xLG9y7q8ubS9xabB2anB07K+zLW+xrO/za7CzrTA
-zrjAyLXBz77BvbbC0K/G2LjD0bnE0rLK28TGw8bIxcLL07vP28HN28rMycvOyr/T38DU4cnR
-2s/RztHT0NLU0cTY5MrW5MvX5dHX2c3Z59bY1dPb5Nbb3dLe7Nvd2t3f3NXh797g3d3j5dnl
-9OPl4eTm4+Ln6tzo9uXn5Obo5eDp8efp5uHq8uXq7ejq5+nr6OPs9Ovu6unu8O3v6+vw8+7w
-7ezx9O/x7vDy7/Hz8O/19/P18vT38/L3+fb49Pf59vX6/fj69/b7/vn7+Pr8+ff9//v9+vz/
-+/7//P//////////////////////////////////////////////////////////////////
-/////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJZAD/ACwC
-AAIAKAAWAAAI/gD/CRz4bwUGCg8eQFjIsGHDBw4iTLAQgqBFgisuePCiyJOpUyBDihRpypMi
-Lx8qaLhIMIyGFZ5sAUsmjZrNmzhzWpO2DJgtTysqfGDpxoMbW8ekeQsXzty4p1CjRjUXrps3
-asJsuclQ4uKKSbamMR3n1JzZs2jRkh1HzuxVXX8y4CDYAwqua+DInVrRwMGJU2kDp31KThy1
-XGWGDlxhi1rTPAUICBBAoEAesoIzn6Vm68MKgVAUHftmzhOCBCtQwQKSoABgzZnJdSMmyIPA
-FbCotdUQAIhNa9B6DPCAGbZac+SowVIMRVe4pwkA4GpqDlwuAAmMZx4nTtfnf1mO5JEDNy46
-MHJkxQEDgKC49rPjwC0bqGaZuOoZAKjBPE4NgAzUvYcWOc0QZF91imAnCDHJ5JFAAJN0I2Ba
-4iRDUC/gOEVNDwIUcEABCAgAAATUTIgWOMBYRFp80ghiAQIIVAAEAwJIYI2JZnUji0XSYAYO
-NcsQA8wy0hCTwAASXGOiONFcxAtpTokTHznfiLMNMAkcAMuE43jDC0vLeGOWe2R5o4sn1LgH
-GzkWsvTPMgEOaA433Ag4TjjMuDkQMNi0tZ12sqWoJ0HATMPNffAZZ6U0wLAyqJ62RGoLLrhI
-aqmlpzwaEAAh+QQJZAD/ACwAAAAAKgAaAAAI/gD/CRw40JEhQoEC+fGjcOHCMRAjRkxDsKLF
-f5YcAcID582ZjyBDJhmZZIjJIUySEDHiBMhFghrtdNnRAgSHmzhz6sTZQcSLITx+CHn5bxSk
-Nz5MCMGy55CjTVCjbuJEtSrVQ3uwqDBRQwrFi476SHHxow8qXcemVbPGtm21t3CnTaP27Jgu
-VHtuiIjBsuImQkRiiEEFTNo2cOTMKV7MuLE5cN68QUOGSgwKG1EqJqJDY8+rZt8UjxtNunTj
-cY3DgZOWS46KIFgGjiI0ZIsqaqNNjWjgYMUpx8Adc3v2aosNMAI1DbqyI9WycOb4IAggQEAB
-A3lQBxet/TG4cMpI/tHwYeSfIzxM0uTKNs7UgAQrYL1akaDA7+3bueVqY4NJlUhIcQLNYx8E
-AIQ01mwjTQ8DeNAdfouNA8440GBCQxJY3MEGD6p4Y844CQCAizcSgpMLAAlAuJ03qOyQRBR3
-nEHEK+BMGKIui4kDDAAIPKiiYuSYSMQQRCDCxhiziPMYBgDkEaEaAGQA3Y+MjUPOLFoMoUUh
-cKxRC4ngeILiH8Qkk0cCAUzSDZWpzbLEE1EwggcYqWCj2DNADFDAAQUgIAAAEFDDJmPYqNJF
-F1s4cscTmCDjDTjdSPOHBQggUAEQDAgggTWDPoYMJkFoUdRmddyyjWLeULMMMcAsIw0x4wkM
-IME1g25zyxpHxFYUHmyIggw4H4ojITnfiLMNMAkcAAub4BQjihRdDGTJHmvc4Qo1wD6Imje6
-eILbj+BQ4wqu5Q3ECSJ0FOKKMtv4mBg33Pw4zjbKuBIIE1xYpIkhdQQiyi7OtAucj6dt48wu
-otQhBRa6VvSJIRwhIkotvgRTzMUYZ6xxMcj4QkspeKDxxRhEmUfIHWjAgQcijEDissuXvCyz
-zH7Q8YQURxDhUsn/bCInR3AELfTQZBRt9BBJkCGFFVhMwTNBlnBCSCGEIJQQIAklZMXWRBAR
-RRRWENHwRQEBADs="""
-
-
-s1 = tkinter.PhotoImage("search1", data=data, format="gif -index 0")
-s2 = tkinter.PhotoImage("search2", data=data, format="gif -index 1")
-
-style = ttk.Style()
-
-style.element_create("Search.field", "image", "search1",
-    ("focus", "search2"), border=[22, 7, 14], sticky="ew")
-
-style.layout("Search.entry", [
-    ("Search.field", {"sticky": "nswe", "border": 1, "children":
-        [("Entry.padding", {"sticky": "nswe", "children":
-            [("Entry.textarea", {"sticky": "nswe"})]
-        })]
-    })]
-)
-
-style.configure("Search.entry", background="#b2b2b2")
-
-root.configure(background="#b2b2b2")
-
-e1 = ttk.Entry(style="Search.entry", width=20)
-e2 = ttk.Entry(style="Search.entry", width=20)
-
-e1.grid(padx=10, pady=10)
-e2.grid(padx=10, pady=10)
-
-root.mainloop()
diff --git a/Demo/tkinter/ttk/notebook_closebtn.py b/Demo/tkinter/ttk/notebook_closebtn.py
deleted file mode 100644
index 6e65f09..0000000
--- a/Demo/tkinter/ttk/notebook_closebtn.py
+++ /dev/null
@@ -1,78 +0,0 @@
-"""A Ttk Notebook with close buttons.
-
-Based on an example by patthoyts, http://paste.tclers.tk/896
-"""
-import os
-import tkinter
-from tkinter import ttk
-
-root = tkinter.Tk()
-
-imgdir = os.path.join(os.path.dirname(__file__), 'img')
-i1 = tkinter.PhotoImage("img_close", file=os.path.join(imgdir, 'close.gif'))
-i2 = tkinter.PhotoImage("img_closeactive",
-    file=os.path.join(imgdir, 'close_active.gif'))
-i3 = tkinter.PhotoImage("img_closepressed",
-    file=os.path.join(imgdir, 'close_pressed.gif'))
-
-style = ttk.Style()
-
-style.element_create("close", "image", "img_close",
-    ("active", "pressed", "!disabled", "img_closepressed"),
-    ("active", "!disabled", "img_closeactive"), border=8, sticky='')
-
-style.layout("ButtonNotebook", [("ButtonNotebook.client", {"sticky": "nswe"})])
-style.layout("ButtonNotebook.Tab", [
-    ("ButtonNotebook.tab", {"sticky": "nswe", "children":
-        [("ButtonNotebook.padding", {"side": "top", "sticky": "nswe",
-                                     "children":
-            [("ButtonNotebook.focus", {"side": "top", "sticky": "nswe",
-                                       "children":
-                [("ButtonNotebook.label", {"side": "left", "sticky": ''}),
-                 ("ButtonNotebook.close", {"side": "left", "sticky": ''})]
-            })]
-        })]
-    })]
-)
-
-def btn_press(event):
-    x, y, widget = event.x, event.y, event.widget
-    elem = widget.identify(x, y)
-    index = widget.index("@%d,%d" % (x, y))
-
-    if "close" in elem:
-        widget.state(['pressed'])
-        widget.pressed_index = index
-
-def btn_release(event):
-    x, y, widget = event.x, event.y, event.widget
-
-    if not widget.instate(['pressed']):
-        return
-
-    elem =  widget.identify(x, y)
-    index = widget.index("@%d,%d" % (x, y))
-
-    if "close" in elem and widget.pressed_index == index:
-        widget.forget(index)
-        widget.event_generate("<<NotebookClosedTab>>")
-
-    widget.state(["!pressed"])
-    widget.pressed_index = None
-
-
-root.bind_class("TNotebook", "<ButtonPress-1>", btn_press, True)
-root.bind_class("TNotebook", "<ButtonRelease-1>", btn_release)
-
-# create a ttk notebook with our custom style, and add some tabs to it
-nb = ttk.Notebook(width=200, height=200, style="ButtonNotebook")
-nb.pressed_index = None
-f1 = tkinter.Frame(nb, background="red")
-f2 = tkinter.Frame(nb, background="green")
-f3 = tkinter.Frame(nb, background="blue")
-nb.add(f1, text='Red', padding=3)
-nb.add(f2, text='Green', padding=3)
-nb.add(f3, text='Blue', padding=3)
-nb.pack(expand=1, fill='both')
-
-root.mainloop()
diff --git a/Demo/tkinter/ttk/plastik_theme.py b/Demo/tkinter/ttk/plastik_theme.py
deleted file mode 100644
index 9c68bb5..0000000
--- a/Demo/tkinter/ttk/plastik_theme.py
+++ /dev/null
@@ -1,268 +0,0 @@
-"""This demonstrates good part of the syntax accepted by theme_create.
-
-This is a translation of plastik.tcl to python.
-You will need the images used by the plastik theme to test this. The
-images (and other tile themes) can be retrived by doing:
-
-$ cvs -z3 -d:pserver:anonymous@tktable.cvs.sourceforge.net:/cvsroot/tktable \
-  co tile-themes
-
-To test this module you should do, for example:
-
-import Tkinter
-import plastik_theme
-
-root = Tkinter.Tk()
-plastik_theme.install(plastik_image_dir)
-...
-
-Where plastik_image_dir contains the path to the images directory used by
-the plastik theme, something like: tile-themes/plastik/plastik
-"""
-import os
-import glob
-from tkinter import ttk, PhotoImage
-
-__all__ = ['install']
-
-colors = {
-    "frame": "#efefef",
-    "disabledfg": "#aaaaaa",
-    "selectbg": "#657a9e",
-    "selectfg": "#ffffff"
-    }
-
-imgs = {}
-def _load_imgs(imgdir):
-    imgdir = os.path.expanduser(imgdir)
-    if not os.path.isdir(imgdir):
-        raise Exception("%r is not a directory, can't load images" % imgdir)
-    for f in glob.glob("%s/*.gif" % imgdir):
-        img = os.path.split(f)[1]
-        name = img[:-4]
-        imgs[name] = PhotoImage(name, file=f, format="gif89")
-
-def install(imgdir):
-    _load_imgs(imgdir)
-    style = ttk.Style()
-    style.theme_create("plastik", "default", settings={
-        ".": {
-            "configure":
-                {"background": colors['frame'],
-                 "troughcolor": colors['frame'],
-                 "selectbackground": colors['selectbg'],
-                 "selectforeground": colors['selectfg'],
-                 "fieldbackground": colors['frame'],
-                 "font": "TkDefaultFont",
-                 "borderwidth": 1},
-            "map": {"foreground": [("disabled", colors['disabledfg'])]}
-        },
-
-        "Vertical.TScrollbar": {"layout": [
-            ("Vertical.Scrollbar.uparrow", {"side": "top", "sticky": ''}),
-            ("Vertical.Scrollbar.downarrow", {"side": "bottom", "sticky": ''}),
-            ("Vertical.Scrollbar.uparrow", {"side": "bottom", "sticky": ''}),
-            ("Vertical.Scrollbar.trough", {"sticky": "ns", "children":
-                [("Vertical.Scrollbar.thumb", {"expand": 1, "unit": 1,
-                    "children": [("Vertical.Scrollbar.grip", {"sticky": ''})]
-                })]
-            })]
-        },
-
-        "Horizontal.TScrollbar": {"layout": [
-            ("Horizontal.Scrollbar.leftarrow", {"side": "left", "sticky": ''}),
-            ("Horizontal.Scrollbar.rightarrow",
-                {"side": "right", "sticky": ''}),
-            ("Horizontal.Scrollbar.leftarrow",
-                {"side": "right", "sticky": ''}),
-            ("Horizontal.Scrollbar.trough", {"sticky": "ew", "children":
-                [("Horizontal.Scrollbar.thumb", {"expand": 1, "unit": 1,
-                    "children": [("Horizontal.Scrollbar.grip", {"sticky": ''})]
-                })]
-            })]
-        },
-
-        "TButton": {
-            "configure": {"width": 10, "anchor": "center"},
-            "layout": [
-                ("Button.button", {"children":
-                    [("Button.focus", {"children":
-                        [("Button.padding", {"children":
-                            [("Button.label", {"side": "left", "expand": 1})]
-                        })]
-                    })]
-                })
-            ]
-        },
-
-        "Toolbutton": {
-            "configure": {"anchor": "center"},
-            "layout": [
-                ("Toolbutton.border", {"children":
-                    [("Toolbutton.button", {"children":
-                        [("Toolbutton.padding", {"children":
-                            [("Toolbutton.label", {"side":"left", "expand":1})]
-                        })]
-                    })]
-                })
-            ]
-        },
-
-        "TMenubutton": {"layout": [
-            ("Menubutton.button", {"children":
-                [("Menubutton.indicator", {"side": "right"}),
-                 ("Menubutton.focus", {"children":
-                    [("Menubutton.padding", {"children":
-                        [("Menubutton.label", {"side": "left", "expand": 1})]
-                    })]
-                })]
-            })]
-        },
-
-        "TNotebook": {"configure": {"tabmargins": [0, 2, 0, 0]}},
-        "TNotebook.tab": {
-            "configure": {"padding": [6, 2, 6, 2], "expand": [0, 0, 2]},
-            "map": {"expand": [("selected", [1, 2, 4, 2])]}
-        },
-        "Treeview": {"configure": {"padding": 0}},
-
-        # elements
-        "Button.button": {"element create":
-            ("image", 'button-n',
-                ("pressed", 'button-p'), ("active", 'button-h'),
-                {"border": [4, 10], "padding": 4, "sticky":"ewns"}
-            )
-        },
-
-        "Toolbutton.button": {"element create":
-            ("image", 'tbutton-n',
-                ("selected", 'tbutton-p'), ("pressed", 'tbutton-p'),
-                ("active", 'tbutton-h'),
-                {"border": [4, 9], "padding": 3, "sticky": "news"}
-            )
-        },
-
-        "Checkbutton.indicator": {"element create":
-            ("image", 'check-nu',
-                ('active', 'selected', 'check-hc'),
-                ('pressed', 'selected', 'check-pc'),
-                ('active', 'check-hu'),
-                ("selected", 'check-nc'),
-                {"sticky": ''}
-            )
-        },
-
-        "Radiobutton.indicator": {"element create":
-            ("image", 'radio-nu',
-                ('active', 'selected', 'radio-hc'),
-                ('pressed', 'selected', 'radio-pc'),
-                ('active', 'radio-hu'), ('selected', 'radio-nc'),
-                {"sticky": ''}
-            )
-        },
-
-        "Horizontal.Scrollbar.thumb": {"element create":
-            ("image", 'hsb-n', {"border": 3, "sticky": "ew"})
-        },
-
-        "Horizontal.Scrollbar.grip": {"element create": ("image", 'hsb-g')},
-        "Horizontal.Scrollbar.trough": {"element create": ("image", 'hsb-t')},
-        "Vertical.Scrollbar.thumb": {"element create":
-            ("image", 'vsb-n', {"border": 3, "sticky": "ns"})
-        },
-        "Vertical.Scrollbar.grip": {"element create": ("image", 'vsb-g')},
-        "Vertical.Scrollbar.trough": {"element create": ("image", 'vsb-t')},
-        "Scrollbar.uparrow": {"element create":
-            ("image", 'arrowup-n', ("pressed", 'arrowup-p'), {"sticky": ''})
-        },
-        "Scrollbar.downarrow": {"element create":
-            ("image", 'arrowdown-n',
-            ("pressed", 'arrowdown-p'), {'sticky': ''})
-        },
-        "Scrollbar.leftarrow": {"element create":
-            ("image", 'arrowleft-n',
-            ("pressed", 'arrowleft-p'), {'sticky': ''})
-        },
-        "Scrollbar.rightarrow": {"element create":
-            ("image", 'arrowright-n', ("pressed", 'arrowright-p'),
-            {'sticky': ''})
-        },
-
-        "Horizontal.Scale.slider": {"element create":
-            ("image", 'hslider-n', {'sticky': ''})
-        },
-        "Horizontal.Scale.trough": {"element create":
-            ("image", 'hslider-t', {'border': 1, 'padding': 0})
-        },
-        "Vertical.Scale.slider": {"element create":
-            ("image", 'vslider-n', {'sticky': ''})
-        },
-        "Vertical.Scale.trough": {"element create":
-            ("image", 'vslider-t', {'border': 1, 'padding': 0})
-        },
-
-        "Entry.field": {"element create":
-            ("image", 'entry-n',
-                ("focus", 'entry-f'),
-                {'border': 2, 'padding': [3, 4], 'sticky': 'news'}
-            )
-        },
-
-        "Labelframe.border": {"element create":
-            ("image", 'border', {'border': 4, 'padding': 4, 'sticky': 'news'})
-        },
-
-        "Menubutton.button": {"element create":
-            ("image", 'combo-r',
-                ('active', 'combo-ra'),
-                {'sticky': 'news', 'border': [4, 6, 24, 15],
-                 'padding': [4, 4, 5]}
-            )
-        },
-        "Menubutton.indicator": {"element create":
-            ("image", 'arrow-d', {"sticky": "e", "border": [15, 0, 0, 0]})
-        },
-
-        "Combobox.field": {"element create":
-            ("image", 'combo-n',
-                ('readonly', 'active', 'combo-ra'),
-                ('focus', 'active', 'combo-fa'),
-                ('active', 'combo-a'), ('!readonly', 'focus', 'combo-f'),
-                ('readonly', 'combo-r'),
-                {'border': [4, 6, 24, 15], 'padding': [4, 4, 5],
-                 'sticky': 'news'}
-            )
-        },
-        "Combobox.downarrow": {"element create":
-            ("image", 'arrow-d', {'sticky': 'e', 'border': [15, 0, 0, 0]})
-         },
-
-        "Notebook.client": {"element create":
-            ("image", 'notebook-c', {'border': 4})
-        },
-        "Notebook.tab": {"element create":
-            ("image", 'notebook-tn',
-                ("selected", 'notebook-ts'), ("active", 'notebook-ta'),
-                {'padding': [0, 2, 0, 0], 'border': [4, 10, 4, 10]}
-            )
-        },
-
-        "Progressbar.trough": {"element create":
-            ("image", 'hprogress-t', {'border': 2})
-        },
-        "Horizontal.Progressbar.pbar": {"element create":
-            ("image", 'hprogress-b', {'border': [2, 9]})
-        },
-        "Vertical.Progressbar.pbar": {"element create":
-            ("image", 'vprogress-b', {'border': [9, 2]})
-        },
-
-        "Treeheading.cell": {"element create":
-            ("image", 'tree-n',
-                ("pressed", 'tree-p'),
-                {'border': [4, 10], 'padding': 4, 'sticky': 'news'}
-            )
-        }
-
-    })
-    style.theme_use("plastik")
diff --git a/Demo/tkinter/ttk/roundframe.py b/Demo/tkinter/ttk/roundframe.py
deleted file mode 100644
index ce3685a..0000000
--- a/Demo/tkinter/ttk/roundframe.py
+++ /dev/null
@@ -1,111 +0,0 @@
-"""Ttk Frame with rounded corners.
-
-Based on an example by Bryan Oakley, found at: http://wiki.tcl.tk/20152"""
-import tkinter
-from tkinter import ttk
-
-root = tkinter.Tk()
-
-img1 = tkinter.PhotoImage("frameFocusBorder", data="""
-R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
-rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
-zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
-QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
-sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
-AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
-5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
-AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
-AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
-AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
-AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
-APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
-AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
-/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
-5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
-q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
-AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
-AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
-gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
-CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICZlizat3KtatX
-rAsiCNDgtCJClQkoFMgqsu3ArBkoZDgA8uDJAwk4bGDmtm9BZgcYzK078m4D
-Cgf4+l0skNkGCg3oUhR4d4GCDIoZM2ZWQMECyZQvLMggIbPmzQIyfCZ5YcME
-AwFMn/bLLIKBCRtMHljQQcDV2ZqZTRDQYfWFAwMqUJANvC8zBhUWbDi5YUAB
-Bsybt2VGoUKH3AcmdP+Im127xOcJih+oXsEDdvOLuQfIMGBD9QwBlsOnzcBD
-hfrsuVfefgzJR599A+CnH4Hb9fcfgu29x6BIBgKYYH4DTojQc/5ZGGGGGhpU
-IYIKghgiQRw+GKCEJxZIwXwWlthiQyl6KOCMLsJIIoY4LlQjhDf2mNCI9/Eo
-5IYO2sjikX+9eGCRCzL5V5JALillY07GaOSVb1G5ookzEnlhlFx+8OOXZb6V
-5Y5kcnlmckGmKaaMaZrpJZxWXjnnlmW++WGdZq5ZXQEetKmnlxPgl6eUYhJq
-KKOI0imnoNbF2ScFHQJJwW99TsBAAAVYWEAAHEQAZoi1cQDqAAeEV0EACpT/
-JqcACgRQAW6uNWCbYKcyyEwGDBgQwa2tTlBBAhYIQMFejC5AgQAWJNDABK3y
-loEDEjCgV6/aOcYBAwp4kIF6rVkXgAEc8IQZVifCBRQHGqya23HGIpsTBgSU
-OsFX/PbrVVjpYsCABA4kQCxHu11ogAQUIOAwATpBLDFQFE9sccUYS0wAxD5h
-4DACFEggbAHk3jVBA/gtTIHHEADg8sswxyzzzDQDAAEECGAQsgHiTisZResN
-gLIHBijwLQEYePzx0kw37fTSSjuMr7ZMzfcgYZUZi58DGsTKwbdgayt22GSP
-bXbYY3MggQIaONDzAJ8R9kFlQheQQAAOWGCAARrwdt23Bn8H7vfggBMueOEG
-WOBBAAkU0EB9oBGUdXIFZJBABAEEsPjmmnfO+eeeh/55BBEk0Ph/E8Q9meQq
-bbDABAN00EADFRRQ++2254777rr3jrvjFTTQwQCpz7u6QRut5/oEzA/g/PPQ
-Ry/99NIz//oGrZpUUEAAOw==""")
-
-img2 = tkinter.PhotoImage("frameBorder", data="""
-R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
-rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
-zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
-QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
-sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
-AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
-5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
-AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
-AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
-AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
-AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
-APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
-AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
-/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
-5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
-q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
-AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
-AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
-gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
-CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICkVgHLoggQIPT
-ighVJqBQIKvZghkoZDgA8uDJAwk4bDhLd+ABBmvbjnzbgMKBuoA/bKDQgC1F
-gW8XKMgQOHABBQsMI76wIIOExo0FZIhM8sKGCQYCYA4cwcCEDSYPLOgg4Oro
-uhMEdOB84cCAChReB2ZQYcGGkxsGFGCgGzCFCh1QH5jQIW3xugwSzD4QvIIH
-4s/PUgiQYcCG4BkC5P/ObpaBhwreq18nb3Z79+8Dwo9nL9I8evjWsdOX6D59
-fPH71Xeef/kFyB93/sln4EP2Ebjegg31B5+CEDLUIH4PVqiQhOABqKFCF6qn
-34cHcfjffCQaFOJtGaZYkIkUuljQigXK+CKCE3po40A0trgjjDru+EGPI/6I
-Y4co7kikkAMBmaSNSzL5gZNSDjkghkXaaGIBHjwpY4gThJeljFt2WSWYMQpZ
-5pguUnClehS4tuMEDARQgH8FBMBBBExGwIGdAxywXAUBKHCZkAIoEEAFp33W
-QGl47ZgBAwZEwKigE1SQgAUCUDCXiwtQIIAFCTQwgaCrZeCABAzIleIGHDD/
-oIAHGUznmXABGMABT4xpmBYBHGgAKGq1ZbppThgAG8EEAW61KwYMSOBAApdy
-pNp/BkhAAQLcEqCTt+ACJW645I5rLrgEeOsTBtwiQIEElRZg61sTNBBethSw
-CwEA/Pbr778ABywwABBAgAAG7xpAq6mGUUTdAPZ6YIACsRKAAbvtZqzxxhxn
-jDG3ybbKFHf36ZVYpuE5oIGhHMTqcqswvyxzzDS/HDMHEiiggQMLDxCZXh8k
-BnEBCQTggAUGGKCB0ktr0PTTTEfttNRQT22ABR4EkEABDXgnGUEn31ZABglE
-EEAAWaeN9tpqt832221HEEECW6M3wc+Hga3SBgtMODBABw00UEEBgxdO+OGG
-J4744oZzXUEDHQxwN7F5G7QRdXxPoPkAnHfu+eeghw665n1vIKhJBQUEADs=""")
-
-style = ttk.Style()
-
-style.element_create("RoundedFrame", "image", "frameBorder",
-    ("focus", "frameFocusBorder"), border=16, sticky="nsew")
-
-style.layout("RoundedFrame", [("RoundedFrame", {"sticky": "nsew"})])
-style.configure("TEntry", borderwidth=0)
-
-frame = ttk.Frame(style="RoundedFrame", padding=10)
-frame.pack(fill='x')
-
-frame2 = ttk.Frame(style="RoundedFrame", padding=10)
-frame2.pack(fill='both', expand=1)
-
-entry = ttk.Entry(frame, text='Test')
-entry.pack(fill='x')
-entry.bind("<FocusIn>", lambda evt: frame.state(["focus"]))
-entry.bind("<FocusOut>", lambda evt: frame.state(["!focus"]))
-
-text = tkinter.Text(frame2, borderwidth=0, bg="white", highlightthickness=0)
-text.pack(fill='both', expand=1)
-text.bind("<FocusIn>", lambda evt: frame2.state(["focus"]))
-text.bind("<FocusOut>", lambda evt: frame2.state(["!focus"]))
-
-root.mainloop()
diff --git a/Demo/tkinter/ttk/theme_selector.py b/Demo/tkinter/ttk/theme_selector.py
deleted file mode 100644
index 09c5a72..0000000
--- a/Demo/tkinter/ttk/theme_selector.py
+++ /dev/null
@@ -1,61 +0,0 @@
-"""Ttk Theme Selector v2.
-
-This is an improvement from the other theme selector (themes_combo.py)
-since now you can notice theme changes in Ttk Combobox, Ttk Frame,
-Ttk Label and Ttk Button.
-"""
-import tkinter
-from tkinter import ttk
-
-class App(ttk.Frame):
-    def __init__(self):
-        ttk.Frame.__init__(self, borderwidth=3)
-
-        self.style = ttk.Style()
-
-        # XXX Ideally I wouldn't want to create a Tkinter.IntVar to make
-        #     it works with Checkbutton variable option.
-        self.theme_autochange = tkinter.IntVar(self, 0)
-        self._setup_widgets()
-
-    def _change_theme(self):
-        self.style.theme_use(self.themes_combo.get())
-
-    def _theme_sel_changed(self, widget):
-        if self.theme_autochange.get():
-            self._change_theme()
-
-    def _setup_widgets(self):
-        themes_lbl = ttk.Label(self, text="Themes")
-
-        themes = self.style.theme_names()
-        self.themes_combo = ttk.Combobox(self, values=themes, state="readonly")
-        self.themes_combo.set(themes[0])
-        self.themes_combo.bind("<<ComboboxSelected>>", self._theme_sel_changed)
-
-        change_btn = ttk.Button(self, text='Change Theme',
-            command=self._change_theme)
-
-        theme_change_checkbtn = ttk.Checkbutton(self,
-            text="Change themes when combobox item is activated",
-            variable=self.theme_autochange)
-
-        themes_lbl.grid(ipadx=6, sticky="w")
-        self.themes_combo.grid(row=0, column=1, padx=6, sticky="ew")
-        change_btn.grid(row=0, column=2, padx=6, sticky="e")
-        theme_change_checkbtn.grid(row=1, columnspan=3, sticky="w", pady=6)
-
-        top = self.winfo_toplevel()
-        top.rowconfigure(0, weight=1)
-        top.columnconfigure(0, weight=1)
-        self.columnconfigure(1, weight=1)
-        self.grid(row=0, column=0, sticky="nsew", columnspan=3, rowspan=2)
-
-
-def main():
-    app = App()
-    app.master.title("Theme Selector")
-    app.mainloop()
-
-if __name__ == "__main__":
-    main()
diff --git a/Demo/tkinter/ttk/treeview_multicolumn.py b/Demo/tkinter/ttk/treeview_multicolumn.py
deleted file mode 100644
index be72237..0000000
--- a/Demo/tkinter/ttk/treeview_multicolumn.py
+++ /dev/null
@@ -1,107 +0,0 @@
-"""Demo based on the demo mclist included with tk source distribution."""
-import tkinter
-import tkinter.font
-from tkinter import ttk
-
-tree_columns = ("country", "capital", "currency")
-tree_data = [
-    ("Argentina",      "Buenos Aires",     "ARS"),
-    ("Australia",      "Canberra",         "AUD"),
-    ("Brazil",         "Brazilia",         "BRL"),
-    ("Canada",         "Ottawa",           "CAD"),
-    ("China",          "Beijing",          "CNY"),
-    ("France",         "Paris",            "EUR"),
-    ("Germany",        "Berlin",           "EUR"),
-    ("India",          "New Delhi",        "INR"),
-    ("Italy",          "Rome",             "EUR"),
-    ("Japan",          "Tokyo",            "JPY"),
-    ("Mexico",         "Mexico City",      "MXN"),
-    ("Russia",         "Moscow",           "RUB"),
-    ("South Africa",   "Pretoria",         "ZAR"),
-    ("United Kingdom", "London",           "GBP"),
-    ("United States",  "Washington, D.C.", "USD")
-    ]
-
-def sortby(tree, col, descending):
-    """Sort tree contents when a column is clicked on."""
-    # grab values to sort
-    data = [(tree.set(child, col), child) for child in tree.get_children('')]
-
-    # reorder data
-    data.sort(reverse=descending)
-    for indx, item in enumerate(data):
-        tree.move(item[1], '', indx)
-
-    # switch the heading so that it will sort in the opposite direction
-    tree.heading(col,
-        command=lambda col=col: sortby(tree, col, int(not descending)))
-
-class App(object):
-    def __init__(self):
-        self.tree = None
-        self._setup_widgets()
-        self._build_tree()
-
-    def _setup_widgets(self):
-        msg = ttk.Label(wraplength="4i", justify="left", anchor="n",
-            padding=(10, 2, 10, 6),
-            text=("Ttk is the new Tk themed widget set. One of the widgets it "
-                  "includes is a tree widget, which can be configured to "
-                  "display multiple columns of informational data without "
-                  "displaying the tree itself. This is a simple way to build "
-                  "a listbox that has multiple columns. Clicking on the "
-                  "heading for a column will sort the data by that column. "
-                  "You can also change the width of the columns by dragging "
-                  "the boundary between them."))
-        msg.pack(fill='x')
-
-        container = ttk.Frame()
-        container.pack(fill='both', expand=True)
-
-        # XXX Sounds like a good support class would be one for constructing
-        #     a treeview with scrollbars.
-        self.tree = ttk.Treeview(columns=tree_columns, show="headings")
-        vsb = ttk.Scrollbar(orient="vertical", command=self.tree.yview)
-        hsb = ttk.Scrollbar(orient="horizontal", command=self.tree.xview)
-        self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
-        self.tree.grid(column=0, row=0, sticky='nsew', in_=container)
-        vsb.grid(column=1, row=0, sticky='ns', in_=container)
-        hsb.grid(column=0, row=1, sticky='ew', in_=container)
-
-        container.grid_columnconfigure(0, weight=1)
-        container.grid_rowconfigure(0, weight=1)
-
-    def _build_tree(self):
-        for col in tree_columns:
-            self.tree.heading(col, text=col.title(),
-                command=lambda c=col: sortby(self.tree, c, 0))
-            # XXX tkFont.Font().measure expected args are incorrect according
-            #     to the Tk docs
-            self.tree.column(col, width=tkinter.font.Font().measure(col.title()))
-
-        for item in tree_data:
-            self.tree.insert('', 'end', values=item)
-
-            # adjust columns lenghts if necessary
-            for indx, val in enumerate(item):
-                ilen = tkinter.font.Font().measure(val)
-                if self.tree.column(tree_columns[indx], width=None) < ilen:
-                    self.tree.column(tree_columns[indx], width=ilen)
-
-def main():
-    root = tkinter.Tk()
-    root.wm_title("Multi-Column List")
-    root.wm_iconname("mclist")
-
-    import plastik_theme
-    try:
-        plastik_theme.install('~/tile-themes/plastik/plastik')
-    except Exception:
-        import warnings
-        warnings.warn("plastik theme being used without images")
-
-    app = App()
-    root.mainloop()
-
-if __name__ == "__main__":
-    main()
diff --git a/Demo/tkinter/ttk/ttkcalendar.py b/Demo/tkinter/ttk/ttkcalendar.py
deleted file mode 100644
index 8e35f1f..0000000
--- a/Demo/tkinter/ttk/ttkcalendar.py
+++ /dev/null
@@ -1,231 +0,0 @@
-"""
-Simple calendar using ttk Treeview together with calendar and datetime
-classes.
-"""
-import calendar
-import tkinter
-import tkinter.font
-from tkinter import ttk
-
-def get_calendar(locale, fwday):
-    # instantiate proper calendar class
-    if locale is None:
-        return calendar.TextCalendar(fwday)
-    else:
-        return calendar.LocaleTextCalendar(fwday, locale)
-
-class Calendar(ttk.Frame):
-    # XXX ToDo: cget and configure
-
-    datetime = calendar.datetime.datetime
-    timedelta = calendar.datetime.timedelta
-
-    def __init__(self, master=None, **kw):
-        """
-        WIDGET-SPECIFIC OPTIONS
-
-            locale, firstweekday, year, month, selectbackground,
-            selectforeground
-        """
-        # remove custom options from kw before initializating ttk.Frame
-        fwday = kw.pop('firstweekday', calendar.MONDAY)
-        year = kw.pop('year', self.datetime.now().year)
-        month = kw.pop('month', self.datetime.now().month)
-        locale = kw.pop('locale', None)
-        sel_bg = kw.pop('selectbackground', '#ecffc4')
-        sel_fg = kw.pop('selectforeground', '#05640e')
-
-        self._date = self.datetime(year, month, 1)
-        self._selection = None # no date selected
-
-        ttk.Frame.__init__(self, master, **kw)
-
-        self._cal = get_calendar(locale, fwday)
-
-        self.__setup_styles()       # creates custom styles
-        self.__place_widgets()      # pack/grid used widgets
-        self.__config_calendar()    # adjust calendar columns and setup tags
-        # configure a canvas, and proper bindings, for selecting dates
-        self.__setup_selection(sel_bg, sel_fg)
-
-        # store items ids, used for insertion later
-        self._items = [self._calendar.insert('', 'end', values='')
-                            for _ in range(6)]
-        # insert dates in the currently empty calendar
-        self._build_calendar()
-
-        # set the minimal size for the widget
-        self._calendar.bind('<Map>', self.__minsize)
-
-    def __setitem__(self, item, value):
-        if item in ('year', 'month'):
-            raise AttributeError("attribute '%s' is not writeable" % item)
-        elif item == 'selectbackground':
-            self._canvas['background'] = value
-        elif item == 'selectforeground':
-            self._canvas.itemconfigure(self._canvas.text, item=value)
-        else:
-            ttk.Frame.__setitem__(self, item, value)
-
-    def __getitem__(self, item):
-        if item in ('year', 'month'):
-            return getattr(self._date, item)
-        elif item == 'selectbackground':
-            return self._canvas['background']
-        elif item == 'selectforeground':
-            return self._canvas.itemcget(self._canvas.text, 'fill')
-        else:
-            r = ttk.tclobjs_to_py({item: ttk.Frame.__getitem__(self, item)})
-            return r[item]
-
-    def __setup_styles(self):
-        # custom ttk styles
-        style = ttk.Style(self.master)
-        arrow_layout = lambda dir: (
-            [('Button.focus', {'children': [('Button.%sarrow' % dir, None)]})]
-        )
-        style.layout('L.TButton', arrow_layout('left'))
-        style.layout('R.TButton', arrow_layout('right'))
-
-    def __place_widgets(self):
-        # header frame and its widgets
-        hframe = ttk.Frame(self)
-        lbtn = ttk.Button(hframe, style='L.TButton', command=self._prev_month)
-        rbtn = ttk.Button(hframe, style='R.TButton', command=self._next_month)
-        self._header = ttk.Label(hframe, width=15, anchor='center')
-        # the calendar
-        self._calendar = ttk.Treeview(show='', selectmode='none', height=7)
-
-        # pack the widgets
-        hframe.pack(in_=self, side='top', pady=4, anchor='center')
-        lbtn.grid(in_=hframe)
-        self._header.grid(in_=hframe, column=1, row=0, padx=12)
-        rbtn.grid(in_=hframe, column=2, row=0)
-        self._calendar.pack(in_=self, expand=1, fill='both', side='bottom')
-
-    def __config_calendar(self):
-        cols = self._cal.formatweekheader(3).split()
-        self._calendar['columns'] = cols
-        self._calendar.tag_configure('header', background='grey90')
-        self._calendar.insert('', 'end', values=cols, tag='header')
-        # adjust its columns width
-        font = tkinter.font.Font()
-        maxwidth = max(font.measure(col) for col in cols)
-        for col in cols:
-            self._calendar.column(col, width=maxwidth, minwidth=maxwidth,
-                anchor='e')
-
-    def __setup_selection(self, sel_bg, sel_fg):
-        self._font = tkinter.font.Font()
-        self._canvas = canvas = tkinter.Canvas(self._calendar,
-            background=sel_bg, borderwidth=0, highlightthickness=0)
-        canvas.text = canvas.create_text(0, 0, fill=sel_fg, anchor='w')
-
-        canvas.bind('<ButtonPress-1>', lambda evt: canvas.place_forget())
-        self._calendar.bind('<Configure>', lambda evt: canvas.place_forget())
-        self._calendar.bind('<ButtonPress-1>', self._pressed)
-
-    def __minsize(self, evt):
-        width, height = self._calendar.master.geometry().split('x')
-        height = height[:height.index('+')]
-        self._calendar.master.minsize(width, height)
-
-    def _build_calendar(self):
-        year, month = self._date.year, self._date.month
-
-        # update header text (Month, YEAR)
-        header = self._cal.formatmonthname(year, month, 0)
-        self._header['text'] = header.title()
-
-        # update calendar shown dates
-        cal = self._cal.monthdayscalendar(year, month)
-        for indx, item in enumerate(self._items):
-            week = cal[indx] if indx < len(cal) else []
-            fmt_week = [('%02d' % day) if day else '' for day in week]
-            self._calendar.item(item, values=fmt_week)
-
-    def _show_selection(self, text, bbox):
-        """Configure canvas for a new selection."""
-        x, y, width, height = bbox
-
-        textw = self._font.measure(text)
-
-        canvas = self._canvas
-        canvas.configure(width=width, height=height)
-        canvas.coords(canvas.text, width - textw, height / 2 - 1)
-        canvas.itemconfigure(canvas.text, text=text)
-        canvas.place(in_=self._calendar, x=x, y=y)
-
-    # Callbacks
-
-    def _pressed(self, evt):
-        """Clicked somewhere in the calendar."""
-        x, y, widget = evt.x, evt.y, evt.widget
-        item = widget.identify_row(y)
-        column = widget.identify_column(x)
-
-        if not column or not item in self._items:
-            # clicked in the weekdays row or just outside the columns
-            return
-
-        item_values = widget.item(item)['values']
-        if not len(item_values): # row is empty for this month
-            return
-
-        text = item_values[int(column[1]) - 1]
-        if not text: # date is empty
-            return
-
-        bbox = widget.bbox(item, column)
-        if not bbox: # calendar not visible yet
-            return
-
-        # update and then show selection
-        text = '%02d' % text
-        self._selection = (text, item, column)
-        self._show_selection(text, bbox)
-
-    def _prev_month(self):
-        """Updated calendar to show the previous month."""
-        self._canvas.place_forget()
-
-        self._date = self._date - self.timedelta(days=1)
-        self._date = self.datetime(self._date.year, self._date.month, 1)
-        self._build_calendar() # reconstuct calendar
-
-    def _next_month(self):
-        """Update calendar to show the next month."""
-        self._canvas.place_forget()
-
-        year, month = self._date.year, self._date.month
-        self._date = self._date + self.timedelta(
-            days=calendar.monthrange(year, month)[1] + 1)
-        self._date = self.datetime(self._date.year, self._date.month, 1)
-        self._build_calendar() # reconstruct calendar
-
-    # Properties
-
-    @property
-    def selection(self):
-        """Return a datetime representing the current selected date."""
-        if not self._selection:
-            return None
-
-        year, month = self._date.year, self._date.month
-        return self.datetime(year, month, int(self._selection[0]))
-
-def test():
-    import sys
-    root = tkinter.Tk()
-    root.title('Ttk Calendar')
-    ttkcal = Calendar(firstweekday=calendar.SUNDAY)
-    ttkcal.pack(expand=1, fill='both')
-
-    if 'win' not in sys.platform:
-        style = ttk.Style()
-        style.theme_use('clam')
-
-    root.mainloop()
-
-if __name__ == '__main__':
-    test()
diff --git a/Demo/tkinter/ttk/widget_state.py b/Demo/tkinter/ttk/widget_state.py
deleted file mode 100644
index b68f13b..0000000
--- a/Demo/tkinter/ttk/widget_state.py
+++ /dev/null
@@ -1,83 +0,0 @@
-"""Sample demo showing widget states and some font styling."""
-from tkinter import ttk
-
-states = ['active', 'disabled', 'focus', 'pressed', 'selected',
-          'background', 'readonly', 'alternate', 'invalid']
-
-for state in states[:]:
-    states.append("!" + state)
-
-def reset_state(widget):
-    nostate = states[len(states) // 2:]
-    widget.state(nostate)
-
-class App(ttk.Frame):
-    def __init__(self, title=None):
-        ttk.Frame.__init__(self, borderwidth=6)
-        self.master.title(title)
-
-        self.style = ttk.Style()
-
-        # get default font size and family
-        btn_font = self.style.lookup("TButton", "font")
-        fsize = str(self.tk.eval("font configure %s -size" % btn_font))
-        self.font_family = self.tk.eval("font configure %s -family" % btn_font)
-        if ' ' in self.font_family:
-            self.font_family = '{%s}' % self.font_family
-        self.fsize_prefix = fsize[0] if fsize[0] == '-' else ''
-        self.base_fsize = int(fsize[1 if fsize[0] == '-' else 0:])
-
-        # a list to hold all the widgets that will have their states changed
-        self.update_widgets = []
-
-        self._setup_widgets()
-
-    def _set_font(self, extra=0):
-        self.style.configure("TButton", font="%s %s%d" % (self.font_family,
-            self.fsize_prefix, self.base_fsize + extra))
-
-    def _new_state(self, widget, newtext):
-        widget = self.nametowidget(widget)
-
-        if not newtext:
-            goodstates = ["disabled"]
-            font_extra = 0
-        else:
-            # set widget state according to what has been entered in the entry
-            newstates = set(newtext.split()) # eliminate duplicates
-
-            # keep only the valid states
-            goodstates = [state for state in newstates if state in states]
-            # define a new font size based on amount of states
-            font_extra = 2 * len(goodstates)
-
-        # set new widget state
-        for widget in self.update_widgets:
-            reset_state(widget) # remove any previous state from the widget
-            widget.state(goodstates)
-
-        # update Ttk Button font size
-        self._set_font(font_extra)
-        return 1
-
-    def _setup_widgets(self):
-        btn = ttk.Button(self, text='Enter states and watch')
-
-        entry = ttk.Entry(self, cursor='xterm', validate="key")
-        entry['validatecommand'] = (self.register(self._new_state), '%W', '%P')
-        entry.focus()
-
-        self.update_widgets.append(btn)
-        entry.validate()
-
-        entry.pack(fill='x', padx=6)
-        btn.pack(side='left', pady=6, padx=6, anchor='n')
-        self.pack(fill='both', expand=1)
-
-
-def main():
-    app = App("Widget State Tester")
-    app.mainloop()
-
-if __name__ == "__main__":
-    main()
diff --git a/Demo/newmetaclasses/Eiffel.py b/Tools/demo/Eiffel.py
similarity index 100%
rename from Demo/newmetaclasses/Eiffel.py
rename to Tools/demo/Eiffel.py
diff --git a/Demo/classes/Vec.py b/Tools/demo/Vec.py
similarity index 100%
rename from Demo/classes/Vec.py
rename to Tools/demo/Vec.py
diff --git a/Demo/scripts/beer.py b/Tools/demo/beer.py
similarity index 100%
rename from Demo/scripts/beer.py
rename to Tools/demo/beer.py
diff --git a/Demo/tkinter/guido/hanoi.py b/Tools/demo/hanoi.py
similarity index 100%
rename from Demo/tkinter/guido/hanoi.py
rename to Tools/demo/hanoi.py
diff --git a/Demo/curses/life.py b/Tools/demo/life.py
similarity index 100%
rename from Demo/curses/life.py
rename to Tools/demo/life.py
diff --git a/Demo/scripts/markov.py b/Tools/demo/markov.py
similarity index 100%
rename from Demo/scripts/markov.py
rename to Tools/demo/markov.py
diff --git a/Demo/sockets/mcast.py b/Tools/demo/mcast.py
similarity index 100%
rename from Demo/sockets/mcast.py
rename to Tools/demo/mcast.py
diff --git a/Demo/scripts/queens.py b/Tools/demo/queens.py
similarity index 100%
rename from Demo/scripts/queens.py
rename to Tools/demo/queens.py
diff --git a/Tools/demo/rpython.py b/Tools/demo/rpython.py
new file mode 100755
index 0000000..e965720
--- /dev/null
+++ b/Tools/demo/rpython.py
@@ -0,0 +1,36 @@
+#! /usr/bin/env python3
+
+# Remote python client.
+# Execute Python commands remotely and send output back.
+
+import sys
+from socket import socket, AF_INET, SOCK_STREAM, SHUT_WR
+
+PORT = 4127
+BUFSIZE = 1024
+
+def main():
+    if len(sys.argv) < 3:
+        print("usage: rpython host command")
+        sys.exit(2)
+    host = sys.argv[1]
+    port = PORT
+    i = host.find(':')
+    if i >= 0:
+        port = int(port[i+1:])
+        host = host[:i]
+    command = ' '.join(sys.argv[2:])
+    s = socket(AF_INET, SOCK_STREAM)
+    s.connect((host, port))
+    s.send(command.encode())
+    s.shutdown(SHUT_WR)
+    reply = b''
+    while True:
+        data = s.recv(BUFSIZE)
+        if not data:
+            break
+        reply += data
+    print(reply.decode(), end=' ')
+    s.close()
+
+main()
diff --git a/Demo/sockets/rpythond.py b/Tools/demo/rpythond.py
similarity index 74%
rename from Demo/sockets/rpythond.py
rename to Tools/demo/rpythond.py
index e244d6c..fe24b3d 100755
--- a/Demo/sockets/rpythond.py
+++ b/Tools/demo/rpythond.py
@@ -6,7 +6,7 @@
 # from any host on the Internet!
 
 import sys
-from socket import *
+from socket import socket, AF_INET, SOCK_STREAM
 import io
 import traceback
 
@@ -15,23 +15,23 @@
 
 def main():
     if len(sys.argv) > 1:
-        port = int(eval(sys.argv[1]))
+        port = int(sys.argv[1])
     else:
         port = PORT
     s = socket(AF_INET, SOCK_STREAM)
     s.bind(('', port))
     s.listen(1)
-    while 1:
+    while True:
         conn, (remotehost, remoteport) = s.accept()
-        print('connected by', remotehost, remoteport)
-        request = ''
+        print('connection from', remotehost, remoteport)
+        request = b''
         while 1:
             data = conn.recv(BUFSIZE)
             if not data:
                 break
-            request = request + data
-        reply = execute(request)
-        conn.send(reply)
+            request += data
+        reply = execute(request.decode())
+        conn.send(reply.encode())
         conn.close()
 
 def execute(request):
@@ -49,4 +49,7 @@
         sys.stdout = stdout
     return fakefile.getvalue()
 
-main()
+try:
+    main()
+except KeyboardInterrupt:
+    pass
diff --git a/Demo/tkinter/guido/sortvisu.py b/Tools/demo/sortvisu.py
similarity index 100%
rename from Demo/tkinter/guido/sortvisu.py
rename to Tools/demo/sortvisu.py
diff --git a/Demo/tkinter/guido/ss1.py b/Tools/demo/ss1.py
similarity index 100%
rename from Demo/tkinter/guido/ss1.py
rename to Tools/demo/ss1.py
diff --git a/Demo/distutils/test2to3/README b/Tools/test2to3/README
similarity index 100%
rename from Demo/distutils/test2to3/README
rename to Tools/test2to3/README
diff --git a/Demo/distutils/test2to3/maintest.py b/Tools/test2to3/maintest.py
similarity index 100%
rename from Demo/distutils/test2to3/maintest.py
rename to Tools/test2to3/maintest.py
diff --git a/Demo/distutils/test2to3/setup.py b/Tools/test2to3/setup.py
similarity index 100%
rename from Demo/distutils/test2to3/setup.py
rename to Tools/test2to3/setup.py
diff --git a/Demo/distutils/test2to3/test/runtests.py b/Tools/test2to3/test/runtests.py
similarity index 100%
rename from Demo/distutils/test2to3/test/runtests.py
rename to Tools/test2to3/test/runtests.py
diff --git a/Demo/distutils/test2to3/test/test_foo.py b/Tools/test2to3/test/test_foo.py
similarity index 100%
rename from Demo/distutils/test2to3/test/test_foo.py
rename to Tools/test2to3/test/test_foo.py
diff --git a/Demo/distutils/test2to3/test2to3/__init__.py b/Tools/test2to3/test2to3/__init__.py
similarity index 100%
rename from Demo/distutils/test2to3/test2to3/__init__.py
rename to Tools/test2to3/test2to3/__init__.py
diff --git a/Demo/distutils/test2to3/test2to3/hello.py b/Tools/test2to3/test2to3/hello.py
similarity index 100%
rename from Demo/distutils/test2to3/test2to3/hello.py
rename to Tools/test2to3/test2to3/hello.py