[Python-checkins] CVS: python/dist/src/Demo/tix/samples Balloon.py,NONE,1.1 BtnBox.py,NONE,1.1 CmpImg.py,NONE,1.1 ComboBox.py,NONE,1.1 Control.py,NONE,1.1 NoteBook.py,NONE,1.1 OptMenu.py,NONE,1.1 PopMenu.py,NONE,1.1 SHList1.py,NONE,1.1 SHList2.py,NONE,1.1 Tree.py,NONE,1.1

Martin v. L?wis loewis@users.sourceforge.net
Tue, 20 Mar 2001 23:42:09 -0800


Update of /cvsroot/python/python/dist/src/Demo/tix/samples
In directory usw-pr-cvs1:/tmp/cvs-serv20033/Demo/tix/samples

Added Files:
	Balloon.py BtnBox.py CmpImg.py ComboBox.py Control.py 
	NoteBook.py OptMenu.py PopMenu.py SHList1.py SHList2.py 
	Tree.py 
Log Message:
Patch #410231: Add the Python Tix library.


--- NEW FILE: Balloon.py ---
#!/usr/local/bin/python
# 
# $Id: Balloon.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates the use of the tixBalloon widget, which provides
# a interesting way to give help tips about elements in your user interface.
# Your can display the help message in a "balloon" and a status bar widget.
#

import Tix

def RunSample(w):
    status = Tix.Label(w, width=40, relief=Tix.SUNKEN, bd=1)
    status.pack(side=Tix.BOTTOM, fill=Tix.Y, padx=2, pady=1)

    # Create two mysterious widgets that need balloon help
    button1 = Tix.Button(w, text='Something Unexpected',
			 command=lambda w=w: w.destroy())
    button2 = Tix.Button(w, text='Something Else Unexpected')
    button2['command'] = lambda w=button2: w.destroy()
    button1.pack(side=Tix.TOP, expand=1)
    button2.pack(side=Tix.TOP, expand=1)

    # Create the balloon widget and associate it with the widgets that we want
    # to provide tips for:
    b = Tix.Balloon(w, statusbar=status)

    b.bind_widget(button1, balloonmsg='Close Window',
		  statusmsg='Press this button to close this window')
    b.bind_widget(button2, balloonmsg='Self-destruct button',
		  statusmsg='Press this button and it will destroy itself')

if __name__ == '__main__':
    root = Tix.Tk()

    RunSample(root)
    root.mainloop()

--- NEW FILE: BtnBox.py ---
#!/usr/local/bin/python
# 
# $Id: BtnBox.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates the use of the tixButtonBox widget, which is a
# group of TK buttons. You can use it to manage the buttons in a dialog box,
# for example.
#

import Tix

def RunSample(w):
    # Create the label on the top of the dialog box
    #
    top = Tix.Label(w, padx=20, pady=10, bd=1, relief=Tix.RAISED,
		    anchor=Tix.CENTER, text='This dialog box is\n a demonstration of the\n tixButtonBox widget')

    # Create the button box and add a few buttons in it. Set the
    # -width of all the buttons to the same value so that they
    # appear in the same size.
    #
    # Note that the -text, -underline, -command and -width options are all
    # standard options of the button widgets.
    #
    box = Tix.ButtonBox(w, orientation=Tix.HORIZONTAL)
    box.add('ok', text='OK', underline=0, width=5,
	    command=lambda w=w: w.destroy())
    box.add('close', text='Cancel', underline=0, width=5,
	    command=lambda w=w: w.destroy())
    box.pack(side=Tix.BOTTOM, fill=Tix.X)
    top.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()

--- NEW FILE: CmpImg.py ---
#!/usr/local/bin/python
# 
# $Id: CmpImg.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates the use of the compound images: it uses compound
# images to display a text string together with a pixmap inside
# buttons
#

import Tix

