]> granicus.if.org Git - python/commitdiff
Patch #473002: Update Demo/tix tixwidgets.py et al.
authorMartin v. Löwis <martin@v.loewis.de>
Sun, 11 Nov 2001 14:07:37 +0000 (14:07 +0000)
committerMartin v. Löwis <martin@v.loewis.de>
Sun, 11 Nov 2001 14:07:37 +0000 (14:07 +0000)
Demo/tix/INSTALL.txt
Demo/tix/README.txt
Demo/tix/samples/DirList.py [new file with mode: 0755]
Demo/tix/samples/DirTree.py [new file with mode: 0755]
Demo/tix/samples/SHList1.py
Demo/tix/samples/SHList2.py
Demo/tix/tixwidgets.py

index 9dc3093c50f084d4441e5d0f31b19d57ba2be8be..ac70b68c800339e71c74d6e44912f2a68c42db0d 100644 (file)
@@ -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 @@ _tkinter _tkinter.c tkappinit.c -DWITH_APPINIT \
 # *** 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 @@ 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.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
 
index 15e85cd265db1d41692deaf9ac07b5edbafd2f1a..e0196ac3c7ca5ecaed76809b57a77b159959341c 100644 (file)
@@ -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 (executable)
index 0000000..3064768
--- /dev/null
@@ -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 (executable)
index 0000000..7bf813c
--- /dev/null
@@ -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()
+
index 5122bbcdda6116a2010cb9ffa13bc6848ffde799..f4294ee68483178acfe2b93232a0278b2af1965f 100755 (executable)
@@ -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 @@ def RunSample (w) :
     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 @@ def RunSample (w) :
     #
     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 @@ if __name__== '__main__' :
     root=Tix.Tk()
     RunSample(root)
     root.mainloop()
+    root.destroy()
index e1a7a7c21bdf81d8a965a5d738ce660bcf2c7027..db245112b7b65760d0ee68c54833da3d9a3f299f 100755 (executable)
@@ -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 @@ def RunSample (w) :
 
     # 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 @@ def RunSample (w) :
        ('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 @@ def RunSample (w) :
     #
     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 @@ if __name__== '__main__' :
     root=Tix.Tk()
     RunSample(root)
     root.mainloop()
+    root.destroy()
index 556d3b7797b1524904cf18f1498f7c9992e2b5c7..177e452c5c2544a7477a310f46944575c65c781d 100644 (file)
-#! /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 *
 
-class Demo:
-    pass
-
-root = Tix.Tk()
-
-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
+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 main():
+class Demo:
+    def __init__(self, top):
+        self.root = top
+        self.exit = -1
+
+        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
+
+        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 = 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')
-
-    root.withdraw()
-    root = Tix.Toplevel()
-    root.title('Tix Widget Demonstration')
-    root.geometry('780x570+50+50')
-
-    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
+    demo = Demo(top)
 
-    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
+    # top.withdraw()
+    # root = Tix.Toplevel()
+    root = top
+    demo.build()
+    demo.loop()
+    demo.destroy()
 
+# 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 @@ def MkWelcomeText(top):
     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 @@ def MainTextFont(w):
     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 @@ def MkOptMenu(w):
     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 @@ def MkFileEnt(w):
     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 @@ def MkToolBar(w):
     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 @@ def MkTitle(w):
     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 MkScroll(nb, name):
 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 @@ def MkSWindow(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.')
     win = Tix.ScrolledWindow(top, scrollbar='auto')
@@ -500,7 +535,7 @@ def SWindow_reset(rh, win):
 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 @@ def MkManager(nb, name):
     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 @@ together with a bitmap, at the same time, inside a TK button widget.
     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 @@ def MkDirList(nb, name):
     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 @@ def MkDirListWidget(w):
     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 @@ 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',
@@ -686,8 +723,100 @@ samples = {'Balloon'              : 'Balloon',
           '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 @@ def MkSample(nb, name):
     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 @@ def MkSample(nb, name):
     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 @@ def Sample_Action(w, slb, action):
        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 @@ def LoadFile(w, fname):
     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 @@ def ReadFile(w, fname):
        w['state'] = old_state
 
 if __name__ == '__main__':
-    main()
+    root = Tix.Tk()
+    RunMain(root)