diff -r ffa851df0825 -r 2fb8b9db1c86 symbian-qemu-0.9.1-12/python-2.6.1/Demo/tix/tixwidgets.py --- /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('', 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('', 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('', 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)