diff --git a/Demo/tix/INSTALL.txt b/Demo/tix/INSTALL.txt
index 9dc3093..ac70b68 100644
--- a/Demo/tix/INSTALL.txt
+++ b/Demo/tix/INSTALL.txt
@@ -1,25 +1,33 @@
 $Id$
 
-Installing PyTix
+Installing Tix.py
 ----------------
 
-0) To use PyTix, you need Tcl/Tk (V8.2+), Tix (V8.1+) and Python (V2.1+).
-   PyTix has been written and tested on a Intel Pentium running RH Linux 5.2
+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 PyTix itself so it should work on
+   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.2 or 8.3. Build and install Tix 8.1 or better.
+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.2.3 for this release of PyTix.
+   for all three. We recommend tcl8.3.3 for this release of Tix.py.
 
-2) Modify Modules/Setup.dist and setup.py to change the version of the 
-   tix library from tix4.1.8.0 to tix8.1.8.2
+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'.
@@ -44,9 +52,9 @@
 # *** Uncomment and edit for TOGL extension only:
 #	-DWITH_TOGL togl.c \
 # *** Uncomment and edit for Tix extension only:
-	-DWITH_TIX -ltix8.1.8.2 \
+	-DWITH_TIX -ltix8.1.8.3 \
 # *** Uncomment and edit to reflect your Tcl/Tk versions:
-	-ltk8.2 -ltcl8.2 \
+	-ltk8.3 -ltcl8.3 \
 # *** Uncomment and edit to reflect where your X11 libraries are:
 	-L/usr/X11R6/lib \
 # *** Or uncomment this for Solaris:
@@ -69,8 +77,8 @@
 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.2 \
-		TK_LIBRARY=/usr/local/lib/tk8.2 \
+	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
 
diff --git a/Demo/tix/README.txt b/Demo/tix/README.txt
index 15e85cd..e0196ac 100644
--- a/Demo/tix/README.txt
+++ b/Demo/tix/README.txt
@@ -1,7 +1,7 @@
-About PyTix
+About Tix.py
 -----------
 
-PyTix is based on an idea of Jean-Marc Lugrin (lugrin@ms.com) who wrote
+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.
diff --git a/Demo/tix/samples/DirList.py b/Demo/tix/samples/DirList.py
new file mode 100755
index 0000000..3064768
--- /dev/null
+++ b/Demo/tix/samples/DirList.py
@@ -0,0 +1,142 @@
+# -*-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 "widget": 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 Tix, os, copy
+from Tkconstants import *
+
+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
+
+def RunSample (root):
+    global dirlist
+    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_title('Tix.DirList Widget Demo')
+        
+        # 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 = Tix.Frame( w, relief=RAISED, bd=1)
+
+        # Create the DirList widget. By default it will show the current
+        # directory
+        #
+        #
+        top.dir = 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 = 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 = 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'+`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 = 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)
+        z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
+
+    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.root.destroy()
+        self.exit = 0
+
+    def mainloop(self):
+        while self.exit < 0:
+            self.root.tk.dooneevent(TCL_ALL_EVENTS)
+        # self.root.tk.dooneevent(TCL_DONT_WAIT)
+
+    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 "widget".
+#
+if __name__== '__main__' :
+    import tkMessageBox, traceback
+
+    try:
+        root=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 = tkMessageBox.showerror ( 'Tix Demo Error', text)
+
diff --git a/Demo/tix/samples/DirTree.py b/Demo/tix/samples/DirTree.py
new file mode 100755
index 0000000..7bf813c
--- /dev/null
+++ b/Demo/tix/samples/DirTree.py
@@ -0,0 +1,108 @@
+# -*-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 "widget": 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 Tix, os, copy
+from Tkconstants import *
+
+def RunSample (w):
+    DemoDirTree(w)
+
+class DemoDirTree:
+    def __init__(self, w):
+        self.root = w
+        
+        z = w.winfo_toplevel()
+        z.wm_title('Tix.DirTree Widget Demo')
+        
+        # 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 = Tix.Frame( w, relief=RAISED, bd=1)
+
+        # Create the DirTree widget. By default it will show the current
+        # directory
+        #
+        #
+        top.dir = 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 = 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 = 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 = 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.root.destroy()
+
+# This "if" statement makes it possible to run this script file inside or
+# outside of the main demo program "widget".
+#
+if __name__== '__main__' :
+    root=Tix.Tk()
+    RunSample(root)
+    root.mainloop()
+    root.destroy()
+
diff --git a/Demo/tix/samples/SHList1.py b/Demo/tix/samples/SHList1.py
index 5122bbc..f4294ee 100755
--- a/Demo/tix/samples/SHList1.py
+++ b/Demo/tix/samples/SHList1.py
@@ -1,4 +1,4 @@
-#!/usr/local/bin/python
+# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
 # 
 # $Id$
 #
