|
1 # -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*- |
|
2 # |
|
3 # $Id: Tix.py 52785 2006-11-18 18:42:22Z martin.v.loewis $ |
|
4 # |
|
5 # Tix.py -- Tix widget wrappers. |
|
6 # |
|
7 # For Tix, see http://tix.sourceforge.net |
|
8 # |
|
9 # - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995. |
|
10 # based on an idea of Jean-Marc Lugrin (lugrin@ms.com) |
|
11 # |
|
12 # NOTE: In order to minimize changes to Tkinter.py, some of the code here |
|
13 # (TixWidget.__init__) has been taken from Tkinter (Widget.__init__) |
|
14 # and will break if there are major changes in Tkinter. |
|
15 # |
|
16 # The Tix widgets are represented by a class hierarchy in python with proper |
|
17 # inheritance of base classes. |
|
18 # |
|
19 # As a result after creating a 'w = StdButtonBox', I can write |
|
20 # w.ok['text'] = 'Who Cares' |
|
21 # or w.ok['bg'] = w['bg'] |
|
22 # or even w.ok.invoke() |
|
23 # etc. |
|
24 # |
|
25 # Compare the demo tixwidgets.py to the original Tcl program and you will |
|
26 # appreciate the advantages. |
|
27 # |
|
28 |
|
29 from Tkinter import * |
|
30 from Tkinter import _flatten, _cnfmerge, _default_root |
|
31 |
|
32 # WARNING - TkVersion is a limited precision floating point number |
|
33 if TkVersion < 3.999: |
|
34 raise ImportError, "This version of Tix.py requires Tk 4.0 or higher" |
|
35 |
|
36 import _tkinter # If this fails your Python may not be configured for Tk |
|
37 |
|
38 # Some more constants (for consistency with Tkinter) |
|
39 WINDOW = 'window' |
|
40 TEXT = 'text' |
|
41 STATUS = 'status' |
|
42 IMMEDIATE = 'immediate' |
|
43 IMAGE = 'image' |
|
44 IMAGETEXT = 'imagetext' |
|
45 BALLOON = 'balloon' |
|
46 AUTO = 'auto' |
|
47 ACROSSTOP = 'acrosstop' |
|
48 |
|
49 # Some constants used by Tkinter dooneevent() |
|
50 TCL_DONT_WAIT = 1 << 1 |
|
51 TCL_WINDOW_EVENTS = 1 << 2 |
|
52 TCL_FILE_EVENTS = 1 << 3 |
|
53 TCL_TIMER_EVENTS = 1 << 4 |
|
54 TCL_IDLE_EVENTS = 1 << 5 |
|
55 TCL_ALL_EVENTS = 0 |
|
56 |
|
57 # BEWARE - this is implemented by copying some code from the Widget class |
|
58 # in Tkinter (to override Widget initialization) and is therefore |
|
59 # liable to break. |
|
60 import Tkinter, os |
|
61 |
|
62 # Could probably add this to Tkinter.Misc |
|
63 class tixCommand: |
|
64 """The tix commands provide access to miscellaneous elements |
|
65 of Tix's internal state and the Tix application context. |
|
66 Most of the information manipulated by these commands pertains |
|
67 to the application as a whole, or to a screen or |
|
68 display, rather than to a particular window. |
|
69 |
|
70 This is a mixin class, assumed to be mixed to Tkinter.Tk |
|
71 that supports the self.tk.call method. |
|
72 """ |
|
73 |
|
74 def tix_addbitmapdir(self, directory): |
|
75 """Tix maintains a list of directories under which |
|
76 the tix_getimage and tix_getbitmap commands will |
|
77 search for image files. The standard bitmap directory |
|
78 is $TIX_LIBRARY/bitmaps. The addbitmapdir command |
|
79 adds directory into this list. By using this |
|
80 command, the image files of an applications can |
|
81 also be located using the tix_getimage or tix_getbitmap |
|
82 command. |
|
83 """ |
|
84 return self.tk.call('tix', 'addbitmapdir', directory) |
|
85 |
|
86 def tix_cget(self, option): |
|
87 """Returns the current value of the configuration |
|
88 option given by option. Option may be any of the |
|
89 options described in the CONFIGURATION OPTIONS section. |
|
90 """ |
|
91 return self.tk.call('tix', 'cget', option) |
|
92 |
|
93 def tix_configure(self, cnf=None, **kw): |
|
94 """Query or modify the configuration options of the Tix application |
|
95 context. If no option is specified, returns a dictionary all of the |
|
96 available options. If option is specified with no value, then the |
|
97 command returns a list describing the one named option (this list |
|
98 will be identical to the corresponding sublist of the value |
|
99 returned if no option is specified). If one or more option-value |
|
100 pairs are specified, then the command modifies the given option(s) |
|
101 to have the given value(s); in this case the command returns an |
|
102 empty string. Option may be any of the configuration options. |
|
103 """ |
|
104 # Copied from Tkinter.py |
|
105 if kw: |
|
106 cnf = _cnfmerge((cnf, kw)) |
|
107 elif cnf: |
|
108 cnf = _cnfmerge(cnf) |
|
109 if cnf is None: |
|
110 cnf = {} |
|
111 for x in self.tk.split(self.tk.call('tix', 'configure')): |
|
112 cnf[x[0][1:]] = (x[0][1:],) + x[1:] |
|
113 return cnf |
|
114 if isinstance(cnf, StringType): |
|
115 x = self.tk.split(self.tk.call('tix', 'configure', '-'+cnf)) |
|
116 return (x[0][1:],) + x[1:] |
|
117 return self.tk.call(('tix', 'configure') + self._options(cnf)) |
|
118 |
|
119 def tix_filedialog(self, dlgclass=None): |
|
120 """Returns the file selection dialog that may be shared among |
|
121 different calls from this application. This command will create a |
|
122 file selection dialog widget when it is called the first time. This |
|
123 dialog will be returned by all subsequent calls to tix_filedialog. |
|
124 An optional dlgclass parameter can be passed to specified what type |
|
125 of file selection dialog widget is desired. Possible options are |
|
126 tix FileSelectDialog or tixExFileSelectDialog. |
|
127 """ |
|
128 if dlgclass is not None: |
|
129 return self.tk.call('tix', 'filedialog', dlgclass) |
|
130 else: |
|
131 return self.tk.call('tix', 'filedialog') |
|
132 |
|
133 def tix_getbitmap(self, name): |
|
134 """Locates a bitmap file of the name name.xpm or name in one of the |
|
135 bitmap directories (see the tix_addbitmapdir command above). By |
|
136 using tix_getbitmap, you can avoid hard coding the pathnames of the |
|
137 bitmap files in your application. When successful, it returns the |
|
138 complete pathname of the bitmap file, prefixed with the character |
|
139 '@'. The returned value can be used to configure the -bitmap |
|
140 option of the TK and Tix widgets. |
|
141 """ |
|
142 return self.tk.call('tix', 'getbitmap', name) |
|
143 |
|
144 def tix_getimage(self, name): |
|
145 """Locates an image file of the name name.xpm, name.xbm or name.ppm |
|
146 in one of the bitmap directories (see the addbitmapdir command |
|
147 above). If more than one file with the same name (but different |
|
148 extensions) exist, then the image type is chosen according to the |
|
149 depth of the X display: xbm images are chosen on monochrome |
|
150 displays and color images are chosen on color displays. By using |
|
151 tix_ getimage, you can advoid hard coding the pathnames of the |
|
152 image files in your application. When successful, this command |
|
153 returns the name of the newly created image, which can be used to |
|
154 configure the -image option of the Tk and Tix widgets. |
|
155 """ |
|
156 return self.tk.call('tix', 'getimage', name) |
|
157 |
|
158 def tix_option_get(self, name): |
|
159 """Gets the options manitained by the Tix |
|
160 scheme mechanism. Available options include: |
|
161 |
|
162 active_bg active_fg bg |
|
163 bold_font dark1_bg dark1_fg |
|
164 dark2_bg dark2_fg disabled_fg |
|
165 fg fixed_font font |
|
166 inactive_bg inactive_fg input1_bg |
|
167 input2_bg italic_font light1_bg |
|
168 light1_fg light2_bg light2_fg |
|
169 menu_font output1_bg output2_bg |
|
170 select_bg select_fg selector |
|
171 """ |
|
172 # could use self.tk.globalgetvar('tixOption', name) |
|
173 return self.tk.call('tix', 'option', 'get', name) |
|
174 |
|
175 def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None): |
|
176 """Resets the scheme and fontset of the Tix application to |
|
177 newScheme and newFontSet, respectively. This affects only those |
|
178 widgets created after this call. Therefore, it is best to call the |
|
179 resetoptions command before the creation of any widgets in a Tix |
|
180 application. |
|
181 |
|
182 The optional parameter newScmPrio can be given to reset the |
|
183 priority level of the Tk options set by the Tix schemes. |
|
184 |
|
185 Because of the way Tk handles the X option database, after Tix has |
|
186 been has imported and inited, it is not possible to reset the color |
|
187 schemes and font sets using the tix config command. Instead, the |
|
188 tix_resetoptions command must be used. |
|
189 """ |
|
190 if newScmPrio is not None: |
|
191 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio) |
|
192 else: |
|
193 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet) |
|
194 |
|
195 class Tk(Tkinter.Tk, tixCommand): |
|
196 """Toplevel widget of Tix which represents mostly the main window |
|
197 of an application. It has an associated Tcl interpreter.""" |
|
198 def __init__(self, screenName=None, baseName=None, className='Tix'): |
|
199 Tkinter.Tk.__init__(self, screenName, baseName, className) |
|
200 tixlib = os.environ.get('TIX_LIBRARY') |
|
201 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]') |
|
202 if tixlib is not None: |
|
203 self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib) |
|
204 self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib) |
|
205 # Load Tix - this should work dynamically or statically |
|
206 # If it's static, tcl/tix8.1/pkgIndex.tcl should have |
|
207 # 'load {} Tix' |
|
208 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have |
|
209 # 'load libtix8.1.8.3.so Tix' |
|
210 self.tk.eval('package require Tix') |
|
211 |
|
212 def destroy(self): |
|
213 # For safety, remove an delete_window binding before destroy |
|
214 self.protocol("WM_DELETE_WINDOW", "") |
|
215 Tkinter.Tk.destroy(self) |
|
216 |
|
217 # The Tix 'tixForm' geometry manager |
|
218 class Form: |
|
219 """The Tix Form geometry manager |
|
220 |
|
221 Widgets can be arranged by specifying attachments to other widgets. |
|
222 See Tix documentation for complete details""" |
|
223 |
|
224 def config(self, cnf={}, **kw): |
|
225 self.tk.call('tixForm', self._w, *self._options(cnf, kw)) |
|
226 |
|
227 form = config |
|
228 |
|
229 def __setitem__(self, key, value): |
|
230 Form.form(self, {key: value}) |
|
231 |
|
232 def check(self): |
|
233 return self.tk.call('tixForm', 'check', self._w) |
|
234 |
|
235 def forget(self): |
|
236 self.tk.call('tixForm', 'forget', self._w) |
|
237 |
|
238 def grid(self, xsize=0, ysize=0): |
|
239 if (not xsize) and (not ysize): |
|
240 x = self.tk.call('tixForm', 'grid', self._w) |
|
241 y = self.tk.splitlist(x) |
|
242 z = () |
|
243 for x in y: |
|
244 z = z + (self.tk.getint(x),) |
|
245 return z |
|
246 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize) |
|
247 |
|
248 def info(self, option=None): |
|
249 if not option: |
|
250 return self.tk.call('tixForm', 'info', self._w) |
|
251 if option[0] != '-': |
|
252 option = '-' + option |
|
253 return self.tk.call('tixForm', 'info', self._w, option) |
|
254 |
|
255 def slaves(self): |
|
256 return map(self._nametowidget, |
|
257 self.tk.splitlist( |
|
258 self.tk.call( |
|
259 'tixForm', 'slaves', self._w))) |
|
260 |
|
261 |
|
262 |
|
263 Tkinter.Widget.__bases__ = Tkinter.Widget.__bases__ + (Form,) |
|
264 |
|
265 class TixWidget(Tkinter.Widget): |
|
266 """A TixWidget class is used to package all (or most) Tix widgets. |
|
267 |
|
268 Widget initialization is extended in two ways: |
|
269 1) It is possible to give a list of options which must be part of |
|
270 the creation command (so called Tix 'static' options). These cannot be |
|
271 given as a 'config' command later. |
|
272 2) It is possible to give the name of an existing TK widget. These are |
|
273 child widgets created automatically by a Tix mega-widget. The Tk call |
|
274 to create these widgets is therefore bypassed in TixWidget.__init__ |
|
275 |
|
276 Both options are for use by subclasses only. |
|
277 """ |
|
278 def __init__ (self, master=None, widgetName=None, |
|
279 static_options=None, cnf={}, kw={}): |
|
280 # Merge keywords and dictionary arguments |
|
281 if kw: |
|
282 cnf = _cnfmerge((cnf, kw)) |
|
283 else: |
|
284 cnf = _cnfmerge(cnf) |
|
285 |
|
286 # Move static options into extra. static_options must be |
|
287 # a list of keywords (or None). |
|
288 extra=() |
|
289 |
|
290 # 'options' is always a static option |
|
291 if static_options: |
|
292 static_options.append('options') |
|
293 else: |
|
294 static_options = ['options'] |
|
295 |
|
296 for k,v in cnf.items()[:]: |
|
297 if k in static_options: |
|
298 extra = extra + ('-' + k, v) |
|
299 del cnf[k] |
|
300 |
|
301 self.widgetName = widgetName |
|
302 Widget._setup(self, master, cnf) |
|
303 |
|
304 # If widgetName is None, this is a dummy creation call where the |
|
305 # corresponding Tk widget has already been created by Tix |
|
306 if widgetName: |
|
307 self.tk.call(widgetName, self._w, *extra) |
|
308 |
|
309 # Non-static options - to be done via a 'config' command |
|
310 if cnf: |
|
311 Widget.config(self, cnf) |
|
312 |
|
313 # Dictionary to hold subwidget names for easier access. We can't |
|
314 # use the children list because the public Tix names may not be the |
|
315 # same as the pathname component |
|
316 self.subwidget_list = {} |
|
317 |
|
318 # We set up an attribute access function so that it is possible to |
|
319 # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello' |
|
320 # when w is a StdButtonBox. |
|
321 # We can even do w.ok.invoke() because w.ok is subclassed from the |
|
322 # Button class if you go through the proper constructors |
|
323 def __getattr__(self, name): |
|
324 if self.subwidget_list.has_key(name): |
|
325 return self.subwidget_list[name] |
|
326 raise AttributeError, name |
|
327 |
|
328 def set_silent(self, value): |
|
329 """Set a variable without calling its action routine""" |
|
330 self.tk.call('tixSetSilent', self._w, value) |
|
331 |
|
332 def subwidget(self, name): |
|
333 """Return the named subwidget (which must have been created by |
|
334 the sub-class).""" |
|
335 n = self._subwidget_name(name) |
|
336 if not n: |
|
337 raise TclError, "Subwidget " + name + " not child of " + self._name |
|
338 # Remove header of name and leading dot |
|
339 n = n[len(self._w)+1:] |
|
340 return self._nametowidget(n) |
|
341 |
|
342 def subwidgets_all(self): |
|
343 """Return all subwidgets.""" |
|
344 names = self._subwidget_names() |
|
345 if not names: |
|
346 return [] |
|
347 retlist = [] |
|
348 for name in names: |
|
349 name = name[len(self._w)+1:] |
|
350 try: |
|
351 retlist.append(self._nametowidget(name)) |
|
352 except: |
|
353 # some of the widgets are unknown e.g. border in LabelFrame |
|
354 pass |
|
355 return retlist |
|
356 |
|
357 def _subwidget_name(self,name): |
|
358 """Get a subwidget name (returns a String, not a Widget !)""" |
|
359 try: |
|
360 return self.tk.call(self._w, 'subwidget', name) |
|
361 except TclError: |
|
362 return None |
|
363 |
|
364 def _subwidget_names(self): |
|
365 """Return the name of all subwidgets.""" |
|
366 try: |
|
367 x = self.tk.call(self._w, 'subwidgets', '-all') |
|
368 return self.tk.split(x) |
|
369 except TclError: |
|
370 return None |
|
371 |
|
372 def config_all(self, option, value): |
|
373 """Set configuration options for all subwidgets (and self).""" |
|
374 if option == '': |
|
375 return |
|
376 elif not isinstance(option, StringType): |
|
377 option = repr(option) |
|
378 if not isinstance(value, StringType): |
|
379 value = repr(value) |
|
380 names = self._subwidget_names() |
|
381 for name in names: |
|
382 self.tk.call(name, 'configure', '-' + option, value) |
|
383 # These are missing from Tkinter |
|
384 def image_create(self, imgtype, cnf={}, master=None, **kw): |
|
385 if not master: |
|
386 master = Tkinter._default_root |
|
387 if not master: |
|
388 raise RuntimeError, 'Too early to create image' |
|
389 if kw and cnf: cnf = _cnfmerge((cnf, kw)) |
|
390 elif kw: cnf = kw |
|
391 options = () |
|
392 for k, v in cnf.items(): |
|
393 if callable(v): |
|
394 v = self._register(v) |
|
395 options = options + ('-'+k, v) |
|
396 return master.tk.call(('image', 'create', imgtype,) + options) |
|
397 def image_delete(self, imgname): |
|
398 try: |
|
399 self.tk.call('image', 'delete', imgname) |
|
400 except TclError: |
|
401 # May happen if the root was destroyed |
|
402 pass |
|
403 |
|
404 # Subwidgets are child widgets created automatically by mega-widgets. |
|
405 # In python, we have to create these subwidgets manually to mirror their |
|
406 # existence in Tk/Tix. |
|
407 class TixSubWidget(TixWidget): |
|
408 """Subwidget class. |
|
409 |
|
410 This is used to mirror child widgets automatically created |
|
411 by Tix/Tk as part of a mega-widget in Python (which is not informed |
|
412 of this)""" |
|
413 |
|
414 def __init__(self, master, name, |
|
415 destroy_physically=1, check_intermediate=1): |
|
416 if check_intermediate: |
|
417 path = master._subwidget_name(name) |
|
418 try: |
|
419 path = path[len(master._w)+1:] |
|
420 plist = path.split('.') |
|
421 except: |
|
422 plist = [] |
|
423 |
|
424 if not check_intermediate: |
|
425 # immediate descendant |
|
426 TixWidget.__init__(self, master, None, None, {'name' : name}) |
|
427 else: |
|
428 # Ensure that the intermediate widgets exist |
|
429 parent = master |
|
430 for i in range(len(plist) - 1): |
|
431 n = '.'.join(plist[:i+1]) |
|
432 try: |
|
433 w = master._nametowidget(n) |
|
434 parent = w |
|
435 except KeyError: |
|
436 # Create the intermediate widget |
|
437 parent = TixSubWidget(parent, plist[i], |
|
438 destroy_physically=0, |
|
439 check_intermediate=0) |
|
440 # The Tk widget name is in plist, not in name |
|
441 if plist: |
|
442 name = plist[-1] |
|
443 TixWidget.__init__(self, parent, None, None, {'name' : name}) |
|
444 self.destroy_physically = destroy_physically |
|
445 |
|
446 def destroy(self): |
|
447 # For some widgets e.g., a NoteBook, when we call destructors, |
|
448 # we must be careful not to destroy the frame widget since this |
|
449 # also destroys the parent NoteBook thus leading to an exception |
|
450 # in Tkinter when it finally calls Tcl to destroy the NoteBook |
|
451 for c in self.children.values(): c.destroy() |
|
452 if self.master.children.has_key(self._name): |
|
453 del self.master.children[self._name] |
|
454 if self.master.subwidget_list.has_key(self._name): |
|
455 del self.master.subwidget_list[self._name] |
|
456 if self.destroy_physically: |
|
457 # This is bypassed only for a few widgets |
|
458 self.tk.call('destroy', self._w) |
|
459 |
|
460 |
|
461 # Useful func. to split Tcl lists and return as a dict. From Tkinter.py |
|
462 def _lst2dict(lst): |
|
463 dict = {} |
|
464 for x in lst: |
|
465 dict[x[0][1:]] = (x[0][1:],) + x[1:] |
|
466 return dict |
|
467 |
|
468 # Useful class to create a display style - later shared by many items. |
|
469 # Contributed by Steffen Kremser |
|
470 class DisplayStyle: |
|
471 """DisplayStyle - handle configuration options shared by |
|
472 (multiple) Display Items""" |
|
473 |
|
474 def __init__(self, itemtype, cnf={}, **kw): |
|
475 master = _default_root # global from Tkinter |
|
476 if not master and cnf.has_key('refwindow'): master=cnf['refwindow'] |
|
477 elif not master and kw.has_key('refwindow'): master= kw['refwindow'] |
|
478 elif not master: raise RuntimeError, "Too early to create display style: no root window" |
|
479 self.tk = master.tk |
|
480 self.stylename = self.tk.call('tixDisplayStyle', itemtype, |
|
481 *self._options(cnf,kw) ) |
|
482 |
|
483 def __str__(self): |
|
484 return self.stylename |
|
485 |
|
486 def _options(self, cnf, kw): |
|
487 if kw and cnf: |
|
488 cnf = _cnfmerge((cnf, kw)) |
|
489 elif kw: |
|
490 cnf = kw |
|
491 opts = () |
|
492 for k, v in cnf.items(): |
|
493 opts = opts + ('-'+k, v) |
|
494 return opts |
|
495 |
|
496 def delete(self): |
|
497 self.tk.call(self.stylename, 'delete') |
|
498 |
|
499 def __setitem__(self,key,value): |
|
500 self.tk.call(self.stylename, 'configure', '-%s'%key, value) |
|
501 |
|
502 def config(self, cnf={}, **kw): |
|
503 return _lst2dict( |
|
504 self.tk.split( |
|
505 self.tk.call( |
|
506 self.stylename, 'configure', *self._options(cnf,kw)))) |
|
507 |
|
508 def __getitem__(self,key): |
|
509 return self.tk.call(self.stylename, 'cget', '-%s'%key) |
|
510 |
|
511 |
|
512 ###################################################### |
|
513 ### The Tix Widget classes - in alphabetical order ### |
|
514 ###################################################### |
|
515 |
|
516 class Balloon(TixWidget): |
|
517 """Balloon help widget. |
|
518 |
|
519 Subwidget Class |
|
520 --------- ----- |
|
521 label Label |
|
522 message Message""" |
|
523 |
|
524 # FIXME: It should inherit -superclass tixShell |
|
525 def __init__(self, master=None, cnf={}, **kw): |
|
526 # static seem to be -installcolormap -initwait -statusbar -cursor |
|
527 static = ['options', 'installcolormap', 'initwait', 'statusbar', |
|
528 'cursor'] |
|
529 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw) |
|
530 self.subwidget_list['label'] = _dummyLabel(self, 'label', |
|
531 destroy_physically=0) |
|
532 self.subwidget_list['message'] = _dummyLabel(self, 'message', |
|
533 destroy_physically=0) |
|
534 |
|
535 def bind_widget(self, widget, cnf={}, **kw): |
|
536 """Bind balloon widget to another. |
|
537 One balloon widget may be bound to several widgets at the same time""" |
|
538 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw)) |
|
539 |
|
540 def unbind_widget(self, widget): |
|
541 self.tk.call(self._w, 'unbind', widget._w) |
|
542 |
|
543 class ButtonBox(TixWidget): |
|
544 """ButtonBox - A container for pushbuttons. |
|
545 Subwidgets are the buttons added with the add method. |
|
546 """ |
|
547 def __init__(self, master=None, cnf={}, **kw): |
|
548 TixWidget.__init__(self, master, 'tixButtonBox', |
|
549 ['orientation', 'options'], cnf, kw) |
|
550 |
|
551 def add(self, name, cnf={}, **kw): |
|
552 """Add a button with given name to box.""" |
|
553 |
|
554 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) |
|
555 self.subwidget_list[name] = _dummyButton(self, name) |
|
556 return btn |
|
557 |
|
558 def invoke(self, name): |
|
559 if self.subwidget_list.has_key(name): |
|
560 self.tk.call(self._w, 'invoke', name) |
|
561 |
|
562 class ComboBox(TixWidget): |
|
563 """ComboBox - an Entry field with a dropdown menu. The user can select a |
|
564 choice by either typing in the entry subwdget or selecting from the |
|
565 listbox subwidget. |
|
566 |
|
567 Subwidget Class |
|
568 --------- ----- |
|
569 entry Entry |
|
570 arrow Button |
|
571 slistbox ScrolledListBox |
|
572 tick Button |
|
573 cross Button : present if created with the fancy option""" |
|
574 |
|
575 # FIXME: It should inherit -superclass tixLabelWidget |
|
576 def __init__ (self, master=None, cnf={}, **kw): |
|
577 TixWidget.__init__(self, master, 'tixComboBox', |
|
578 ['editable', 'dropdown', 'fancy', 'options'], |
|
579 cnf, kw) |
|
580 self.subwidget_list['label'] = _dummyLabel(self, 'label') |
|
581 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') |
|
582 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow') |
|
583 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self, |
|
584 'slistbox') |
|
585 try: |
|
586 self.subwidget_list['tick'] = _dummyButton(self, 'tick') |
|
587 self.subwidget_list['cross'] = _dummyButton(self, 'cross') |
|
588 except TypeError: |
|
589 # unavailable when -fancy not specified |
|
590 pass |
|
591 |
|
592 # align |
|
593 |
|
594 def add_history(self, str): |
|
595 self.tk.call(self._w, 'addhistory', str) |
|
596 |
|
597 def append_history(self, str): |
|
598 self.tk.call(self._w, 'appendhistory', str) |
|
599 |
|
600 def insert(self, index, str): |
|
601 self.tk.call(self._w, 'insert', index, str) |
|
602 |
|
603 def pick(self, index): |
|
604 self.tk.call(self._w, 'pick', index) |
|
605 |
|
606 class Control(TixWidget): |
|
607 """Control - An entry field with value change arrows. The user can |
|
608 adjust the value by pressing the two arrow buttons or by entering |
|
609 the value directly into the entry. The new value will be checked |
|
610 against the user-defined upper and lower limits. |
|
611 |
|
612 Subwidget Class |
|
613 --------- ----- |
|
614 incr Button |
|
615 decr Button |
|
616 entry Entry |
|
617 label Label""" |
|
618 |
|
619 # FIXME: It should inherit -superclass tixLabelWidget |
|
620 def __init__ (self, master=None, cnf={}, **kw): |
|
621 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw) |
|
622 self.subwidget_list['incr'] = _dummyButton(self, 'incr') |
|
623 self.subwidget_list['decr'] = _dummyButton(self, 'decr') |
|
624 self.subwidget_list['label'] = _dummyLabel(self, 'label') |
|
625 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') |
|
626 |
|
627 def decrement(self): |
|
628 self.tk.call(self._w, 'decr') |
|
629 |
|
630 def increment(self): |
|
631 self.tk.call(self._w, 'incr') |
|
632 |
|
633 def invoke(self): |
|
634 self.tk.call(self._w, 'invoke') |
|
635 |
|
636 def update(self): |
|
637 self.tk.call(self._w, 'update') |
|
638 |
|
639 class DirList(TixWidget): |
|
640 """DirList - displays a list view of a directory, its previous |
|
641 directories and its sub-directories. The user can choose one of |
|
642 the directories displayed in the list or change to another directory. |
|
643 |
|
644 Subwidget Class |
|
645 --------- ----- |
|
646 hlist HList |
|
647 hsb Scrollbar |
|
648 vsb Scrollbar""" |
|
649 |
|
650 # FIXME: It should inherit -superclass tixScrolledHList |
|
651 def __init__(self, master, cnf={}, **kw): |
|
652 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw) |
|
653 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
654 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
655 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
656 |
|
657 def chdir(self, dir): |
|
658 self.tk.call(self._w, 'chdir', dir) |
|
659 |
|
660 class DirTree(TixWidget): |
|
661 """DirTree - Directory Listing in a hierarchical view. |
|
662 Displays a tree view of a directory, its previous directories and its |
|
663 sub-directories. The user can choose one of the directories displayed |
|
664 in the list or change to another directory. |
|
665 |
|
666 Subwidget Class |
|
667 --------- ----- |
|
668 hlist HList |
|
669 hsb Scrollbar |
|
670 vsb Scrollbar""" |
|
671 |
|
672 # FIXME: It should inherit -superclass tixScrolledHList |
|
673 def __init__(self, master, cnf={}, **kw): |
|
674 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw) |
|
675 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
676 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
677 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
678 |
|
679 def chdir(self, dir): |
|
680 self.tk.call(self._w, 'chdir', dir) |
|
681 |
|
682 class DirSelectBox(TixWidget): |
|
683 """DirSelectBox - Motif style file select box. |
|
684 It is generally used for |
|
685 the user to choose a file. FileSelectBox stores the files mostly |
|
686 recently selected into a ComboBox widget so that they can be quickly |
|
687 selected again. |
|
688 |
|
689 Subwidget Class |
|
690 --------- ----- |
|
691 selection ComboBox |
|
692 filter ComboBox |
|
693 dirlist ScrolledListBox |
|
694 filelist ScrolledListBox""" |
|
695 |
|
696 def __init__(self, master, cnf={}, **kw): |
|
697 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw) |
|
698 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') |
|
699 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') |
|
700 |
|
701 class ExFileSelectBox(TixWidget): |
|
702 """ExFileSelectBox - MS Windows style file select box. |
|
703 It provides an convenient method for the user to select files. |
|
704 |
|
705 Subwidget Class |
|
706 --------- ----- |
|
707 cancel Button |
|
708 ok Button |
|
709 hidden Checkbutton |
|
710 types ComboBox |
|
711 dir ComboBox |
|
712 file ComboBox |
|
713 dirlist ScrolledListBox |
|
714 filelist ScrolledListBox""" |
|
715 |
|
716 def __init__(self, master, cnf={}, **kw): |
|
717 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw) |
|
718 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') |
|
719 self.subwidget_list['ok'] = _dummyButton(self, 'ok') |
|
720 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden') |
|
721 self.subwidget_list['types'] = _dummyComboBox(self, 'types') |
|
722 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir') |
|
723 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') |
|
724 self.subwidget_list['file'] = _dummyComboBox(self, 'file') |
|
725 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') |
|
726 |
|
727 def filter(self): |
|
728 self.tk.call(self._w, 'filter') |
|
729 |
|
730 def invoke(self): |
|
731 self.tk.call(self._w, 'invoke') |
|
732 |
|
733 |
|
734 # Should inherit from a Dialog class |
|
735 class DirSelectDialog(TixWidget): |
|
736 """The DirSelectDialog widget presents the directories in the file |
|
737 system in a dialog window. The user can use this dialog window to |
|
738 navigate through the file system to select the desired directory. |
|
739 |
|
740 Subwidgets Class |
|
741 ---------- ----- |
|
742 dirbox DirSelectDialog""" |
|
743 |
|
744 # FIXME: It should inherit -superclass tixDialogShell |
|
745 def __init__(self, master, cnf={}, **kw): |
|
746 TixWidget.__init__(self, master, 'tixDirSelectDialog', |
|
747 ['options'], cnf, kw) |
|
748 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox') |
|
749 # cancel and ok buttons are missing |
|
750 |
|
751 def popup(self): |
|
752 self.tk.call(self._w, 'popup') |
|
753 |
|
754 def popdown(self): |
|
755 self.tk.call(self._w, 'popdown') |
|
756 |
|
757 |
|
758 # Should inherit from a Dialog class |
|
759 class ExFileSelectDialog(TixWidget): |
|
760 """ExFileSelectDialog - MS Windows style file select dialog. |
|
761 It provides an convenient method for the user to select files. |
|
762 |
|
763 Subwidgets Class |
|
764 ---------- ----- |
|
765 fsbox ExFileSelectBox""" |
|
766 |
|
767 # FIXME: It should inherit -superclass tixDialogShell |
|
768 def __init__(self, master, cnf={}, **kw): |
|
769 TixWidget.__init__(self, master, 'tixExFileSelectDialog', |
|
770 ['options'], cnf, kw) |
|
771 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox') |
|
772 |
|
773 def popup(self): |
|
774 self.tk.call(self._w, 'popup') |
|
775 |
|
776 def popdown(self): |
|
777 self.tk.call(self._w, 'popdown') |
|
778 |
|
779 class FileSelectBox(TixWidget): |
|
780 """ExFileSelectBox - Motif style file select box. |
|
781 It is generally used for |
|
782 the user to choose a file. FileSelectBox stores the files mostly |
|
783 recently selected into a ComboBox widget so that they can be quickly |
|
784 selected again. |
|
785 |
|
786 Subwidget Class |
|
787 --------- ----- |
|
788 selection ComboBox |
|
789 filter ComboBox |
|
790 dirlist ScrolledListBox |
|
791 filelist ScrolledListBox""" |
|
792 |
|
793 def __init__(self, master, cnf={}, **kw): |
|
794 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw) |
|
795 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') |
|
796 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') |
|
797 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter') |
|
798 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection') |
|
799 |
|
800 def apply_filter(self): # name of subwidget is same as command |
|
801 self.tk.call(self._w, 'filter') |
|
802 |
|
803 def invoke(self): |
|
804 self.tk.call(self._w, 'invoke') |
|
805 |
|
806 # Should inherit from a Dialog class |
|
807 class FileSelectDialog(TixWidget): |
|
808 """FileSelectDialog - Motif style file select dialog. |
|
809 |
|
810 Subwidgets Class |
|
811 ---------- ----- |
|
812 btns StdButtonBox |
|
813 fsbox FileSelectBox""" |
|
814 |
|
815 # FIXME: It should inherit -superclass tixStdDialogShell |
|
816 def __init__(self, master, cnf={}, **kw): |
|
817 TixWidget.__init__(self, master, 'tixFileSelectDialog', |
|
818 ['options'], cnf, kw) |
|
819 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns') |
|
820 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox') |
|
821 |
|
822 def popup(self): |
|
823 self.tk.call(self._w, 'popup') |
|
824 |
|
825 def popdown(self): |
|
826 self.tk.call(self._w, 'popdown') |
|
827 |
|
828 class FileEntry(TixWidget): |
|
829 """FileEntry - Entry field with button that invokes a FileSelectDialog. |
|
830 The user can type in the filename manually. Alternatively, the user can |
|
831 press the button widget that sits next to the entry, which will bring |
|
832 up a file selection dialog. |
|
833 |
|
834 Subwidgets Class |
|
835 ---------- ----- |
|
836 button Button |
|
837 entry Entry""" |
|
838 |
|
839 # FIXME: It should inherit -superclass tixLabelWidget |
|
840 def __init__(self, master, cnf={}, **kw): |
|
841 TixWidget.__init__(self, master, 'tixFileEntry', |
|
842 ['dialogtype', 'options'], cnf, kw) |
|
843 self.subwidget_list['button'] = _dummyButton(self, 'button') |
|
844 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') |
|
845 |
|
846 def invoke(self): |
|
847 self.tk.call(self._w, 'invoke') |
|
848 |
|
849 def file_dialog(self): |
|
850 # FIXME: return python object |
|
851 pass |
|
852 |
|
853 class HList(TixWidget): |
|
854 """HList - Hierarchy display widget can be used to display any data |
|
855 that have a hierarchical structure, for example, file system directory |
|
856 trees. The list entries are indented and connected by branch lines |
|
857 according to their places in the hierachy. |
|
858 |
|
859 Subwidgets - None""" |
|
860 |
|
861 def __init__ (self,master=None,cnf={}, **kw): |
|
862 TixWidget.__init__(self, master, 'tixHList', |
|
863 ['columns', 'options'], cnf, kw) |
|
864 |
|
865 def add(self, entry, cnf={}, **kw): |
|
866 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw)) |
|
867 |
|
868 def add_child(self, parent=None, cnf={}, **kw): |
|
869 if not parent: |
|
870 parent = '' |
|
871 return self.tk.call( |
|
872 self._w, 'addchild', parent, *self._options(cnf, kw)) |
|
873 |
|
874 def anchor_set(self, entry): |
|
875 self.tk.call(self._w, 'anchor', 'set', entry) |
|
876 |
|
877 def anchor_clear(self): |
|
878 self.tk.call(self._w, 'anchor', 'clear') |
|
879 |
|
880 def column_width(self, col=0, width=None, chars=None): |
|
881 if not chars: |
|
882 return self.tk.call(self._w, 'column', 'width', col, width) |
|
883 else: |
|
884 return self.tk.call(self._w, 'column', 'width', col, |
|
885 '-char', chars) |
|
886 |
|
887 def delete_all(self): |
|
888 self.tk.call(self._w, 'delete', 'all') |
|
889 |
|
890 def delete_entry(self, entry): |
|
891 self.tk.call(self._w, 'delete', 'entry', entry) |
|
892 |
|
893 def delete_offsprings(self, entry): |
|
894 self.tk.call(self._w, 'delete', 'offsprings', entry) |
|
895 |
|
896 def delete_siblings(self, entry): |
|
897 self.tk.call(self._w, 'delete', 'siblings', entry) |
|
898 |
|
899 def dragsite_set(self, index): |
|
900 self.tk.call(self._w, 'dragsite', 'set', index) |
|
901 |
|
902 def dragsite_clear(self): |
|
903 self.tk.call(self._w, 'dragsite', 'clear') |
|
904 |
|
905 def dropsite_set(self, index): |
|
906 self.tk.call(self._w, 'dropsite', 'set', index) |
|
907 |
|
908 def dropsite_clear(self): |
|
909 self.tk.call(self._w, 'dropsite', 'clear') |
|
910 |
|
911 def header_create(self, col, cnf={}, **kw): |
|
912 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw)) |
|
913 |
|
914 def header_configure(self, col, cnf={}, **kw): |
|
915 if cnf is None: |
|
916 return _lst2dict( |
|
917 self.tk.split( |
|
918 self.tk.call(self._w, 'header', 'configure', col))) |
|
919 self.tk.call(self._w, 'header', 'configure', col, |
|
920 *self._options(cnf, kw)) |
|
921 |
|
922 def header_cget(self, col, opt): |
|
923 return self.tk.call(self._w, 'header', 'cget', col, opt) |
|
924 |
|
925 def header_exists(self, col): |
|
926 return self.tk.call(self._w, 'header', 'exists', col) |
|
927 |
|
928 def header_delete(self, col): |
|
929 self.tk.call(self._w, 'header', 'delete', col) |
|
930 |
|
931 def header_size(self, col): |
|
932 return self.tk.call(self._w, 'header', 'size', col) |
|
933 |
|
934 def hide_entry(self, entry): |
|
935 self.tk.call(self._w, 'hide', 'entry', entry) |
|
936 |
|
937 def indicator_create(self, entry, cnf={}, **kw): |
|
938 self.tk.call( |
|
939 self._w, 'indicator', 'create', entry, *self._options(cnf, kw)) |
|
940 |
|
941 def indicator_configure(self, entry, cnf={}, **kw): |
|
942 if cnf is None: |
|
943 return _lst2dict( |
|
944 self.tk.split( |
|
945 self.tk.call(self._w, 'indicator', 'configure', entry))) |
|
946 self.tk.call( |
|
947 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw)) |
|
948 |
|
949 def indicator_cget(self, entry, opt): |
|
950 return self.tk.call(self._w, 'indicator', 'cget', entry, opt) |
|
951 |
|
952 def indicator_exists(self, entry): |
|
953 return self.tk.call (self._w, 'indicator', 'exists', entry) |
|
954 |
|
955 def indicator_delete(self, entry): |
|
956 self.tk.call(self._w, 'indicator', 'delete', entry) |
|
957 |
|
958 def indicator_size(self, entry): |
|
959 return self.tk.call(self._w, 'indicator', 'size', entry) |
|
960 |
|
961 def info_anchor(self): |
|
962 return self.tk.call(self._w, 'info', 'anchor') |
|
963 |
|
964 def info_children(self, entry=None): |
|
965 c = self.tk.call(self._w, 'info', 'children', entry) |
|
966 return self.tk.splitlist(c) |
|
967 |
|
968 def info_data(self, entry): |
|
969 return self.tk.call(self._w, 'info', 'data', entry) |
|
970 |
|
971 def info_exists(self, entry): |
|
972 return self.tk.call(self._w, 'info', 'exists', entry) |
|
973 |
|
974 def info_hidden(self, entry): |
|
975 return self.tk.call(self._w, 'info', 'hidden', entry) |
|
976 |
|
977 def info_next(self, entry): |
|
978 return self.tk.call(self._w, 'info', 'next', entry) |
|
979 |
|
980 def info_parent(self, entry): |
|
981 return self.tk.call(self._w, 'info', 'parent', entry) |
|
982 |
|
983 def info_prev(self, entry): |
|
984 return self.tk.call(self._w, 'info', 'prev', entry) |
|
985 |
|
986 def info_selection(self): |
|
987 c = self.tk.call(self._w, 'info', 'selection') |
|
988 return self.tk.splitlist(c) |
|
989 |
|
990 def item_cget(self, entry, col, opt): |
|
991 return self.tk.call(self._w, 'item', 'cget', entry, col, opt) |
|
992 |
|
993 def item_configure(self, entry, col, cnf={}, **kw): |
|
994 if cnf is None: |
|
995 return _lst2dict( |
|
996 self.tk.split( |
|
997 self.tk.call(self._w, 'item', 'configure', entry, col))) |
|
998 self.tk.call(self._w, 'item', 'configure', entry, col, |
|
999 *self._options(cnf, kw)) |
|
1000 |
|
1001 def item_create(self, entry, col, cnf={}, **kw): |
|
1002 self.tk.call( |
|
1003 self._w, 'item', 'create', entry, col, *self._options(cnf, kw)) |
|
1004 |
|
1005 def item_exists(self, entry, col): |
|
1006 return self.tk.call(self._w, 'item', 'exists', entry, col) |
|
1007 |
|
1008 def item_delete(self, entry, col): |
|
1009 self.tk.call(self._w, 'item', 'delete', entry, col) |
|
1010 |
|
1011 def entrycget(self, entry, opt): |
|
1012 return self.tk.call(self._w, 'entrycget', entry, opt) |
|
1013 |
|
1014 def entryconfigure(self, entry, cnf={}, **kw): |
|
1015 if cnf is None: |
|
1016 return _lst2dict( |
|
1017 self.tk.split( |
|
1018 self.tk.call(self._w, 'entryconfigure', entry))) |
|
1019 self.tk.call(self._w, 'entryconfigure', entry, |
|
1020 *self._options(cnf, kw)) |
|
1021 |
|
1022 def nearest(self, y): |
|
1023 return self.tk.call(self._w, 'nearest', y) |
|
1024 |
|
1025 def see(self, entry): |
|
1026 self.tk.call(self._w, 'see', entry) |
|
1027 |
|
1028 def selection_clear(self, cnf={}, **kw): |
|
1029 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw)) |
|
1030 |
|
1031 def selection_includes(self, entry): |
|
1032 return self.tk.call(self._w, 'selection', 'includes', entry) |
|
1033 |
|
1034 def selection_set(self, first, last=None): |
|
1035 self.tk.call(self._w, 'selection', 'set', first, last) |
|
1036 |
|
1037 def show_entry(self, entry): |
|
1038 return self.tk.call(self._w, 'show', 'entry', entry) |
|
1039 |
|
1040 def xview(self, *args): |
|
1041 self.tk.call(self._w, 'xview', *args) |
|
1042 |
|
1043 def yview(self, *args): |
|
1044 self.tk.call(self._w, 'yview', *args) |
|
1045 |
|
1046 class InputOnly(TixWidget): |
|
1047 """InputOnly - Invisible widget. Unix only. |
|
1048 |
|
1049 Subwidgets - None""" |
|
1050 |
|
1051 def __init__ (self,master=None,cnf={}, **kw): |
|
1052 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw) |
|
1053 |
|
1054 class LabelEntry(TixWidget): |
|
1055 """LabelEntry - Entry field with label. Packages an entry widget |
|
1056 and a label into one mega widget. It can beused be used to simplify |
|
1057 the creation of ``entry-form'' type of interface. |
|
1058 |
|
1059 Subwidgets Class |
|
1060 ---------- ----- |
|
1061 label Label |
|
1062 entry Entry""" |
|
1063 |
|
1064 def __init__ (self,master=None,cnf={}, **kw): |
|
1065 TixWidget.__init__(self, master, 'tixLabelEntry', |
|
1066 ['labelside','options'], cnf, kw) |
|
1067 self.subwidget_list['label'] = _dummyLabel(self, 'label') |
|
1068 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') |
|
1069 |
|
1070 class LabelFrame(TixWidget): |
|
1071 """LabelFrame - Labelled Frame container. Packages a frame widget |
|
1072 and a label into one mega widget. To create widgets inside a |
|
1073 LabelFrame widget, one creates the new widgets relative to the |
|
1074 frame subwidget and manage them inside the frame subwidget. |
|
1075 |
|
1076 Subwidgets Class |
|
1077 ---------- ----- |
|
1078 label Label |
|
1079 frame Frame""" |
|
1080 |
|
1081 def __init__ (self,master=None,cnf={}, **kw): |
|
1082 TixWidget.__init__(self, master, 'tixLabelFrame', |
|
1083 ['labelside','options'], cnf, kw) |
|
1084 self.subwidget_list['label'] = _dummyLabel(self, 'label') |
|
1085 self.subwidget_list['frame'] = _dummyFrame(self, 'frame') |
|
1086 |
|
1087 |
|
1088 class ListNoteBook(TixWidget): |
|
1089 """A ListNoteBook widget is very similar to the TixNoteBook widget: |
|
1090 it can be used to display many windows in a limited space using a |
|
1091 notebook metaphor. The notebook is divided into a stack of pages |
|
1092 (windows). At one time only one of these pages can be shown. |
|
1093 The user can navigate through these pages by |
|
1094 choosing the name of the desired page in the hlist subwidget.""" |
|
1095 |
|
1096 def __init__(self, master, cnf={}, **kw): |
|
1097 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw) |
|
1098 # Is this necessary? It's not an exposed subwidget in Tix. |
|
1099 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane', |
|
1100 destroy_physically=0) |
|
1101 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
1102 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist') |
|
1103 |
|
1104 def add(self, name, cnf={}, **kw): |
|
1105 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) |
|
1106 self.subwidget_list[name] = TixSubWidget(self, name) |
|
1107 return self.subwidget_list[name] |
|
1108 |
|
1109 def page(self, name): |
|
1110 return self.subwidget(name) |
|
1111 |
|
1112 def pages(self): |
|
1113 # Can't call subwidgets_all directly because we don't want .nbframe |
|
1114 names = self.tk.split(self.tk.call(self._w, 'pages')) |
|
1115 ret = [] |
|
1116 for x in names: |
|
1117 ret.append(self.subwidget(x)) |
|
1118 return ret |
|
1119 |
|
1120 def raise_page(self, name): # raise is a python keyword |
|
1121 self.tk.call(self._w, 'raise', name) |
|
1122 |
|
1123 class Meter(TixWidget): |
|
1124 """The Meter widget can be used to show the progress of a background |
|
1125 job which may take a long time to execute. |
|
1126 """ |
|
1127 |
|
1128 def __init__(self, master=None, cnf={}, **kw): |
|
1129 TixWidget.__init__(self, master, 'tixMeter', |
|
1130 ['options'], cnf, kw) |
|
1131 |
|
1132 class NoteBook(TixWidget): |
|
1133 """NoteBook - Multi-page container widget (tabbed notebook metaphor). |
|
1134 |
|
1135 Subwidgets Class |
|
1136 ---------- ----- |
|
1137 nbframe NoteBookFrame |
|
1138 <pages> page widgets added dynamically with the add method""" |
|
1139 |
|
1140 def __init__ (self,master=None,cnf={}, **kw): |
|
1141 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw) |
|
1142 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe', |
|
1143 destroy_physically=0) |
|
1144 |
|
1145 def add(self, name, cnf={}, **kw): |
|
1146 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) |
|
1147 self.subwidget_list[name] = TixSubWidget(self, name) |
|
1148 return self.subwidget_list[name] |
|
1149 |
|
1150 def delete(self, name): |
|
1151 self.tk.call(self._w, 'delete', name) |
|
1152 self.subwidget_list[name].destroy() |
|
1153 del self.subwidget_list[name] |
|
1154 |
|
1155 def page(self, name): |
|
1156 return self.subwidget(name) |
|
1157 |
|
1158 def pages(self): |
|
1159 # Can't call subwidgets_all directly because we don't want .nbframe |
|
1160 names = self.tk.split(self.tk.call(self._w, 'pages')) |
|
1161 ret = [] |
|
1162 for x in names: |
|
1163 ret.append(self.subwidget(x)) |
|
1164 return ret |
|
1165 |
|
1166 def raise_page(self, name): # raise is a python keyword |
|
1167 self.tk.call(self._w, 'raise', name) |
|
1168 |
|
1169 def raised(self): |
|
1170 return self.tk.call(self._w, 'raised') |
|
1171 |
|
1172 class NoteBookFrame(TixWidget): |
|
1173 # FIXME: This is dangerous to expose to be called on its own. |
|
1174 pass |
|
1175 |
|
1176 class OptionMenu(TixWidget): |
|
1177 """OptionMenu - creates a menu button of options. |
|
1178 |
|
1179 Subwidget Class |
|
1180 --------- ----- |
|
1181 menubutton Menubutton |
|
1182 menu Menu""" |
|
1183 |
|
1184 def __init__(self, master, cnf={}, **kw): |
|
1185 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw) |
|
1186 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton') |
|
1187 self.subwidget_list['menu'] = _dummyMenu(self, 'menu') |
|
1188 |
|
1189 def add_command(self, name, cnf={}, **kw): |
|
1190 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw)) |
|
1191 |
|
1192 def add_separator(self, name, cnf={}, **kw): |
|
1193 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw)) |
|
1194 |
|
1195 def delete(self, name): |
|
1196 self.tk.call(self._w, 'delete', name) |
|
1197 |
|
1198 def disable(self, name): |
|
1199 self.tk.call(self._w, 'disable', name) |
|
1200 |
|
1201 def enable(self, name): |
|
1202 self.tk.call(self._w, 'enable', name) |
|
1203 |
|
1204 class PanedWindow(TixWidget): |
|
1205 """PanedWindow - Multi-pane container widget |
|
1206 allows the user to interactively manipulate the sizes of several |
|
1207 panes. The panes can be arranged either vertically or horizontally.The |
|
1208 user changes the sizes of the panes by dragging the resize handle |
|
1209 between two panes. |
|
1210 |
|
1211 Subwidgets Class |
|
1212 ---------- ----- |
|
1213 <panes> g/p widgets added dynamically with the add method.""" |
|
1214 |
|
1215 def __init__(self, master, cnf={}, **kw): |
|
1216 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw) |
|
1217 |
|
1218 # add delete forget panecget paneconfigure panes setsize |
|
1219 def add(self, name, cnf={}, **kw): |
|
1220 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) |
|
1221 self.subwidget_list[name] = TixSubWidget(self, name, |
|
1222 check_intermediate=0) |
|
1223 return self.subwidget_list[name] |
|
1224 |
|
1225 def delete(self, name): |
|
1226 self.tk.call(self._w, 'delete', name) |
|
1227 self.subwidget_list[name].destroy() |
|
1228 del self.subwidget_list[name] |
|
1229 |
|
1230 def forget(self, name): |
|
1231 self.tk.call(self._w, 'forget', name) |
|
1232 |
|
1233 def panecget(self, entry, opt): |
|
1234 return self.tk.call(self._w, 'panecget', entry, opt) |
|
1235 |
|
1236 def paneconfigure(self, entry, cnf={}, **kw): |
|
1237 if cnf is None: |
|
1238 return _lst2dict( |
|
1239 self.tk.split( |
|
1240 self.tk.call(self._w, 'paneconfigure', entry))) |
|
1241 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw)) |
|
1242 |
|
1243 def panes(self): |
|
1244 names = self.tk.call(self._w, 'panes') |
|
1245 ret = [] |
|
1246 for x in names: |
|
1247 ret.append(self.subwidget(x)) |
|
1248 return ret |
|
1249 |
|
1250 class PopupMenu(TixWidget): |
|
1251 """PopupMenu widget can be used as a replacement of the tk_popup command. |
|
1252 The advantage of the Tix PopupMenu widget is it requires less application |
|
1253 code to manipulate. |
|
1254 |
|
1255 |
|
1256 Subwidgets Class |
|
1257 ---------- ----- |
|
1258 menubutton Menubutton |
|
1259 menu Menu""" |
|
1260 |
|
1261 # FIXME: It should inherit -superclass tixShell |
|
1262 def __init__(self, master, cnf={}, **kw): |
|
1263 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw) |
|
1264 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton') |
|
1265 self.subwidget_list['menu'] = _dummyMenu(self, 'menu') |
|
1266 |
|
1267 def bind_widget(self, widget): |
|
1268 self.tk.call(self._w, 'bind', widget._w) |
|
1269 |
|
1270 def unbind_widget(self, widget): |
|
1271 self.tk.call(self._w, 'unbind', widget._w) |
|
1272 |
|
1273 def post_widget(self, widget, x, y): |
|
1274 self.tk.call(self._w, 'post', widget._w, x, y) |
|
1275 |
|
1276 class ResizeHandle(TixWidget): |
|
1277 """Internal widget to draw resize handles on Scrolled widgets.""" |
|
1278 def __init__(self, master, cnf={}, **kw): |
|
1279 # There seems to be a Tix bug rejecting the configure method |
|
1280 # Let's try making the flags -static |
|
1281 flags = ['options', 'command', 'cursorfg', 'cursorbg', |
|
1282 'handlesize', 'hintcolor', 'hintwidth', |
|
1283 'x', 'y'] |
|
1284 # In fact, x y height width are configurable |
|
1285 TixWidget.__init__(self, master, 'tixResizeHandle', |
|
1286 flags, cnf, kw) |
|
1287 |
|
1288 def attach_widget(self, widget): |
|
1289 self.tk.call(self._w, 'attachwidget', widget._w) |
|
1290 |
|
1291 def detach_widget(self, widget): |
|
1292 self.tk.call(self._w, 'detachwidget', widget._w) |
|
1293 |
|
1294 def hide(self, widget): |
|
1295 self.tk.call(self._w, 'hide', widget._w) |
|
1296 |
|
1297 def show(self, widget): |
|
1298 self.tk.call(self._w, 'show', widget._w) |
|
1299 |
|
1300 class ScrolledHList(TixWidget): |
|
1301 """ScrolledHList - HList with automatic scrollbars.""" |
|
1302 |
|
1303 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1304 def __init__(self, master, cnf={}, **kw): |
|
1305 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'], |
|
1306 cnf, kw) |
|
1307 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
1308 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1309 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1310 |
|
1311 class ScrolledListBox(TixWidget): |
|
1312 """ScrolledListBox - Listbox with automatic scrollbars.""" |
|
1313 |
|
1314 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1315 def __init__(self, master, cnf={}, **kw): |
|
1316 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw) |
|
1317 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox') |
|
1318 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1319 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1320 |
|
1321 class ScrolledText(TixWidget): |
|
1322 """ScrolledText - Text with automatic scrollbars.""" |
|
1323 |
|
1324 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1325 def __init__(self, master, cnf={}, **kw): |
|
1326 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw) |
|
1327 self.subwidget_list['text'] = _dummyText(self, 'text') |
|
1328 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1329 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1330 |
|
1331 class ScrolledTList(TixWidget): |
|
1332 """ScrolledTList - TList with automatic scrollbars.""" |
|
1333 |
|
1334 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1335 def __init__(self, master, cnf={}, **kw): |
|
1336 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'], |
|
1337 cnf, kw) |
|
1338 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist') |
|
1339 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1340 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1341 |
|
1342 class ScrolledWindow(TixWidget): |
|
1343 """ScrolledWindow - Window with automatic scrollbars.""" |
|
1344 |
|
1345 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1346 def __init__(self, master, cnf={}, **kw): |
|
1347 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw) |
|
1348 self.subwidget_list['window'] = _dummyFrame(self, 'window') |
|
1349 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1350 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1351 |
|
1352 class Select(TixWidget): |
|
1353 """Select - Container of button subwidgets. It can be used to provide |
|
1354 radio-box or check-box style of selection options for the user. |
|
1355 |
|
1356 Subwidgets are buttons added dynamically using the add method.""" |
|
1357 |
|
1358 # FIXME: It should inherit -superclass tixLabelWidget |
|
1359 def __init__(self, master, cnf={}, **kw): |
|
1360 TixWidget.__init__(self, master, 'tixSelect', |
|
1361 ['allowzero', 'radio', 'orientation', 'labelside', |
|
1362 'options'], |
|
1363 cnf, kw) |
|
1364 self.subwidget_list['label'] = _dummyLabel(self, 'label') |
|
1365 |
|
1366 def add(self, name, cnf={}, **kw): |
|
1367 self.tk.call(self._w, 'add', name, *self._options(cnf, kw)) |
|
1368 self.subwidget_list[name] = _dummyButton(self, name) |
|
1369 return self.subwidget_list[name] |
|
1370 |
|
1371 def invoke(self, name): |
|
1372 self.tk.call(self._w, 'invoke', name) |
|
1373 |
|
1374 class Shell(TixWidget): |
|
1375 """Toplevel window. |
|
1376 |
|
1377 Subwidgets - None""" |
|
1378 |
|
1379 def __init__ (self,master=None,cnf={}, **kw): |
|
1380 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw) |
|
1381 |
|
1382 class DialogShell(TixWidget): |
|
1383 """Toplevel window, with popup popdown and center methods. |
|
1384 It tells the window manager that it is a dialog window and should be |
|
1385 treated specially. The exact treatment depends on the treatment of |
|
1386 the window manager. |
|
1387 |
|
1388 Subwidgets - None""" |
|
1389 |
|
1390 # FIXME: It should inherit from Shell |
|
1391 def __init__ (self,master=None,cnf={}, **kw): |
|
1392 TixWidget.__init__(self, master, |
|
1393 'tixDialogShell', |
|
1394 ['options', 'title', 'mapped', |
|
1395 'minheight', 'minwidth', |
|
1396 'parent', 'transient'], cnf, kw) |
|
1397 |
|
1398 def popdown(self): |
|
1399 self.tk.call(self._w, 'popdown') |
|
1400 |
|
1401 def popup(self): |
|
1402 self.tk.call(self._w, 'popup') |
|
1403 |
|
1404 def center(self): |
|
1405 self.tk.call(self._w, 'center') |
|
1406 |
|
1407 class StdButtonBox(TixWidget): |
|
1408 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """ |
|
1409 |
|
1410 def __init__(self, master=None, cnf={}, **kw): |
|
1411 TixWidget.__init__(self, master, 'tixStdButtonBox', |
|
1412 ['orientation', 'options'], cnf, kw) |
|
1413 self.subwidget_list['ok'] = _dummyButton(self, 'ok') |
|
1414 self.subwidget_list['apply'] = _dummyButton(self, 'apply') |
|
1415 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') |
|
1416 self.subwidget_list['help'] = _dummyButton(self, 'help') |
|
1417 |
|
1418 def invoke(self, name): |
|
1419 if self.subwidget_list.has_key(name): |
|
1420 self.tk.call(self._w, 'invoke', name) |
|
1421 |
|
1422 class TList(TixWidget): |
|
1423 """TList - Hierarchy display widget which can be |
|
1424 used to display data in a tabular format. The list entries of a TList |
|
1425 widget are similar to the entries in the Tk listbox widget. The main |
|
1426 differences are (1) the TList widget can display the list entries in a |
|
1427 two dimensional format and (2) you can use graphical images as well as |
|
1428 multiple colors and fonts for the list entries. |
|
1429 |
|
1430 Subwidgets - None""" |
|
1431 |
|
1432 def __init__ (self,master=None,cnf={}, **kw): |
|
1433 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw) |
|
1434 |
|
1435 def active_set(self, index): |
|
1436 self.tk.call(self._w, 'active', 'set', index) |
|
1437 |
|
1438 def active_clear(self): |
|
1439 self.tk.call(self._w, 'active', 'clear') |
|
1440 |
|
1441 def anchor_set(self, index): |
|
1442 self.tk.call(self._w, 'anchor', 'set', index) |
|
1443 |
|
1444 def anchor_clear(self): |
|
1445 self.tk.call(self._w, 'anchor', 'clear') |
|
1446 |
|
1447 def delete(self, from_, to=None): |
|
1448 self.tk.call(self._w, 'delete', from_, to) |
|
1449 |
|
1450 def dragsite_set(self, index): |
|
1451 self.tk.call(self._w, 'dragsite', 'set', index) |
|
1452 |
|
1453 def dragsite_clear(self): |
|
1454 self.tk.call(self._w, 'dragsite', 'clear') |
|
1455 |
|
1456 def dropsite_set(self, index): |
|
1457 self.tk.call(self._w, 'dropsite', 'set', index) |
|
1458 |
|
1459 def dropsite_clear(self): |
|
1460 self.tk.call(self._w, 'dropsite', 'clear') |
|
1461 |
|
1462 def insert(self, index, cnf={}, **kw): |
|
1463 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw)) |
|
1464 |
|
1465 def info_active(self): |
|
1466 return self.tk.call(self._w, 'info', 'active') |
|
1467 |
|
1468 def info_anchor(self): |
|
1469 return self.tk.call(self._w, 'info', 'anchor') |
|
1470 |
|
1471 def info_down(self, index): |
|
1472 return self.tk.call(self._w, 'info', 'down', index) |
|
1473 |
|
1474 def info_left(self, index): |
|
1475 return self.tk.call(self._w, 'info', 'left', index) |
|
1476 |
|
1477 def info_right(self, index): |
|
1478 return self.tk.call(self._w, 'info', 'right', index) |
|
1479 |
|
1480 def info_selection(self): |
|
1481 c = self.tk.call(self._w, 'info', 'selection') |
|
1482 return self.tk.splitlist(c) |
|
1483 |
|
1484 def info_size(self): |
|
1485 return self.tk.call(self._w, 'info', 'size') |
|
1486 |
|
1487 def info_up(self, index): |
|
1488 return self.tk.call(self._w, 'info', 'up', index) |
|
1489 |
|
1490 def nearest(self, x, y): |
|
1491 return self.tk.call(self._w, 'nearest', x, y) |
|
1492 |
|
1493 def see(self, index): |
|
1494 self.tk.call(self._w, 'see', index) |
|
1495 |
|
1496 def selection_clear(self, cnf={}, **kw): |
|
1497 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw)) |
|
1498 |
|
1499 def selection_includes(self, index): |
|
1500 return self.tk.call(self._w, 'selection', 'includes', index) |
|
1501 |
|
1502 def selection_set(self, first, last=None): |
|
1503 self.tk.call(self._w, 'selection', 'set', first, last) |
|
1504 |
|
1505 def xview(self, *args): |
|
1506 self.tk.call(self._w, 'xview', *args) |
|
1507 |
|
1508 def yview(self, *args): |
|
1509 self.tk.call(self._w, 'yview', *args) |
|
1510 |
|
1511 class Tree(TixWidget): |
|
1512 """Tree - The tixTree widget can be used to display hierachical |
|
1513 data in a tree form. The user can adjust |
|
1514 the view of the tree by opening or closing parts of the tree.""" |
|
1515 |
|
1516 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1517 def __init__(self, master=None, cnf={}, **kw): |
|
1518 TixWidget.__init__(self, master, 'tixTree', |
|
1519 ['options'], cnf, kw) |
|
1520 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
1521 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1522 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1523 |
|
1524 def autosetmode(self): |
|
1525 '''This command calls the setmode method for all the entries in this |
|
1526 Tree widget: if an entry has no child entries, its mode is set to |
|
1527 none. Otherwise, if the entry has any hidden child entries, its mode is |
|
1528 set to open; otherwise its mode is set to close.''' |
|
1529 self.tk.call(self._w, 'autosetmode') |
|
1530 |
|
1531 def close(self, entrypath): |
|
1532 '''Close the entry given by entryPath if its mode is close.''' |
|
1533 self.tk.call(self._w, 'close', entrypath) |
|
1534 |
|
1535 def getmode(self, entrypath): |
|
1536 '''Returns the current mode of the entry given by entryPath.''' |
|
1537 return self.tk.call(self._w, 'getmode', entrypath) |
|
1538 |
|
1539 def open(self, entrypath): |
|
1540 '''Open the entry given by entryPath if its mode is open.''' |
|
1541 self.tk.call(self._w, 'open', entrypath) |
|
1542 |
|
1543 def setmode(self, entrypath, mode='none'): |
|
1544 '''This command is used to indicate whether the entry given by |
|
1545 entryPath has children entries and whether the children are visible. mode |
|
1546 must be one of open, close or none. If mode is set to open, a (+) |
|
1547 indicator is drawn next the the entry. If mode is set to close, a (-) |
|
1548 indicator is drawn next the the entry. If mode is set to none, no |
|
1549 indicators will be drawn for this entry. The default mode is none. The |
|
1550 open mode indicates the entry has hidden children and this entry can be |
|
1551 opened by the user. The close mode indicates that all the children of the |
|
1552 entry are now visible and the entry can be closed by the user.''' |
|
1553 self.tk.call(self._w, 'setmode', entrypath, mode) |
|
1554 |
|
1555 |
|
1556 # Could try subclassing Tree for CheckList - would need another arg to init |
|
1557 class CheckList(TixWidget): |
|
1558 """The CheckList widget |
|
1559 displays a list of items to be selected by the user. CheckList acts |
|
1560 similarly to the Tk checkbutton or radiobutton widgets, except it is |
|
1561 capable of handling many more items than checkbuttons or radiobuttons. |
|
1562 """ |
|
1563 # FIXME: It should inherit -superclass tixTree |
|
1564 def __init__(self, master=None, cnf={}, **kw): |
|
1565 TixWidget.__init__(self, master, 'tixCheckList', |
|
1566 ['options'], cnf, kw) |
|
1567 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
1568 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1569 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1570 |
|
1571 def autosetmode(self): |
|
1572 '''This command calls the setmode method for all the entries in this |
|
1573 Tree widget: if an entry has no child entries, its mode is set to |
|
1574 none. Otherwise, if the entry has any hidden child entries, its mode is |
|
1575 set to open; otherwise its mode is set to close.''' |
|
1576 self.tk.call(self._w, 'autosetmode') |
|
1577 |
|
1578 def close(self, entrypath): |
|
1579 '''Close the entry given by entryPath if its mode is close.''' |
|
1580 self.tk.call(self._w, 'close', entrypath) |
|
1581 |
|
1582 def getmode(self, entrypath): |
|
1583 '''Returns the current mode of the entry given by entryPath.''' |
|
1584 return self.tk.call(self._w, 'getmode', entrypath) |
|
1585 |
|
1586 def open(self, entrypath): |
|
1587 '''Open the entry given by entryPath if its mode is open.''' |
|
1588 self.tk.call(self._w, 'open', entrypath) |
|
1589 |
|
1590 def getselection(self, mode='on'): |
|
1591 '''Returns a list of items whose status matches status. If status is |
|
1592 not specified, the list of items in the "on" status will be returned. |
|
1593 Mode can be on, off, default''' |
|
1594 c = self.tk.split(self.tk.call(self._w, 'getselection', mode)) |
|
1595 return self.tk.splitlist(c) |
|
1596 |
|
1597 def getstatus(self, entrypath): |
|
1598 '''Returns the current status of entryPath.''' |
|
1599 return self.tk.call(self._w, 'getstatus', entrypath) |
|
1600 |
|
1601 def setstatus(self, entrypath, mode='on'): |
|
1602 '''Sets the status of entryPath to be status. A bitmap will be |
|
1603 displayed next to the entry its status is on, off or default.''' |
|
1604 self.tk.call(self._w, 'setstatus', entrypath, mode) |
|
1605 |
|
1606 |
|
1607 ########################################################################### |
|
1608 ### The subclassing below is used to instantiate the subwidgets in each ### |
|
1609 ### mega widget. This allows us to access their methods directly. ### |
|
1610 ########################################################################### |
|
1611 |
|
1612 class _dummyButton(Button, TixSubWidget): |
|
1613 def __init__(self, master, name, destroy_physically=1): |
|
1614 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1615 |
|
1616 class _dummyCheckbutton(Checkbutton, TixSubWidget): |
|
1617 def __init__(self, master, name, destroy_physically=1): |
|
1618 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1619 |
|
1620 class _dummyEntry(Entry, TixSubWidget): |
|
1621 def __init__(self, master, name, destroy_physically=1): |
|
1622 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1623 |
|
1624 class _dummyFrame(Frame, TixSubWidget): |
|
1625 def __init__(self, master, name, destroy_physically=1): |
|
1626 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1627 |
|
1628 class _dummyLabel(Label, TixSubWidget): |
|
1629 def __init__(self, master, name, destroy_physically=1): |
|
1630 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1631 |
|
1632 class _dummyListbox(Listbox, TixSubWidget): |
|
1633 def __init__(self, master, name, destroy_physically=1): |
|
1634 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1635 |
|
1636 class _dummyMenu(Menu, TixSubWidget): |
|
1637 def __init__(self, master, name, destroy_physically=1): |
|
1638 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1639 |
|
1640 class _dummyMenubutton(Menubutton, TixSubWidget): |
|
1641 def __init__(self, master, name, destroy_physically=1): |
|
1642 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1643 |
|
1644 class _dummyScrollbar(Scrollbar, TixSubWidget): |
|
1645 def __init__(self, master, name, destroy_physically=1): |
|
1646 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1647 |
|
1648 class _dummyText(Text, TixSubWidget): |
|
1649 def __init__(self, master, name, destroy_physically=1): |
|
1650 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1651 |
|
1652 class _dummyScrolledListBox(ScrolledListBox, TixSubWidget): |
|
1653 def __init__(self, master, name, destroy_physically=1): |
|
1654 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1655 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox') |
|
1656 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1657 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1658 |
|
1659 class _dummyHList(HList, TixSubWidget): |
|
1660 def __init__(self, master, name, destroy_physically=1): |
|
1661 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1662 |
|
1663 class _dummyScrolledHList(ScrolledHList, TixSubWidget): |
|
1664 def __init__(self, master, name, destroy_physically=1): |
|
1665 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1666 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
1667 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1668 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1669 |
|
1670 class _dummyTList(TList, TixSubWidget): |
|
1671 def __init__(self, master, name, destroy_physically=1): |
|
1672 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1673 |
|
1674 class _dummyComboBox(ComboBox, TixSubWidget): |
|
1675 def __init__(self, master, name, destroy_physically=1): |
|
1676 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically]) |
|
1677 self.subwidget_list['label'] = _dummyLabel(self, 'label') |
|
1678 self.subwidget_list['entry'] = _dummyEntry(self, 'entry') |
|
1679 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow') |
|
1680 |
|
1681 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self, |
|
1682 'slistbox') |
|
1683 try: |
|
1684 self.subwidget_list['tick'] = _dummyButton(self, 'tick') |
|
1685 #cross Button : present if created with the fancy option |
|
1686 self.subwidget_list['cross'] = _dummyButton(self, 'cross') |
|
1687 except TypeError: |
|
1688 # unavailable when -fancy not specified |
|
1689 pass |
|
1690 |
|
1691 class _dummyDirList(DirList, TixSubWidget): |
|
1692 def __init__(self, master, name, destroy_physically=1): |
|
1693 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1694 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist') |
|
1695 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb') |
|
1696 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb') |
|
1697 |
|
1698 class _dummyDirSelectBox(DirSelectBox, TixSubWidget): |
|
1699 def __init__(self, master, name, destroy_physically=1): |
|
1700 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1701 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist') |
|
1702 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx') |
|
1703 |
|
1704 class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget): |
|
1705 def __init__(self, master, name, destroy_physically=1): |
|
1706 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1707 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') |
|
1708 self.subwidget_list['ok'] = _dummyButton(self, 'ok') |
|
1709 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden') |
|
1710 self.subwidget_list['types'] = _dummyComboBox(self, 'types') |
|
1711 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir') |
|
1712 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') |
|
1713 self.subwidget_list['file'] = _dummyComboBox(self, 'file') |
|
1714 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') |
|
1715 |
|
1716 class _dummyFileSelectBox(FileSelectBox, TixSubWidget): |
|
1717 def __init__(self, master, name, destroy_physically=1): |
|
1718 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1719 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist') |
|
1720 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist') |
|
1721 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter') |
|
1722 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection') |
|
1723 |
|
1724 class _dummyFileComboBox(ComboBox, TixSubWidget): |
|
1725 def __init__(self, master, name, destroy_physically=1): |
|
1726 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1727 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx') |
|
1728 |
|
1729 class _dummyStdButtonBox(StdButtonBox, TixSubWidget): |
|
1730 def __init__(self, master, name, destroy_physically=1): |
|
1731 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1732 self.subwidget_list['ok'] = _dummyButton(self, 'ok') |
|
1733 self.subwidget_list['apply'] = _dummyButton(self, 'apply') |
|
1734 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel') |
|
1735 self.subwidget_list['help'] = _dummyButton(self, 'help') |
|
1736 |
|
1737 class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget): |
|
1738 def __init__(self, master, name, destroy_physically=0): |
|
1739 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1740 |
|
1741 class _dummyPanedWindow(PanedWindow, TixSubWidget): |
|
1742 def __init__(self, master, name, destroy_physically=1): |
|
1743 TixSubWidget.__init__(self, master, name, destroy_physically) |
|
1744 |
|
1745 ######################## |
|
1746 ### Utility Routines ### |
|
1747 ######################## |
|
1748 |
|
1749 #mike Should tixDestroy be exposed as a wrapper? - but not for widgets. |
|
1750 |
|
1751 def OptionName(widget): |
|
1752 '''Returns the qualified path name for the widget. Normally used to set |
|
1753 default options for subwidgets. See tixwidgets.py''' |
|
1754 return widget.tk.call('tixOptionName', widget._w) |
|
1755 |
|
1756 # Called with a dictionary argument of the form |
|
1757 # {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'} |
|
1758 # returns a string which can be used to configure the fsbox file types |
|
1759 # in an ExFileSelectBox. i.e., |
|
1760 # '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}' |
|
1761 def FileTypeList(dict): |
|
1762 s = '' |
|
1763 for type in dict.keys(): |
|
1764 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} ' |
|
1765 return s |
|
1766 |
|
1767 # Still to be done: |
|
1768 # tixIconView |
|
1769 class CObjView(TixWidget): |
|
1770 """This file implements the Canvas Object View widget. This is a base |
|
1771 class of IconView. It implements automatic placement/adjustment of the |
|
1772 scrollbars according to the canvas objects inside the canvas subwidget. |
|
1773 The scrollbars are adjusted so that the canvas is just large enough |
|
1774 to see all the objects. |
|
1775 """ |
|
1776 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1777 pass |
|
1778 |
|
1779 |
|
1780 class Grid(TixWidget): |
|
1781 '''The Tix Grid command creates a new window and makes it into a |
|
1782 tixGrid widget. Additional options, may be specified on the command |
|
1783 line or in the option database to configure aspects such as its cursor |
|
1784 and relief. |
|
1785 |
|
1786 A Grid widget displays its contents in a two dimensional grid of cells. |
|
1787 Each cell may contain one Tix display item, which may be in text, |
|
1788 graphics or other formats. See the DisplayStyle class for more information |
|
1789 about Tix display items. Individual cells, or groups of cells, can be |
|
1790 formatted with a wide range of attributes, such as its color, relief and |
|
1791 border. |
|
1792 |
|
1793 Subwidgets - None''' |
|
1794 # valid specific resources as of Tk 8.4 |
|
1795 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd, |
|
1796 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode, |
|
1797 # selectunit, topmargin, |
|
1798 def __init__(self, master=None, cnf={}, **kw): |
|
1799 static= [] |
|
1800 self.cnf= cnf |
|
1801 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw) |
|
1802 |
|
1803 # valid options as of Tk 8.4 |
|
1804 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget, edit |
|
1805 # entryconfigure, format, geometryinfo, info, index, move, nearest, selection |
|
1806 # set, size, unset, xview, yview |
|
1807 # def anchor option ?args ...? |
|
1808 def anchor_get(self): |
|
1809 "Get the (x,y) coordinate of the current anchor cell" |
|
1810 return self._getints(self.tk.call(self, 'anchor', 'get')) |
|
1811 |
|
1812 # def bdtype |
|
1813 # def delete dim from ?to? |
|
1814 def delete_row(self, from_, to=None): |
|
1815 """Delete rows between from_ and to inclusive. |
|
1816 If to is not provided, delete only row at from_""" |
|
1817 if to is None: |
|
1818 self.tk.call(self, 'delete', 'row', from_) |
|
1819 else: |
|
1820 self.tk.call(self, 'delete', 'row', from_, to) |
|
1821 def delete_column(self, from_, to=None): |
|
1822 """Delete columns between from_ and to inclusive. |
|
1823 If to is not provided, delete only column at from_""" |
|
1824 if to is None: |
|
1825 self.tk.call(self, 'delete', 'column', from_) |
|
1826 else: |
|
1827 self.tk.call(self, 'delete', 'column', from_, to) |
|
1828 # def edit apply |
|
1829 # def edit set x y |
|
1830 |
|
1831 def entrycget(self, x, y, option): |
|
1832 "Get the option value for cell at (x,y)" |
|
1833 return self.tk.call(self, 'entrycget', x, y, option) |
|
1834 |
|
1835 def entryconfigure(self, x, y, **kw): |
|
1836 return self.tk.call(self, 'entryconfigure', x, y, *self._options(None, kw)) |
|
1837 # def format |
|
1838 # def index |
|
1839 |
|
1840 def info_exists(self, x, y): |
|
1841 "Return True if display item exists at (x,y)" |
|
1842 return bool(int(self.tk.call(self, 'info', 'exists', x, y))) |
|
1843 |
|
1844 def info_bbox(self, x, y): |
|
1845 # This seems to always return '', at least for 'text' displayitems |
|
1846 return self.tk.call(self, 'info', 'bbox', x, y) |
|
1847 |
|
1848 def nearest(self, x, y): |
|
1849 "Return coordinate of cell nearest pixel coordinate (x,y)" |
|
1850 return self._getints(self.tk.call(self, 'nearest', x, y)) |
|
1851 |
|
1852 # def selection adjust |
|
1853 # def selection clear |
|
1854 # def selection includes |
|
1855 # def selection set |
|
1856 # def selection toggle |
|
1857 # def move dim from to offset |
|
1858 |
|
1859 def set(self, x, y, itemtype=None, **kw): |
|
1860 args= self._options(self.cnf, kw) |
|
1861 if itemtype is not None: |
|
1862 args= ('-itemtype', itemtype) + args |
|
1863 self.tk.call(self, 'set', x, y, *args) |
|
1864 |
|
1865 # def size dim index ?option value ...? |
|
1866 # def unset x y |
|
1867 |
|
1868 def xview(self): |
|
1869 return self._getdoubles(self.tk.call(self, 'xview')) |
|
1870 def xview_moveto(self, fraction): |
|
1871 self.tk.call(self,'xview', 'moveto', fraction) |
|
1872 def xview_scroll(self, count, what="units"): |
|
1873 "Scroll right (count>0) or left <count> of units|pages" |
|
1874 self.tk.call(self, 'xview', 'scroll', count, what) |
|
1875 |
|
1876 def yview(self): |
|
1877 return self._getdoubles(self.tk.call(self, 'yview')) |
|
1878 def yview_moveto(self, fraction): |
|
1879 self.tk.call(self,'ysview', 'moveto', fraction) |
|
1880 def yview_scroll(self, count, what="units"): |
|
1881 "Scroll down (count>0) or up <count> of units|pages" |
|
1882 self.tk.call(self, 'yview', 'scroll', count, what) |
|
1883 |
|
1884 class ScrolledGrid(Grid): |
|
1885 '''Scrolled Grid widgets''' |
|
1886 |
|
1887 # FIXME: It should inherit -superclass tixScrolledWidget |
|
1888 def __init__(self, master=None, cnf={}, **kw): |
|
1889 static= [] |
|
1890 self.cnf= cnf |
|
1891 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw) |