network_pixmap = """/* XPM */
static char * netw_xpm[] = {
/* width height ncolors chars_per_pixel */
"32 32 7 1",
/* colors */
" 	s None	c None",
".	c #000000000000",
"X	c white",
"o	c #c000c000c000",
"O	c #404040",
"+	c blue",
"@	c red",
/* pixels */
"                                ",
"                 .............. ",
"                 .XXXXXXXXXXXX. ",
"                 .XooooooooooO. ",
"                 .Xo.......XoO. ",
"                 .Xo.++++o+XoO. ",
"                 .Xo.++++o+XoO. ",
"                 .Xo.++oo++XoO. ",
"                 .Xo.++++++XoO. ",
"                 .Xo.+o++++XoO. ",
"                 .Xo.++++++XoO. ",
"                 .Xo.XXXXXXXoO. ",
"                 .XooooooooooO. ",
"                 .Xo@ooo....oO. ",
" ..............  .XooooooooooO. ",
" .XXXXXXXXXXXX.  .XooooooooooO. ",
" .XooooooooooO.  .OOOOOOOOOOOO. ",
" .Xo.......XoO.  .............. ",
" .Xo.++++o+XoO.        @        ",
" .Xo.++++o+XoO.        @        ",
" .Xo.++oo++XoO.        @        ",
" .Xo.++++++XoO.        @        ",
" .Xo.+o++++XoO.        @        ",
" .Xo.++++++XoO.      .....      ",
" .Xo.XXXXXXXoO.      .XXX.      ",
" .XooooooooooO.@@@@@@.X O.      ",
" .Xo@ooo....oO.      .OOO.      ",
" .XooooooooooO.      .....      ",
" .XooooooooooO.                 ",
" .OOOOOOOOOOOO.                 ",
" ..............                 ",
"                                "};
"""

hard_disk_pixmap = """/* XPM */
static char * drivea_xpm[] = {
/* width height ncolors chars_per_pixel */
"32 32 5 1",
/* colors */
" 	s None	c None",
".	c #000000000000",
"X	c white",
"o	c #c000c000c000",
"O	c #800080008000",
/* pixels */
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"   ..........................   ",
"   .XXXXXXXXXXXXXXXXXXXXXXXo.   ",
"   .XooooooooooooooooooooooO.   ",
"   .Xooooooooooooooooo..oooO.   ",
"   .Xooooooooooooooooo..oooO.   ",
"   .XooooooooooooooooooooooO.   ",
"   .Xoooooooo.......oooooooO.   ",
"   .Xoo...................oO.   ",
"   .Xoooooooo.......oooooooO.   ",
"   .XooooooooooooooooooooooO.   ",
"   .XooooooooooooooooooooooO.   ",
"   .XooooooooooooooooooooooO.   ",
"   .XooooooooooooooooooooooO.   ",
"   .oOOOOOOOOOOOOOOOOOOOOOOO.   ",
"   ..........................   ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                ",
"                                "};
"""

network_bitmap = """
#define netw_width 32
#define netw_height 32
static unsigned char netw_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00, 0x02, 0x40,
   0x00, 0x00, 0xfa, 0x5f, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x52,
   0x00, 0x00, 0x0a, 0x52, 0x00, 0x00, 0x8a, 0x51, 0x00, 0x00, 0x0a, 0x50,
   0x00, 0x00, 0x4a, 0x50, 0x00, 0x00, 0x0a, 0x50, 0x00, 0x00, 0x0a, 0x50,
   0x00, 0x00, 0xfa, 0x5f, 0x00, 0x00, 0x02, 0x40, 0xfe, 0x7f, 0x52, 0x55,
   0x02, 0x40, 0xaa, 0x6a, 0xfa, 0x5f, 0xfe, 0x7f, 0x0a, 0x50, 0xfe, 0x7f,
   0x0a, 0x52, 0x80, 0x00, 0x0a, 0x52, 0x80, 0x00, 0x8a, 0x51, 0x80, 0x00,
   0x0a, 0x50, 0x80, 0x00, 0x4a, 0x50, 0x80, 0x00, 0x0a, 0x50, 0xe0, 0x03,
   0x0a, 0x50, 0x20, 0x02, 0xfa, 0xdf, 0x3f, 0x03, 0x02, 0x40, 0xa0, 0x02,
   0x52, 0x55, 0xe0, 0x03, 0xaa, 0x6a, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00,
   0xfe, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
"""

hard_disk_bitmap = """
#define drivea_width 32
#define drivea_height 32
static unsigned char drivea_bits[] = {
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0xf8, 0xff, 0xff, 0x1f, 0x08, 0x00, 0x00, 0x18, 0xa8, 0xaa, 0xaa, 0x1a,
   0x48, 0x55, 0xd5, 0x1d, 0xa8, 0xaa, 0xaa, 0x1b, 0x48, 0x55, 0x55, 0x1d,
   0xa8, 0xfa, 0xaf, 0x1a, 0xc8, 0xff, 0xff, 0x1d, 0xa8, 0xfa, 0xaf, 0x1a,
   0x48, 0x55, 0x55, 0x1d, 0xa8, 0xaa, 0xaa, 0x1a, 0x48, 0x55, 0x55, 0x1d,
   0xa8, 0xaa, 0xaa, 0x1a, 0xf8, 0xff, 0xff, 0x1f, 0xf8, 0xff, 0xff, 0x1f,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
"""