@@ -57,7 +57,7 @@
     for boss,name in bosses :
 	if count :
 	    f=Tix.Frame(hlist, name='sep%d' % count, height=2, width=150,
-		bd=2, relief=Tix.SUNKEN, bg=hlist['bg'] )
+		bd=2, relief=Tix.SUNKEN )
 
 	    hlist.add_child( itemtype=Tix.WINDOW, 
 		window=f, state=Tix.DISABLED )
@@ -89,10 +89,10 @@
     #
     box= Tix.ButtonBox(top, orientation=Tix.HORIZONTAL )
     box.add( 'ok',  text='Ok', underline=0,  width=6,
-	command = lambda w=w:  w.destroy() )
+	command = lambda w=w:  w.quit() )
 
     box.add( 'cancel', text='Cancel', underline=0, width=6,
-	command = lambda w=w:  w.destroy() )
+	command = lambda w=w:  w.quit() )
 
     box.pack( side=Tix.BOTTOM, fill=Tix.X)
     top.pack( side=Tix.TOP,    fill=Tix.BOTH, expand=1 )
@@ -105,3 +105,4 @@
     root=Tix.Tk()
     RunSample(root)
     root.mainloop()
+    root.destroy()
diff --git a/Demo/tix/samples/SHList2.py b/Demo/tix/samples/SHList2.py
index e1a7a7c..db24511 100755
--- a/Demo/tix/samples/SHList2.py
+++ b/Demo/tix/samples/SHList2.py
@@ -1,4 +1,4 @@
-#!/usr/local/bin/python
+# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
 # 
 # $Id$
 #
@@ -43,7 +43,7 @@
 
     # First some styles for the headers
     style={}
-    style['header'] = Tix.DisplayStyle(Tix.TEXT, fg='black', refwindow=top,
+    style['header'] = Tix.DisplayStyle(Tix.TEXT, refwindow=top,
 	anchor=Tix.CENTER, padx=8, pady=2, font = boldfont )
 
     hlist.header_create(0, itemtype=Tix.TEXT, text='Name',
@@ -78,17 +78,13 @@
 	('chuck', 'jeff',       'Chuck McLean',		'Cleaner')
     ]
 
-    style['mgr_name'] = Tix.DisplayStyle(Tix.TEXT, refwindow=top,
-	fg='#202060', selectforeground = '#202060', font = boldfont )
+    style['mgr_name'] = Tix.DisplayStyle(Tix.TEXT, refwindow=top)
 
-    style['mgr_posn'] = Tix.DisplayStyle(Tix.TEXT, padx=8,  refwindow=top,
-	fg='#202060', selectforeground='#202060' )
+    style['mgr_posn'] = Tix.DisplayStyle(Tix.TEXT, padx=8,  refwindow=top)
 
-    style['empl_name'] = Tix.DisplayStyle(Tix.TEXT, refwindow=top,
-	fg='#602020', selectforeground = '#602020', font = boldfont )
+    style['empl_name'] = Tix.DisplayStyle(Tix.TEXT, refwindow=top)
 
-    style['empl_posn'] = Tix.DisplayStyle(Tix.TEXT, padx=8,  refwindow=top,
-	fg='#602020', selectforeground = '#602020' )
+    style['empl_posn'] = Tix.DisplayStyle(Tix.TEXT, padx=8,  refwindow=top)
 
     # Let configure the appearance of the HList subwidget 
     #
@@ -130,10 +126,10 @@
     #
     box= Tix.ButtonBox(top, orientation=Tix.HORIZONTAL )
     box.add( 'ok',  text='Ok', underline=0,  width=6,
-	command = lambda w=w: w.destroy() )
+	command = lambda w=w: w.quit() )
 
     box.add( 'cancel', text='Cancel', underline=0, width=6,
-	command = lambda w=w: w.destroy() )
+	command = lambda w=w: w.quit() )
 
     box.pack( side=Tix.BOTTOM, fill=Tix.X)
     top.pack( side=Tix.TOP,    fill=Tix.BOTH, expand=1 )
@@ -146,3 +142,4 @@
     root=Tix.Tk()
     RunSample(root)
     root.mainloop()
