blob: 49d1e7f9ace2deab44741335f31d478615c8d05f [file] [log] [blame]
Martin v. Löwis20efa682001-11-11 14:07:37 +00001# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00002#
3# $Id$
4#
5# tixwidgets.py --
Martin v. Löwis20efa682001-11-11 14:07:37 +00006#
Tim Peters182b5ac2004-07-18 06:16:08 +00007# For Tix, see http://tix.sourceforge.net
Martin v. Löwis20efa682001-11-11 14:07:37 +00008#
Tim Peters182b5ac2004-07-18 06:16:08 +00009# This is a demo program of some of the Tix widgets available in Python.
10# If you have installed Python & Tix properly, you can execute this as
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000011#
Tim Peters182b5ac2004-07-18 06:16:08 +000012# % python tixwidgets.py
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000013#
14
Martin v. Löwis652e1912001-11-25 14:50:56 +000015import os, os.path, sys, Tix
Martin v. Löwis20efa682001-11-11 14:07:37 +000016from Tkconstants import *
Neal Norwitzac30ead2002-11-14 02:44:08 +000017import traceback, tkMessageBox
Martin v. Löwis20efa682001-11-11 14:07:37 +000018
Tim Peters182b5ac2004-07-18 06:16:08 +000019TCL_DONT_WAIT = 1<<1
20TCL_WINDOW_EVENTS = 1<<2
21TCL_FILE_EVENTS = 1<<3
22TCL_TIMER_EVENTS = 1<<4
23TCL_IDLE_EVENTS = 1<<5
24TCL_ALL_EVENTS = 0
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000025
26class Demo:
Martin v. Löwis20efa682001-11-11 14:07:37 +000027 def __init__(self, top):
28 self.root = top
29 self.exit = -1
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000030
Tim Peters182b5ac2004-07-18 06:16:08 +000031 self.dir = None # script directory
32 self.balloon = None # balloon widget
Martin v. Löwis20efa682001-11-11 14:07:37 +000033 self.useBalloons = Tix.StringVar()
34 self.useBalloons.set('0')
Tim Peters182b5ac2004-07-18 06:16:08 +000035 self.statusbar = None # status bar widget
36 self.welmsg = None # Msg widget
37 self.welfont = '' # font name
38 self.welsize = '' # font size
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000039
Martin v. Löwis20efa682001-11-11 14:07:37 +000040 progname = sys.argv[0]
41 dirname = os.path.dirname(progname)
42 if dirname and dirname != os.curdir:
43 self.dir = dirname
44 index = -1
45 for i in range(len(sys.path)):
46 p = sys.path[i]
47 if p in ("", os.curdir):
48 index = i
49 if index >= 0:
50 sys.path[index] = dirname
51 else:
52 sys.path.insert(0, dirname)
53 else:
54 self.dir = os.getcwd()
55 sys.path.insert(0, self.dir+'/samples')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000056
Martin v. Löwis20efa682001-11-11 14:07:37 +000057 def MkMainMenu(self):
58 top = self.root
59 w = Tix.Frame(top, bd=2, relief=RAISED)
60 file = Tix.Menubutton(w, text='File', underline=0, takefocus=0)
61 help = Tix.Menubutton(w, text='Help', underline=0, takefocus=0)
62 file.pack(side=LEFT)
63 help.pack(side=RIGHT)
Martin v. Löwis652e1912001-11-25 14:50:56 +000064 fm = Tix.Menu(file, tearoff=0)
Martin v. Löwis20efa682001-11-11 14:07:37 +000065 file['menu'] = fm
Martin v. Löwis652e1912001-11-25 14:50:56 +000066 hm = Tix.Menu(help, tearoff=0)
Martin v. Löwis20efa682001-11-11 14:07:37 +000067 help['menu'] = hm
68
Martin v. Löwis652e1912001-11-25 14:50:56 +000069 fm.add_command(label='Exit', underline=1,
Martin v. Löwis20efa682001-11-11 14:07:37 +000070 command = lambda self=self: self.quitcmd () )
71 hm.add_checkbutton(label='BalloonHelp', underline=0, command=ToggleHelp,
72 variable=self.useBalloons)
73 # The trace variable option doesn't seem to work, instead I use 'command'
Neal Norwitzd9108552006-03-17 08:00:19 +000074 #w.tk.call('trace', 'variable', self.useBalloons, 'w', ToggleHelp))
Neal Norwitzac30ead2002-11-14 02:44:08 +000075
Martin v. Löwis20efa682001-11-11 14:07:37 +000076 return w
77
78 def MkMainNotebook(self):
79 top = self.root
80 w = Tix.NoteBook(top, ipadx=5, ipady=5, options="""
Neal Norwitzac30ead2002-11-14 02:44:08 +000081 tagPadX 6
82 tagPadY 4
83 borderWidth 2
Martin v. Löwis20efa682001-11-11 14:07:37 +000084 """)
85 # This may be required if there is no *Background option
86 top['bg'] = w['bg']
87
88 w.add('wel', label='Welcome', underline=0,
89 createcmd=lambda w=w, name='wel': MkWelcome(w, name))
90 w.add('cho', label='Choosers', underline=0,
91 createcmd=lambda w=w, name='cho': MkChoosers(w, name))
92 w.add('scr', label='Scrolled Widgets', underline=0,
93 createcmd=lambda w=w, name='scr': MkScroll(w, name))
94 w.add('mgr', label='Manager Widgets', underline=0,
95 createcmd=lambda w=w, name='mgr': MkManager(w, name))
96 w.add('dir', label='Directory List', underline=0,
97 createcmd=lambda w=w, name='dir': MkDirList(w, name))
98 w.add('exp', label='Run Sample Programs', underline=0,
99 createcmd=lambda w=w, name='exp': MkSample(w, name))
100 return w
101
102 def MkMainStatus(self):
103 global demo
104 top = self.root
105
106 w = Tix.Frame(top, relief=Tix.RAISED, bd=1)
107 demo.statusbar = Tix.Label(w, relief=Tix.SUNKEN, bd=1)
108 demo.statusbar.form(padx=3, pady=3, left=0, right='%70')
109 return w
110
111 def build(self):
112 root = self.root
113 z = root.winfo_toplevel()
114 z.wm_title('Tix Widget Demonstration')
Neal Norwitzac30ead2002-11-14 02:44:08 +0000115 if z.winfo_screenwidth() <= 800:
116 z.geometry('790x590+10+10')
117 else:
118 z.geometry('890x640+10+10')
Martin v. Löwis20efa682001-11-11 14:07:37 +0000119 demo.balloon = Tix.Balloon(root)
120 frame1 = self.MkMainMenu()
121 frame2 = self.MkMainNotebook()
122 frame3 = self.MkMainStatus()
123 frame1.pack(side=TOP, fill=X)
124 frame3.pack(side=BOTTOM, fill=X)
125 frame2.pack(side=TOP, expand=1, fill=BOTH, padx=4, pady=4)
126 demo.balloon['statusbar'] = demo.statusbar
127 z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
128
Neal Norwitzac30ead2002-11-14 02:44:08 +0000129 # To show Tcl errors - uncomment this to see the listbox bug.
130 # Tkinter defines a Tcl tkerror procedure that in effect
131 # silences all background Tcl error reporting.
Tim Peters182b5ac2004-07-18 06:16:08 +0000132 # root.tk.eval('if {[info commands tkerror] != ""} {rename tkerror pytkerror}')
Martin v. Löwis20efa682001-11-11 14:07:37 +0000133 def quitcmd (self):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000134 """Quit our mainloop. It is up to you to call root.destroy() after."""
Martin v. Löwis20efa682001-11-11 14:07:37 +0000135 self.exit = 0
136
137 def loop(self):
Tim Peters182b5ac2004-07-18 06:16:08 +0000138 """This is an explict replacement for _tkinter mainloop()
139 It lets you catch keyboard interrupts easier, and avoids
140 the 20 msec. dead sleep() which burns a constant CPU."""
Martin v. Löwis652e1912001-11-25 14:50:56 +0000141 while self.exit < 0:
Neal Norwitzac30ead2002-11-14 02:44:08 +0000142 # There are 2 whiles here. The outer one lets you continue
143 # after a ^C interrupt.
Martin v. Löwis652e1912001-11-25 14:50:56 +0000144 try:
Neal Norwitzac30ead2002-11-14 02:44:08 +0000145 # This is the replacement for _tkinter mainloop()
146 # It blocks waiting for the next Tcl event using select.
147 while self.exit < 0:
148 self.root.tk.dooneevent(TCL_ALL_EVENTS)
Martin v. Löwis652e1912001-11-25 14:50:56 +0000149 except SystemExit:
Neal Norwitzac30ead2002-11-14 02:44:08 +0000150 # Tkinter uses SystemExit to exit
Martin v. Löwis652e1912001-11-25 14:50:56 +0000151 #print 'Exit'
152 self.exit = 1
Neal Norwitzac30ead2002-11-14 02:44:08 +0000153 return
Martin v. Löwis652e1912001-11-25 14:50:56 +0000154 except KeyboardInterrupt:
155 if tkMessageBox.askquestion ('Interrupt', 'Really Quit?') == 'yes':
156 # self.tk.eval('exit')
Neal Norwitzac30ead2002-11-14 02:44:08 +0000157 self.exit = 1
Martin v. Löwis652e1912001-11-25 14:50:56 +0000158 return
Martin v. Löwis652e1912001-11-25 14:50:56 +0000159 continue
160 except:
Neal Norwitzac30ead2002-11-14 02:44:08 +0000161 # Otherwise it's some other error - be nice and say why
Martin v. Löwis652e1912001-11-25 14:50:56 +0000162 t, v, tb = sys.exc_info()
163 text = ""
164 for line in traceback.format_exception(t,v,tb):
165 text += line + '\n'
166 try: tkMessageBox.showerror ('Error', text)
167 except: pass
Martin v. Löwis8ec03e02002-03-17 18:19:13 +0000168 self.exit = 1
Collin Winter6f2df4d2007-07-17 20:59:35 +0000169 raise SystemExit(1)
Martin v. Löwis20efa682001-11-11 14:07:37 +0000170
171 def destroy (self):
172 self.root.destroy()
Neal Norwitzac30ead2002-11-14 02:44:08 +0000173
Martin v. Löwis652e1912001-11-25 14:50:56 +0000174def RunMain(root):
175 global demo
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000176
Martin v. Löwis652e1912001-11-25 14:50:56 +0000177 demo = Demo(root)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000178
Martin v. Löwis20efa682001-11-11 14:07:37 +0000179 demo.build()
180 demo.loop()
181 demo.destroy()
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000182
Martin v. Löwis20efa682001-11-11 14:07:37 +0000183# Tabs
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000184def MkWelcome(nb, name):
185 w = nb.page(name)
186 bar = MkWelcomeBar(w)
187 text = MkWelcomeText(w)
Martin v. Löwis20efa682001-11-11 14:07:37 +0000188 bar.pack(side=TOP, fill=X, padx=2, pady=2)
189 text.pack(side=TOP, fill=BOTH, expand=1)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000190
191def MkWelcomeBar(top):
192 global demo
193
194 w = Tix.Frame(top, bd=2, relief=Tix.GROOVE)
195 b1 = Tix.ComboBox(w, command=lambda w=top: MainTextFont(w))
196 b2 = Tix.ComboBox(w, command=lambda w=top: MainTextFont(w))
197 b1.entry['width'] = 15
198 b1.slistbox.listbox['height'] = 3
199 b2.entry['width'] = 4
200 b2.slistbox.listbox['height'] = 3
201
202 demo.welfont = b1
203 demo.welsize = b2
204
205 b1.insert(Tix.END, 'Courier')
206 b1.insert(Tix.END, 'Helvetica')
207 b1.insert(Tix.END, 'Lucida')
208 b1.insert(Tix.END, 'Times Roman')
209
210 b2.insert(Tix.END, '8')
211 b2.insert(Tix.END, '10')
212 b2.insert(Tix.END, '12')
213 b2.insert(Tix.END, '14')
214 b2.insert(Tix.END, '18')
215
216 b1.pick(1)
217 b2.pick(3)
218
219 b1.pack(side=Tix.LEFT, padx=4, pady=4)
220 b2.pack(side=Tix.LEFT, padx=4, pady=4)
221
222 demo.balloon.bind_widget(b1, msg='Choose\na font',
Tim Peters182b5ac2004-07-18 06:16:08 +0000223 statusmsg='Choose a font for this page')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000224 demo.balloon.bind_widget(b2, msg='Point size',
Tim Peters182b5ac2004-07-18 06:16:08 +0000225 statusmsg='Choose the font size for this page')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000226 return w
227
228def MkWelcomeText(top):
229 global demo
230
231 w = Tix.ScrolledWindow(top, scrollbar='auto')
232 win = w.window
233 text = 'Welcome to TIX in Python'
Martin v. Löwis20efa682001-11-11 14:07:37 +0000234 title = Tix.Label(win,
Tim Peters182b5ac2004-07-18 06:16:08 +0000235 bd=0, width=30, anchor=Tix.N, text=text)
Martin v. Löwis20efa682001-11-11 14:07:37 +0000236 msg = Tix.Message(win,
Tim Peters182b5ac2004-07-18 06:16:08 +0000237 bd=0, width=400, anchor=Tix.N,
238 text='Tix is a set of mega-widgets based on TK. This program \
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000239demonstrates the widgets in the Tix widget set. You can choose the pages \
240in this window to look at the corresponding widgets. \n\n\
241To quit this program, choose the "File | Exit" command.\n\n\
242For more information, see http://tix.sourceforge.net.')
243 title.pack(expand=1, fill=Tix.BOTH, padx=10, pady=10)
244 msg.pack(expand=1, fill=Tix.BOTH, padx=10, pady=10)
245 demo.welmsg = msg
246 return w
247
248def MainTextFont(w):
249 global demo
250
251 if not demo.welmsg:
Tim Peters182b5ac2004-07-18 06:16:08 +0000252 return
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000253 font = demo.welfont['value']
254 point = demo.welsize['value']
255 if font == 'Times Roman':
Tim Peters182b5ac2004-07-18 06:16:08 +0000256 font = 'times'
Martin v. Löwis20efa682001-11-11 14:07:37 +0000257 fontstr = '%s %s' % (font, point)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000258 demo.welmsg['font'] = fontstr
259
260def ToggleHelp():
261 if demo.useBalloons.get() == '1':
Tim Peters182b5ac2004-07-18 06:16:08 +0000262 demo.balloon['state'] = 'both'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000263 else:
Tim Peters182b5ac2004-07-18 06:16:08 +0000264 demo.balloon['state'] = 'none'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000265
266def MkChoosers(nb, name):
267 w = nb.page(name)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000268 options = "label.padX 4"
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000269
Neal Norwitzac30ead2002-11-14 02:44:08 +0000270 til = Tix.LabelFrame(w, label='Chooser Widgets', options=options)
271 cbx = Tix.LabelFrame(w, label='tixComboBox', options=options)
272 ctl = Tix.LabelFrame(w, label='tixControl', options=options)
273 sel = Tix.LabelFrame(w, label='tixSelect', options=options)
274 opt = Tix.LabelFrame(w, label='tixOptionMenu', options=options)
275 fil = Tix.LabelFrame(w, label='tixFileEntry', options=options)
276 fbx = Tix.LabelFrame(w, label='tixFileSelectBox', options=options)
277 tbr = Tix.LabelFrame(w, label='Tool Bar', options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000278
279 MkTitle(til.frame)
280 MkCombo(cbx.frame)
281 MkControl(ctl.frame)
282 MkSelect(sel.frame)
283 MkOptMenu(opt.frame)
284 MkFileEnt(fil.frame)
285 MkFileBox(fbx.frame)
286 MkToolBar(tbr.frame)
287
288 # First column: comBox and selector
289 cbx.form(top=0, left=0, right='%33')
290 sel.form(left=0, right='&'+str(cbx), top=cbx)
291 opt.form(left=0, right='&'+str(cbx), top=sel, bottom=-1)
292
293 # Second column: title .. etc
294 til.form(left=cbx, top=0,right='%66')
295 ctl.form(left=cbx, right='&'+str(til), top=til)
296 fil.form(left=cbx, right='&'+str(til), top=ctl)
297 tbr.form(left=cbx, right='&'+str(til), top=fil, bottom=-1)
298
299 #
300 # Third column: file selection
301 fbx.form(right=-1, top=0, left='%66')
302
303def MkCombo(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000304 options="label.width %d label.anchor %s entry.width %d" % (10, Tix.E, 14)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000305
Neal Norwitzac30ead2002-11-14 02:44:08 +0000306 static = Tix.ComboBox(w, label='Static', editable=0, options=options)
307 editable = Tix.ComboBox(w, label='Editable', editable=1, options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000308 history = Tix.ComboBox(w, label='History', editable=1, history=1,
Tim Peters182b5ac2004-07-18 06:16:08 +0000309 anchor=Tix.E, options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000310 static.insert(Tix.END, 'January')
311 static.insert(Tix.END, 'February')
312 static.insert(Tix.END, 'March')
313 static.insert(Tix.END, 'April')
314 static.insert(Tix.END, 'May')
315 static.insert(Tix.END, 'June')
316 static.insert(Tix.END, 'July')
317 static.insert(Tix.END, 'August')
318 static.insert(Tix.END, 'September')
319 static.insert(Tix.END, 'October')
320 static.insert(Tix.END, 'November')
321 static.insert(Tix.END, 'December')
322
323 editable.insert(Tix.END, 'Angola')
324 editable.insert(Tix.END, 'Bangladesh')
325 editable.insert(Tix.END, 'China')
326 editable.insert(Tix.END, 'Denmark')
327 editable.insert(Tix.END, 'Ecuador')
328
329 history.insert(Tix.END, '/usr/bin/ksh')
330 history.insert(Tix.END, '/usr/local/lib/python')
331 history.insert(Tix.END, '/var/adm')
332
333 static.pack(side=Tix.TOP, padx=5, pady=3)
334 editable.pack(side=Tix.TOP, padx=5, pady=3)
335 history.pack(side=Tix.TOP, padx=5, pady=3)
336
337states = ['Bengal', 'Delhi', 'Karnataka', 'Tamil Nadu']
338
339def spin_cmd(w, inc):
340 idx = states.index(demo_spintxt.get()) + inc
341 if idx < 0:
Tim Peters182b5ac2004-07-18 06:16:08 +0000342 idx = len(states) - 1
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000343 elif idx >= len(states):
Tim Peters182b5ac2004-07-18 06:16:08 +0000344 idx = 0
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000345# following doesn't work.
346# return states[idx]
Tim Peters182b5ac2004-07-18 06:16:08 +0000347 demo_spintxt.set(states[idx]) # this works
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000348
349def spin_validate(w):
350 global states, demo_spintxt
351
352 try:
Tim Peters182b5ac2004-07-18 06:16:08 +0000353 i = states.index(demo_spintxt.get())
Fred Drake7def2562001-05-11 19:44:55 +0000354 except ValueError:
Tim Peters182b5ac2004-07-18 06:16:08 +0000355 return states[0]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000356 return states[i]
357 # why this procedure works as opposed to the previous one beats me.
358
359def MkControl(w):
360 global demo_spintxt
361
Neal Norwitzac30ead2002-11-14 02:44:08 +0000362 options="label.width %d label.anchor %s entry.width %d" % (10, Tix.E, 13)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000363
364 demo_spintxt = Tix.StringVar()
365 demo_spintxt.set(states[0])
Neal Norwitzac30ead2002-11-14 02:44:08 +0000366 simple = Tix.Control(w, label='Numbers', options=options)
367 spintxt = Tix.Control(w, label='States', variable=demo_spintxt,
368 options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000369 spintxt['incrcmd'] = lambda w=spintxt: spin_cmd(w, 1)
370 spintxt['decrcmd'] = lambda w=spintxt: spin_cmd(w, -1)
371 spintxt['validatecmd'] = lambda w=spintxt: spin_validate(w)
372
373 simple.pack(side=Tix.TOP, padx=5, pady=3)
374 spintxt.pack(side=Tix.TOP, padx=5, pady=3)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000375
Neal Norwitzac30ead2002-11-14 02:44:08 +0000376def MkSelect(w):
377 options = "label.anchor %s" % Tix.CENTER
378
379 sel1 = Tix.Select(w, label='Mere Mortals', allowzero=1, radio=1,
380 orientation=Tix.VERTICAL,
381 labelside=Tix.TOP,
382 options=options)
383 sel2 = Tix.Select(w, label='Geeks', allowzero=1, radio=0,
384 orientation=Tix.VERTICAL,
385 labelside= Tix.TOP,
386 options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000387
388 sel1.add('eat', text='Eat')
389 sel1.add('work', text='Work')
390 sel1.add('play', text='Play')
391 sel1.add('party', text='Party')
392 sel1.add('sleep', text='Sleep')
393
394 sel2.add('eat', text='Eat')
395 sel2.add('prog1', text='Program')
396 sel2.add('prog2', text='Program')
397 sel2.add('prog3', text='Program')
398 sel2.add('sleep', text='Sleep')
399
400 sel1.pack(side=Tix.LEFT, padx=5, pady=3, fill=Tix.X)
401 sel2.pack(side=Tix.LEFT, padx=5, pady=3, fill=Tix.X)
402
403def MkOptMenu(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000404 options='menubutton.width 15 label.anchor %s' % Tix.E
405
406 m = Tix.OptionMenu(w, label='File Format : ', options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000407 m.add_command('text', label='Plain Text')
408 m.add_command('post', label='PostScript')
409 m.add_command('format', label='Formatted Text')
410 m.add_command('html', label='HTML')
411 m.add_command('sep')
412 m.add_command('tex', label='LaTeX')
413 m.add_command('rtf', label='Rich Text Format')
414
415 m.pack(fill=Tix.X, padx=5, pady=3)
416
417def MkFileEnt(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000418 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000419 relief=Tix.FLAT, width=240, anchor=Tix.N,
420 text='Press the "open file" icon button and a TixFileSelectDialog will popup.')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000421 ent = Tix.FileEntry(w, label='Select a file : ')
422 msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
423 ent.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
424
425def MkFileBox(w):
Martin v. Löwis8ec03e02002-03-17 18:19:13 +0000426 """The FileSelectBox is a Motif-style box with various enhancements.
427 For example, you can adjust the size of the two listboxes
428 and your past selections are recorded.
429 """
Neal Norwitzac30ead2002-11-14 02:44:08 +0000430 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000431 relief=Tix.FLAT, width=240, anchor=Tix.N,
432 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.')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000433 box = Tix.FileSelectBox(w)
434 msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
435 box.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
436
437def MkToolBar(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000438 """The Select widget is also good for arranging buttons in a tool bar.
439 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000440 global demo
441
Neal Norwitzac30ead2002-11-14 02:44:08 +0000442 options='frame.borderWidth 1'
443
444 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000445 relief=Tix.FLAT, width=240, anchor=Tix.N,
446 text='The Select widget is also good for arranging buttons in a tool bar.')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000447 bar = Tix.Frame(w, bd=2, relief=Tix.RAISED)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000448 font = Tix.Select(w, allowzero=1, radio=0, label='', options=options)
449 para = Tix.Select(w, allowzero=0, radio=1, label='', options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000450
451 font.add('bold', bitmap='@' + demo.dir + '/bitmaps/bold.xbm')
452 font.add('italic', bitmap='@' + demo.dir + '/bitmaps/italic.xbm')
453 font.add('underline', bitmap='@' + demo.dir + '/bitmaps/underline.xbm')
454 font.add('capital', bitmap='@' + demo.dir + '/bitmaps/capital.xbm')
455
456 para.add('left', bitmap='@' + demo.dir + '/bitmaps/leftj.xbm')
457 para.add('right', bitmap='@' + demo.dir + '/bitmaps/rightj.xbm')
458 para.add('center', bitmap='@' + demo.dir + '/bitmaps/centerj.xbm')
459 para.add('justify', bitmap='@' + demo.dir + '/bitmaps/justify.xbm')
460
461 msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
462 bar.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
463 font.pack({'in':bar}, side=Tix.LEFT, padx=3, pady=3)
464 para.pack({'in':bar}, side=Tix.LEFT, padx=3, pady=3)
465
466def MkTitle(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000467 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000468 relief=Tix.FLAT, width=240, anchor=Tix.N,
469 text='There are many types of "chooser" widgets that allow the user to input different types of information')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000470 msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
471
472def MkScroll(nb, name):
473 w = nb.page(name)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000474 options='label.padX 4'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000475
Martin v. Löwis46874282002-12-06 10:33:45 +0000476 sls = Tix.LabelFrame(w, label='Tix.ScrolledListBox', options=options)
477 swn = Tix.LabelFrame(w, label='Tix.ScrolledWindow', options=options)
478 stx = Tix.LabelFrame(w, label='Tix.ScrolledText', options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000479
480 MkSList(sls.frame)
481 MkSWindow(swn.frame)
482 MkSText(stx.frame)
483
484 sls.form(top=0, left=0, right='%33', bottom=-1)
485 swn.form(top=0, left=sls, right='%66', bottom=-1)
486 stx.form(top=0, left=swn, right=-1, bottom=-1)
487
Neal Norwitzac30ead2002-11-14 02:44:08 +0000488
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000489def MkSList(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000490 """This TixScrolledListBox is configured so that it uses scrollbars
491 only when it is necessary. Use the handles to resize the listbox and
492 watch the scrollbars automatically appear and disappear. """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000493 top = Tix.Frame(w, width=300, height=330)
494 bot = Tix.Frame(w)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000495 msg = Tix.Message(top,
Tim Peters182b5ac2004-07-18 06:16:08 +0000496 relief=Tix.FLAT, width=200, anchor=Tix.N,
497 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.')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000498
499 list = Tix.ScrolledListBox(top, scrollbar='auto')
500 list.place(x=50, y=150, width=120, height=80)
501 list.listbox.insert(Tix.END, 'Alabama')
502 list.listbox.insert(Tix.END, 'California')
503 list.listbox.insert(Tix.END, 'Montana')
504 list.listbox.insert(Tix.END, 'New Jersey')
505 list.listbox.insert(Tix.END, 'New York')
506 list.listbox.insert(Tix.END, 'Pennsylvania')
507 list.listbox.insert(Tix.END, 'Washington')
508
509 rh = Tix.ResizeHandle(top, bg='black',
Tim Peters182b5ac2004-07-18 06:16:08 +0000510 relief=Tix.RAISED,
511 handlesize=8, gridded=1, minwidth=50, minheight=30)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000512 btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=list: SList_reset(w,x))
513 top.propagate(0)
514 msg.pack(fill=Tix.X)
515 btn.pack(anchor=Tix.CENTER)
516 top.pack(expand=1, fill=Tix.BOTH)
517 bot.pack(fill=Tix.BOTH)
518 list.bind('<Map>', func=lambda arg=0, rh=rh, list=list:
Tim Peters182b5ac2004-07-18 06:16:08 +0000519 list.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(list)))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000520
521def SList_reset(rh, list):
522 list.place(x=50, y=150, width=120, height=80)
523 list.update()
524 rh.attach_widget(list)
525
526def MkSWindow(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000527 """The ScrolledWindow widget allows you to scroll any kind of Tk
528 widget. It is more versatile than a scrolled canvas widget.
529 """
530 global demo
Martin v. Löwis652e1912001-11-25 14:50:56 +0000531
Neal Norwitzac30ead2002-11-14 02:44:08 +0000532 text = 'The Tix ScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.'
533
Martin v. Löwis652e1912001-11-25 14:50:56 +0000534 file = os.path.join(demo.dir, 'bitmaps', 'tix.gif')
535 if not os.path.isfile(file):
536 text += ' (Image missing)'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000537
538 top = Tix.Frame(w, width=330, height=330)
539 bot = Tix.Frame(w)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000540 msg = Tix.Message(top,
Tim Peters182b5ac2004-07-18 06:16:08 +0000541 relief=Tix.FLAT, width=200, anchor=Tix.N,
542 text=text)
Martin v. Löwis652e1912001-11-25 14:50:56 +0000543
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000544 win = Tix.ScrolledWindow(top, scrollbar='auto')
Martin v. Löwis652e1912001-11-25 14:50:56 +0000545
Neal Norwitz731a9862002-12-10 02:18:49 +0000546 image1 = win.window.image_create('photo', file=file)
Martin v. Löwis652e1912001-11-25 14:50:56 +0000547 lbl = Tix.Label(win.window, image=image1)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000548 lbl.pack(expand=1, fill=Tix.BOTH)
549
550 win.place(x=30, y=150, width=190, height=120)
551
552 rh = Tix.ResizeHandle(top, bg='black',
Tim Peters182b5ac2004-07-18 06:16:08 +0000553 relief=Tix.RAISED,
554 handlesize=8, gridded=1, minwidth=50, minheight=30)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000555 btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SWindow_reset(w,x))
556 top.propagate(0)
557 msg.pack(fill=Tix.X)
558 btn.pack(anchor=Tix.CENTER)
559 top.pack(expand=1, fill=Tix.BOTH)
560 bot.pack(fill=Tix.BOTH)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000561
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000562 win.bind('<Map>', func=lambda arg=0, rh=rh, win=win:
Tim Peters182b5ac2004-07-18 06:16:08 +0000563 win.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(win)))
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000564
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000565def SWindow_reset(rh, win):
566 win.place(x=30, y=150, width=190, height=120)
567 win.update()
568 rh.attach_widget(win)
569
570def MkSText(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000571 """The TixScrolledWindow widget allows you to scroll any kind of Tk
572 widget. It is more versatile than a scrolled canvas widget."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000573 top = Tix.Frame(w, width=330, height=330)
574 bot = Tix.Frame(w)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000575 msg = Tix.Message(top,
Tim Peters182b5ac2004-07-18 06:16:08 +0000576 relief=Tix.FLAT, width=200, anchor=Tix.N,
577 text='The Tix ScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000578
579 win = Tix.ScrolledText(top, scrollbar='auto')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000580 win.text['wrap'] = 'none'
581 win.text.insert(Tix.END, '''When -scrollbar is set to "auto", the
Tim Peters182b5ac2004-07-18 06:16:08 +0000582scrollbars are shown only when needed.
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000583Additional modifiers can be used to force a
Tim Peters182b5ac2004-07-18 06:16:08 +0000584scrollbar to be shown or hidden. For example,
585"auto -y" means the horizontal scrollbar
586should be shown when needed but the vertical
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000587scrollbar should always be hidden;
588"auto +x" means the vertical scrollbar
Tim Peters182b5ac2004-07-18 06:16:08 +0000589should be shown when needed but the horizontal
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000590scrollbar should always be shown, and so on.'''
591)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000592 win.place(x=30, y=150, width=190, height=100)
593
594 rh = Tix.ResizeHandle(top, bg='black',
Tim Peters182b5ac2004-07-18 06:16:08 +0000595 relief=Tix.RAISED,
596 handlesize=8, gridded=1, minwidth=50, minheight=30)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000597 btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SText_reset(w,x))
598 top.propagate(0)
599 msg.pack(fill=Tix.X)
600 btn.pack(anchor=Tix.CENTER)
601 top.pack(expand=1, fill=Tix.BOTH)
602 bot.pack(fill=Tix.BOTH)
603 win.bind('<Map>', func=lambda arg=0, rh=rh, win=win:
Tim Peters182b5ac2004-07-18 06:16:08 +0000604 win.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(win)))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000605
606def SText_reset(rh, win):
607 win.place(x=30, y=150, width=190, height=120)
608 win.update()
609 rh.attach_widget(win)
610
611def MkManager(nb, name):
612 w = nb.page(name)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000613 options='label.padX 4'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000614
Martin v. Löwis46874282002-12-06 10:33:45 +0000615 pane = Tix.LabelFrame(w, label='Tix.PanedWindow', options=options)
616 note = Tix.LabelFrame(w, label='Tix.NoteBook', options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000617
618 MkPanedWindow(pane.frame)
619 MkNoteBook(note.frame)
620
621 pane.form(top=0, left=0, right=note, bottom=-1)
622 note.form(top=0, right=-1, bottom=-1)
623
624def MkPanedWindow(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000625 """The PanedWindow widget allows the user to interactively manipulate
626 the sizes of several panes. The panes can be arranged either vertically
627 or horizontally.
628 """
629 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000630 relief=Tix.FLAT, width=240, anchor=Tix.N,
631 text='The PanedWindow widget allows the user to interactively manipulate the sizes of several panes. The panes can be arranged either vertically or horizontally.')
Martin v. Löwis652e1912001-11-25 14:50:56 +0000632 group = Tix.LabelEntry(w, label='Newsgroup:', options='entry.width 25')
633 group.entry.insert(0,'comp.lang.python')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000634 pane = Tix.PanedWindow(w, orientation='vertical')
635
636 p1 = pane.add('list', min=70, size=100)
637 p2 = pane.add('text', min=70)
638 list = Tix.ScrolledListBox(p1)
639 text = Tix.ScrolledText(p2)
640
Martin v. Löwis652e1912001-11-25 14:50:56 +0000641 list.listbox.insert(Tix.END, " 12324 Re: Tkinter is good for your health")
642 list.listbox.insert(Tix.END, "+ 12325 Re: Tkinter is good for your health")
643 list.listbox.insert(Tix.END, "+ 12326 Re: Tix is even better for your health (Was: Tkinter is good...)")
644 list.listbox.insert(Tix.END, " 12327 Re: Tix is even better for your health (Was: Tkinter is good...)")
645 list.listbox.insert(Tix.END, "+ 12328 Re: Tix is even better for your health (Was: Tkinter is good...)")
646 list.listbox.insert(Tix.END, " 12329 Re: Tix is even better for your health (Was: Tkinter is good...)")
647 list.listbox.insert(Tix.END, "+ 12330 Re: Tix is even better for your health (Was: Tkinter is good...)")
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000648
649 text.text['bg'] = list.listbox['bg']
650 text.text['wrap'] = 'none'
651 text.text.insert(Tix.END, """
Martin v. Löwis652e1912001-11-25 14:50:56 +0000652Mon, 19 Jun 1995 11:39:52 comp.lang.python Thread 34 of 220
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000653Lines 353 A new way to put text and bitmaps together iNo responses
654ioi@blue.seas.upenn.edu Ioi K. Lam at University of Pennsylvania
655
656Hi,
657
658I have implemented a new image type called "compound". It allows you
659to glue together a bunch of bitmaps, images and text strings together
660to form a bigger image. Then you can use this image with widgets that
661support the -image option. For example, you can display a text string string
662together with a bitmap, at the same time, inside a TK button widget.
663""")
664 list.pack(expand=1, fill=Tix.BOTH, padx=4, pady=6)
665 text.pack(expand=1, fill=Tix.BOTH, padx=4, pady=6)
666
667 msg.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
668 group.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
669 pane.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH, expand=1)
670
671def MkNoteBook(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000672 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000673 relief=Tix.FLAT, width=240, anchor=Tix.N,
674 text='The NoteBook widget allows you to layout a complex interface into individual pages.')
Neal Norwitzac30ead2002-11-14 02:44:08 +0000675 # prefix = Tix.OptionName(w)
676 # if not prefix: prefix = ''
677 # w.option_add('*' + prefix + '*TixNoteBook*tagPadX', 8)
678 options = "entry.width %d label.width %d label.anchor %s" % (10, 18, Tix.E)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000679
Neal Norwitzac30ead2002-11-14 02:44:08 +0000680 nb = Tix.NoteBook(w, ipadx=6, ipady=6, options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000681 nb.add('hard_disk', label="Hard Disk", underline=0)
682 nb.add('network', label="Network", underline=0)
683
684 # Frame for the buttons that are present on all pages
685 common = Tix.Frame(nb.hard_disk)
686 common.pack(side=Tix.RIGHT, padx=2, pady=2, fill=Tix.Y)
687 CreateCommonButtons(common)
688
689 # Widgets belonging only to this page
690 a = Tix.Control(nb.hard_disk, value=12, label='Access Time: ')
691 w = Tix.Control(nb.hard_disk, value=400, label='Write Throughput: ')
692 r = Tix.Control(nb.hard_disk, value=400, label='Read Throughput: ')
693 c = Tix.Control(nb.hard_disk, value=1021, label='Capacity: ')
694 a.pack(side=Tix.TOP, padx=20, pady=2)
695 w.pack(side=Tix.TOP, padx=20, pady=2)
696 r.pack(side=Tix.TOP, padx=20, pady=2)
697 c.pack(side=Tix.TOP, padx=20, pady=2)
698
699 common = Tix.Frame(nb.network)
700 common.pack(side=Tix.RIGHT, padx=2, pady=2, fill=Tix.Y)
701 CreateCommonButtons(common)
702
703 a = Tix.Control(nb.network, value=12, label='Access Time: ')
704 w = Tix.Control(nb.network, value=400, label='Write Throughput: ')
705 r = Tix.Control(nb.network, value=400, label='Read Throughput: ')
706 c = Tix.Control(nb.network, value=1021, label='Capacity: ')
707 u = Tix.Control(nb.network, value=10, label='Users: ')
708 a.pack(side=Tix.TOP, padx=20, pady=2)
709 w.pack(side=Tix.TOP, padx=20, pady=2)
710 r.pack(side=Tix.TOP, padx=20, pady=2)
711 c.pack(side=Tix.TOP, padx=20, pady=2)
712 u.pack(side=Tix.TOP, padx=20, pady=2)
713
714 msg.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
715 nb.pack(side=Tix.TOP, padx=5, pady=5, fill=Tix.BOTH, expand=1)
716
717def CreateCommonButtons(f):
718 ok = Tix.Button(f, text='OK', width = 6)
719 cancel = Tix.Button(f, text='Cancel', width = 6)
720 ok.pack(side=Tix.TOP, padx=2, pady=2)
721 cancel.pack(side=Tix.TOP, padx=2, pady=2)
722
723def MkDirList(nb, name):
724 w = nb.page(name)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000725 options = "label.padX 4"
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000726
Martin v. Löwis46874282002-12-06 10:33:45 +0000727 dir = Tix.LabelFrame(w, label='Tix.DirList', options=options)
728 fsbox = Tix.LabelFrame(w, label='Tix.ExFileSelectBox', options=options)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000729 MkDirListWidget(dir.frame)
730 MkExFileWidget(fsbox.frame)
731 dir.form(top=0, left=0, right='%40', bottom=-1)
732 fsbox.form(top=0, left='%40', right=-1, bottom=-1)
733
734def MkDirListWidget(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000735 """The TixDirList widget gives a graphical representation of the file
736 system directory and makes it easy for the user to choose and access
737 directories.
738 """
739 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000740 relief=Tix.FLAT, width=240, anchor=Tix.N,
741 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.')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000742 dirlist = Tix.DirList(w, options='hlist.padY 1 hlist.width 25 hlist.height 16')
743 msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
744 dirlist.pack(side=Tix.TOP, padx=3, pady=3)
745
746def MkExFileWidget(w):
Neal Norwitzac30ead2002-11-14 02:44:08 +0000747 """The TixExFileSelectBox widget is more user friendly than the Motif
748 style FileSelectBox. """
749 msg = Tix.Message(w,
Tim Peters182b5ac2004-07-18 06:16:08 +0000750 relief=Tix.FLAT, width=240, anchor=Tix.N,
751 text='The Tix ExFileSelectBox widget is more user friendly than the Motif style FileSelectBox.')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000752 # There's a bug in the ComboBoxes - the scrolledlistbox is destroyed
753 box = Tix.ExFileSelectBox(w, bd=2, relief=Tix.RAISED)
754 msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
755 box.pack(side=Tix.TOP, padx=3, pady=3)
756
757###
758### List of all the demos we want to show off
759comments = {'widget' : 'Widget Demos', 'image' : 'Image Demos'}
Tim Peters182b5ac2004-07-18 06:16:08 +0000760samples = {'Balloon' : 'Balloon',
761 'Button Box' : 'BtnBox',
762 'Combo Box' : 'ComboBox',
763 'Compound Image' : 'CmpImg',
764 'Directory List' : 'DirList',
765 'Directory Tree' : 'DirTree',
766 'Control' : 'Control',
767 'Notebook' : 'NoteBook',
768 'Option Menu' : 'OptMenu',
769 'Paned Window' : 'PanedWin',
770 'Popup Menu' : 'PopMenu',
771 'ScrolledHList (1)' : 'SHList1',
772 'ScrolledHList (2)' : 'SHList2',
773 'Tree (dynamic)' : 'Tree'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000774}
775
Martin v. Löwis20efa682001-11-11 14:07:37 +0000776# There are still a lot of demos to be translated:
Tim Peters182b5ac2004-07-18 06:16:08 +0000777## set root {
778## {d "File Selectors" file }
779## {d "Hierachical ListBox" hlist }
780## {d "Tabular ListBox" tlist {c tixTList}}
781## {d "Grid Widget" grid {c tixGrid}}
782## {d "Manager Widgets" manager }
783## {d "Scrolled Widgets" scroll }
784## {d "Miscellaneous Widgets" misc }
785## {d "Image Types" image }
786## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000787##
Tim Peters182b5ac2004-07-18 06:16:08 +0000788## set image {
789## {d "Compound Image" cmpimg }
790## {d "XPM Image" xpm {i pixmap}}
791## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000792##
Tim Peters182b5ac2004-07-18 06:16:08 +0000793## set cmpimg {
794##done {f "In Buttons" CmpImg.tcl }
795## {f "In NoteBook" CmpImg2.tcl }
796## {f "Notebook Color Tabs" CmpImg4.tcl }
797## {f "Icons" CmpImg3.tcl }
798## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000799##
Tim Peters182b5ac2004-07-18 06:16:08 +0000800## set xpm {
801## {f "In Button" Xpm.tcl {i pixmap}}
802## {f "In Menu" Xpm1.tcl {i pixmap}}
803## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000804##
Tim Peters182b5ac2004-07-18 06:16:08 +0000805## set file {
806##added {f DirList DirList.tcl }
807##added {f DirTree DirTree.tcl }
808## {f DirSelectDialog DirDlg.tcl }
809## {f ExFileSelectDialog EFileDlg.tcl }
810## {f FileSelectDialog FileDlg.tcl }
811## {f FileEntry FileEnt.tcl }
812## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000813##
Tim Peters182b5ac2004-07-18 06:16:08 +0000814## set hlist {
815## {f HList HList1.tcl }
816## {f CheckList ChkList.tcl {c tixCheckList}}
817##done {f "ScrolledHList (1)" SHList.tcl }
818##done {f "ScrolledHList (2)" SHList2.tcl }
819##done {f Tree Tree.tcl }
820##done {f "Tree (Dynamic)" DynTree.tcl {v win}}
821## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000822##
Tim Peters182b5ac2004-07-18 06:16:08 +0000823## set tlist {
824## {f "ScrolledTList (1)" STList1.tcl {c tixTList}}
825## {f "ScrolledTList (2)" STList2.tcl {c tixTList}}
826## }
827## global tcl_platform
828## # This demo hangs windows
829## if {$tcl_platform(platform) != "windows"} {
830##na lappend tlist {f "TList File Viewer" STList3.tcl {c tixTList}}
831## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000832##
Tim Peters182b5ac2004-07-18 06:16:08 +0000833## set grid {
834##na {f "Simple Grid" SGrid0.tcl {c tixGrid}}
835##na {f "ScrolledGrid" SGrid1.tcl {c tixGrid}}
836##na {f "Editable Grid" EditGrid.tcl {c tixGrid}}
837## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000838##
Tim Peters182b5ac2004-07-18 06:16:08 +0000839## set scroll {
840## {f ScrolledListBox SListBox.tcl }
841## {f ScrolledText SText.tcl }
842## {f ScrolledWindow SWindow.tcl }
843##na {f "Canvas Object View" CObjView.tcl {c tixCObjView}}
844## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000845##
Tim Peters182b5ac2004-07-18 06:16:08 +0000846## set manager {
847## {f ListNoteBook ListNBK.tcl }
848##done {f NoteBook NoteBook.tcl }
849##done {f PanedWindow PanedWin.tcl }
850## }
Neal Norwitzac30ead2002-11-14 02:44:08 +0000851##
Tim Peters182b5ac2004-07-18 06:16:08 +0000852## set misc {
853##done {f Balloon Balloon.tcl }
854##done {f ButtonBox BtnBox.tcl }
855##done {f ComboBox ComboBox.tcl }
856##done {f Control Control.tcl }
857## {f LabelEntry LabEntry.tcl }
858## {f LabelFrame LabFrame.tcl }
859## {f Meter Meter.tcl {c tixMeter}}
860##done {f OptionMenu OptMenu.tcl }
861##done {f PopupMenu PopMenu.tcl }
862## {f Select Select.tcl }
863## {f StdButtonBox StdBBox.tcl }
864## }
Martin v. Löwis20efa682001-11-11 14:07:37 +0000865##
866
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000867stypes = {}
868stypes['widget'] = ['Balloon', 'Button Box', 'Combo Box', 'Control',
Martin v. Löwis20efa682001-11-11 14:07:37 +0000869 'Directory List', 'Directory Tree',
Tim Peters182b5ac2004-07-18 06:16:08 +0000870 'Notebook', 'Option Menu', 'Popup Menu', 'Paned Window',
871 'ScrolledHList (1)', 'ScrolledHList (2)', 'Tree (dynamic)']
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000872stypes['image'] = ['Compound Image']
873
874def MkSample(nb, name):
875 w = nb.page(name)
Neal Norwitzac30ead2002-11-14 02:44:08 +0000876 options = "label.padX 4"
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000877
Martin v. Löwis652e1912001-11-25 14:50:56 +0000878 pane = Tix.PanedWindow(w, orientation='horizontal')
879 pane.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH)
880 f1 = pane.add('list', expand='1')
881 f2 = pane.add('text', expand='5')
882 f1['relief'] = 'flat'
883 f2['relief'] = 'flat'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000884
Neal Norwitzac30ead2002-11-14 02:44:08 +0000885 lab = Tix.LabelFrame(f1, label='Select a sample program:')
886 lab.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5, pady=5)
887 lab1 = Tix.LabelFrame(f2, label='Source:')
888 lab1.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5, pady=5)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000889
Neal Norwitzac30ead2002-11-14 02:44:08 +0000890 slb = Tix.Tree(lab.frame, options='hlist.width 20')
Martin v. Löwis652e1912001-11-25 14:50:56 +0000891 slb.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5)
892
Neal Norwitzac30ead2002-11-14 02:44:08 +0000893 stext = Tix.ScrolledText(lab1.frame, name='stext')
Martin v. Löwis20efa682001-11-11 14:07:37 +0000894 font = root.tk.eval('tix option get fixed_font')
895 stext.text.config(font=font)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000896
Neal Norwitzac30ead2002-11-14 02:44:08 +0000897 frame = Tix.Frame(lab1.frame, name='frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000898
Martin v. Löwis652e1912001-11-25 14:50:56 +0000899 run = Tix.Button(frame, text='Run ...', name='run')
900 view = Tix.Button(frame, text='View Source ...', name='view')
901 run.pack(side=Tix.LEFT, expand=0, fill=Tix.NONE)
902 view.pack(side=Tix.LEFT, expand=0, fill=Tix.NONE)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000903
904 stext.text['bg'] = slb.hlist['bg']
905 stext.text['state'] = 'disabled'
906 stext.text['wrap'] = 'none'
Martin v. Löwis652e1912001-11-25 14:50:56 +0000907 stext.text['width'] = 80
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000908
Neal Norwitzac30ead2002-11-14 02:44:08 +0000909 frame.pack(side=Tix.BOTTOM, expand=0, fill=Tix.X, padx=7)
910 stext.pack(side=Tix.TOP, expand=0, fill=Tix.BOTH, padx=7)
911
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000912 slb.hlist['separator'] = '.'
913 slb.hlist['width'] = 25
914 slb.hlist['drawbranch'] = 0
915 slb.hlist['indent'] = 10
916 slb.hlist['wideselect'] = 1
Martin v. Löwis652e1912001-11-25 14:50:56 +0000917 slb.hlist['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'run')
918 slb.hlist['browsecmd'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'browse')
919
920 run['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'run')
921 view['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'view')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000922
923 for type in ['widget', 'image']:
Tim Peters182b5ac2004-07-18 06:16:08 +0000924 if type != 'widget':
925 x = Tix.Frame(slb.hlist, bd=2, height=2, width=150,
926 relief=Tix.SUNKEN, bg=slb.hlist['bg'])
927 slb.hlist.add_child(itemtype=Tix.WINDOW, window=x, state='disabled')
928 x = slb.hlist.add_child(itemtype=Tix.TEXT, state='disabled',
929 text=comments[type])
930 for key in stypes[type]:
931 slb.hlist.add_child(x, itemtype=Tix.TEXT, data=key,
932 text=key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000933 slb.hlist.selection_clear()
934
935 run['state'] = 'disabled'
936 view['state'] = 'disabled'
937
Martin v. Löwis652e1912001-11-25 14:50:56 +0000938def Sample_Action(w, slb, stext, run, view, action):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000939 global demo
940
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000941 hlist = slb.hlist
942 anchor = hlist.info_anchor()
943 if not anchor:
Tim Peters182b5ac2004-07-18 06:16:08 +0000944 run['state'] = 'disabled'
945 view['state'] = 'disabled'
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000946 elif not hlist.info_parent(anchor):
Tim Peters182b5ac2004-07-18 06:16:08 +0000947 # a comment
948 return
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000949
950 run['state'] = 'normal'
951 view['state'] = 'normal'
952 key = hlist.info_data(anchor)
953 title = key
954 prog = samples[key]
955
956 if action == 'run':
Tim Peters182b5ac2004-07-18 06:16:08 +0000957 exec('import ' + prog)
958 w = Tix.Toplevel()
959 w.title(title)
960 rtn = eval(prog + '.RunSample')
961 rtn(w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000962 elif action == 'view':
Tim Peters182b5ac2004-07-18 06:16:08 +0000963 w = Tix.Toplevel()
964 w.title('Source view: ' + title)
965 LoadFile(w, demo.dir + '/samples/' + prog + '.py')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000966 elif action == 'browse':
Tim Peters182b5ac2004-07-18 06:16:08 +0000967 ReadFile(stext.text, demo.dir + '/samples/' + prog + '.py')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000968
969def LoadFile(w, fname):
Martin v. Löwis20efa682001-11-11 14:07:37 +0000970 global root
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000971 b = Tix.Button(w, text='Close', command=w.destroy)
972 t = Tix.ScrolledText(w)
973 # b.form(left=0, bottom=0, padx=4, pady=4)
974 # t.form(left=0, bottom=b, right='-0', top=0)
975 t.pack()
976 b.pack()
977
Martin v. Löwis20efa682001-11-11 14:07:37 +0000978 font = root.tk.eval('tix option get fixed_font')
979 t.text.config(font=font)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000980 t.text['bd'] = 2
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000981 t.text['wrap'] = 'none'
982
983 ReadFile(t.text, fname)
984
985def ReadFile(w, fname):
986 old_state = w['state']
987 w['state'] = 'normal'
988 w.delete('0.0', Tix.END)
989
990 try:
Tim Peters182b5ac2004-07-18 06:16:08 +0000991 f = open(fname)
992 lines = f.readlines()
993 for s in lines:
994 w.insert(Tix.END, s)
995 f.close()
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000996 finally:
Tim Peters182b5ac2004-07-18 06:16:08 +0000997# w.see('1.0')
998 w['state'] = old_state
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000999
1000if __name__ == '__main__':
Martin v. Löwis20efa682001-11-11 14:07:37 +00001001 root = Tix.Tk()
1002 RunMain(root)