symbian-qemu-0.9.1-12/python-2.6.1/Demo/tix/tixwidgets.py
changeset 1 2fb8b9db1c86
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/symbian-qemu-0.9.1-12/python-2.6.1/Demo/tix/tixwidgets.py	Fri Jul 31 15:01:17 2009 +0100
@@ -0,0 +1,1003 @@
+# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
+#
+# $Id: tixwidgets.py 36560 2004-07-18 06:16:08Z tim_one $
+#
+# 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, Tix
+from Tkconstants import *
+import traceback, tkMessageBox
+
+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 = 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, tearoff=0)
+        file['menu'] = fm
+        hm = 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'
+        #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="""
+        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 = 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')
+        if z.winfo_screenwidth() <= 800:
+            z.geometry('790x590+10+10')
+        else:
+            z.geometry('890x640+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())
+
+        # 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 tkMessageBox.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: tkMessageBox.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 = Tix.Frame(top, bd=2, relief=Tix.GROOVE)
+    b1 = Tix.ComboBox(w, command=lambda w=top: MainTextFont(w))
+    b2 = 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(Tix.END, 'Courier')
+    b1.insert(Tix.END, 'Helvetica')
+    b1.insert(Tix.END, 'Lucida')
+    b1.insert(Tix.END, 'Times Roman')
+
+    b2.insert(Tix.END, '8')
+    b2.insert(Tix.END, '10')
+    b2.insert(Tix.END, '12')
+    b2.insert(Tix.END, '14')
+    b2.insert(Tix.END, '18')
+
+    b1.pick(1)
+    b2.pick(3)
+
+    b1.pack(side=Tix.LEFT, padx=4, pady=4)
+    b2.pack(side=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 = Tix.ScrolledWindow(top, scrollbar='auto')
+    win = w.window
+    text = 'Welcome to TIX in Python'
+    title = Tix.Label(win,
+                      bd=0, width=30, anchor=Tix.N, text=text)
+    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 \
+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=Tix.BOTH, padx=10, pady=10)
+    msg.pack(expand=1, fill=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 = Tix.LabelFrame(w, label='Chooser Widgets', options=options)
+    cbx = Tix.LabelFrame(w, label='tixComboBox', options=options)
+    ctl = Tix.LabelFrame(w, label='tixControl', options=options)
+    sel = Tix.LabelFrame(w, label='tixSelect', options=options)
+    opt = Tix.LabelFrame(w, label='tixOptionMenu', options=options)
+    fil = Tix.LabelFrame(w, label='tixFileEntry', options=options)
+    fbx = Tix.LabelFrame(w, label='tixFileSelectBox', options=options)
+    tbr = 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, Tix.E, 14)
+
+    static = Tix.ComboBox(w, label='Static', editable=0, options=options)
+    editable = Tix.ComboBox(w, label='Editable', editable=1, options=options)
+    history = Tix.ComboBox(w, label='History', editable=1, history=1,
+                           anchor=Tix.E, options=options)
+    static.insert(Tix.END, 'January')
+    static.insert(Tix.END, 'February')
+    static.insert(Tix.END, 'March')
+    static.insert(Tix.END, 'April')
+    static.insert(Tix.END, 'May')
+    static.insert(Tix.END, 'June')
+    static.insert(Tix.END, 'July')
+    static.insert(Tix.END, 'August')
+    static.insert(Tix.END, 'September')
+    static.insert(Tix.END, 'October')
+    static.insert(Tix.END, 'November')
+    static.insert(Tix.END, 'December')
+
+    editable.insert(Tix.END, 'Angola')
+    editable.insert(Tix.END, 'Bangladesh')
+    editable.insert(Tix.END, 'China')
+    editable.insert(Tix.END, 'Denmark')
+    editable.insert(Tix.END, 'Ecuador')
+
+    history.insert(Tix.END, '/usr/bin/ksh')
+    history.insert(Tix.END, '/usr/local/lib/python')
+    history.insert(Tix.END, '/var/adm')
+
+    static.pack(side=Tix.TOP, padx=5, pady=3)
+    editable.pack(side=Tix.TOP, padx=5, pady=3)
+    history.pack(side=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, Tix.E, 13)
+
+    demo_spintxt = Tix.StringVar()
+    demo_spintxt.set(states[0])
+    simple = Tix.Control(w, label='Numbers', options=options)
+    spintxt = 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=Tix.TOP, padx=5, pady=3)
+    spintxt.pack(side=Tix.TOP, padx=5, pady=3)
+
+def MkSelect(w):
+    options = "label.anchor %s" % Tix.CENTER
+
+    sel1 = Tix.Select(w, label='Mere Mortals', allowzero=1, radio=1,
+                      orientation=Tix.VERTICAL,
+                      labelside=Tix.TOP,
+                      options=options)
+    sel2 = Tix.Select(w, label='Geeks', allowzero=1, radio=0,
+                      orientation=Tix.VERTICAL,
+                      labelside= 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=Tix.LEFT, padx=5, pady=3, fill=Tix.X)
+    sel2.pack(side=Tix.LEFT, padx=5, pady=3, fill=Tix.X)
+
+def MkOptMenu(w):
+    options='menubutton.width 15 label.anchor %s' % Tix.E
+
+    m = 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=Tix.X, padx=5, pady=3)
+
+def MkFileEnt(w):
+    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 : ')
+    msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
+    ent.pack(side=Tix.TOP, fill=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 = Tix.Message(w,
+                      relief=Tix.FLAT, width=240, anchor=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 = Tix.FileSelectBox(w)
+    msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
+    box.pack(side=Tix.TOP, fill=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 = 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)
+    font = Tix.Select(w, allowzero=1, radio=0, label='', options=options)
+    para = 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=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
+    bar.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
+    font.pack({'in':bar}, side=Tix.LEFT, padx=3, pady=3)
+    para.pack({'in':bar}, side=Tix.LEFT, padx=3, pady=3)
+
+def MkTitle(w):
+    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)
+
+def MkScroll(nb, name):
+    w = nb.page(name)
+    options='label.padX 4'
+
+    sls = Tix.LabelFrame(w, label='Tix.ScrolledListBox', options=options)
+    swn = Tix.LabelFrame(w, label='Tix.ScrolledWindow', options=options)
+    stx = 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 = Tix.Frame(w, width=300, height=330)
+    bot = Tix.Frame(w)
+    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.')
+
+    list = Tix.ScrolledListBox(top, scrollbar='auto')
+    list.place(x=50, y=150, width=120, height=80)
+    list.listbox.insert(Tix.END, 'Alabama')
+    list.listbox.insert(Tix.END, 'California')
+    list.listbox.insert(Tix.END, 'Montana')
+    list.listbox.insert(Tix.END, 'New Jersey')
+    list.listbox.insert(Tix.END, 'New York')
+    list.listbox.insert(Tix.END, 'Pennsylvania')
+    list.listbox.insert(Tix.END, 'Washington')
+
+    rh = Tix.ResizeHandle(top, bg='black',
+                          relief=Tix.RAISED,
+                          handlesize=8, gridded=1, minwidth=50, minheight=30)
+    btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=list: SList_reset(w,x))
+    top.propagate(0)
+    msg.pack(fill=Tix.X)
+    btn.pack(anchor=Tix.CENTER)
+    top.pack(expand=1, fill=Tix.BOTH)
+    bot.pack(fill=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 = Tix.Frame(w, width=330, height=330)
+    bot = Tix.Frame(w)
+    msg = Tix.Message(top,
+                      relief=Tix.FLAT, width=200, anchor=Tix.N,
+                      text=text)
+
+    win = Tix.ScrolledWindow(top, scrollbar='auto')
+
+    image1 = win.window.image_create('photo', file=file)
+    lbl = Tix.Label(win.window, image=image1)
+    lbl.pack(expand=1, fill=Tix.BOTH)
+
+    win.place(x=30, y=150, width=190, height=120)
+
+    rh = Tix.ResizeHandle(top, bg='black',
+                          relief=Tix.RAISED,
+                          handlesize=8, gridded=1, minwidth=50, minheight=30)
+    btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SWindow_reset(w,x))
+    top.propagate(0)
+    msg.pack(fill=Tix.X)
+    btn.pack(anchor=Tix.CENTER)
+    top.pack(expand=1, fill=Tix.BOTH)
+    bot.pack(fill=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 = Tix.Frame(w, width=330, height=330)
+    bot = Tix.Frame(w)
+    msg = Tix.Message(top,
+                      relief=Tix.FLAT, width=200, anchor=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 = Tix.ScrolledText(top, scrollbar='auto')
+    win.text['wrap'] = 'none'
+    win.text.insert(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 = Tix.ResizeHandle(top, bg='black',
+                          relief=Tix.RAISED,
+                          handlesize=8, gridded=1, minwidth=50, minheight=30)
+    btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SText_reset(w,x))
+    top.propagate(0)
+    msg.pack(fill=Tix.X)
+    btn.pack(anchor=Tix.CENTER)
+    top.pack(expand=1, fill=Tix.BOTH)
+    bot.pack(fill=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 = Tix.LabelFrame(w, label='Tix.PanedWindow', options=options)
+    note = 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 = 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.LabelEntry(w, label='Newsgroup:', options='entry.width 25')
+    group.entry.insert(0,'comp.lang.python')
+    pane = Tix.PanedWindow(w, orientation='vertical')
+
+    p1 = pane.add('list', min=70, size=100)
+    p2 = pane.add('text', min=70)
+    list = Tix.ScrolledListBox(p1)
+    text = Tix.ScrolledText(p2)
+
+    list.listbox.insert(Tix.END, "  12324 Re: Tkinter is good for your health")
+    list.listbox.insert(Tix.END, "+ 12325 Re: Tkinter is good for your health")
+    list.listbox.insert(Tix.END, "+ 12326 Re: Tix is even better for your health (Was: Tkinter is good...)")
+    list.listbox.insert(Tix.END, "  12327 Re: Tix is even better for your health (Was: Tkinter is good...)")
+    list.listbox.insert(Tix.END, "+ 12328 Re: Tix is even better for your health (Was: Tkinter is good...)")
+    list.listbox.insert(Tix.END, "  12329 Re: Tix is even better for your health (Was: Tkinter is good...)")
+    list.listbox.insert(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(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=Tix.BOTH, padx=4, pady=6)
+    text.pack(expand=1, fill=Tix.BOTH, padx=4, pady=6)
+
+    msg.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
+    group.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
+    pane.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH, expand=1)
+
+def MkNoteBook(w):
+    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)
+    # if not prefix: prefix = ''
+    # w.option_add('*' + prefix + '*TixNoteBook*tagPadX', 8)
+    options = "entry.width %d label.width %d label.anchor %s" % (10, 18, Tix.E)
+
+    nb = 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 = Tix.Frame(nb.hard_disk)
+    common.pack(side=Tix.RIGHT, padx=2, pady=2, fill=Tix.Y)
+    CreateCommonButtons(common)
+
+    # Widgets belonging only to this page
+    a = Tix.Control(nb.hard_disk, value=12, label='Access Time: ')
+    w = Tix.Control(nb.hard_disk, value=400, label='Write Throughput: ')
+    r = Tix.Control(nb.hard_disk, value=400, label='Read Throughput: ')
+    c = Tix.Control(nb.hard_disk, value=1021, label='Capacity: ')
+    a.pack(side=Tix.TOP, padx=20, pady=2)
+    w.pack(side=Tix.TOP, padx=20, pady=2)
+    r.pack(side=Tix.TOP, padx=20, pady=2)
+    c.pack(side=Tix.TOP, padx=20, pady=2)
+
+    common = Tix.Frame(nb.network)
+    common.pack(side=Tix.RIGHT, padx=2, pady=2, fill=Tix.Y)
+    CreateCommonButtons(common)
+
+    a = Tix.Control(nb.network, value=12, label='Access Time: ')
+    w = Tix.Control(nb.network, value=400, label='Write Throughput: ')
+    r = Tix.Control(nb.network, value=400, label='Read Throughput: ')
+    c = Tix.Control(nb.network, value=1021, label='Capacity: ')
+    u = Tix.Control(nb.network, value=10, label='Users: ')
+    a.pack(side=Tix.TOP, padx=20, pady=2)
+    w.pack(side=Tix.TOP, padx=20, pady=2)
+    r.pack(side=Tix.TOP, padx=20, pady=2)
+    c.pack(side=Tix.TOP, padx=20, pady=2)
+    u.pack(side=Tix.TOP, padx=20, pady=2)
+
+    msg.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
+    nb.pack(side=Tix.TOP, padx=5, pady=5, fill=Tix.BOTH, expand=1)
+
+def CreateCommonButtons(f):
+    ok = Tix.Button(f, text='OK', width = 6)
+    cancel = Tix.Button(f, text='Cancel', width = 6)
+    ok.pack(side=Tix.TOP, padx=2, pady=2)
+    cancel.pack(side=Tix.TOP, padx=2, pady=2)
+
+def MkDirList(nb, name):
+    w = nb.page(name)
+    options = "label.padX 4"
+
+    dir = Tix.LabelFrame(w, label='Tix.DirList', options=options)
+    fsbox = 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 = Tix.Message(w,
+                      relief=Tix.FLAT, width=240, anchor=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 = Tix.DirList(w, options='hlist.padY 1 hlist.width 25 hlist.height 16')
+    msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
+    dirlist.pack(side=Tix.TOP, padx=3, pady=3)
+
+def MkExFileWidget(w):
+    """The TixExFileSelectBox widget is more user friendly than the Motif
+    style FileSelectBox.  """
+    msg = Tix.Message(w,
+                      relief=Tix.FLAT, width=240, anchor=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 = Tix.ExFileSelectBox(w, bd=2, relief=Tix.RAISED)
+    msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
+    box.pack(side=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 = Tix.PanedWindow(w, orientation='horizontal')
+    pane.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH)
+    f1 = pane.add('list', expand='1')
+    f2 = pane.add('text', expand='5')
+    f1['relief'] = 'flat'
+    f2['relief'] = 'flat'
+
+    lab = Tix.LabelFrame(f1, label='Select a sample program:')
+    lab.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5, pady=5)
+    lab1 = Tix.LabelFrame(f2, label='Source:')
+    lab1.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5, pady=5)
+
+    slb = Tix.Tree(lab.frame, options='hlist.width 20')
+    slb.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5)
+
+    stext = Tix.ScrolledText(lab1.frame, name='stext')
+    font = root.tk.eval('tix option get fixed_font')
+    stext.text.config(font=font)
+
+    frame = Tix.Frame(lab1.frame, name='frame')
+
+    run = Tix.Button(frame, text='Run ...', name='run')
+    view = Tix.Button(frame, text='View Source ...', name='view')
+    run.pack(side=Tix.LEFT, expand=0, fill=Tix.NONE)
+    view.pack(side=Tix.LEFT, expand=0, fill=Tix.NONE)
+
+    stext.text['bg'] = slb.hlist['bg']
+    stext.text['state'] = 'disabled'
+    stext.text['wrap'] = 'none'
+    stext.text['width'] = 80
+
+    frame.pack(side=Tix.BOTTOM, expand=0, fill=Tix.X, padx=7)
+    stext.pack(side=Tix.TOP, expand=0, fill=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 = Tix.Frame(slb.hlist, bd=2, height=2, width=150,
+                          relief=Tix.SUNKEN, bg=slb.hlist['bg'])
+            slb.hlist.add_child(itemtype=Tix.WINDOW, window=x, state='disabled')
+        x = slb.hlist.add_child(itemtype=Tix.TEXT, state='disabled',
+                                text=comments[type])
+        for key in stypes[type]:
+            slb.hlist.add_child(x, itemtype=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 = Tix.Toplevel()
+        w.title(title)
+        rtn = eval(prog + '.RunSample')
+        rtn(w)
+    elif action == 'view':
+        w = 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 = Tix.Button(w, text='Close', command=w.destroy)
+    t = 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', Tix.END)
+
+    try:
+        f = open(fname)
+        lines = f.readlines()
+        for s in lines:
+            w.insert(Tix.END, s)
+        f.close()
+    finally:
+#       w.see('1.0')
+        w['state'] = old_state
+
+if __name__ == '__main__':
+    root = Tix.Tk()
+    RunMain(root)