def RunSample(w):
    w.img0 = Tix.Image('pixmap', data=network_pixmap)
    if not w.img0:
	w.img0 = Tix.Image('bitmap', data=network_bitmap)
    w.img1 = Tix.Image('pixmap', data=hard_disk_pixmap)
    if not w.img0:
	w.img1 = Tix.Image('bitmap', data=hard_disk_bitmap)

    hdd = Tix.Button(w, padx=4, pady=1, width=120)
    net = Tix.Button(w, padx=4, pady=1, width=120)

    # Create the first image: we create a line, then put a string,
    # a space and a image into this line, from left to right.
    # The result: we have a one-line image that consists of three
    # individual items
    #
    # The tk.calls should be methods in Tix ...
    w.hdd_img = Tix.Image('compound', window=hdd)
    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'line')
    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'text', '-text', 'Hard Disk',
		    '-underline', '0')
    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'space', '-width', '7')
    w.hdd_img.tk.call(str(w.hdd_img), 'add', 'image', '-image', w.img1)

    # Put this image into the first button
    #
    hdd['image'] = w.hdd_img

    # Next button
    w.net_img = Tix.Image('compound', window=net)
    w.net_img.tk.call(str(w.net_img), 'add', 'line')
    w.net_img.tk.call(str(w.net_img), 'add', 'text', '-text', 'Network',
		    '-underline', '0')
    w.net_img.tk.call(str(w.net_img), 'add', 'space', '-width', '7')
    w.net_img.tk.call(str(w.net_img), 'add', 'image', '-image', w.img0)

    # Put this image into the first button
    #
    net['image'] = w.net_img

    close = Tix.Button(w, pady=1, text='Close',
		       command=lambda w=w: w.destroy())

    hdd.pack(side=Tix.LEFT, padx=10, pady=10, fill=Tix.Y, expand=1)
    net.pack(side=Tix.LEFT, padx=10, pady=10, fill=Tix.Y, expand=1)
    close.pack(side=Tix.LEFT, padx=10, pady=10, fill=Tix.Y, expand=1)

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()
 

--- NEW FILE: ComboBox.py ---
#!/usr/local/bin/python
# 
# $Id: ComboBox.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates the use of the tixComboBox widget, which is close
# to the MS Window Combo Box control.
#
import Tix

def RunSample(w):
    global demo_month, demo_year

    top = Tix.Frame(w, bd=1, relief=Tix.RAISED)

    demo_month = Tix.StringVar()
    demo_year = Tix.StringVar()

    # $w.top.a is a drop-down combo box. It is not editable -- who wants
    # to invent new months?
    #
    # [Hint] The -options switch sets the options of the subwidgets.
    # [Hint] We set the label.width subwidget option of both comboboxes to 
    #        be 10 so that their labels appear to be aligned.
    #
    a = Tix.ComboBox(top, label="Month: ", dropdown=1,
	command=select_month, editable=0, variable=demo_month,
	options='listbox.height 6 label.width 10 label.anchor e')

    # $w.top.b is a non-drop-down combo box. It is not editable: we provide
    # four choices for the user, but he can enter an alternative year if he
    # wants to.
    #
    # [Hint] Use the padY and anchor options of the label subwidget to
    #	     align the label with the entry subwidget.
    # [Hint] Notice that you should use padY (the NAME of the option) and not
    #        pady (the SWITCH of the option).
    #
    b = Tix.ComboBox(top, label="Year: ", dropdown=0,
	command=select_year, editable=1, variable=demo_year,
	options='listbox.height 4 label.padY 5 label.width 10 label.anchor ne')

    a.pack(side=Tix.TOP, anchor=Tix.W)
    b.pack(side=Tix.TOP, anchor=Tix.W)

    a.insert(Tix.END, 'January')
    a.insert(Tix.END, 'February')
    a.insert(Tix.END, 'March')
    a.insert(Tix.END, 'April')
    a.insert(Tix.END, 'May')
    a.insert(Tix.END, 'June')
    a.insert(Tix.END, 'July')
    a.insert(Tix.END, 'August')
    a.insert(Tix.END, 'September')
    a.insert(Tix.END, 'October')
    a.insert(Tix.END, 'November')
    a.insert(Tix.END, 'December')

    b.insert(Tix.END, '1992')
    b.insert(Tix.END, '1993')
    b.insert(Tix.END, '1994')
    b.insert(Tix.END, '1995')
    b.insert(Tix.END, '1996')

    # Use "tixSetSilent" to set the values of the combo box if you
    # don't want your -command procedures (cbx:select_month and 
    # cbx:select_year) to be called.
    #
    a.set_silent('January')
    b.set_silent('1995')

    box = Tix.ButtonBox(w, orientation=Tix.HORIZONTAL)
    box.add('ok', text='Ok', underline=0, width=6,
	    command=lambda w=w: ok_command(w))
    box.add('cancel', text='Cancel', underline=0, width=6,
	    command=lambda w=w: w.destroy())
    box.pack(side=Tix.BOTTOM, fill=Tix.X)
    top.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)

