1 | # -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
|
---|
2 | #
|
---|
3 | # $Id: tixwidgets.py 36560 2004-07-18 06:16:08Z tim_one $
|
---|
4 | #
|
---|
5 | # tixwidgets.py --
|
---|
6 | #
|
---|
7 | # For Tix, see http://tix.sourceforge.net
|
---|
8 | #
|
---|
9 | # 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
|
---|
11 | #
|
---|
12 | # % python tixwidgets.py
|
---|
13 | #
|
---|
14 |
|
---|
15 | import os, os.path, sys, Tix
|
---|
16 | from Tkconstants import *
|
---|
17 | import traceback, tkMessageBox
|
---|
18 |
|
---|
19 | TCL_DONT_WAIT = 1<<1
|
---|
20 | TCL_WINDOW_EVENTS = 1<<2
|
---|
21 | TCL_FILE_EVENTS = 1<<3
|
---|
22 | TCL_TIMER_EVENTS = 1<<4
|
---|
23 | TCL_IDLE_EVENTS = 1<<5
|
---|
24 | TCL_ALL_EVENTS = 0
|
---|
25 |
|
---|
26 | class Demo:
|
---|
27 | def __init__(self, top):
|
---|
28 | self.root = top
|
---|
29 | self.exit = -1
|
---|
30 |
|
---|
31 | self.dir = None # script directory
|
---|
32 | self.balloon = None # balloon widget
|
---|
33 | self.useBalloons = Tix.StringVar()
|
---|
34 | self.useBalloons.set('0')
|
---|
35 | self.statusbar = None # status bar widget
|
---|
36 | self.welmsg = None # Msg widget
|
---|
37 | self.welfont = '' # font name
|
---|
38 | self.welsize = '' # font size
|
---|
39 |
|
---|
40 | 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')
|
---|
56 |
|
---|
57 | 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)
|
---|
64 | fm = Tix.Menu(file, tearoff=0)
|
---|
65 | file['menu'] = fm
|
---|
66 | hm = Tix.Menu(help, tearoff=0)
|
---|
67 | help['menu'] = hm
|
---|
68 |
|
---|
69 | fm.add_command(label='Exit', underline=1,
|
---|
70 | 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'
|
---|
74 | #apply(w.tk.call, ('trace', 'variable', self.useBalloons, 'w',
|
---|
75 | # ToggleHelp))
|
---|
76 |
|
---|
77 | return w
|
---|
78 |
|
---|
79 | def MkMainNotebook(self):
|
---|
80 | top = self.root
|
---|
81 | w = Tix.NoteBook(top, ipadx=5, ipady=5, options="""
|
---|
82 | tagPadX 6
|
---|
83 | tagPadY 4
|
---|
84 | borderWidth 2
|
---|
85 | """)
|
---|
86 | # This may be required if there is no *Background option
|
---|
87 | top['bg'] = w['bg']
|
---|
88 |
|
---|
89 | w.add('wel', label='Welcome', underline=0,
|
---|
90 | createcmd=lambda w=w, name='wel': MkWelcome(w, name))
|
---|
91 | w.add('cho', label='Choosers', underline=0,
|
---|
92 | createcmd=lambda w=w, name='cho': MkChoosers(w, name))
|
---|
93 | w.add('scr', label='Scrolled Widgets', underline=0,
|
---|
94 | createcmd=lambda w=w, name='scr': MkScroll(w, name))
|
---|
95 | w.add('mgr', label='Manager Widgets', underline=0,
|
---|
96 | createcmd=lambda w=w, name='mgr': MkManager(w, name))
|
---|
97 | w.add('dir', label='Directory List', underline=0,
|
---|
98 | createcmd=lambda w=w, name='dir': MkDirList(w, name))
|
---|
99 | w.add('exp', label='Run Sample Programs', underline=0,
|
---|
100 | createcmd=lambda w=w, name='exp': MkSample(w, name))
|
---|
101 | return w
|
---|
102 |
|
---|
103 | def MkMainStatus(self):
|
---|
104 | global demo
|
---|
105 | top = self.root
|
---|
106 |
|
---|
107 | w = Tix.Frame(top, relief=Tix.RAISED, bd=1)
|
---|
108 | demo.statusbar = Tix.Label(w, relief=Tix.SUNKEN, bd=1)
|
---|
109 | demo.statusbar.form(padx=3, pady=3, left=0, right='%70')
|
---|
110 | return w
|
---|
111 |
|
---|
112 | def build(self):
|
---|
113 | root = self.root
|
---|
114 | z = root.winfo_toplevel()
|
---|
115 | z.wm_title('Tix Widget Demonstration')
|
---|
116 | if z.winfo_screenwidth() <= 800:
|
---|
117 | z.geometry('790x590+10+10')
|
---|
118 | else:
|
---|
119 | z.geometry('890x640+10+10')
|
---|
120 | demo.balloon = Tix.Balloon(root)
|
---|
121 | frame1 = self.MkMainMenu()
|
---|
122 | frame2 = self.MkMainNotebook()
|
---|
123 | frame3 = self.MkMainStatus()
|
---|
124 | frame1.pack(side=TOP, fill=X)
|
---|
125 | frame3.pack(side=BOTTOM, fill=X)
|
---|
126 | frame2.pack(side=TOP, expand=1, fill=BOTH, padx=4, pady=4)
|
---|
127 | demo.balloon['statusbar'] = demo.statusbar
|
---|
128 | z.wm_protocol("WM_DELETE_WINDOW", lambda self=self: self.quitcmd())
|
---|
129 |
|
---|
130 | # To show Tcl errors - uncomment this to see the listbox bug.
|
---|
131 | # Tkinter defines a Tcl tkerror procedure that in effect
|
---|
132 | # silences all background Tcl error reporting.
|
---|
133 | # root.tk.eval('if {[info commands tkerror] != ""} {rename tkerror pytkerror}')
|
---|
134 | def quitcmd (self):
|
---|
135 | """Quit our mainloop. It is up to you to call root.destroy() after."""
|
---|
136 | self.exit = 0
|
---|
137 |
|
---|
138 | def loop(self):
|
---|
139 | """This is an explict replacement for _tkinter mainloop()
|
---|
140 | It lets you catch keyboard interrupts easier, and avoids
|
---|
141 | the 20 msec. dead sleep() which burns a constant CPU."""
|
---|
142 | while self.exit < 0:
|
---|
143 | # There are 2 whiles here. The outer one lets you continue
|
---|
144 | # after a ^C interrupt.
|
---|
145 | try:
|
---|
146 | # This is the replacement for _tkinter mainloop()
|
---|
147 | # It blocks waiting for the next Tcl event using select.
|
---|
148 | while self.exit < 0:
|
---|
149 | self.root.tk.dooneevent(TCL_ALL_EVENTS)
|
---|
150 | except SystemExit:
|
---|
151 | # Tkinter uses SystemExit to exit
|
---|
152 | #print 'Exit'
|
---|
153 | self.exit = 1
|
---|
154 | return
|
---|
155 | except KeyboardInterrupt:
|
---|
156 | if tkMessageBox.askquestion ('Interrupt', 'Really Quit?') == 'yes':
|
---|
157 | # self.tk.eval('exit')
|
---|
158 | self.exit = 1
|
---|
159 | return
|
---|
160 | continue
|
---|
161 | except:
|
---|
162 | # Otherwise it's some other error - be nice and say why
|
---|
163 | t, v, tb = sys.exc_info()
|
---|
164 | text = ""
|
---|
165 | for line in traceback.format_exception(t,v,tb):
|
---|
166 | text += line + '\n'
|
---|
167 | try: tkMessageBox.showerror ('Error', text)
|
---|
168 | except: pass
|
---|
169 | self.exit = 1
|
---|
170 | raise SystemExit, 1
|
---|
171 |
|
---|
172 | def destroy (self):
|
---|
173 | self.root.destroy()
|
---|
174 |
|
---|
175 | def RunMain(root):
|
---|
176 | global demo
|
---|
177 |
|
---|
178 | demo = Demo(root)
|
---|
179 |
|
---|
180 | demo.build()
|
---|
181 | demo.loop()
|
---|
182 | demo.destroy()
|
---|
183 |
|
---|
184 | # Tabs
|
---|
185 | def MkWelcome(nb, name):
|
---|
186 | w = nb.page(name)
|
---|
187 | bar = MkWelcomeBar(w)
|
---|
188 | text = MkWelcomeText(w)
|
---|
189 | bar.pack(side=TOP, fill=X, padx=2, pady=2)
|
---|
190 | text.pack(side=TOP, fill=BOTH, expand=1)
|
---|
191 |
|
---|
192 | def MkWelcomeBar(top):
|
---|
193 | global demo
|
---|
194 |
|
---|
195 | w = Tix.Frame(top, bd=2, relief=Tix.GROOVE)
|
---|
196 | b1 = Tix.ComboBox(w, command=lambda w=top: MainTextFont(w))
|
---|
197 | b2 = Tix.ComboBox(w, command=lambda w=top: MainTextFont(w))
|
---|
198 | b1.entry['width'] = 15
|
---|
199 | b1.slistbox.listbox['height'] = 3
|
---|
200 | b2.entry['width'] = 4
|
---|
201 | b2.slistbox.listbox['height'] = 3
|
---|
202 |
|
---|
203 | demo.welfont = b1
|
---|
204 | demo.welsize = b2
|
---|
205 |
|
---|
206 | b1.insert(Tix.END, 'Courier')
|
---|
207 | b1.insert(Tix.END, 'Helvetica')
|
---|
208 | b1.insert(Tix.END, 'Lucida')
|
---|
209 | b1.insert(Tix.END, 'Times Roman')
|
---|
210 |
|
---|
211 | b2.insert(Tix.END, '8')
|
---|
212 | b2.insert(Tix.END, '10')
|
---|
213 | b2.insert(Tix.END, '12')
|
---|
214 | b2.insert(Tix.END, '14')
|
---|
215 | b2.insert(Tix.END, '18')
|
---|
216 |
|
---|
217 | b1.pick(1)
|
---|
218 | b2.pick(3)
|
---|
219 |
|
---|
220 | b1.pack(side=Tix.LEFT, padx=4, pady=4)
|
---|
221 | b2.pack(side=Tix.LEFT, padx=4, pady=4)
|
---|
222 |
|
---|
223 | demo.balloon.bind_widget(b1, msg='Choose\na font',
|
---|
224 | statusmsg='Choose a font for this page')
|
---|
225 | demo.balloon.bind_widget(b2, msg='Point size',
|
---|
226 | statusmsg='Choose the font size for this page')
|
---|
227 | return w
|
---|
228 |
|
---|
229 | def MkWelcomeText(top):
|
---|
230 | global demo
|
---|
231 |
|
---|
232 | w = Tix.ScrolledWindow(top, scrollbar='auto')
|
---|
233 | win = w.window
|
---|
234 | text = 'Welcome to TIX in Python'
|
---|
235 | title = Tix.Label(win,
|
---|
236 | bd=0, width=30, anchor=Tix.N, text=text)
|
---|
237 | msg = Tix.Message(win,
|
---|
238 | bd=0, width=400, anchor=Tix.N,
|
---|
239 | text='Tix is a set of mega-widgets based on TK. This program \
|
---|
240 | demonstrates the widgets in the Tix widget set. You can choose the pages \
|
---|
241 | in this window to look at the corresponding widgets. \n\n\
|
---|
242 | To quit this program, choose the "File | Exit" command.\n\n\
|
---|
243 | For more information, see http://tix.sourceforge.net.')
|
---|
244 | title.pack(expand=1, fill=Tix.BOTH, padx=10, pady=10)
|
---|
245 | msg.pack(expand=1, fill=Tix.BOTH, padx=10, pady=10)
|
---|
246 | demo.welmsg = msg
|
---|
247 | return w
|
---|
248 |
|
---|
249 | def MainTextFont(w):
|
---|
250 | global demo
|
---|
251 |
|
---|
252 | if not demo.welmsg:
|
---|
253 | return
|
---|
254 | font = demo.welfont['value']
|
---|
255 | point = demo.welsize['value']
|
---|
256 | if font == 'Times Roman':
|
---|
257 | font = 'times'
|
---|
258 | fontstr = '%s %s' % (font, point)
|
---|
259 | demo.welmsg['font'] = fontstr
|
---|
260 |
|
---|
261 | def ToggleHelp():
|
---|
262 | if demo.useBalloons.get() == '1':
|
---|
263 | demo.balloon['state'] = 'both'
|
---|
264 | else:
|
---|
265 | demo.balloon['state'] = 'none'
|
---|
266 |
|
---|
267 | def MkChoosers(nb, name):
|
---|
268 | w = nb.page(name)
|
---|
269 | options = "label.padX 4"
|
---|
270 |
|
---|
271 | til = Tix.LabelFrame(w, label='Chooser Widgets', options=options)
|
---|
272 | cbx = Tix.LabelFrame(w, label='tixComboBox', options=options)
|
---|
273 | ctl = Tix.LabelFrame(w, label='tixControl', options=options)
|
---|
274 | sel = Tix.LabelFrame(w, label='tixSelect', options=options)
|
---|
275 | opt = Tix.LabelFrame(w, label='tixOptionMenu', options=options)
|
---|
276 | fil = Tix.LabelFrame(w, label='tixFileEntry', options=options)
|
---|
277 | fbx = Tix.LabelFrame(w, label='tixFileSelectBox', options=options)
|
---|
278 | tbr = Tix.LabelFrame(w, label='Tool Bar', options=options)
|
---|
279 |
|
---|
280 | MkTitle(til.frame)
|
---|
281 | MkCombo(cbx.frame)
|
---|
282 | MkControl(ctl.frame)
|
---|
283 | MkSelect(sel.frame)
|
---|
284 | MkOptMenu(opt.frame)
|
---|
285 | MkFileEnt(fil.frame)
|
---|
286 | MkFileBox(fbx.frame)
|
---|
287 | MkToolBar(tbr.frame)
|
---|
288 |
|
---|
289 | # First column: comBox and selector
|
---|
290 | cbx.form(top=0, left=0, right='%33')
|
---|
291 | sel.form(left=0, right='&'+str(cbx), top=cbx)
|
---|
292 | opt.form(left=0, right='&'+str(cbx), top=sel, bottom=-1)
|
---|
293 |
|
---|
294 | # Second column: title .. etc
|
---|
295 | til.form(left=cbx, top=0,right='%66')
|
---|
296 | ctl.form(left=cbx, right='&'+str(til), top=til)
|
---|
297 | fil.form(left=cbx, right='&'+str(til), top=ctl)
|
---|
298 | tbr.form(left=cbx, right='&'+str(til), top=fil, bottom=-1)
|
---|
299 |
|
---|
300 | #
|
---|
301 | # Third column: file selection
|
---|
302 | fbx.form(right=-1, top=0, left='%66')
|
---|
303 |
|
---|
304 | def MkCombo(w):
|
---|
305 | options="label.width %d label.anchor %s entry.width %d" % (10, Tix.E, 14)
|
---|
306 |
|
---|
307 | static = Tix.ComboBox(w, label='Static', editable=0, options=options)
|
---|
308 | editable = Tix.ComboBox(w, label='Editable', editable=1, options=options)
|
---|
309 | history = Tix.ComboBox(w, label='History', editable=1, history=1,
|
---|
310 | anchor=Tix.E, options=options)
|
---|
311 | static.insert(Tix.END, 'January')
|
---|
312 | static.insert(Tix.END, 'February')
|
---|
313 | static.insert(Tix.END, 'March')
|
---|
314 | static.insert(Tix.END, 'April')
|
---|
315 | static.insert(Tix.END, 'May')
|
---|
316 | static.insert(Tix.END, 'June')
|
---|
317 | static.insert(Tix.END, 'July')
|
---|
318 | static.insert(Tix.END, 'August')
|
---|
319 | static.insert(Tix.END, 'September')
|
---|
320 | static.insert(Tix.END, 'October')
|
---|
321 | static.insert(Tix.END, 'November')
|
---|
322 | static.insert(Tix.END, 'December')
|
---|
323 |
|
---|
324 | editable.insert(Tix.END, 'Angola')
|
---|
325 | editable.insert(Tix.END, 'Bangladesh')
|
---|
326 | editable.insert(Tix.END, 'China')
|
---|
327 | editable.insert(Tix.END, 'Denmark')
|
---|
328 | editable.insert(Tix.END, 'Ecuador')
|
---|
329 |
|
---|
330 | history.insert(Tix.END, '/usr/bin/ksh')
|
---|
331 | history.insert(Tix.END, '/usr/local/lib/python')
|
---|
332 | history.insert(Tix.END, '/var/adm')
|
---|
333 |
|
---|
334 | static.pack(side=Tix.TOP, padx=5, pady=3)
|
---|
335 | editable.pack(side=Tix.TOP, padx=5, pady=3)
|
---|
336 | history.pack(side=Tix.TOP, padx=5, pady=3)
|
---|
337 |
|
---|
338 | states = ['Bengal', 'Delhi', 'Karnataka', 'Tamil Nadu']
|
---|
339 |
|
---|
340 | def spin_cmd(w, inc):
|
---|
341 | idx = states.index(demo_spintxt.get()) + inc
|
---|
342 | if idx < 0:
|
---|
343 | idx = len(states) - 1
|
---|
344 | elif idx >= len(states):
|
---|
345 | idx = 0
|
---|
346 | # following doesn't work.
|
---|
347 | # return states[idx]
|
---|
348 | demo_spintxt.set(states[idx]) # this works
|
---|
349 |
|
---|
350 | def spin_validate(w):
|
---|
351 | global states, demo_spintxt
|
---|
352 |
|
---|
353 | try:
|
---|
354 | i = states.index(demo_spintxt.get())
|
---|
355 | except ValueError:
|
---|
356 | return states[0]
|
---|
357 | return states[i]
|
---|
358 | # why this procedure works as opposed to the previous one beats me.
|
---|
359 |
|
---|
360 | def MkControl(w):
|
---|
361 | global demo_spintxt
|
---|
362 |
|
---|
363 | options="label.width %d label.anchor %s entry.width %d" % (10, Tix.E, 13)
|
---|
364 |
|
---|
365 | demo_spintxt = Tix.StringVar()
|
---|
366 | demo_spintxt.set(states[0])
|
---|
367 | simple = Tix.Control(w, label='Numbers', options=options)
|
---|
368 | spintxt = Tix.Control(w, label='States', variable=demo_spintxt,
|
---|
369 | options=options)
|
---|
370 | spintxt['incrcmd'] = lambda w=spintxt: spin_cmd(w, 1)
|
---|
371 | spintxt['decrcmd'] = lambda w=spintxt: spin_cmd(w, -1)
|
---|
372 | spintxt['validatecmd'] = lambda w=spintxt: spin_validate(w)
|
---|
373 |
|
---|
374 | simple.pack(side=Tix.TOP, padx=5, pady=3)
|
---|
375 | spintxt.pack(side=Tix.TOP, padx=5, pady=3)
|
---|
376 |
|
---|
377 | def MkSelect(w):
|
---|
378 | options = "label.anchor %s" % Tix.CENTER
|
---|
379 |
|
---|
380 | sel1 = Tix.Select(w, label='Mere Mortals', allowzero=1, radio=1,
|
---|
381 | orientation=Tix.VERTICAL,
|
---|
382 | labelside=Tix.TOP,
|
---|
383 | options=options)
|
---|
384 | sel2 = Tix.Select(w, label='Geeks', allowzero=1, radio=0,
|
---|
385 | orientation=Tix.VERTICAL,
|
---|
386 | labelside= Tix.TOP,
|
---|
387 | options=options)
|
---|
388 |
|
---|
389 | sel1.add('eat', text='Eat')
|
---|
390 | sel1.add('work', text='Work')
|
---|
391 | sel1.add('play', text='Play')
|
---|
392 | sel1.add('party', text='Party')
|
---|
393 | sel1.add('sleep', text='Sleep')
|
---|
394 |
|
---|
395 | sel2.add('eat', text='Eat')
|
---|
396 | sel2.add('prog1', text='Program')
|
---|
397 | sel2.add('prog2', text='Program')
|
---|
398 | sel2.add('prog3', text='Program')
|
---|
399 | sel2.add('sleep', text='Sleep')
|
---|
400 |
|
---|
401 | sel1.pack(side=Tix.LEFT, padx=5, pady=3, fill=Tix.X)
|
---|
402 | sel2.pack(side=Tix.LEFT, padx=5, pady=3, fill=Tix.X)
|
---|
403 |
|
---|
404 | def MkOptMenu(w):
|
---|
405 | options='menubutton.width 15 label.anchor %s' % Tix.E
|
---|
406 |
|
---|
407 | m = Tix.OptionMenu(w, label='File Format : ', options=options)
|
---|
408 | m.add_command('text', label='Plain Text')
|
---|
409 | m.add_command('post', label='PostScript')
|
---|
410 | m.add_command('format', label='Formatted Text')
|
---|
411 | m.add_command('html', label='HTML')
|
---|
412 | m.add_command('sep')
|
---|
413 | m.add_command('tex', label='LaTeX')
|
---|
414 | m.add_command('rtf', label='Rich Text Format')
|
---|
415 |
|
---|
416 | m.pack(fill=Tix.X, padx=5, pady=3)
|
---|
417 |
|
---|
418 | def MkFileEnt(w):
|
---|
419 | msg = Tix.Message(w,
|
---|
420 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
421 | text='Press the "open file" icon button and a TixFileSelectDialog will popup.')
|
---|
422 | ent = Tix.FileEntry(w, label='Select a file : ')
|
---|
423 | msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
|
---|
424 | ent.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
|
---|
425 |
|
---|
426 | def MkFileBox(w):
|
---|
427 | """The FileSelectBox is a Motif-style box with various enhancements.
|
---|
428 | For example, you can adjust the size of the two listboxes
|
---|
429 | and your past selections are recorded.
|
---|
430 | """
|
---|
431 | msg = Tix.Message(w,
|
---|
432 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
433 | 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.')
|
---|
434 | box = Tix.FileSelectBox(w)
|
---|
435 | msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
|
---|
436 | box.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
|
---|
437 |
|
---|
438 | def MkToolBar(w):
|
---|
439 | """The Select widget is also good for arranging buttons in a tool bar.
|
---|
440 | """
|
---|
441 | global demo
|
---|
442 |
|
---|
443 | options='frame.borderWidth 1'
|
---|
444 |
|
---|
445 | msg = Tix.Message(w,
|
---|
446 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
447 | text='The Select widget is also good for arranging buttons in a tool bar.')
|
---|
448 | bar = Tix.Frame(w, bd=2, relief=Tix.RAISED)
|
---|
449 | font = Tix.Select(w, allowzero=1, radio=0, label='', options=options)
|
---|
450 | para = Tix.Select(w, allowzero=0, radio=1, label='', options=options)
|
---|
451 |
|
---|
452 | font.add('bold', bitmap='@' + demo.dir + '/bitmaps/bold.xbm')
|
---|
453 | font.add('italic', bitmap='@' + demo.dir + '/bitmaps/italic.xbm')
|
---|
454 | font.add('underline', bitmap='@' + demo.dir + '/bitmaps/underline.xbm')
|
---|
455 | font.add('capital', bitmap='@' + demo.dir + '/bitmaps/capital.xbm')
|
---|
456 |
|
---|
457 | para.add('left', bitmap='@' + demo.dir + '/bitmaps/leftj.xbm')
|
---|
458 | para.add('right', bitmap='@' + demo.dir + '/bitmaps/rightj.xbm')
|
---|
459 | para.add('center', bitmap='@' + demo.dir + '/bitmaps/centerj.xbm')
|
---|
460 | para.add('justify', bitmap='@' + demo.dir + '/bitmaps/justify.xbm')
|
---|
461 |
|
---|
462 | msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
|
---|
463 | bar.pack(side=Tix.TOP, fill=Tix.X, padx=3, pady=3)
|
---|
464 | font.pack({'in':bar}, side=Tix.LEFT, padx=3, pady=3)
|
---|
465 | para.pack({'in':bar}, side=Tix.LEFT, padx=3, pady=3)
|
---|
466 |
|
---|
467 | def MkTitle(w):
|
---|
468 | msg = Tix.Message(w,
|
---|
469 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
470 | text='There are many types of "chooser" widgets that allow the user to input different types of information')
|
---|
471 | msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
|
---|
472 |
|
---|
473 | def MkScroll(nb, name):
|
---|
474 | w = nb.page(name)
|
---|
475 | options='label.padX 4'
|
---|
476 |
|
---|
477 | sls = Tix.LabelFrame(w, label='Tix.ScrolledListBox', options=options)
|
---|
478 | swn = Tix.LabelFrame(w, label='Tix.ScrolledWindow', options=options)
|
---|
479 | stx = Tix.LabelFrame(w, label='Tix.ScrolledText', options=options)
|
---|
480 |
|
---|
481 | MkSList(sls.frame)
|
---|
482 | MkSWindow(swn.frame)
|
---|
483 | MkSText(stx.frame)
|
---|
484 |
|
---|
485 | sls.form(top=0, left=0, right='%33', bottom=-1)
|
---|
486 | swn.form(top=0, left=sls, right='%66', bottom=-1)
|
---|
487 | stx.form(top=0, left=swn, right=-1, bottom=-1)
|
---|
488 |
|
---|
489 |
|
---|
490 | def MkSList(w):
|
---|
491 | """This TixScrolledListBox is configured so that it uses scrollbars
|
---|
492 | only when it is necessary. Use the handles to resize the listbox and
|
---|
493 | watch the scrollbars automatically appear and disappear. """
|
---|
494 | top = Tix.Frame(w, width=300, height=330)
|
---|
495 | bot = Tix.Frame(w)
|
---|
496 | msg = Tix.Message(top,
|
---|
497 | relief=Tix.FLAT, width=200, anchor=Tix.N,
|
---|
498 | 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.')
|
---|
499 |
|
---|
500 | list = Tix.ScrolledListBox(top, scrollbar='auto')
|
---|
501 | list.place(x=50, y=150, width=120, height=80)
|
---|
502 | list.listbox.insert(Tix.END, 'Alabama')
|
---|
503 | list.listbox.insert(Tix.END, 'California')
|
---|
504 | list.listbox.insert(Tix.END, 'Montana')
|
---|
505 | list.listbox.insert(Tix.END, 'New Jersey')
|
---|
506 | list.listbox.insert(Tix.END, 'New York')
|
---|
507 | list.listbox.insert(Tix.END, 'Pennsylvania')
|
---|
508 | list.listbox.insert(Tix.END, 'Washington')
|
---|
509 |
|
---|
510 | rh = Tix.ResizeHandle(top, bg='black',
|
---|
511 | relief=Tix.RAISED,
|
---|
512 | handlesize=8, gridded=1, minwidth=50, minheight=30)
|
---|
513 | btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=list: SList_reset(w,x))
|
---|
514 | top.propagate(0)
|
---|
515 | msg.pack(fill=Tix.X)
|
---|
516 | btn.pack(anchor=Tix.CENTER)
|
---|
517 | top.pack(expand=1, fill=Tix.BOTH)
|
---|
518 | bot.pack(fill=Tix.BOTH)
|
---|
519 | list.bind('<Map>', func=lambda arg=0, rh=rh, list=list:
|
---|
520 | list.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(list)))
|
---|
521 |
|
---|
522 | def SList_reset(rh, list):
|
---|
523 | list.place(x=50, y=150, width=120, height=80)
|
---|
524 | list.update()
|
---|
525 | rh.attach_widget(list)
|
---|
526 |
|
---|
527 | def MkSWindow(w):
|
---|
528 | """The ScrolledWindow widget allows you to scroll any kind of Tk
|
---|
529 | widget. It is more versatile than a scrolled canvas widget.
|
---|
530 | """
|
---|
531 | global demo
|
---|
532 |
|
---|
533 | text = 'The Tix ScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.'
|
---|
534 |
|
---|
535 | file = os.path.join(demo.dir, 'bitmaps', 'tix.gif')
|
---|
536 | if not os.path.isfile(file):
|
---|
537 | text += ' (Image missing)'
|
---|
538 |
|
---|
539 | top = Tix.Frame(w, width=330, height=330)
|
---|
540 | bot = Tix.Frame(w)
|
---|
541 | msg = Tix.Message(top,
|
---|
542 | relief=Tix.FLAT, width=200, anchor=Tix.N,
|
---|
543 | text=text)
|
---|
544 |
|
---|
545 | win = Tix.ScrolledWindow(top, scrollbar='auto')
|
---|
546 |
|
---|
547 | image1 = win.window.image_create('photo', file=file)
|
---|
548 | lbl = Tix.Label(win.window, image=image1)
|
---|
549 | lbl.pack(expand=1, fill=Tix.BOTH)
|
---|
550 |
|
---|
551 | win.place(x=30, y=150, width=190, height=120)
|
---|
552 |
|
---|
553 | rh = Tix.ResizeHandle(top, bg='black',
|
---|
554 | relief=Tix.RAISED,
|
---|
555 | handlesize=8, gridded=1, minwidth=50, minheight=30)
|
---|
556 | btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SWindow_reset(w,x))
|
---|
557 | top.propagate(0)
|
---|
558 | msg.pack(fill=Tix.X)
|
---|
559 | btn.pack(anchor=Tix.CENTER)
|
---|
560 | top.pack(expand=1, fill=Tix.BOTH)
|
---|
561 | bot.pack(fill=Tix.BOTH)
|
---|
562 |
|
---|
563 | win.bind('<Map>', func=lambda arg=0, rh=rh, win=win:
|
---|
564 | win.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(win)))
|
---|
565 |
|
---|
566 | def SWindow_reset(rh, win):
|
---|
567 | win.place(x=30, y=150, width=190, height=120)
|
---|
568 | win.update()
|
---|
569 | rh.attach_widget(win)
|
---|
570 |
|
---|
571 | def MkSText(w):
|
---|
572 | """The TixScrolledWindow widget allows you to scroll any kind of Tk
|
---|
573 | widget. It is more versatile than a scrolled canvas widget."""
|
---|
574 | top = Tix.Frame(w, width=330, height=330)
|
---|
575 | bot = Tix.Frame(w)
|
---|
576 | msg = Tix.Message(top,
|
---|
577 | relief=Tix.FLAT, width=200, anchor=Tix.N,
|
---|
578 | text='The Tix ScrolledWindow widget allows you to scroll any kind of Tk widget. It is more versatile than a scrolled canvas widget.')
|
---|
579 |
|
---|
580 | win = Tix.ScrolledText(top, scrollbar='auto')
|
---|
581 | win.text['wrap'] = 'none'
|
---|
582 | win.text.insert(Tix.END, '''When -scrollbar is set to "auto", the
|
---|
583 | scrollbars are shown only when needed.
|
---|
584 | Additional modifiers can be used to force a
|
---|
585 | scrollbar to be shown or hidden. For example,
|
---|
586 | "auto -y" means the horizontal scrollbar
|
---|
587 | should be shown when needed but the vertical
|
---|
588 | scrollbar should always be hidden;
|
---|
589 | "auto +x" means the vertical scrollbar
|
---|
590 | should be shown when needed but the horizontal
|
---|
591 | scrollbar should always be shown, and so on.'''
|
---|
592 | )
|
---|
593 | win.place(x=30, y=150, width=190, height=100)
|
---|
594 |
|
---|
595 | rh = Tix.ResizeHandle(top, bg='black',
|
---|
596 | relief=Tix.RAISED,
|
---|
597 | handlesize=8, gridded=1, minwidth=50, minheight=30)
|
---|
598 | btn = Tix.Button(bot, text='Reset', command=lambda w=rh, x=win: SText_reset(w,x))
|
---|
599 | top.propagate(0)
|
---|
600 | msg.pack(fill=Tix.X)
|
---|
601 | btn.pack(anchor=Tix.CENTER)
|
---|
602 | top.pack(expand=1, fill=Tix.BOTH)
|
---|
603 | bot.pack(fill=Tix.BOTH)
|
---|
604 | win.bind('<Map>', func=lambda arg=0, rh=rh, win=win:
|
---|
605 | win.tk.call('tixDoWhenIdle', str(rh), 'attachwidget', str(win)))
|
---|
606 |
|
---|
607 | def SText_reset(rh, win):
|
---|
608 | win.place(x=30, y=150, width=190, height=120)
|
---|
609 | win.update()
|
---|
610 | rh.attach_widget(win)
|
---|
611 |
|
---|
612 | def MkManager(nb, name):
|
---|
613 | w = nb.page(name)
|
---|
614 | options='label.padX 4'
|
---|
615 |
|
---|
616 | pane = Tix.LabelFrame(w, label='Tix.PanedWindow', options=options)
|
---|
617 | note = Tix.LabelFrame(w, label='Tix.NoteBook', options=options)
|
---|
618 |
|
---|
619 | MkPanedWindow(pane.frame)
|
---|
620 | MkNoteBook(note.frame)
|
---|
621 |
|
---|
622 | pane.form(top=0, left=0, right=note, bottom=-1)
|
---|
623 | note.form(top=0, right=-1, bottom=-1)
|
---|
624 |
|
---|
625 | def MkPanedWindow(w):
|
---|
626 | """The PanedWindow widget allows the user to interactively manipulate
|
---|
627 | the sizes of several panes. The panes can be arranged either vertically
|
---|
628 | or horizontally.
|
---|
629 | """
|
---|
630 | msg = Tix.Message(w,
|
---|
631 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
632 | text='The PanedWindow widget allows the user to interactively manipulate the sizes of several panes. The panes can be arranged either vertically or horizontally.')
|
---|
633 | group = Tix.LabelEntry(w, label='Newsgroup:', options='entry.width 25')
|
---|
634 | group.entry.insert(0,'comp.lang.python')
|
---|
635 | pane = Tix.PanedWindow(w, orientation='vertical')
|
---|
636 |
|
---|
637 | p1 = pane.add('list', min=70, size=100)
|
---|
638 | p2 = pane.add('text', min=70)
|
---|
639 | list = Tix.ScrolledListBox(p1)
|
---|
640 | text = Tix.ScrolledText(p2)
|
---|
641 |
|
---|
642 | list.listbox.insert(Tix.END, " 12324 Re: Tkinter is good for your health")
|
---|
643 | list.listbox.insert(Tix.END, "+ 12325 Re: Tkinter is good for your health")
|
---|
644 | list.listbox.insert(Tix.END, "+ 12326 Re: Tix is even better for your health (Was: Tkinter is good...)")
|
---|
645 | list.listbox.insert(Tix.END, " 12327 Re: Tix is even better for your health (Was: Tkinter is good...)")
|
---|
646 | list.listbox.insert(Tix.END, "+ 12328 Re: Tix is even better for your health (Was: Tkinter is good...)")
|
---|
647 | list.listbox.insert(Tix.END, " 12329 Re: Tix is even better for your health (Was: Tkinter is good...)")
|
---|
648 | list.listbox.insert(Tix.END, "+ 12330 Re: Tix is even better for your health (Was: Tkinter is good...)")
|
---|
649 |
|
---|
650 | text.text['bg'] = list.listbox['bg']
|
---|
651 | text.text['wrap'] = 'none'
|
---|
652 | text.text.insert(Tix.END, """
|
---|
653 | Mon, 19 Jun 1995 11:39:52 comp.lang.python Thread 34 of 220
|
---|
654 | Lines 353 A new way to put text and bitmaps together iNo responses
|
---|
655 | ioi@blue.seas.upenn.edu Ioi K. Lam at University of Pennsylvania
|
---|
656 |
|
---|
657 | Hi,
|
---|
658 |
|
---|
659 | I have implemented a new image type called "compound". It allows you
|
---|
660 | to glue together a bunch of bitmaps, images and text strings together
|
---|
661 | to form a bigger image. Then you can use this image with widgets that
|
---|
662 | support the -image option. For example, you can display a text string string
|
---|
663 | together with a bitmap, at the same time, inside a TK button widget.
|
---|
664 | """)
|
---|
665 | list.pack(expand=1, fill=Tix.BOTH, padx=4, pady=6)
|
---|
666 | text.pack(expand=1, fill=Tix.BOTH, padx=4, pady=6)
|
---|
667 |
|
---|
668 | msg.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
|
---|
669 | group.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
|
---|
670 | pane.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH, expand=1)
|
---|
671 |
|
---|
672 | def MkNoteBook(w):
|
---|
673 | msg = Tix.Message(w,
|
---|
674 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
675 | text='The NoteBook widget allows you to layout a complex interface into individual pages.')
|
---|
676 | # prefix = Tix.OptionName(w)
|
---|
677 | # if not prefix: prefix = ''
|
---|
678 | # w.option_add('*' + prefix + '*TixNoteBook*tagPadX', 8)
|
---|
679 | options = "entry.width %d label.width %d label.anchor %s" % (10, 18, Tix.E)
|
---|
680 |
|
---|
681 | nb = Tix.NoteBook(w, ipadx=6, ipady=6, options=options)
|
---|
682 | nb.add('hard_disk', label="Hard Disk", underline=0)
|
---|
683 | nb.add('network', label="Network", underline=0)
|
---|
684 |
|
---|
685 | # Frame for the buttons that are present on all pages
|
---|
686 | common = Tix.Frame(nb.hard_disk)
|
---|
687 | common.pack(side=Tix.RIGHT, padx=2, pady=2, fill=Tix.Y)
|
---|
688 | CreateCommonButtons(common)
|
---|
689 |
|
---|
690 | # Widgets belonging only to this page
|
---|
691 | a = Tix.Control(nb.hard_disk, value=12, label='Access Time: ')
|
---|
692 | w = Tix.Control(nb.hard_disk, value=400, label='Write Throughput: ')
|
---|
693 | r = Tix.Control(nb.hard_disk, value=400, label='Read Throughput: ')
|
---|
694 | c = Tix.Control(nb.hard_disk, value=1021, label='Capacity: ')
|
---|
695 | a.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
696 | w.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
697 | r.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
698 | c.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
699 |
|
---|
700 | common = Tix.Frame(nb.network)
|
---|
701 | common.pack(side=Tix.RIGHT, padx=2, pady=2, fill=Tix.Y)
|
---|
702 | CreateCommonButtons(common)
|
---|
703 |
|
---|
704 | a = Tix.Control(nb.network, value=12, label='Access Time: ')
|
---|
705 | w = Tix.Control(nb.network, value=400, label='Write Throughput: ')
|
---|
706 | r = Tix.Control(nb.network, value=400, label='Read Throughput: ')
|
---|
707 | c = Tix.Control(nb.network, value=1021, label='Capacity: ')
|
---|
708 | u = Tix.Control(nb.network, value=10, label='Users: ')
|
---|
709 | a.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
710 | w.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
711 | r.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
712 | c.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
713 | u.pack(side=Tix.TOP, padx=20, pady=2)
|
---|
714 |
|
---|
715 | msg.pack(side=Tix.TOP, padx=3, pady=3, fill=Tix.BOTH)
|
---|
716 | nb.pack(side=Tix.TOP, padx=5, pady=5, fill=Tix.BOTH, expand=1)
|
---|
717 |
|
---|
718 | def CreateCommonButtons(f):
|
---|
719 | ok = Tix.Button(f, text='OK', width = 6)
|
---|
720 | cancel = Tix.Button(f, text='Cancel', width = 6)
|
---|
721 | ok.pack(side=Tix.TOP, padx=2, pady=2)
|
---|
722 | cancel.pack(side=Tix.TOP, padx=2, pady=2)
|
---|
723 |
|
---|
724 | def MkDirList(nb, name):
|
---|
725 | w = nb.page(name)
|
---|
726 | options = "label.padX 4"
|
---|
727 |
|
---|
728 | dir = Tix.LabelFrame(w, label='Tix.DirList', options=options)
|
---|
729 | fsbox = Tix.LabelFrame(w, label='Tix.ExFileSelectBox', options=options)
|
---|
730 | MkDirListWidget(dir.frame)
|
---|
731 | MkExFileWidget(fsbox.frame)
|
---|
732 | dir.form(top=0, left=0, right='%40', bottom=-1)
|
---|
733 | fsbox.form(top=0, left='%40', right=-1, bottom=-1)
|
---|
734 |
|
---|
735 | def MkDirListWidget(w):
|
---|
736 | """The TixDirList widget gives a graphical representation of the file
|
---|
737 | system directory and makes it easy for the user to choose and access
|
---|
738 | directories.
|
---|
739 | """
|
---|
740 | msg = Tix.Message(w,
|
---|
741 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
742 | 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.')
|
---|
743 | dirlist = Tix.DirList(w, options='hlist.padY 1 hlist.width 25 hlist.height 16')
|
---|
744 | msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
|
---|
745 | dirlist.pack(side=Tix.TOP, padx=3, pady=3)
|
---|
746 |
|
---|
747 | def MkExFileWidget(w):
|
---|
748 | """The TixExFileSelectBox widget is more user friendly than the Motif
|
---|
749 | style FileSelectBox. """
|
---|
750 | msg = Tix.Message(w,
|
---|
751 | relief=Tix.FLAT, width=240, anchor=Tix.N,
|
---|
752 | text='The Tix ExFileSelectBox widget is more user friendly than the Motif style FileSelectBox.')
|
---|
753 | # There's a bug in the ComboBoxes - the scrolledlistbox is destroyed
|
---|
754 | box = Tix.ExFileSelectBox(w, bd=2, relief=Tix.RAISED)
|
---|
755 | msg.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=3, pady=3)
|
---|
756 | box.pack(side=Tix.TOP, padx=3, pady=3)
|
---|
757 |
|
---|
758 | ###
|
---|
759 | ### List of all the demos we want to show off
|
---|
760 | comments = {'widget' : 'Widget Demos', 'image' : 'Image Demos'}
|
---|
761 | samples = {'Balloon' : 'Balloon',
|
---|
762 | 'Button Box' : 'BtnBox',
|
---|
763 | 'Combo Box' : 'ComboBox',
|
---|
764 | 'Compound Image' : 'CmpImg',
|
---|
765 | 'Directory List' : 'DirList',
|
---|
766 | 'Directory Tree' : 'DirTree',
|
---|
767 | 'Control' : 'Control',
|
---|
768 | 'Notebook' : 'NoteBook',
|
---|
769 | 'Option Menu' : 'OptMenu',
|
---|
770 | 'Paned Window' : 'PanedWin',
|
---|
771 | 'Popup Menu' : 'PopMenu',
|
---|
772 | 'ScrolledHList (1)' : 'SHList1',
|
---|
773 | 'ScrolledHList (2)' : 'SHList2',
|
---|
774 | 'Tree (dynamic)' : 'Tree'
|
---|
775 | }
|
---|
776 |
|
---|
777 | # There are still a lot of demos to be translated:
|
---|
778 | ## set root {
|
---|
779 | ## {d "File Selectors" file }
|
---|
780 | ## {d "Hierachical ListBox" hlist }
|
---|
781 | ## {d "Tabular ListBox" tlist {c tixTList}}
|
---|
782 | ## {d "Grid Widget" grid {c tixGrid}}
|
---|
783 | ## {d "Manager Widgets" manager }
|
---|
784 | ## {d "Scrolled Widgets" scroll }
|
---|
785 | ## {d "Miscellaneous Widgets" misc }
|
---|
786 | ## {d "Image Types" image }
|
---|
787 | ## }
|
---|
788 | ##
|
---|
789 | ## set image {
|
---|
790 | ## {d "Compound Image" cmpimg }
|
---|
791 | ## {d "XPM Image" xpm {i pixmap}}
|
---|
792 | ## }
|
---|
793 | ##
|
---|
794 | ## set cmpimg {
|
---|
795 | ##done {f "In Buttons" CmpImg.tcl }
|
---|
796 | ## {f "In NoteBook" CmpImg2.tcl }
|
---|
797 | ## {f "Notebook Color Tabs" CmpImg4.tcl }
|
---|
798 | ## {f "Icons" CmpImg3.tcl }
|
---|
799 | ## }
|
---|
800 | ##
|
---|
801 | ## set xpm {
|
---|
802 | ## {f "In Button" Xpm.tcl {i pixmap}}
|
---|
803 | ## {f "In Menu" Xpm1.tcl {i pixmap}}
|
---|
804 | ## }
|
---|
805 | ##
|
---|
806 | ## set file {
|
---|
807 | ##added {f DirList DirList.tcl }
|
---|
808 | ##added {f DirTree DirTree.tcl }
|
---|
809 | ## {f DirSelectDialog DirDlg.tcl }
|
---|
810 | ## {f ExFileSelectDialog EFileDlg.tcl }
|
---|
811 | ## {f FileSelectDialog FileDlg.tcl }
|
---|
812 | ## {f FileEntry FileEnt.tcl }
|
---|
813 | ## }
|
---|
814 | ##
|
---|
815 | ## set hlist {
|
---|
816 | ## {f HList HList1.tcl }
|
---|
817 | ## {f CheckList ChkList.tcl {c tixCheckList}}
|
---|
818 | ##done {f "ScrolledHList (1)" SHList.tcl }
|
---|
819 | ##done {f "ScrolledHList (2)" SHList2.tcl }
|
---|
820 | ##done {f Tree Tree.tcl }
|
---|
821 | ##done {f "Tree (Dynamic)" DynTree.tcl {v win}}
|
---|
822 | ## }
|
---|
823 | ##
|
---|
824 | ## set tlist {
|
---|
825 | ## {f "ScrolledTList (1)" STList1.tcl {c tixTList}}
|
---|
826 | ## {f "ScrolledTList (2)" STList2.tcl {c tixTList}}
|
---|
827 | ## }
|
---|
828 | ## global tcl_platform
|
---|
829 | ## # This demo hangs windows
|
---|
830 | ## if {$tcl_platform(platform) != "windows"} {
|
---|
831 | ##na lappend tlist {f "TList File Viewer" STList3.tcl {c tixTList}}
|
---|
832 | ## }
|
---|
833 | ##
|
---|
834 | ## set grid {
|
---|
835 | ##na {f "Simple Grid" SGrid0.tcl {c tixGrid}}
|
---|
836 | ##na {f "ScrolledGrid" SGrid1.tcl {c tixGrid}}
|
---|
837 | ##na {f "Editable Grid" EditGrid.tcl {c tixGrid}}
|
---|
838 | ## }
|
---|
839 | ##
|
---|
840 | ## set scroll {
|
---|
841 | ## {f ScrolledListBox SListBox.tcl }
|
---|
842 | ## {f ScrolledText SText.tcl }
|
---|
843 | ## {f ScrolledWindow SWindow.tcl }
|
---|
844 | ##na {f "Canvas Object View" CObjView.tcl {c tixCObjView}}
|
---|
845 | ## }
|
---|
846 | ##
|
---|
847 | ## set manager {
|
---|
848 | ## {f ListNoteBook ListNBK.tcl }
|
---|
849 | ##done {f NoteBook NoteBook.tcl }
|
---|
850 | ##done {f PanedWindow PanedWin.tcl }
|
---|
851 | ## }
|
---|
852 | ##
|
---|
853 | ## set misc {
|
---|
854 | ##done {f Balloon Balloon.tcl }
|
---|
855 | ##done {f ButtonBox BtnBox.tcl }
|
---|
856 | ##done {f ComboBox ComboBox.tcl }
|
---|
857 | ##done {f Control Control.tcl }
|
---|
858 | ## {f LabelEntry LabEntry.tcl }
|
---|
859 | ## {f LabelFrame LabFrame.tcl }
|
---|
860 | ## {f Meter Meter.tcl {c tixMeter}}
|
---|
861 | ##done {f OptionMenu OptMenu.tcl }
|
---|
862 | ##done {f PopupMenu PopMenu.tcl }
|
---|
863 | ## {f Select Select.tcl }
|
---|
864 | ## {f StdButtonBox StdBBox.tcl }
|
---|
865 | ## }
|
---|
866 | ##
|
---|
867 |
|
---|
868 | stypes = {}
|
---|
869 | stypes['widget'] = ['Balloon', 'Button Box', 'Combo Box', 'Control',
|
---|
870 | 'Directory List', 'Directory Tree',
|
---|
871 | 'Notebook', 'Option Menu', 'Popup Menu', 'Paned Window',
|
---|
872 | 'ScrolledHList (1)', 'ScrolledHList (2)', 'Tree (dynamic)']
|
---|
873 | stypes['image'] = ['Compound Image']
|
---|
874 |
|
---|
875 | def MkSample(nb, name):
|
---|
876 | w = nb.page(name)
|
---|
877 | options = "label.padX 4"
|
---|
878 |
|
---|
879 | pane = Tix.PanedWindow(w, orientation='horizontal')
|
---|
880 | pane.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH)
|
---|
881 | f1 = pane.add('list', expand='1')
|
---|
882 | f2 = pane.add('text', expand='5')
|
---|
883 | f1['relief'] = 'flat'
|
---|
884 | f2['relief'] = 'flat'
|
---|
885 |
|
---|
886 | lab = Tix.LabelFrame(f1, label='Select a sample program:')
|
---|
887 | lab.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5, pady=5)
|
---|
888 | lab1 = Tix.LabelFrame(f2, label='Source:')
|
---|
889 | lab1.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5, pady=5)
|
---|
890 |
|
---|
891 | slb = Tix.Tree(lab.frame, options='hlist.width 20')
|
---|
892 | slb.pack(side=Tix.TOP, expand=1, fill=Tix.BOTH, padx=5)
|
---|
893 |
|
---|
894 | stext = Tix.ScrolledText(lab1.frame, name='stext')
|
---|
895 | font = root.tk.eval('tix option get fixed_font')
|
---|
896 | stext.text.config(font=font)
|
---|
897 |
|
---|
898 | frame = Tix.Frame(lab1.frame, name='frame')
|
---|
899 |
|
---|
900 | run = Tix.Button(frame, text='Run ...', name='run')
|
---|
901 | view = Tix.Button(frame, text='View Source ...', name='view')
|
---|
902 | run.pack(side=Tix.LEFT, expand=0, fill=Tix.NONE)
|
---|
903 | view.pack(side=Tix.LEFT, expand=0, fill=Tix.NONE)
|
---|
904 |
|
---|
905 | stext.text['bg'] = slb.hlist['bg']
|
---|
906 | stext.text['state'] = 'disabled'
|
---|
907 | stext.text['wrap'] = 'none'
|
---|
908 | stext.text['width'] = 80
|
---|
909 |
|
---|
910 | frame.pack(side=Tix.BOTTOM, expand=0, fill=Tix.X, padx=7)
|
---|
911 | stext.pack(side=Tix.TOP, expand=0, fill=Tix.BOTH, padx=7)
|
---|
912 |
|
---|
913 | slb.hlist['separator'] = '.'
|
---|
914 | slb.hlist['width'] = 25
|
---|
915 | slb.hlist['drawbranch'] = 0
|
---|
916 | slb.hlist['indent'] = 10
|
---|
917 | slb.hlist['wideselect'] = 1
|
---|
918 | slb.hlist['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'run')
|
---|
919 | slb.hlist['browsecmd'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'browse')
|
---|
920 |
|
---|
921 | run['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'run')
|
---|
922 | view['command'] = lambda args=0, w=w,slb=slb,stext=stext,run=run,view=view: Sample_Action(w, slb, stext, run, view, 'view')
|
---|
923 |
|
---|
924 | for type in ['widget', 'image']:
|
---|
925 | if type != 'widget':
|
---|
926 | x = Tix.Frame(slb.hlist, bd=2, height=2, width=150,
|
---|
927 | relief=Tix.SUNKEN, bg=slb.hlist['bg'])
|
---|
928 | slb.hlist.add_child(itemtype=Tix.WINDOW, window=x, state='disabled')
|
---|
929 | x = slb.hlist.add_child(itemtype=Tix.TEXT, state='disabled',
|
---|
930 | text=comments[type])
|
---|
931 | for key in stypes[type]:
|
---|
932 | slb.hlist.add_child(x, itemtype=Tix.TEXT, data=key,
|
---|
933 | text=key)
|
---|
934 | slb.hlist.selection_clear()
|
---|
935 |
|
---|
936 | run['state'] = 'disabled'
|
---|
937 | view['state'] = 'disabled'
|
---|
938 |
|
---|
939 | def Sample_Action(w, slb, stext, run, view, action):
|
---|
940 | global demo
|
---|
941 |
|
---|
942 | hlist = slb.hlist
|
---|
943 | anchor = hlist.info_anchor()
|
---|
944 | if not anchor:
|
---|
945 | run['state'] = 'disabled'
|
---|
946 | view['state'] = 'disabled'
|
---|
947 | elif not hlist.info_parent(anchor):
|
---|
948 | # a comment
|
---|
949 | return
|
---|
950 |
|
---|
951 | run['state'] = 'normal'
|
---|
952 | view['state'] = 'normal'
|
---|
953 | key = hlist.info_data(anchor)
|
---|
954 | title = key
|
---|
955 | prog = samples[key]
|
---|
956 |
|
---|
957 | if action == 'run':
|
---|
958 | exec('import ' + prog)
|
---|
959 | w = Tix.Toplevel()
|
---|
960 | w.title(title)
|
---|
961 | rtn = eval(prog + '.RunSample')
|
---|
962 | rtn(w)
|
---|
963 | elif action == 'view':
|
---|
964 | w = Tix.Toplevel()
|
---|
965 | w.title('Source view: ' + title)
|
---|
966 | LoadFile(w, demo.dir + '/samples/' + prog + '.py')
|
---|
967 | elif action == 'browse':
|
---|
968 | ReadFile(stext.text, demo.dir + '/samples/' + prog + '.py')
|
---|
969 |
|
---|
970 | def LoadFile(w, fname):
|
---|
971 | global root
|
---|
972 | b = Tix.Button(w, text='Close', command=w.destroy)
|
---|
973 | t = Tix.ScrolledText(w)
|
---|
974 | # b.form(left=0, bottom=0, padx=4, pady=4)
|
---|
975 | # t.form(left=0, bottom=b, right='-0', top=0)
|
---|
976 | t.pack()
|
---|
977 | b.pack()
|
---|
978 |
|
---|
979 | font = root.tk.eval('tix option get fixed_font')
|
---|
980 | t.text.config(font=font)
|
---|
981 | t.text['bd'] = 2
|
---|
982 | t.text['wrap'] = 'none'
|
---|
983 |
|
---|
984 | ReadFile(t.text, fname)
|
---|
985 |
|
---|
986 | def ReadFile(w, fname):
|
---|
987 | old_state = w['state']
|
---|
988 | w['state'] = 'normal'
|
---|
989 | w.delete('0.0', Tix.END)
|
---|
990 |
|
---|
991 | try:
|
---|
992 | f = open(fname)
|
---|
993 | lines = f.readlines()
|
---|
994 | for s in lines:
|
---|
995 | w.insert(Tix.END, s)
|
---|
996 | f.close()
|
---|
997 | finally:
|
---|
998 | # w.see('1.0')
|
---|
999 | w['state'] = old_state
|
---|
1000 |
|
---|
1001 | if __name__ == '__main__':
|
---|
1002 | root = Tix.Tk()
|
---|
1003 | RunMain(root)
|
---|