+    root.destroy()
diff --git a/Demo/tix/tixwidgets.py b/Demo/tix/tixwidgets.py
index 556d3b7..177e452 100644
--- a/Demo/tix/tixwidgets.py
+++ b/Demo/tix/tixwidgets.py
@@ -1,128 +1,163 @@
-#! /usr/local/bin/python
+# -*-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 all Tix widgets available from Python. If
 #	you have installed Python & Tix properly, you can execute this as
 #
-#		% tixwidget.py
+#		% python tixwidget.py
 #
 
 import os, sys, Tix
+from Tkconstants import *
+
+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:
-    pass
+    def __init__(self, top):
+        self.root = top
+        self.exit = -1
 
-root = Tix.Tk()
+        self.dir = None				# script directory
+        self.balloon = None			# balloon widget
+        self.useBalloons = 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
 
-demo = Demo()
-demo.dir = None				# script directory
-demo.balloon = None			# balloon widget
-demo.useBalloons = Tix.StringVar()
-demo.useBalloons.set('0')
-demo.statusbar = None			# status bar widget
-demo.welmsg = None			# Msg widget
-demo.welfont = ''			# font name
-demo.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 main():
+    def MkMainMenu(self):
+        top = self.root
+        w = Tix.Frame(top, bd=2, relief=RAISED)
+        file = Tix.Menubutton(w, text='File', underline=0, takefocus=0)
+        help = Tix.Menubutton(w, text='Help', underline=0, takefocus=0)
+        file.pack(side=LEFT)
+        help.pack(side=RIGHT)
+        fm = Tix.Menu(file)
+        file['menu'] = fm
+        hm = Tix.Menu(help)
+        help['menu'] = hm
+
+        if w.tk.eval ('info commands console') == "console":
+            fm.add_command(label='Console', underline=1,
+                           command=lambda w=w: w.tk.eval('console show'))
+
+        fm.add_command(label='Exit', underline=1, accelerator='Ctrl+X',
+                     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'
+        #apply(w.tk.call, ('trace', 'variable', self.useBalloons, 'w',
+        #		      ToggleHelp))
+        return w
+
+    def MkMainNotebook(self):
+        top = self.root
+        w = Tix.NoteBook(top, ipadx=5, ipady=5, options="""
+        *TixNoteBook*tagPadX 6
+        *TixNoteBook*tagPadY 4
+        *TixNoteBook*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 = Tix.Frame(top, relief=Tix.RAISED, bd=1)
+        demo.statusbar = Tix.Label(w, relief=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')
+        z.geometry('790x590+10+10')
+
+        demo.balloon = 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())
+
+    def quitcmd (self):
+        # self.root.destroy()
+        self.exit = 0
+
+    def loop(self):
+        while self.exit < 0:
+            self.root.tk.dooneevent(TCL_ALL_EVENTS)
+        # self.root.tk.dooneevent(TCL_DONT_WAIT)
+
+    def destroy (self):
+        self.root.destroy()
+    
+def RunMain(top):
     global demo, root
 
-    progname = sys.argv[0]
-    dirname = os.path.dirname(progname)
-    if dirname and dirname != os.curdir:
-	demo.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:
-	demo.dir = os.getcwd()
-    sys.path.insert(0, demo.dir+'/samples')
+    demo = Demo(top)
 
-    root.withdraw()
-    root = Tix.Toplevel()
-    root.title('Tix Widget Demonstration')
-    root.geometry('780x570+50+50')
+    # top.withdraw()
+    # root = Tix.Toplevel()
+    root = top
+    demo.build()
+    demo.loop()
+    demo.destroy()
 
-    demo.balloon = Tix.Balloon(root)
-    frame1 = MkMainMenu(root)
-    frame2 = MkMainNotebook(root)
-    frame3 = MkMainStatus(root)
-    frame1.pack(side=Tix.TOP, fill=Tix.X)
-    frame3.pack(side=Tix.BOTTOM, fill=Tix.X)
-    frame2.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=4, pady=4)
-    demo.balloon['statusbar'] = demo.statusbar
-    root.mainloop()
-
-def exit_cmd(event=None):
-    sys.exit()
-
-def MkMainMenu(top):
-    global demo
-
-    w = Tix.Frame(top, bd=2, relief=Tix.RAISED)
-    file = Tix.Menubutton(w, text='File', underline=0, takefocus=0)
-    help = Tix.Menubutton(w, text='Help', underline=0, takefocus=0)
-    file.pack(side=Tix.LEFT)
-    help.pack(side=Tix.RIGHT)
-    fm = Tix.Menu(file)
-    file['menu'] = fm
-    hm = Tix.Menu(help)
-    help['menu'] = hm
-
-    fm.add_command(label='Exit', underline=1, accelerator='Ctrl+X',
-		   command=exit_cmd)
-    hm.add_checkbutton(label='BalloonHelp', underline=0, command=ToggleHelp,
-		       variable=demo.useBalloons)
-    # The trace variable option doesn't seem to work, instead I use 'command'
-    #apply(w.tk.call, ('trace', 'variable', demo.useBalloons, 'w',
-    #		      ToggleHelp))
-    top.bind_all("<Control-x>", exit_cmd)
-    top.bind_all("<Control-X>", exit_cmd)
-    return w
-
-def MkMainNotebook(top):
-    top.option_add('*TixNoteBook*tagPadX', 6)
-    top.option_add('*TixNoteBook*tagPadY', 4)
-    top.option_add('*TixNoteBook*borderWidth', 2)
-    top.option_add('*TixNoteBook*font',
-		   '-*-helvetica-bold-o-normal-*-14-*-*-*-*-*-*-*')
-    w = Tix.NoteBook(top, ipadx=5, ipady=5)
-    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(top):
-    global demo
-
-    w = Tix.Frame(top, relief=Tix.RAISED, bd=1)
-    demo.statusbar = Tix.Label(w, relief=Tix.SUNKEN, bd=1, font='-*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*')
-    demo.statusbar.form(padx=3, pady=3, left=0, right='%70')
-    return w
-
+# Tabs
 def MkWelcome(nb, name):
     w = nb.page(name)
     bar = MkWelcomeBar(w)
     text = MkWelcomeText(w)
-    bar.pack(side=Tix.TOP, fill=Tix.X, padx=2, pady=2)
-    text.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)
+    bar.pack(side=TOP, fill=X, padx=2, pady=2)
+    text.pack(side=TOP, fill=BOTH, expand=1)
 
 def MkWelcomeBar(top):
     global demo
@@ -167,9 +202,9 @@
     w = Tix.ScrolledWindow(top, scrollbar='auto')
     win = w.window
     text = 'Welcome to TIX in Python'
-    title = Tix.Label(win, font='-*-times-bold-r-normal-*-18-*-*-*-*-*-*-*',
+    title = Tix.Label(win,
 		      bd=0, width=30, anchor=Tix.N, text=text)
-    msg = Tix.Message(win, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(win,
 		      bd=0, width=400, anchor=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 \
@@ -190,7 +225,7 @@
     point = demo.welsize['value']
     if font == 'Times Roman':
 	font = 'times'
-    fontstr = '-*-%s-bold-r-normal-*-%s-*-*-*-*-*-*-*' % (font, point)
+    fontstr = '%s %s' % (font, point)
     demo.welmsg['font'] = fontstr
 
 def ToggleHelp():
@@ -360,7 +395,7 @@
     m.pack(fill=Tix.X, padx=5, pady=3)
 
 def MkFileEnt(w):
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=Tix.N,
 		      text='Press the "open file" icon button and a TixFileSelectDialog will popup.')
     ent = Tix.FileEntry(w, label='Select a file : ')
@@ -368,7 +403,7 @@
     ent.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
 
 def MkFileBox(w):
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=Tix.N,
 		      text='The TixFileSelectBox 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 = Tix.FileSelectBox(w)
@@ -381,7 +416,7 @@
     prefix = Tix.OptionName(w)
     if not prefix: prefix = ''
     w.option_add('*' + prefix + '*TixSelect*frame.borderWidth', 1)
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=Tix.N,
 		      text='The Select widget is also good for arranging buttons in a tool bar.')
     bar = Tix.Frame(w, bd=2, relief=Tix.RAISED)
@@ -407,7 +442,7 @@
     prefix = Tix.OptionName(w)
     if not prefix: prefix = ''
     w.option_add('*' + prefix + '*TixSelect*frame.borderWidth', 1)
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=Tix.N,
 		      text='There are many types of "chooser" widgets that allow the user to input different types of information')
     msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
@@ -434,7 +469,7 @@
 def MkSList(w):
     top = Tix.Frame(w, width=300, height=330)
     bot = Tix.Frame(w)
-    msg = Tix.Message(top, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(top, 
 		      relief=Tix.FLAT, width=200, anchor=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.')
 
@@ -470,7 +505,7 @@
 
     top = Tix.Frame(w, width=330, height=330)
     bot = Tix.Frame(w)
-    msg = Tix.Message(top, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(top, 
 		      relief=Tix.FLAT, width=200, anchor=Tix.N,
 		      text='The TixScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.')
     win = Tix.ScrolledWindow(top, scrollbar='auto')
@@ -500,7 +535,7 @@
 def MkSText(w):
     top = Tix.Frame(w, width=330, height=330)
     bot = Tix.Frame(w)
-    msg = Tix.Message(top, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(top, 
 		      relief=Tix.FLAT, width=200, anchor=Tix.N,
 		      text='The TixScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.')
 
@@ -543,7 +578,7 @@
     note.form(top=0, right=-1, bottom=-1)
 
 def MkPanedWindow(w):
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=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 = Tix.Label(w, text='Newsgroup: comp.lang.python')
@@ -585,7 +620,7 @@
     pane.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH, expand=1)
 
 def MkNoteBook(w):
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=Tix.N,
 		      text='The NoteBook widget allows you to layout a complex interface into individual pages.')
     prefix = Tix.OptionName(w)
@@ -654,7 +689,7 @@
     fsbox.form(top=0, left='%40', right=-1, bottom=-1)
 
 def MkDirListWidget(w):
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=Tix.N,
 		      text='The TixDirList widget gives a graphical representation of the file system directory and makes it easy for the user to choose and access directories.')
     dirlist = Tix.DirList(w, options='hlist.padY 1 hlist.width 25 hlist.height 16')
@@ -662,7 +697,7 @@
     dirlist.pack(side=Tix.TOP, padx=3, pady=3)
 
 def MkExFileWidget(w):
-    msg = Tix.Message(w, font='-*-helvetica-bold-r-normal-*-14-*-*-*-*-*-*-*',
+    msg = Tix.Message(w, 
 		      relief=Tix.FLAT, width=240, anchor=Tix.N,
 		      text='The TixExFileSelectBox widget is more user friendly than the Motif style FileSelectBox.')
     # There's a bug in the ComboBoxes - the scrolledlistbox is destroyed
@@ -677,6 +712,8 @@
 	   'Button Box'		: 'BtnBox',
 	   'Combo Box'		: 'ComboBox',
 	   'Compound Image'	: 'CmpImg',
+	   'Directory List'	: 'DirList',
+	   'Directory Tree'	: 'DirTree',
 	   'Control'		: 'Control',
 	   'Notebook'		: 'NoteBook',
 	   'Option Menu'	: 'OptMenu',
@@ -686,8 +723,100 @@
 	   '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 {
+##	    {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 {
+##na	    {f ListNoteBook		ListNBK.tcl	}
+##	    {f NoteBook			NoteBook.tcl	}
+##	    {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	}
+##na	    {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',
 		    'ScrolledHList (1)', 'ScrolledHList (2)', 'Tree (dynamic)']
 stypes['image'] = ['Compound Image']
@@ -707,7 +836,9 @@
     slb.hlist['browsecmd'] = lambda args=0, w=w,slb=slb: Sample_Action(w, slb, 'browse')
 
     stext = Tix.ScrolledText(w, name='stext')
-    stext.text.bind('<1>', stext.text.focus())
+    font = root.tk.eval('tix option get fixed_font')
+    stext.text.config(font=font)
+    # stext.text.bind('<1>', stext.text.focus())
     stext.text.bind('<Up>', lambda w=stext.text: w.yview(scroll='-1 unit'))
     stext.text.bind('<Down>', lambda w=stext.text: w.yview(scroll='1 unit'))
     stext.text.bind('<Left>', lambda w=stext.text: w.xview(scroll='-1 unit'))
@@ -726,7 +857,6 @@
     stext.text['bg'] = slb.hlist['bg']
     stext.text['state'] = 'disabled'
     stext.text['wrap'] = 'none'
-    #XXX    stext.text['font'] = fixed_font
 
     slb.hlist['separator'] = '.'
     slb.hlist['width'] = 25
@@ -785,6 +915,7 @@
 	ReadFile(stext.text, demo.dir + '/samples/' + prog + '.py')
 
 def LoadFile(w, fname):
+    global root
     b = Tix.Button(w, text='Close', command=w.destroy)
     t = Tix.ScrolledText(w)
     #    b.form(left=0, bottom=0, padx=4, pady=4)
@@ -792,9 +923,9 @@
     t.pack()
     b.pack()
 
-    t.text['highlightcolor'] = t['bg']
+    font = root.tk.eval('tix option get fixed_font')
+    t.text.config(font=font)
     t.text['bd'] = 2
-    t.text['bg'] = t['bg']
     t.text['wrap'] = 'none'
 
     ReadFile(t.text, fname)
@@ -815,5 +946,6 @@
 	w['state'] = old_state
 
 if __name__ == '__main__':
-    main()
+    root = Tix.Tk()
+    RunMain(root)
 