def select_month(event=None):
    print "Month =", demo_month.get()

def select_year(event=None):
    print "Year =", demo_year.get()

def ok_command(w):
    print "Month =", demo_month.get(), ", Year=", demo_year.get()
    w.destroy()

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()

--- NEW FILE: Control.py ---
#!/usr/local/bin/python
# 
# $Id: Control.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates the use of the tixControl widget -- it is an
# entry widget with up/down arrow buttons. You can use the arrow buttons
# to adjust the value inside the entry widget.
#
# This example program uses three Control widgets. One lets you select
# integer values; one lets you select floating point values and the last
# one lets you select a few names.
#
import Tix

def RunSample(w):
    global demo_maker, demo_thrust, demo_num_engines

    demo_maker = Tix.StringVar()
    demo_thrust = Tix.DoubleVar()
    demo_num_engines = Tix.IntVar()
    demo_maker.set('P&W')
    demo_thrust.set(20000.0)
    demo_num_engines.set(2)

    top = Tix.Frame(w, bd=1, relief=Tix.RAISED)

    # $w.top.a allows only integer values
    #
    # [Hint] The -options switch sets the options of the subwidgets.
    # [Hint] We set the label.width subwidget option of the Controls to 
    #        be 16 so that their labels appear to be aligned.
    #
    a = Tix.Control(top, label='Number of Engines: ', integer=1,
		    variable=demo_num_engines, min=1, max=4,
		    options='entry.width 10 label.width 20 label.anchor e')
    
    b = Tix.Control(top, label='Thrust: ', integer=0,
		    min='10000.0', max='60000.0', step=500,
		    variable=demo_thrust,
		    options='entry.width 10 label.width 20 label.anchor e')

    c = Tix.Control(top, label='Engine Maker: ', value='P&W',
		    variable=demo_maker,
		    options='entry.width 10 label.width 20 label.anchor e')

    # We can't define these in the init because the widget 'c' doesn't
    # exist yet and we need to reference it
    c['incrcmd'] = lambda w=c: adjust_maker(w, 1)
    c['decrcmd'] = lambda w=c: adjust_maker(w, -1)
    c['validatecmd'] = lambda w=c: validate_maker(w)

    a.pack(side=Tix.TOP, anchor=Tix.W)
    b.pack(side=Tix.TOP, anchor=Tix.W)
    c.pack(side=Tix.TOP, anchor=Tix.W)

    box = Tix.ButtonBox(w, orientation=Tix.HORIZONTAL)
    box.add('ok', text='Ok', underline=0, width=6,
	    command=lambda w=w: ok_command(w))
    box.add('cancel', text='Cancel', underline=0, width=6,
	    command=lambda w=w: w.destroy())
    box.pack(side=Tix.BOTTOM, fill=Tix.X)
    top.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)

maker_list = ['P&W', 'GE', 'Rolls Royce']

def adjust_maker(w, inc):
    i = maker_list.index(demo_maker.get())
    i = i + inc
    if i >= len(maker_list):
	i = 0
    elif i < 0:
	i = len(maker_list) - 1

    # In Tcl/Tix we should return the string maker_list[i]. We can't
    # do that in Tkinter so we set the global variable. (This works).
    demo_maker.set(maker_list[i])

def validate_maker(w):
    try:
	i = maker_list.index(demo_maker.get())
    except:
	# Works here though. Why ? Beats me.
	return maker_list[0]
    # Works here though. Why ? Beats me.
    return maker_list[i]

def ok_command(w):
    print "Selected", demo_num_engines.get(), "of", demo_maker.get(), " engines each of thrust", demo_thrust.get()
    w.destroy()

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()

--- NEW FILE: NoteBook.py ---
#!/usr/local/bin/python
# 
# $Id: NoteBook.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates the use of the tixNoteBook widget, which allows
# you to lay out your interface using a "notebook" metaphore
#
import Tix

