blob: 91b27f53d0a3f8938dde7bf0e7cdc144ab805f61 [file] [log] [blame]
Georg Brandl33cece02008-05-20 06:58:21 +00001# -*-mode: python; fill-column: 75; tab-width: 8; coding: iso-latin-1-unix -*-
2#
3# $Id$
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
Georg Brandl6634bf22008-05-20 07:13:37 +000029from Tkinter import *
30from Tkinter import _flatten, _cnfmerge, _default_root
Georg Brandl33cece02008-05-20 06:58:21 +000031
32# WARNING - TkVersion is a limited precision floating point number
33if TkVersion < 3.999:
34 raise ImportError, "This version of Tix.py requires Tk 4.0 or higher"
35
36import _tkinter # If this fails your Python may not be configured for Tk
37
38# Some more constants (for consistency with Tkinter)
39WINDOW = 'window'
40TEXT = 'text'
41STATUS = 'status'
42IMMEDIATE = 'immediate'
43IMAGE = 'image'
44IMAGETEXT = 'imagetext'
45BALLOON = 'balloon'
46AUTO = 'auto'
47ACROSSTOP = 'acrosstop'
48
49# Some constants used by Tkinter dooneevent()
50TCL_DONT_WAIT = 1 << 1
51TCL_WINDOW_EVENTS = 1 << 2
52TCL_FILE_EVENTS = 1 << 3
53TCL_TIMER_EVENTS = 1 << 4
54TCL_IDLE_EVENTS = 1 << 5
55TCL_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.
Georg Brandl6634bf22008-05-20 07:13:37 +000060import Tkinter, os
Georg Brandl33cece02008-05-20 06:58:21 +000061
62# Could probably add this to Tkinter.Misc
63class 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
Georg Brandl6634bf22008-05-20 07:13:37 +0000195class Tk(Tkinter.Tk, tixCommand):
Georg Brandl33cece02008-05-20 06:58:21 +0000196 """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'):
Georg Brandl6634bf22008-05-20 07:13:37 +0000199 Tkinter.Tk.__init__(self, screenName, baseName, className)
Georg Brandl33cece02008-05-20 06:58:21 +0000200 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", "")
Georg Brandl6634bf22008-05-20 07:13:37 +0000215 Tkinter.Tk.destroy(self)
Georg Brandl33cece02008-05-20 06:58:21 +0000216
217# The Tix 'tixForm' geometry manager
218class 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
Georg Brandl6634bf22008-05-20 07:13:37 +0000263Tkinter.Widget.__bases__ = Tkinter.Widget.__bases__ + (Form,)
Georg Brandl33cece02008-05-20 06:58:21 +0000264
Georg Brandl6634bf22008-05-20 07:13:37 +0000265class TixWidget(Tkinter.Widget):
Georg Brandl33cece02008-05-20 06:58:21 +0000266 """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:
Georg Brandl6634bf22008-05-20 07:13:37 +0000386 master = Tkinter._default_root
Georg Brandl33cece02008-05-20 06:58:21 +0000387 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.
407class 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
462def _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
470class 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
516class 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
543class 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
562class 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
606class 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
639class 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
660class 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
682class 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
701class 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
735class 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
759class 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
779class 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
807class 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
828class 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
Guilherme Poloe45f0172009-08-14 14:36:45 +0000853class HList(TixWidget, XView, YView):
Georg Brandl33cece02008-05-20 06:58:21 +0000854 """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
Georg Brandl33cece02008-05-20 06:58:21 +00001040class InputOnly(TixWidget):
1041 """InputOnly - Invisible widget. Unix only.
1042
1043 Subwidgets - None"""
1044
1045 def __init__ (self,master=None,cnf={}, **kw):
1046 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
1047
1048class LabelEntry(TixWidget):
1049 """LabelEntry - Entry field with label. Packages an entry widget
1050 and a label into one mega widget. It can beused be used to simplify
1051 the creation of ``entry-form'' type of interface.
1052
1053 Subwidgets Class
1054 ---------- -----
1055 label Label
1056 entry Entry"""
1057
1058 def __init__ (self,master=None,cnf={}, **kw):
1059 TixWidget.__init__(self, master, 'tixLabelEntry',
1060 ['labelside','options'], cnf, kw)
1061 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1062 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1063
1064class LabelFrame(TixWidget):
1065 """LabelFrame - Labelled Frame container. Packages a frame widget
1066 and a label into one mega widget. To create widgets inside a
1067 LabelFrame widget, one creates the new widgets relative to the
1068 frame subwidget and manage them inside the frame subwidget.
1069
1070 Subwidgets Class
1071 ---------- -----
1072 label Label
1073 frame Frame"""
1074
1075 def __init__ (self,master=None,cnf={}, **kw):
1076 TixWidget.__init__(self, master, 'tixLabelFrame',
1077 ['labelside','options'], cnf, kw)
1078 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1079 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
1080
1081
1082class ListNoteBook(TixWidget):
1083 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1084 it can be used to display many windows in a limited space using a
1085 notebook metaphor. The notebook is divided into a stack of pages
1086 (windows). At one time only one of these pages can be shown.
1087 The user can navigate through these pages by
1088 choosing the name of the desired page in the hlist subwidget."""
1089
1090 def __init__(self, master, cnf={}, **kw):
1091 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1092 # Is this necessary? It's not an exposed subwidget in Tix.
1093 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1094 destroy_physically=0)
1095 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1096 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
1097
1098 def add(self, name, cnf={}, **kw):
1099 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
1100 self.subwidget_list[name] = TixSubWidget(self, name)
1101 return self.subwidget_list[name]
1102
1103 def page(self, name):
1104 return self.subwidget(name)
1105
1106 def pages(self):
1107 # Can't call subwidgets_all directly because we don't want .nbframe
1108 names = self.tk.split(self.tk.call(self._w, 'pages'))
1109 ret = []
1110 for x in names:
1111 ret.append(self.subwidget(x))
1112 return ret
1113
1114 def raise_page(self, name): # raise is a python keyword
1115 self.tk.call(self._w, 'raise', name)
1116
1117class Meter(TixWidget):
1118 """The Meter widget can be used to show the progress of a background
1119 job which may take a long time to execute.
1120 """
1121
1122 def __init__(self, master=None, cnf={}, **kw):
1123 TixWidget.__init__(self, master, 'tixMeter',
1124 ['options'], cnf, kw)
1125
1126class NoteBook(TixWidget):
1127 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1128
1129 Subwidgets Class
1130 ---------- -----
1131 nbframe NoteBookFrame
1132 <pages> page widgets added dynamically with the add method"""
1133
1134 def __init__ (self,master=None,cnf={}, **kw):
1135 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1136 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
1137 destroy_physically=0)
1138
1139 def add(self, name, cnf={}, **kw):
1140 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
1141 self.subwidget_list[name] = TixSubWidget(self, name)
1142 return self.subwidget_list[name]
1143
1144 def delete(self, name):
1145 self.tk.call(self._w, 'delete', name)
1146 self.subwidget_list[name].destroy()
1147 del self.subwidget_list[name]
1148
1149 def page(self, name):
1150 return self.subwidget(name)
1151
1152 def pages(self):
1153 # Can't call subwidgets_all directly because we don't want .nbframe
1154 names = self.tk.split(self.tk.call(self._w, 'pages'))
1155 ret = []
1156 for x in names:
1157 ret.append(self.subwidget(x))
1158 return ret
1159
1160 def raise_page(self, name): # raise is a python keyword
1161 self.tk.call(self._w, 'raise', name)
1162
1163 def raised(self):
1164 return self.tk.call(self._w, 'raised')
1165
1166class NoteBookFrame(TixWidget):
1167 # FIXME: This is dangerous to expose to be called on its own.
1168 pass
1169
1170class OptionMenu(TixWidget):
1171 """OptionMenu - creates a menu button of options.
1172
1173 Subwidget Class
1174 --------- -----
1175 menubutton Menubutton
1176 menu Menu"""
1177
1178 def __init__(self, master, cnf={}, **kw):
1179 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1180 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1181 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
1182
1183 def add_command(self, name, cnf={}, **kw):
1184 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
1185
1186 def add_separator(self, name, cnf={}, **kw):
1187 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
1188
1189 def delete(self, name):
1190 self.tk.call(self._w, 'delete', name)
1191
1192 def disable(self, name):
1193 self.tk.call(self._w, 'disable', name)
1194
1195 def enable(self, name):
1196 self.tk.call(self._w, 'enable', name)
1197
1198class PanedWindow(TixWidget):
1199 """PanedWindow - Multi-pane container widget
1200 allows the user to interactively manipulate the sizes of several
1201 panes. The panes can be arranged either vertically or horizontally.The
1202 user changes the sizes of the panes by dragging the resize handle
1203 between two panes.
1204
1205 Subwidgets Class
1206 ---------- -----
1207 <panes> g/p widgets added dynamically with the add method."""
1208
1209 def __init__(self, master, cnf={}, **kw):
1210 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
1211
1212 # add delete forget panecget paneconfigure panes setsize
1213 def add(self, name, cnf={}, **kw):
1214 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
1215 self.subwidget_list[name] = TixSubWidget(self, name,
1216 check_intermediate=0)
1217 return self.subwidget_list[name]
1218
1219 def delete(self, name):
1220 self.tk.call(self._w, 'delete', name)
1221 self.subwidget_list[name].destroy()
1222 del self.subwidget_list[name]
1223
1224 def forget(self, name):
1225 self.tk.call(self._w, 'forget', name)
1226
1227 def panecget(self, entry, opt):
1228 return self.tk.call(self._w, 'panecget', entry, opt)
1229
1230 def paneconfigure(self, entry, cnf={}, **kw):
1231 if cnf is None:
1232 return _lst2dict(
1233 self.tk.split(
1234 self.tk.call(self._w, 'paneconfigure', entry)))
1235 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
1236
1237 def panes(self):
Guilherme Polo6c823f82009-08-18 13:29:20 +00001238 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1239 return [self.subwidget(x) for x in names]
Georg Brandl33cece02008-05-20 06:58:21 +00001240
1241class PopupMenu(TixWidget):
1242 """PopupMenu widget can be used as a replacement of the tk_popup command.
1243 The advantage of the Tix PopupMenu widget is it requires less application
1244 code to manipulate.
1245
1246
1247 Subwidgets Class
1248 ---------- -----
1249 menubutton Menubutton
1250 menu Menu"""
1251
1252 # FIXME: It should inherit -superclass tixShell
1253 def __init__(self, master, cnf={}, **kw):
1254 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1255 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1256 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
1257
1258 def bind_widget(self, widget):
1259 self.tk.call(self._w, 'bind', widget._w)
1260
1261 def unbind_widget(self, widget):
1262 self.tk.call(self._w, 'unbind', widget._w)
1263
1264 def post_widget(self, widget, x, y):
1265 self.tk.call(self._w, 'post', widget._w, x, y)
1266
1267class ResizeHandle(TixWidget):
1268 """Internal widget to draw resize handles on Scrolled widgets."""
1269 def __init__(self, master, cnf={}, **kw):
1270 # There seems to be a Tix bug rejecting the configure method
1271 # Let's try making the flags -static
1272 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1273 'handlesize', 'hintcolor', 'hintwidth',
1274 'x', 'y']
1275 # In fact, x y height width are configurable
1276 TixWidget.__init__(self, master, 'tixResizeHandle',
1277 flags, cnf, kw)
1278
1279 def attach_widget(self, widget):
1280 self.tk.call(self._w, 'attachwidget', widget._w)
1281
1282 def detach_widget(self, widget):
1283 self.tk.call(self._w, 'detachwidget', widget._w)
1284
1285 def hide(self, widget):
1286 self.tk.call(self._w, 'hide', widget._w)
1287
1288 def show(self, widget):
1289 self.tk.call(self._w, 'show', widget._w)
1290
1291class ScrolledHList(TixWidget):
1292 """ScrolledHList - HList with automatic scrollbars."""
1293
1294 # FIXME: It should inherit -superclass tixScrolledWidget
1295 def __init__(self, master, cnf={}, **kw):
1296 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
1297 cnf, kw)
1298 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1299 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1300 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1301
1302class ScrolledListBox(TixWidget):
1303 """ScrolledListBox - Listbox with automatic scrollbars."""
1304
1305 # FIXME: It should inherit -superclass tixScrolledWidget
1306 def __init__(self, master, cnf={}, **kw):
1307 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1308 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1309 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1310 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1311
1312class ScrolledText(TixWidget):
1313 """ScrolledText - Text with automatic scrollbars."""
1314
1315 # FIXME: It should inherit -superclass tixScrolledWidget
1316 def __init__(self, master, cnf={}, **kw):
1317 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1318 self.subwidget_list['text'] = _dummyText(self, 'text')
1319 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1320 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1321
1322class ScrolledTList(TixWidget):
1323 """ScrolledTList - TList with automatic scrollbars."""
1324
1325 # FIXME: It should inherit -superclass tixScrolledWidget
1326 def __init__(self, master, cnf={}, **kw):
1327 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
1328 cnf, kw)
1329 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1330 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1331 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1332
1333class ScrolledWindow(TixWidget):
1334 """ScrolledWindow - Window with automatic scrollbars."""
1335
1336 # FIXME: It should inherit -superclass tixScrolledWidget
1337 def __init__(self, master, cnf={}, **kw):
1338 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1339 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1340 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1341 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1342
1343class Select(TixWidget):
1344 """Select - Container of button subwidgets. It can be used to provide
1345 radio-box or check-box style of selection options for the user.
1346
1347 Subwidgets are buttons added dynamically using the add method."""
1348
1349 # FIXME: It should inherit -superclass tixLabelWidget
1350 def __init__(self, master, cnf={}, **kw):
1351 TixWidget.__init__(self, master, 'tixSelect',
1352 ['allowzero', 'radio', 'orientation', 'labelside',
1353 'options'],
1354 cnf, kw)
1355 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1356
1357 def add(self, name, cnf={}, **kw):
1358 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
1359 self.subwidget_list[name] = _dummyButton(self, name)
1360 return self.subwidget_list[name]
1361
1362 def invoke(self, name):
1363 self.tk.call(self._w, 'invoke', name)
1364
1365class Shell(TixWidget):
1366 """Toplevel window.
1367
1368 Subwidgets - None"""
1369
1370 def __init__ (self,master=None,cnf={}, **kw):
1371 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1372
1373class DialogShell(TixWidget):
1374 """Toplevel window, with popup popdown and center methods.
1375 It tells the window manager that it is a dialog window and should be
1376 treated specially. The exact treatment depends on the treatment of
1377 the window manager.
1378
1379 Subwidgets - None"""
1380
1381 # FIXME: It should inherit from Shell
1382 def __init__ (self,master=None,cnf={}, **kw):
1383 TixWidget.__init__(self, master,
1384 'tixDialogShell',
1385 ['options', 'title', 'mapped',
1386 'minheight', 'minwidth',
1387 'parent', 'transient'], cnf, kw)
1388
1389 def popdown(self):
1390 self.tk.call(self._w, 'popdown')
1391
1392 def popup(self):
1393 self.tk.call(self._w, 'popup')
1394
1395 def center(self):
1396 self.tk.call(self._w, 'center')
1397
1398class StdButtonBox(TixWidget):
1399 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1400
1401 def __init__(self, master=None, cnf={}, **kw):
1402 TixWidget.__init__(self, master, 'tixStdButtonBox',
1403 ['orientation', 'options'], cnf, kw)
1404 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1405 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1406 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1407 self.subwidget_list['help'] = _dummyButton(self, 'help')
1408
1409 def invoke(self, name):
1410 if self.subwidget_list.has_key(name):
1411 self.tk.call(self._w, 'invoke', name)
1412
Guilherme Poloe45f0172009-08-14 14:36:45 +00001413class TList(TixWidget, XView, YView):
Georg Brandl33cece02008-05-20 06:58:21 +00001414 """TList - Hierarchy display widget which can be
1415 used to display data in a tabular format. The list entries of a TList
1416 widget are similar to the entries in the Tk listbox widget. The main
1417 differences are (1) the TList widget can display the list entries in a
1418 two dimensional format and (2) you can use graphical images as well as
1419 multiple colors and fonts for the list entries.
1420
1421 Subwidgets - None"""
1422
1423 def __init__ (self,master=None,cnf={}, **kw):
1424 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
1425
1426 def active_set(self, index):
1427 self.tk.call(self._w, 'active', 'set', index)
1428
1429 def active_clear(self):
1430 self.tk.call(self._w, 'active', 'clear')
1431
1432 def anchor_set(self, index):
1433 self.tk.call(self._w, 'anchor', 'set', index)
1434
1435 def anchor_clear(self):
1436 self.tk.call(self._w, 'anchor', 'clear')
1437
1438 def delete(self, from_, to=None):
1439 self.tk.call(self._w, 'delete', from_, to)
1440
1441 def dragsite_set(self, index):
1442 self.tk.call(self._w, 'dragsite', 'set', index)
1443
1444 def dragsite_clear(self):
1445 self.tk.call(self._w, 'dragsite', 'clear')
1446
1447 def dropsite_set(self, index):
1448 self.tk.call(self._w, 'dropsite', 'set', index)
1449
1450 def dropsite_clear(self):
1451 self.tk.call(self._w, 'dropsite', 'clear')
1452
1453 def insert(self, index, cnf={}, **kw):
1454 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
1455
1456 def info_active(self):
1457 return self.tk.call(self._w, 'info', 'active')
1458
1459 def info_anchor(self):
1460 return self.tk.call(self._w, 'info', 'anchor')
1461
1462 def info_down(self, index):
1463 return self.tk.call(self._w, 'info', 'down', index)
1464
1465 def info_left(self, index):
1466 return self.tk.call(self._w, 'info', 'left', index)
1467
1468 def info_right(self, index):
1469 return self.tk.call(self._w, 'info', 'right', index)
1470
1471 def info_selection(self):
1472 c = self.tk.call(self._w, 'info', 'selection')
1473 return self.tk.splitlist(c)
1474
1475 def info_size(self):
1476 return self.tk.call(self._w, 'info', 'size')
1477
1478 def info_up(self, index):
1479 return self.tk.call(self._w, 'info', 'up', index)
1480
1481 def nearest(self, x, y):
1482 return self.tk.call(self._w, 'nearest', x, y)
1483
1484 def see(self, index):
1485 self.tk.call(self._w, 'see', index)
1486
1487 def selection_clear(self, cnf={}, **kw):
1488 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
1489
1490 def selection_includes(self, index):
1491 return self.tk.call(self._w, 'selection', 'includes', index)
1492
1493 def selection_set(self, first, last=None):
1494 self.tk.call(self._w, 'selection', 'set', first, last)
1495
Georg Brandl33cece02008-05-20 06:58:21 +00001496class Tree(TixWidget):
1497 """Tree - The tixTree widget can be used to display hierachical
1498 data in a tree form. The user can adjust
1499 the view of the tree by opening or closing parts of the tree."""
1500
1501 # FIXME: It should inherit -superclass tixScrolledWidget
1502 def __init__(self, master=None, cnf={}, **kw):
1503 TixWidget.__init__(self, master, 'tixTree',
1504 ['options'], cnf, kw)
1505 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1506 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1507 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1508
1509 def autosetmode(self):
1510 '''This command calls the setmode method for all the entries in this
1511 Tree widget: if an entry has no child entries, its mode is set to
1512 none. Otherwise, if the entry has any hidden child entries, its mode is
1513 set to open; otherwise its mode is set to close.'''
1514 self.tk.call(self._w, 'autosetmode')
1515
1516 def close(self, entrypath):
1517 '''Close the entry given by entryPath if its mode is close.'''
1518 self.tk.call(self._w, 'close', entrypath)
1519
1520 def getmode(self, entrypath):
1521 '''Returns the current mode of the entry given by entryPath.'''
1522 return self.tk.call(self._w, 'getmode', entrypath)
1523
1524 def open(self, entrypath):
1525 '''Open the entry given by entryPath if its mode is open.'''
1526 self.tk.call(self._w, 'open', entrypath)
1527
1528 def setmode(self, entrypath, mode='none'):
1529 '''This command is used to indicate whether the entry given by
1530 entryPath has children entries and whether the children are visible. mode
1531 must be one of open, close or none. If mode is set to open, a (+)
Walter Dörwald28277092009-05-04 16:03:03 +00001532 indicator is drawn next to the entry. If mode is set to close, a (-)
1533 indicator is drawn next to the entry. If mode is set to none, no
Georg Brandl33cece02008-05-20 06:58:21 +00001534 indicators will be drawn for this entry. The default mode is none. The
1535 open mode indicates the entry has hidden children and this entry can be
1536 opened by the user. The close mode indicates that all the children of the
1537 entry are now visible and the entry can be closed by the user.'''
1538 self.tk.call(self._w, 'setmode', entrypath, mode)
1539
1540
1541# Could try subclassing Tree for CheckList - would need another arg to init
1542class CheckList(TixWidget):
1543 """The CheckList widget
1544 displays a list of items to be selected by the user. CheckList acts
1545 similarly to the Tk checkbutton or radiobutton widgets, except it is
1546 capable of handling many more items than checkbuttons or radiobuttons.
1547 """
1548 # FIXME: It should inherit -superclass tixTree
1549 def __init__(self, master=None, cnf={}, **kw):
1550 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polo57f9b722009-08-18 13:33:30 +00001551 ['options', 'radio'], cnf, kw)
Georg Brandl33cece02008-05-20 06:58:21 +00001552 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1553 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1554 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1555
1556 def autosetmode(self):
1557 '''This command calls the setmode method for all the entries in this
1558 Tree widget: if an entry has no child entries, its mode is set to
1559 none. Otherwise, if the entry has any hidden child entries, its mode is
1560 set to open; otherwise its mode is set to close.'''
1561 self.tk.call(self._w, 'autosetmode')
1562
1563 def close(self, entrypath):
1564 '''Close the entry given by entryPath if its mode is close.'''
1565 self.tk.call(self._w, 'close', entrypath)
1566
1567 def getmode(self, entrypath):
1568 '''Returns the current mode of the entry given by entryPath.'''
1569 return self.tk.call(self._w, 'getmode', entrypath)
1570
1571 def open(self, entrypath):
1572 '''Open the entry given by entryPath if its mode is open.'''
1573 self.tk.call(self._w, 'open', entrypath)
1574
1575 def getselection(self, mode='on'):
1576 '''Returns a list of items whose status matches status. If status is
1577 not specified, the list of items in the "on" status will be returned.
1578 Mode can be on, off, default'''
1579 c = self.tk.split(self.tk.call(self._w, 'getselection', mode))
1580 return self.tk.splitlist(c)
1581
1582 def getstatus(self, entrypath):
1583 '''Returns the current status of entryPath.'''
1584 return self.tk.call(self._w, 'getstatus', entrypath)
1585
1586 def setstatus(self, entrypath, mode='on'):
1587 '''Sets the status of entryPath to be status. A bitmap will be
1588 displayed next to the entry its status is on, off or default.'''
1589 self.tk.call(self._w, 'setstatus', entrypath, mode)
1590
1591
1592###########################################################################
1593### The subclassing below is used to instantiate the subwidgets in each ###
1594### mega widget. This allows us to access their methods directly. ###
1595###########################################################################
1596
1597class _dummyButton(Button, TixSubWidget):
1598 def __init__(self, master, name, destroy_physically=1):
1599 TixSubWidget.__init__(self, master, name, destroy_physically)
1600
1601class _dummyCheckbutton(Checkbutton, TixSubWidget):
1602 def __init__(self, master, name, destroy_physically=1):
1603 TixSubWidget.__init__(self, master, name, destroy_physically)
1604
1605class _dummyEntry(Entry, TixSubWidget):
1606 def __init__(self, master, name, destroy_physically=1):
1607 TixSubWidget.__init__(self, master, name, destroy_physically)
1608
1609class _dummyFrame(Frame, TixSubWidget):
1610 def __init__(self, master, name, destroy_physically=1):
1611 TixSubWidget.__init__(self, master, name, destroy_physically)
1612
1613class _dummyLabel(Label, TixSubWidget):
1614 def __init__(self, master, name, destroy_physically=1):
1615 TixSubWidget.__init__(self, master, name, destroy_physically)
1616
1617class _dummyListbox(Listbox, TixSubWidget):
1618 def __init__(self, master, name, destroy_physically=1):
1619 TixSubWidget.__init__(self, master, name, destroy_physically)
1620
1621class _dummyMenu(Menu, TixSubWidget):
1622 def __init__(self, master, name, destroy_physically=1):
1623 TixSubWidget.__init__(self, master, name, destroy_physically)
1624
1625class _dummyMenubutton(Menubutton, TixSubWidget):
1626 def __init__(self, master, name, destroy_physically=1):
1627 TixSubWidget.__init__(self, master, name, destroy_physically)
1628
1629class _dummyScrollbar(Scrollbar, TixSubWidget):
1630 def __init__(self, master, name, destroy_physically=1):
1631 TixSubWidget.__init__(self, master, name, destroy_physically)
1632
1633class _dummyText(Text, TixSubWidget):
1634 def __init__(self, master, name, destroy_physically=1):
1635 TixSubWidget.__init__(self, master, name, destroy_physically)
1636
1637class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1638 def __init__(self, master, name, destroy_physically=1):
1639 TixSubWidget.__init__(self, master, name, destroy_physically)
1640 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1641 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1642 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1643
1644class _dummyHList(HList, TixSubWidget):
1645 def __init__(self, master, name, destroy_physically=1):
1646 TixSubWidget.__init__(self, master, name, destroy_physically)
1647
1648class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1649 def __init__(self, master, name, destroy_physically=1):
1650 TixSubWidget.__init__(self, master, name, destroy_physically)
1651 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1652 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1653 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1654
1655class _dummyTList(TList, TixSubWidget):
1656 def __init__(self, master, name, destroy_physically=1):
1657 TixSubWidget.__init__(self, master, name, destroy_physically)
1658
1659class _dummyComboBox(ComboBox, TixSubWidget):
1660 def __init__(self, master, name, destroy_physically=1):
1661 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1662 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1663 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1664 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
1665
1666 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
1667 'slistbox')
1668 try:
1669 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1670 #cross Button : present if created with the fancy option
1671 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1672 except TypeError:
1673 # unavailable when -fancy not specified
1674 pass
1675
1676class _dummyDirList(DirList, TixSubWidget):
1677 def __init__(self, master, name, destroy_physically=1):
1678 TixSubWidget.__init__(self, master, name, destroy_physically)
1679 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1680 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1681 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
1682
1683class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1684 def __init__(self, master, name, destroy_physically=1):
1685 TixSubWidget.__init__(self, master, name, destroy_physically)
1686 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1687 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
1688
1689class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1690 def __init__(self, master, name, destroy_physically=1):
1691 TixSubWidget.__init__(self, master, name, destroy_physically)
1692 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1693 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1694 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1695 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1696 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1697 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1698 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1699 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1700
1701class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1702 def __init__(self, master, name, destroy_physically=1):
1703 TixSubWidget.__init__(self, master, name, destroy_physically)
1704 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1705 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1706 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1707 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
1708
1709class _dummyFileComboBox(ComboBox, TixSubWidget):
1710 def __init__(self, master, name, destroy_physically=1):
1711 TixSubWidget.__init__(self, master, name, destroy_physically)
1712 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
1713
1714class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1715 def __init__(self, master, name, destroy_physically=1):
1716 TixSubWidget.__init__(self, master, name, destroy_physically)
1717 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1718 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1719 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1720 self.subwidget_list['help'] = _dummyButton(self, 'help')
1721
1722class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1723 def __init__(self, master, name, destroy_physically=0):
1724 TixSubWidget.__init__(self, master, name, destroy_physically)
1725
1726class _dummyPanedWindow(PanedWindow, TixSubWidget):
1727 def __init__(self, master, name, destroy_physically=1):
1728 TixSubWidget.__init__(self, master, name, destroy_physically)
1729
1730########################
1731### Utility Routines ###
1732########################
1733
1734#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1735
1736def OptionName(widget):
1737 '''Returns the qualified path name for the widget. Normally used to set
1738 default options for subwidgets. See tixwidgets.py'''
1739 return widget.tk.call('tixOptionName', widget._w)
1740
1741# Called with a dictionary argument of the form
1742# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1743# returns a string which can be used to configure the fsbox file types
1744# in an ExFileSelectBox. i.e.,
1745# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1746def FileTypeList(dict):
1747 s = ''
1748 for type in dict.keys():
1749 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
1750 return s
1751
1752# Still to be done:
1753# tixIconView
1754class CObjView(TixWidget):
1755 """This file implements the Canvas Object View widget. This is a base
1756 class of IconView. It implements automatic placement/adjustment of the
1757 scrollbars according to the canvas objects inside the canvas subwidget.
1758 The scrollbars are adjusted so that the canvas is just large enough
1759 to see all the objects.
1760 """
1761 # FIXME: It should inherit -superclass tixScrolledWidget
1762 pass
1763
1764
Guilherme Poloe45f0172009-08-14 14:36:45 +00001765class Grid(TixWidget, XView, YView):
Georg Brandl33cece02008-05-20 06:58:21 +00001766 '''The Tix Grid command creates a new window and makes it into a
1767 tixGrid widget. Additional options, may be specified on the command
1768 line or in the option database to configure aspects such as its cursor
1769 and relief.
1770
1771 A Grid widget displays its contents in a two dimensional grid of cells.
1772 Each cell may contain one Tix display item, which may be in text,
1773 graphics or other formats. See the DisplayStyle class for more information
1774 about Tix display items. Individual cells, or groups of cells, can be
1775 formatted with a wide range of attributes, such as its color, relief and
1776 border.
1777
1778 Subwidgets - None'''
1779 # valid specific resources as of Tk 8.4
1780 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1781 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1782 # selectunit, topmargin,
1783 def __init__(self, master=None, cnf={}, **kw):
1784 static= []
1785 self.cnf= cnf
1786 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
1787
1788 # valid options as of Tk 8.4
1789 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget, edit
1790 # entryconfigure, format, geometryinfo, info, index, move, nearest, selection
1791 # set, size, unset, xview, yview
1792 # def anchor option ?args ...?
1793 def anchor_get(self):
1794 "Get the (x,y) coordinate of the current anchor cell"
1795 return self._getints(self.tk.call(self, 'anchor', 'get'))
1796
1797 # def bdtype
1798 # def delete dim from ?to?
1799 def delete_row(self, from_, to=None):
1800 """Delete rows between from_ and to inclusive.
1801 If to is not provided, delete only row at from_"""
1802 if to is None:
1803 self.tk.call(self, 'delete', 'row', from_)
1804 else:
1805 self.tk.call(self, 'delete', 'row', from_, to)
1806 def delete_column(self, from_, to=None):
1807 """Delete columns between from_ and to inclusive.
1808 If to is not provided, delete only column at from_"""
1809 if to is None:
1810 self.tk.call(self, 'delete', 'column', from_)
1811 else:
1812 self.tk.call(self, 'delete', 'column', from_, to)
1813 # def edit apply
1814 # def edit set x y
1815
1816 def entrycget(self, x, y, option):
1817 "Get the option value for cell at (x,y)"
1818 return self.tk.call(self, 'entrycget', x, y, option)
1819
1820 def entryconfigure(self, x, y, **kw):
1821 return self.tk.call(self, 'entryconfigure', x, y, *self._options(None, kw))
1822 # def format
1823 # def index
1824
1825 def info_exists(self, x, y):
1826 "Return True if display item exists at (x,y)"
1827 return bool(int(self.tk.call(self, 'info', 'exists', x, y)))
1828
1829 def info_bbox(self, x, y):
1830 # This seems to always return '', at least for 'text' displayitems
1831 return self.tk.call(self, 'info', 'bbox', x, y)
1832
1833 def nearest(self, x, y):
1834 "Return coordinate of cell nearest pixel coordinate (x,y)"
1835 return self._getints(self.tk.call(self, 'nearest', x, y))
1836
1837 # def selection adjust
1838 # def selection clear
1839 # def selection includes
1840 # def selection set
1841 # def selection toggle
1842 # def move dim from to offset
1843
1844 def set(self, x, y, itemtype=None, **kw):
1845 args= self._options(self.cnf, kw)
1846 if itemtype is not None:
1847 args= ('-itemtype', itemtype) + args
1848 self.tk.call(self, 'set', x, y, *args)
1849
1850 # def size dim index ?option value ...?
1851 # def unset x y
1852
Georg Brandl33cece02008-05-20 06:58:21 +00001853class ScrolledGrid(Grid):
1854 '''Scrolled Grid widgets'''
1855
1856 # FIXME: It should inherit -superclass tixScrolledWidget
1857 def __init__(self, master=None, cnf={}, **kw):
1858 static= []
1859 self.cnf= cnf
1860 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)