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