def RunSample(w):
    global root
    root = w

    # We use these options to set the sizes of the subwidgets inside the
    # notebook, so that they are well-aligned on the screen.
    prefix = Tix.OptionName(w)
    if prefix:
	prefix = '*'+prefix
    else:
	prefix = ''
    w.option_add(prefix+'*TixControl*entry.width', 10)
    w.option_add(prefix+'*TixControl*label.width', 18)
    w.option_add(prefix+'*TixControl*label.anchor', Tix.E)
    w.option_add(prefix+'*TixNoteBook*tagPadX', 8)

    # Create the notebook widget and set its backpagecolor to gray.
    # Note that the -backpagecolor option belongs to the "nbframe"
    # subwidget.
    nb = Tix.NoteBook(w, name='nb', ipadx=6, ipady=6)
    nb['bg'] = 'gray'
    nb.nbframe['backpagecolor'] = 'gray'
	
    # Create the two tabs on the notebook. The -underline option
    # puts a underline on the first character of the labels of the tabs.
    # Keyboard accelerators will be defined automatically according
    # to the underlined character.	
    nb.add('hard_disk', label="Hard Disk", underline=0)
    nb.add('network', label="Network", underline=0)
	
    nb.pack(expand=1, fill=Tix.BOTH, padx=5, pady=5 ,side=Tix.TOP)

    #----------------------------------------
    # Create the first page
    #----------------------------------------
    # Create two frames: one for the common buttons, one for the
    # other widgets
    #
    tab=nb.hard_disk
    f = Tix.Frame(tab)
    common = Tix.Frame(tab)
	
    f.pack(side=Tix.LEFT, padx=2, pady=2, fill=Tix.BOTH, expand=1)
    common.pack(side=Tix.RIGHT, padx=2, fill=Tix.Y)
	
    a = Tix.Control(f, value=12,   label='Access time: ')
    w = Tix.Control(f, value=400,  label='Write Throughput: ')
    r = Tix.Control(f, value=400,  label='Read Throughput: ')
    c = Tix.Control(f, 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)
	
    # Create the common buttons
    createCommonButtons(common)
	
    #----------------------------------------
    # Create the second page	
    #----------------------------------------
	
    tab = nb.network

    f = Tix.Frame(tab)
    common = Tix.Frame(tab)
	
    f.pack(side=Tix.LEFT, padx=2, pady=2, fill=Tix.BOTH, expand=1)
    common.pack(side=Tix.RIGHT, padx=2, fill=Tix.Y)
	
    a = Tix.Control(f, value=12,   label='Access time: ')
    w = Tix.Control(f, value=400,  label='Write Throughput: ')
    r = Tix.Control(f, value=400,  label='Read Throughput: ')
    c = Tix.Control(f, value=1021, label='Capacity: ')
    u = Tix.Control(f, 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)
	
    createCommonButtons(common)
	
def doDestroy():
    global root
    root.destroy()

def createCommonButtons(master):
    ok = Tix.Button(master, name='ok', text='OK', width=6, 
		command=doDestroy)
    cancel = Tix.Button(master, name='cancel', 
		    text='Cancel', width=6, 
		    command=doDestroy)
    
    ok.pack(side=Tix.TOP, padx=2, pady=2)
    cancel.pack(side=Tix.TOP, padx=2, pady=2)	

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()

--- NEW FILE: OptMenu.py ---
#!/usr/local/bin/python
# 
# $Id: OptMenu.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates the use of the tixOptionMenu widget -- you can
# use it for the user to choose from a fixed set of options
#
import Tix

options = {'text':'Plain Text', 'post':'PostScript', 'html':'HTML',
	   'tex':'LaTeX', 'rtf':'Rich Text Format'}

def RunSample(w):
    global demo_opt_from, demo_opt_to

    demo_opt_from = Tix.StringVar()
    demo_opt_to = Tix.StringVar()

    top = Tix.Frame(w, bd=1, relief=Tix.RAISED)

    from_file = Tix.OptionMenu(top, label="From File Format : ",
			       variable=demo_opt_from,
			       options = 'label.width  19 label.anchor e menubutton.width 15')

    to_file = Tix.OptionMenu(top, label="To File Format : ",
			     variable=demo_opt_to,
			     options='label.width  19 label.anchor e menubutton.width 15')

    # Add the available options to the two OptionMenu widgets
    #
    # [Hint] You have to add the options first before you set the
    #	     global variables "demo_opt_from" and "demo_opt_to". Otherwise
    #	     the OptionMenu widget will complain about "unknown options"!
    #
    for opt in options.keys():
	from_file.add_command(opt, label=options[opt])
	to_file.add_command(opt, label=options[opt])

    demo_opt_from.set('html')
    demo_opt_to.set('post')

    from_file.pack(side=Tix.TOP, anchor=Tix.W, pady=3, padx=6)
    to_file.pack(side=Tix.TOP, anchor=Tix.W, pady=3, padx=6)

    box = Tix.ButtonBox(w, orientation=Tix.HORIZONTAL)
    box.add('ok', text='Ok', underline=0, width=6,
	    command=lambda w=w: ok_command(w))
    box.add('cancel', text='Cancel', underline=0, width=6,
	    command=lambda w=w: w.destroy())
    box.pack(side=Tix.BOTTOM, fill=Tix.X)
    top.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)

def ok_command(w):
    print "Convert file from", demo_opt_from.get(), " to", demo_opt_to.get()
    w.destroy()

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()

--- NEW FILE: PopMenu.py ---
# Tix Demostration Program
# 
# $Id: PopMenu.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
#
# 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 tixPopupMenu widget.
#
import Tix

def RunSample(w):
    # We create the frame and the button, then we'll bind the PopupMenu
    # to both widgets. The result is, when you press the right mouse
    # button over $w.top or $w.top.but, the PopupMenu will come up.
    #
    top = Tix.Frame(w, relief=Tix.RAISED, bd=1)
    but = Tix.Button(top, text='Press the right mouse button over this button or its surrounding area')
    but.pack(expand=1, fill=Tix.BOTH, padx=50, pady=50)

    p = Tix.PopupMenu(top, title='Popup Test')
    p.bind_widget(top)
    p.bind_widget(but)

    # Set the entries inside the PopupMenu widget. 
    # [Hint] You have to manipulate the "menu" subwidget.
    #	     $w.top.p itself is NOT a menu widget.
    # [Hint] Watch carefully how the sub-menu is created
    #
    p.menu.add_command(label='Desktop', underline=0)
    p.menu.add_command(label='Select', underline=0)
    p.menu.add_command(label='Find', underline=0)
    p.menu.add_command(label='System', underline=1)
    p.menu.add_command(label='Help', underline=0)
    m1 = Tix.Menu(p.menu)
    m1.add_command(label='Hello')
    p.menu.add_cascade(label='More', menu=m1)

    but.pack(side=Tix.TOP, padx=40, pady=50)

    box = Tix.ButtonBox(w, orientation=Tix.HORIZONTAL)
    box.add('ok', text='Ok', underline=0, width=6,
	    command=lambda w=w: w.destroy())
    box.add('cancel', text='Cancel', underline=0, width=6,
	    command=lambda w=w: w.destroy())
    box.pack(side=Tix.BOTTOM, fill=Tix.X)
    top.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()

--- NEW FILE: SHList1.py ---
#!/usr/local/bin/python
# 
# $Id: SHList1.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program using tixwish.

# This file demonstrates the use of the tixScrolledHList widget.
#

import Tix

def RunSample (w) :

    # We create the frame and the ScrolledHList widget
    # at the top of the dialog box
    #
    top = Tix.Frame( w, relief=Tix.RAISED, bd=1)

    # Put a simple hierachy into the HList (two levels). Use colors and
    # separator widgets (frames) to make the list look fancy
    #
    top.a  = Tix.ScrolledHList(top)
    top.a.pack( expand=1, fill=Tix.BOTH, padx=10, pady=10, side=Tix.TOP)


    # This is our little relational database
    #
    bosses = [
	('jeff',  'Jeff Waxman'),
	('john',  'John Lee'),
	('peter', 'Peter Kenson')
    ]

    employees = [
	('alex',  'john',  'Alex Kellman'),
	('alan',  'john',  'Alan Adams'),
	('andy',  'peter', 'Andreas Crawford'),
	('doug',  'jeff',  'Douglas Bloom'),
	('jon',   'peter', 'Jon Baraki'),
	('chris', 'jeff',  'Chris Geoffrey'),
	('chuck', 'jeff',  'Chuck McLean')
    ]

    hlist=top.a.hlist

    # Let configure the appearance of the HList subwidget 
    #
    hlist.config( separator='.', width=25, drawbranch=0, indent=10)

    count=0
    for boss,name in bosses :
	if count :
	    f=Tix.Frame(hlist, name='sep%d' % count, height=2, width=150,
		bd=2, relief=Tix.SUNKEN, bg=hlist['bg'] )

	    hlist.add_child( itemtype=Tix.WINDOW, 
		window=f, state=Tix.DISABLED )
	
	hlist.add(boss, itemtype=Tix.TEXT, text=name)
	count = count+1
    

    for person,boss,name in employees :
	# '.' is the separator character we chose above
	#
	key= boss    + '.'     + person
	#    ^^^^                ^^^^^^
	#    parent entryPath /  child's name

	hlist.add( key, text=name )

	# [Hint] Make sure the keys (e.g. 'boss.person') you choose
	#	 are unique names. If you cannot be sure of this (because of
	#	 the structure of your database, e.g.) you can use the
	#	 "add_child" command instead:
	#
	#  hlist.addchild( boss,  text=name)
	#                  ^^^^
	#                  parent entryPath 


    # Use a ButtonBox to hold the buttons.
    #
    box= Tix.ButtonBox(top, orientation=Tix.HORIZONTAL )
    box.add( 'ok',  text='Ok', underline=0,  width=6,
	command = lambda w=w:  w.destroy() )

    box.add( 'cancel', text='Cancel', underline=0, width=6,
	command = lambda w=w:  w.destroy() )

    box.pack( side=Tix.BOTTOM, fill=Tix.X)
    top.pack( side=Tix.TOP,    fill=Tix.BOTH, expand=1 )


# 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()

--- NEW FILE: SHList2.py ---
#!/usr/local/bin/python
# 
# $Id: SHList2.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the PyTix demo program "tixwidget": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program using tixwish.

# This file demonstrates how to use multiple columns and multiple styles
# in the tixHList widget
#
# In a tixHList widget, you can have one ore more columns. 
#

import Tix

def RunSample (w) :

    # We create the frame and the ScrolledHList widget
    # at the top of the dialog box
    #
    top = Tix.Frame( w, relief=Tix.RAISED, bd=1)

    # Put a simple hierachy into the HList (two levels). Use colors and
    # separator widgets (frames) to make the list look fancy
    #
    top.a = Tix.ScrolledHList(top, options='hlist.columns 3 hlist.header 1' )

    top.a.pack( expand=1, fill=Tix.BOTH, padx=10, pady=10, side=Tix.TOP)

    hlist=top.a.hlist

    # Create the title for the HList widget
    #	>> Notice that we have set the hlist.header subwidget option to true
    #      so that the header is displayed
    #

    boldfont=hlist.tk.call('tix','option','get','bold_font')

    # First some styles for the headers
    style={}
    style['header'] = Tix.DisplayStyle(Tix.TEXT, fg='black', refwindow=top,
	anchor=Tix.CENTER, padx=8, pady=2, font = boldfont )

    hlist.header_create(0, itemtype=Tix.TEXT, text='Name',
	style=style['header'])
    hlist.header_create(1, itemtype=Tix.TEXT, text='Position',
	style=style['header'])

    # Notice that we use 3 columns in the hlist widget. This way when the user
    # expands the windows wide, the right side of the header doesn't look
    # chopped off. The following line ensures that the 3 column header is
    # not shown unless the hlist window is wider than its contents.
    #
    hlist.column_width(2,0)

    # This is our little relational database
    #
    boss = ('doe', 'John Doe',	'Director')

    managers = [
	('jeff',  'Jeff Waxman',	'Manager'),
	('john',  'John Lee',		'Manager'),
	('peter', 'Peter Kenson',	'Manager')
    ]

    employees = [
	('alex',  'john',	'Alex Kellman',		'Clerk'),
	('alan',  'john',       'Alan Adams',		'Clerk'),
	('andy',  'peter',      'Andreas Crawford',	'Salesman'),
	('doug',  'jeff',       'Douglas Bloom',	'Clerk'),
	('jon',   'peter',      'Jon Baraki',		'Salesman'),
	('chris', 'jeff',       'Chris Geoffrey',	'Clerk'),
	('chuck', 'jeff',       'Chuck McLean',		'Cleaner')
    ]

    style['mgr_name'] = Tix.DisplayStyle(Tix.TEXT, refwindow=top,
	fg='#202060', selectforeground = '#202060', font = boldfont )

    style['mgr_posn'] = Tix.DisplayStyle(Tix.TEXT, padx=8,  refwindow=top,
	fg='#202060', selectforeground='#202060' )

    style['empl_name'] = Tix.DisplayStyle(Tix.TEXT, refwindow=top,
	fg='#602020', selectforeground = '#602020', font = boldfont )

    style['empl_posn'] = Tix.DisplayStyle(Tix.TEXT, padx=8,  refwindow=top,
	fg='#602020', selectforeground = '#602020' )

    # Let configure the appearance of the HList subwidget 
    #
    hlist.config(separator='.', width=25, drawbranch=0, indent=10)
    hlist.column_width(0, chars=20)

    # Create the boss
    #
    hlist.add ('.',           itemtype=Tix.TEXT, text=boss[1],
	style=style['mgr_name'])
    hlist.item_create('.', 1, itemtype=Tix.TEXT, text=boss[2],
	style=style['mgr_posn'])

    # Create the managers
    #

    for key,name,posn in managers :
	e= '.'+ key
	hlist.add(e, itemtype=Tix.TEXT, text=name,
	    style=style['mgr_name'])
	hlist.item_create(e, 1, itemtype=Tix.TEXT, text=posn,
	    style=style['mgr_posn'])


    for key,mgr,name,posn in employees :
	# "." is the separator character we chose above

	entrypath = '.' + mgr        + '.' + key 

	#           ^^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^
	#	    parent entryPath / child's name

	hlist.add(entrypath, text=name, style=style['empl_name'])
	hlist.item_create(entrypath, 1, itemtype=Tix.TEXT,
	    text = posn, style = style['empl_posn'] )
    

    # Use a ButtonBox to hold the buttons.
    #
    box= Tix.ButtonBox(top, orientation=Tix.HORIZONTAL )
    box.add( 'ok',  text='Ok', underline=0,  width=6,
	command = lambda w=w: w.destroy() )

    box.add( 'cancel', text='Cancel', underline=0, width=6,
	command = lambda w=w: w.destroy() )

    box.pack( side=Tix.BOTTOM, fill=Tix.X)
    top.pack( side=Tix.TOP,    fill=Tix.BOTH, expand=1 )


# 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()

--- NEW FILE: Tree.py ---
#!/usr/local/bin/python
# 
# $Id: Tree.py,v 1.1 2001/03/21 07:42:07 loewis Exp $
#
# Tix Demostration Program
#
# This sample program is structured in such a way so that it can be
# executed from the Tix demo program "tixwidgets": it must have a
# procedure called "RunSample". It should also have the "if" statment
# at the end of this file so that it can be run as a standalone
# program.

# This file demonstrates how to use the TixTree widget to display
# dynamic hierachical data (the files in the Unix file system)
#

import Tix, os

def RunSample(w):
    top = Tix.Frame(w, relief=Tix.RAISED, bd=1)
    tree = Tix.Tree(top, options='separator "/"')
    tree.pack(expand=1, fill=Tix.BOTH, padx=10, pady=10, side=Tix.LEFT)
    tree['opencmd'] = lambda dir=None, w=tree: opendir(w, dir)

    # The / directory is added in the "open" mode. The user can open it
    # and then browse its subdirectories ...
    adddir(tree, "/")

    box = Tix.ButtonBox(w, orientation=Tix.HORIZONTAL)
    box.add('ok', text='Ok', underline=0, command=w.destroy, width=6)
    box.add('cancel', text='Cancel', underline=0, command=w.destroy, width=6)
    box.pack(side=Tix.BOTTOM, fill=Tix.X)
    top.pack(side=Tix.TOP, fill=Tix.BOTH, expand=1)

def adddir(tree, dir):
    if dir == '/':
	text = '/'
    else:
	text = os.path.basename(dir)
    tree.hlist.add(dir, itemtype=Tix.IMAGETEXT, text=text,
		   image=tree.tk.call('tix', 'getimage', 'folder'))
    try:
	os.listdir(dir)
	tree.setmode(dir, 'open')
    except os.error:
	# No read permission ?
	pass

# This function is called whenever the user presses the (+) indicator or
# double clicks on a directory whose mode is "open". It loads the files
# inside that directory into the Tree widget.
#
# Note we didn't specify the closecmd option for the Tree widget, so it
# performs the default action when the user presses the (-) indicator or
# double clicks on a directory whose mode is "close": hide all of its child
# entries
def opendir(tree, dir):
    entries = tree.hlist.info_children(dir)
    if entries:
	# We have already loaded this directory. Let's just
	# show all the child entries
	#
	# Note: since we load the directory only once, it will not be
	#       refreshed if the you add or remove files from this
	#	directory.
	#
	for entry in entries:
	    tree.hlist.show_entry(entry)
    files = os.listdir(dir)
    for file in files:
	if os.path.isdir(dir + '/' + file):
	    adddir(tree, dir + '/' + file)
	else:
	    tree.hlist.add(dir + '/' + file, itemtype=Tix.IMAGETEXT, text=file,
			   image=tree.tk.call('tix', 'getimage', 'file'))

if __name__ == '__main__':
    root = Tix.Tk()
    RunSample(root)
    root.mainloop()