blob: 0c8ca684333a8f5358356b11f3aea41b304e20a3 [file] [log] [blame]
Guido van Rossumd77d6992007-07-16 23:10:57 +00001# -*-mode: python; fill-column: 75; tab-width: 8 -*-
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00002#
3# $Id$
4#
Martin v. Löwisb7b32602001-11-02 23:48:20 +00005# Tix.py -- Tix widget wrappers.
6#
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00007# For Tix, see http://tix.sourceforge.net
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00008#
Moshe Zadka22710822001-03-21 17:24:49 +00009# - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000010# based on an idea of Jean-Marc Lugrin (lugrin@ms.com)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000011#
12# NOTE: In order to minimize changes to Tkinter.py, some of the code here
Moshe Zadka22710822001-03-21 17:24:49 +000013# (TixWidget.__init__) has been taken from Tkinter (Widget.__init__)
14# and will break if there are major changes in Tkinter.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000015#
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
Moshe Zadka22710822001-03-21 17:24:49 +000020# w.ok['text'] = 'Who Cares'
21# or w.ok['bg'] = w['bg']
22# or even w.ok.invoke()
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000023# etc.
24#
25# Compare the demo tixwidgets.py to the original Tcl program and you will
26# appreciate the advantages.
27#
28
Georg Brandl14fc4272008-05-17 18:39:55 +000029from tkinter import *
30from tkinter import _flatten, _cnfmerge, _default_root
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000031
32# WARNING - TkVersion is a limited precision floating point number
33if TkVersion < 3.999:
Collin Winterce36ad82007-08-30 01:19:48 +000034 raise ImportError("This version of Tix.py requires Tk 4.0 or higher")
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000035
36import _tkinter # If this fails your Python may not be configured for Tk
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000037
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
Fred Drake723293c2001-12-13 04:53:07 +000049# 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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000057# 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 Brandl14fc4272008-05-17 18:39:55 +000060import tkinter, os
Martin v. Löwisb7b32602001-11-02 23:48:20 +000061
62# Could probably add this to Tkinter.Misc
63class tixCommand:
Fred Drake723293c2001-12-13 04:53:07 +000064 """The tix commands provide access to miscellaneous elements
Martin v. Löwisb7b32602001-11-02 23:48:20 +000065 of Tix's internal state and the Tix application context.
Fred Drake723293c2001-12-13 04:53:07 +000066 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.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000069
70 This is a mixin class, assumed to be mixed to Tkinter.Tk
71 that supports the self.tk.call method.
72 """
Fred Drake723293c2001-12-13 04:53:07 +000073
Martin v. Löwisb7b32602001-11-02 23:48:20 +000074 def tix_addbitmapdir(self, directory):
Fred Drake723293c2001-12-13 04:53:07 +000075 """Tix maintains a list of directories under which
Martin v. Löwisb7b32602001-11-02 23:48:20 +000076 the tix_getimage and tix_getbitmap commands will
Fred Drake723293c2001-12-13 04:53:07 +000077 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
Martin v. Löwisb7b32602001-11-02 23:48:20 +000080 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):
Fred Drake723293c2001-12-13 04:53:07 +000094 """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.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000103 """
Fred Drake723293c2001-12-13 04:53:07 +0000104 # 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))
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000118
119 def tix_filedialog(self, dlgclass=None):
Fred Drake723293c2001-12-13 04:53:07 +0000120 """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.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000127 """
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):
Fred Drake723293c2001-12-13 04:53:07 +0000134 """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.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000141 """
142 return self.tk.call('tix', 'getbitmap', name)
143
144 def tix_getimage(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000145 """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.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000155 """
156 return self.tk.call('tix', 'getimage', name)
157
158 def tix_option_get(self, name):
159 """Gets the options manitained by the Tix
Fred Drake723293c2001-12-13 04:53:07 +0000160 scheme mechanism. Available options include:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000161
162 active_bg active_fg bg
163 bold_font dark1_bg dark1_fg
164 dark2_bg dark2_fg disabled_fg
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000165 fg fixed_font font
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000166 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):
Fred Drake723293c2001-12-13 04:53:07 +0000176 """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.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000181
Fred Drake723293c2001-12-13 04:53:07 +0000182 The optional parameter newScmPrio can be given to reset the
183 priority level of the Tk options set by the Tix schemes.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000184
Fred Drake723293c2001-12-13 04:53:07 +0000185 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.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000189 """
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 Brandl14fc4272008-05-17 18:39:55 +0000195class Tk(tkinter.Tk, tixCommand):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000196 """Toplevel widget of Tix which represents mostly the main window
197 of an application. It has an associated Tcl interpreter."""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000198 def __init__(self, screenName=None, baseName=None, className='Tix'):
Georg Brandl14fc4272008-05-17 18:39:55 +0000199 tkinter.Tk.__init__(self, screenName, baseName, className)
Moshe Zadka22710822001-03-21 17:24:49 +0000200 tixlib = os.environ.get('TIX_LIBRARY')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000201 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]')
Moshe Zadka22710822001-03-21 17:24:49 +0000202 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)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000205 # Load Tix - this should work dynamically or statically
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000206 # If it's static, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000207 # 'load {} Tix'
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000208 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000209 # 'load libtix8.1.8.3.so Tix'
Moshe Zadka22710822001-03-21 17:24:49 +0000210 self.tk.eval('package require Tix')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000211
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000212 def destroy(self):
213 # For safety, remove an delete_window binding before destroy
214 self.protocol("WM_DELETE_WINDOW", "")
Georg Brandl14fc4272008-05-17 18:39:55 +0000215 tkinter.Tk.destroy(self)
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000216
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000217# 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):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000225 self.tk.call('tixForm', self._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000226
227 form = config
228
229 def __setitem__(self, key, value):
Guido van Rossum49fa2bd2001-08-13 14:12:35 +0000230 Form.form(self, {key: value})
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000231
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
Martin v. Löwis46874282002-12-06 10:33:45 +0000246 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000247
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)))
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000260
261
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000262
Georg Brandl14fc4272008-05-17 18:39:55 +0000263tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000264
Georg Brandl14fc4272008-05-17 18:39:55 +0000265class TixWidget(tkinter.Widget):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000266 """A TixWidget class is used to package all (or most) Tix widgets.
267
268 Widget initialization is extended in two ways:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000269 1) It is possible to give a list of options which must be part of
Moshe Zadka22710822001-03-21 17:24:49 +0000270 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__
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000275
276 Both options are for use by subclasses only.
277 """
278 def __init__ (self, master=None, widgetName=None,
Moshe Zadka22710822001-03-21 17:24:49 +0000279 static_options=None, cnf={}, kw={}):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000280 # Merge keywords and dictionary arguments
281 if kw:
Moshe Zadka22710822001-03-21 17:24:49 +0000282 cnf = _cnfmerge((cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000283 else:
284 cnf = _cnfmerge(cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000285
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000286 # Move static options into extra. static_options must be
287 # a list of keywords (or None).
288 extra=()
Neal Norwitzf539bde2002-11-14 02:43:40 +0000289
290 # 'options' is always a static option
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000291 if static_options:
Neal Norwitzf539bde2002-11-14 02:43:40 +0000292 static_options.append('options')
293 else:
294 static_options = ['options']
Raymond Hettingerff41c482003-04-06 09:01:11 +0000295
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000296 for k,v in list(cnf.items()):
Neal Norwitzf539bde2002-11-14 02:43:40 +0000297 if k in static_options:
298 extra = extra + ('-' + k, v)
299 del cnf[k]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000300
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000301 self.widgetName = widgetName
302 Widget._setup(self, master, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000303
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000304 # 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:
Raymond Hettingerff41c482003-04-06 09:01:11 +0000307 self.tk.call(widgetName, self._w, *extra)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000308
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000309 # Non-static options - to be done via a 'config' command
310 if cnf:
311 Widget.config(self, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000312
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000313 # 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 = {}
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000317
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):
Guido van Rossume014a132006-08-19 16:53:45 +0000324 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000325 return self.subwidget_list[name]
Collin Winterce36ad82007-08-30 01:19:48 +0000326 raise AttributeError(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000327
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000328 def set_silent(self, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000329 """Set a variable without calling its action routine"""
330 self.tk.call('tixSetSilent', self._w, value)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000331
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000332 def subwidget(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000333 """Return the named subwidget (which must have been created by
334 the sub-class)."""
335 n = self._subwidget_name(name)
336 if not n:
Collin Winterce36ad82007-08-30 01:19:48 +0000337 raise TclError("Subwidget " + name + " not child of " + self._name)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000338 # Remove header of name and leading dot
339 n = n[len(self._w)+1:]
340 return self._nametowidget(n)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000341
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000342 def subwidgets_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000343 """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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000356
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000357 def _subwidget_name(self,name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000358 """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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000363
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000364 def _subwidget_names(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000365 """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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000371
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000372 def config_all(self, option, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000373 """Set configuration options for all subwidgets (and self)."""
374 if option == '':
375 return
376 elif not isinstance(option, StringType):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000377 option = repr(option)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000378 if not isinstance(value, StringType):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000379 value = repr(value)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000380 names = self._subwidget_names()
381 for name in names:
382 self.tk.call(name, 'configure', '-' + option, value)
Neal Norwitz731a9862002-12-10 02:18:49 +0000383 # These are missing from Tkinter
384 def image_create(self, imgtype, cnf={}, master=None, **kw):
385 if not master:
Georg Brandl14fc4272008-05-17 18:39:55 +0000386 master = tkinter._default_root
Neal Norwitz731a9862002-12-10 02:18:49 +0000387 if not master:
Collin Winterce36ad82007-08-30 01:19:48 +0000388 raise RuntimeError('Too early to create image')
Neal Norwitz731a9862002-12-10 02:18:49 +0000389 if kw and cnf: cnf = _cnfmerge((cnf, kw))
390 elif kw: cnf = kw
391 options = ()
392 for k, v in cnf.items():
Guido van Rossumd59da4b2007-05-22 18:11:13 +0000393 if hasattr(v, '__call__'):
Neal Norwitz731a9862002-12-10 02:18:49 +0000394 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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000403
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,
Moshe Zadka22710822001-03-21 17:24:49 +0000415 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000416 if check_intermediate:
417 path = master._subwidget_name(name)
418 try:
419 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000420 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000421 except:
422 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000423
Thomas Wouters89f507f2006-12-13 04:49:30 +0000424 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000425 # 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):
Neal Norwitzebb41902002-05-31 20:51:31 +0000431 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000432 try:
433 w = master._nametowidget(n)
434 parent = w
435 except KeyError:
436 # Create the intermediate widget
437 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000438 destroy_physically=0,
439 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000440 # The Tk widget name is in plist, not in name
441 if plist:
442 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000443 TixWidget.__init__(self, parent, None, None, {'name' : name})
444 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000445
446 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000447 # 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
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000451 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000452 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000453 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000454 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000455 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)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000459
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:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000465 dict[x[0][1:]] = (x[0][1:],) + x[1:]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000466 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
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000474 def __init__(self, itemtype, cnf={}, **kw):
Moshe Zadka22710822001-03-21 17:24:49 +0000475 master = _default_root # global from Tkinter
Guido van Rossume014a132006-08-19 16:53:45 +0000476 if not master and 'refwindow' in cnf: master=cnf['refwindow']
477 elif not master and 'refwindow' in kw: master= kw['refwindow']
Collin Winterce36ad82007-08-30 01:19:48 +0000478 elif not master: raise RuntimeError("Too early to create display style: no root window")
Moshe Zadka22710822001-03-21 17:24:49 +0000479 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000480 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
481 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000482
483 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000484 return self.stylename
485
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000486 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000487 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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000496 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000497 self.tk.call(self.stylename, 'delete')
498
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000499 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000500 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
501
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000502 def config(self, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000503 return _lst2dict(
504 self.tk.split(
Raymond Hettingerff41c482003-04-06 09:01:11 +0000505 self.tk.call(
506 self.stylename, 'configure', *self._options(cnf,kw))))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000507
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000508 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000509 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000510
511
512######################################################
513### The Tix Widget classes - in alphabetical order ###
514######################################################
515
516class Balloon(TixWidget):
517 """Balloon help widget.
518
Moshe Zadka22710822001-03-21 17:24:49 +0000519 Subwidget Class
520 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000521 label Label
522 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000523
Martin v. Löwis46874282002-12-06 10:33:45 +0000524 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000525 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000526 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000527 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)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000534
535 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000536 """Bind balloon widget to another.
537 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000538 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000539
540 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000541 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000542
543class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000544 """ButtonBox - A container for pushbuttons.
545 Subwidgets are the buttons added with the add method.
546 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000547 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000548 TixWidget.__init__(self, master, 'tixButtonBox',
549 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000550
551 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000552 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000553
Raymond Hettingerff41c482003-04-06 09:01:11 +0000554 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000555 self.subwidget_list[name] = _dummyButton(self, name)
556 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000557
558 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000559 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000560 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000561
562class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000563 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000566
Moshe Zadka22710822001-03-21 17:24:49 +0000567 Subwidget Class
568 --------- -----
569 entry Entry
570 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000571 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000572 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000573 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000574
Martin v. Löwis46874282002-12-06 10:33:45 +0000575 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000576 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000577 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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000591
Neal Norwitz731a9862002-12-10 02:18:49 +0000592 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000593
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000594 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000595 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000596
597 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000598 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000599
600 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000601 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000602
603 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000604 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000605
606class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000607 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000611
Moshe Zadka22710822001-03-21 17:24:49 +0000612 Subwidget Class
613 --------- -----
614 incr Button
615 decr Button
616 entry Entry
617 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000618
Martin v. Löwis46874282002-12-06 10:33:45 +0000619 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000620 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000621 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')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000626
627 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000628 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000629
630 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000631 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000632
633 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000634 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000635
636 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000637 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000638
639class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000640 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000643
Moshe Zadka22710822001-03-21 17:24:49 +0000644 Subwidget Class
645 --------- -----
646 hlist HList
647 hsb Scrollbar
648 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000649
Martin v. Löwis46874282002-12-06 10:33:45 +0000650 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000651 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000652 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')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000656
657 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000658 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000659
660class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000661 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000665
Moshe Zadka22710822001-03-21 17:24:49 +0000666 Subwidget Class
667 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000668 hlist HList
669 hsb Scrollbar
670 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000671
Martin v. Löwis46874282002-12-06 10:33:45 +0000672 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000673 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000674 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')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000678
679 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000680 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000681
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000682class 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.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000688
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000689 Subwidget Class
690 --------- -----
691 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000692 filter ComboBox
693 dirlist ScrolledListBox
694 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000695
696 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000697 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
698 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
699 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000700
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000701class ExFileSelectBox(TixWidget):
702 """ExFileSelectBox - MS Windows style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000703 It provides an convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000704
Moshe Zadka22710822001-03-21 17:24:49 +0000705 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"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000715
716 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000717 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')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000726
727 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000728 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000729
730 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000731 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000732
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000733
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
Martin v. Löwis46874282002-12-06 10:33:45 +0000744 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000745 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000746 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000747 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000748 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
749 # cancel and ok buttons are missing
750
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000751 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000752 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000753
754 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000755 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000756
757
758# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000759class ExFileSelectDialog(TixWidget):
760 """ExFileSelectDialog - MS Windows style file select dialog.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000761 It provides an convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000762
Moshe Zadka22710822001-03-21 17:24:49 +0000763 Subwidgets Class
764 ---------- -----
765 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000766
Martin v. Löwis46874282002-12-06 10:33:45 +0000767 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000768 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000769 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000770 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000771 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000772
773 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000774 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000775
776 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000777 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000778
779class FileSelectBox(TixWidget):
780 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000781 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.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000785
Moshe Zadka22710822001-03-21 17:24:49 +0000786 Subwidget Class
787 --------- -----
788 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000789 filter ComboBox
790 dirlist ScrolledListBox
791 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000792
793 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000794 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')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000799
Moshe Zadka22710822001-03-21 17:24:49 +0000800 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000801 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000802
803 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000804 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000805
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000806# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000807class FileSelectDialog(TixWidget):
808 """FileSelectDialog - Motif style file select dialog.
809
Moshe Zadka22710822001-03-21 17:24:49 +0000810 Subwidgets Class
811 ---------- -----
812 btns StdButtonBox
813 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000814
Martin v. Löwis46874282002-12-06 10:33:45 +0000815 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000816 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000817 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000818 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000819 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
820 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000821
822 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000823 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000824
825 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000826 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000827
828class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000829 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000833
Moshe Zadka22710822001-03-21 17:24:49 +0000834 Subwidgets Class
835 ---------- -----
836 button Button
837 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000838
Martin v. Löwis46874282002-12-06 10:33:45 +0000839 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000840 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000841 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000842 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000843 self.subwidget_list['button'] = _dummyButton(self, 'button')
844 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000845
846 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000847 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000848
849 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000850 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000851 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000852
Guilherme Polo1fff0082009-08-14 15:05:30 +0000853class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000858
859 Subwidgets - None"""
860
861 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000862 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000863 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000864
865 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000866 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000867
868 def add_child(self, parent=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000869 if not parent:
870 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000871 return self.tk.call(
872 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000873
874 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000875 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000876
877 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000878 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000879
880 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000881 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,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000885 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000886
887 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000888 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000889
890 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000891 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000892
893 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000894 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000895
896 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000897 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000898
899 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000900 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000901
902 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000903 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000904
905 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000906 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000907
908 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000909 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000910
911 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000912 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000913
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000914 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000915 if cnf is None:
916 return _lst2dict(
Neal Norwitzf539bde2002-11-14 02:43:40 +0000917 self.tk.split(
918 self.tk.call(self._w, 'header', 'configure', col)))
Raymond Hettingerff41c482003-04-06 09:01:11 +0000919 self.tk.call(self._w, 'header', 'configure', col,
920 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000921
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000922 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000923 return self.tk.call(self._w, 'header', 'cget', col, opt)
924
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000925 def header_exists(self, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000926 return self.tk.call(self._w, 'header', 'exists', col)
927
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000928 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000929 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000930
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000931 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000932 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000933
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000934 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000935 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000936
937 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000938 self.tk.call(
939 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000940
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000941 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000942 if cnf is None:
943 return _lst2dict(
Neal Norwitzf539bde2002-11-14 02:43:40 +0000944 self.tk.split(
945 self.tk.call(self._w, 'indicator', 'configure', entry)))
Raymond Hettingerff41c482003-04-06 09:01:11 +0000946 self.tk.call(
947 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000948
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000949 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000950 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
951
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000952 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000953 return self.tk.call (self._w, 'indicator', 'exists', entry)
954
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000955 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000956 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000957
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000958 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000959 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000960
961 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000962 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000963
964 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000965 c = self.tk.call(self._w, 'info', 'children', entry)
966 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000967
968 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000969 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000970
971 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000972 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000973
974 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000975 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000976
977 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000978 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000979
980 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000981 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000982
983 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000984 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000985
986 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000987 c = self.tk.call(self._w, 'info', 'selection')
988 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000989
Martin v. Löwis3e048482001-10-09 11:50:55 +0000990 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000991 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
992
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000993 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000994 if cnf is None:
995 return _lst2dict(
Neal Norwitzf539bde2002-11-14 02:43:40 +0000996 self.tk.split(
997 self.tk.call(self._w, 'item', 'configure', entry, col)))
Raymond Hettingerff41c482003-04-06 09:01:11 +0000998 self.tk.call(self._w, 'item', 'configure', entry, col,
999 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001000
1001 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001002 self.tk.call(
1003 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001004
1005 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001006 return self.tk.call(self._w, 'item', 'exists', entry, col)
1007
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001008 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001009 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001010
Martin v. Löwis433fa692004-03-21 15:26:44 +00001011 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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001022 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001023 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001024
1025 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001026 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001027
1028 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001029 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001030
1031 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001032 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001033
1034 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001035 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001036
1037 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001038 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001039
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001040class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001041 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001042
1043 Subwidgets - None"""
1044
1045 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001046 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001047
1048class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001049 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001052
Moshe Zadka22710822001-03-21 17:24:49 +00001053 Subwidgets Class
1054 ---------- -----
1055 label Label
1056 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001057
1058 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001059 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001060 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001061 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1062 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001063
1064class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001065 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001069
Moshe Zadka22710822001-03-21 17:24:49 +00001070 Subwidgets Class
1071 ---------- -----
1072 label Label
1073 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001074
1075 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001076 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001077 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001078 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1079 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001080
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001081
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):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001091 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')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001097
1098 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001099 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001100 self.subwidget_list[name] = TixSubWidget(self, name)
1101 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001102
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001103 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001104 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001105
1106 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001107 # 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
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001113
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001114 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001115 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001116
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):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001123 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001124 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001125
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001126class NoteBook(TixWidget):
1127 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1128
Moshe Zadka22710822001-03-21 17:24:49 +00001129 Subwidgets Class
1130 ---------- -----
1131 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001132 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001133
1134 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001135 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1136 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001137 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001138
1139 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001140 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001141 self.subwidget_list[name] = TixSubWidget(self, name)
1142 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001143
1144 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001145 self.tk.call(self._w, 'delete', name)
1146 self.subwidget_list[name].destroy()
1147 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001148
1149 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001150 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001151
1152 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001153 # 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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001159
Moshe Zadka22710822001-03-21 17:24:49 +00001160 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001161 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001162
1163 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001164 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001165
1166class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001167 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001168 pass
1169
1170class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001171 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001172
Moshe Zadka22710822001-03-21 17:24:49 +00001173 Subwidget Class
1174 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001175 menubutton Menubutton
1176 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001177
1178 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001179 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1180 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1181 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001182
1183 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001184 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001185
1186 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001187 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001188
1189 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001190 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001191
1192 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001193 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001194
1195 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001196 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001197
1198class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001199 """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.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001204
Moshe Zadka22710822001-03-21 17:24:49 +00001205 Subwidgets Class
1206 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001207 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001208
1209 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001210 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001211
Neal Norwitzf539bde2002-11-14 02:43:40 +00001212 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001213 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001214 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001215 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001216 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001217 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001218
Neal Norwitzf539bde2002-11-14 02:43:40 +00001219 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)))
Raymond Hettingerff41c482003-04-06 09:01:11 +00001235 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001236
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001237 def panes(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001238 names = self.tk.call(self._w, 'panes')
1239 ret = []
1240 for x in names:
1241 ret.append(self.subwidget(x))
1242 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001243
1244class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001245 """PopupMenu widget can be used as a replacement of the tk_popup command.
1246 The advantage of the Tix PopupMenu widget is it requires less application
1247 code to manipulate.
1248
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001249
Moshe Zadka22710822001-03-21 17:24:49 +00001250 Subwidgets Class
1251 ---------- -----
1252 menubutton Menubutton
1253 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001254
Martin v. Löwis46874282002-12-06 10:33:45 +00001255 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001256 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001257 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1258 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1259 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001260
1261 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001262 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001263
1264 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001265 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001266
1267 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001268 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001269
1270class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001271 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001272 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001273 # There seems to be a Tix bug rejecting the configure method
1274 # Let's try making the flags -static
1275 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1276 'handlesize', 'hintcolor', 'hintwidth',
1277 'x', 'y']
1278 # In fact, x y height width are configurable
1279 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001280 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001281
1282 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001283 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001284
Martin v. Löwis652e1912001-11-25 14:50:56 +00001285 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001286 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001287
1288 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001289 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001290
1291 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001292 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001293
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001294class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001295 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001296
Martin v. Löwis46874282002-12-06 10:33:45 +00001297 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001298 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001299 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001300 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001301 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1302 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1303 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001304
1305class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001306 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001307
Martin v. Löwis46874282002-12-06 10:33:45 +00001308 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001309 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001310 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1311 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1312 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1313 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001314
1315class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001316 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001317
Martin v. Löwis46874282002-12-06 10:33:45 +00001318 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001319 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001320 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1321 self.subwidget_list['text'] = _dummyText(self, 'text')
1322 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1323 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001324
1325class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001326 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001327
Martin v. Löwis46874282002-12-06 10:33:45 +00001328 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001329 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001330 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001331 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001332 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1333 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1334 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001335
1336class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001337 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001338
Martin v. Löwis46874282002-12-06 10:33:45 +00001339 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001340 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001341 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1342 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1343 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1344 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001345
1346class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001347 """Select - Container of button subwidgets. It can be used to provide
1348 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001349
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001350 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001351
Martin v. Löwis46874282002-12-06 10:33:45 +00001352 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001353 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001354 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001355 ['allowzero', 'radio', 'orientation', 'labelside',
1356 'options'],
1357 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001358 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001359
1360 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001361 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001362 self.subwidget_list[name] = _dummyButton(self, name)
1363 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001364
1365 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001366 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001367
Neal Norwitzf539bde2002-11-14 02:43:40 +00001368class Shell(TixWidget):
1369 """Toplevel window.
1370
1371 Subwidgets - None"""
1372
1373 def __init__ (self,master=None,cnf={}, **kw):
1374 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1375
1376class DialogShell(TixWidget):
1377 """Toplevel window, with popup popdown and center methods.
1378 It tells the window manager that it is a dialog window and should be
1379 treated specially. The exact treatment depends on the treatment of
1380 the window manager.
1381
1382 Subwidgets - None"""
1383
Martin v. Löwis46874282002-12-06 10:33:45 +00001384 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001385 def __init__ (self,master=None,cnf={}, **kw):
1386 TixWidget.__init__(self, master,
1387 'tixDialogShell',
1388 ['options', 'title', 'mapped',
1389 'minheight', 'minwidth',
1390 'parent', 'transient'], cnf, kw)
1391
1392 def popdown(self):
1393 self.tk.call(self._w, 'popdown')
1394
1395 def popup(self):
1396 self.tk.call(self._w, 'popup')
1397
1398 def center(self):
1399 self.tk.call(self._w, 'center')
1400
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001401class StdButtonBox(TixWidget):
1402 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1403
1404 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001405 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001406 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001407 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1408 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1409 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1410 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001411
1412 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001413 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001414 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001415
Guilherme Polo1fff0082009-08-14 15:05:30 +00001416class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001417 """TList - Hierarchy display widget which can be
1418 used to display data in a tabular format. The list entries of a TList
1419 widget are similar to the entries in the Tk listbox widget. The main
1420 differences are (1) the TList widget can display the list entries in a
1421 two dimensional format and (2) you can use graphical images as well as
1422 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001423
1424 Subwidgets - None"""
1425
1426 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001427 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001428
1429 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001430 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001431
1432 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001433 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001434
1435 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001436 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001437
1438 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001439 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001440
1441 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001442 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001443
1444 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001445 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001446
1447 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001448 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001449
1450 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001451 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001452
1453 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001454 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001455
1456 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001457 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001458
1459 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001460 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001461
1462 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001463 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001464
1465 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001466 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001467
1468 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001469 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001470
1471 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001472 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001473
1474 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001475 c = self.tk.call(self._w, 'info', 'selection')
1476 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001477
1478 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001479 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001480
1481 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001482 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001483
1484 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001485 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001486
1487 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001488 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001489
1490 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001491 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001492
1493 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001494 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001495
1496 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001497 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001498
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001499class Tree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001500 """Tree - The tixTree widget can be used to display hierachical
1501 data in a tree form. The user can adjust
1502 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001503
Martin v. Löwis46874282002-12-06 10:33:45 +00001504 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001505 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001506 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001507 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001508 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1509 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1510 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001511
1512 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001513 '''This command calls the setmode method for all the entries in this
1514 Tree widget: if an entry has no child entries, its mode is set to
1515 none. Otherwise, if the entry has any hidden child entries, its mode is
1516 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001517 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001518
1519 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001520 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001521 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001522
1523 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001524 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001525 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001526
1527 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001528 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001529 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001530
1531 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001532 '''This command is used to indicate whether the entry given by
1533 entryPath has children entries and whether the children are visible. mode
1534 must be one of open, close or none. If mode is set to open, a (+)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001535 indicator is drawn next the the entry. If mode is set to close, a (-)
1536 indicator is drawn next the the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001537 indicators will be drawn for this entry. The default mode is none. The
1538 open mode indicates the entry has hidden children and this entry can be
1539 opened by the user. The close mode indicates that all the children of the
1540 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001541 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001542
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001543
1544# Could try subclassing Tree for CheckList - would need another arg to init
1545class CheckList(TixWidget):
1546 """The CheckList widget
1547 displays a list of items to be selected by the user. CheckList acts
1548 similarly to the Tk checkbutton or radiobutton widgets, except it is
1549 capable of handling many more items than checkbuttons or radiobuttons.
1550 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001551 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001552 def __init__(self, master=None, cnf={}, **kw):
1553 TixWidget.__init__(self, master, 'tixCheckList',
1554 ['options'], cnf, kw)
1555 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1556 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1557 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001558
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001559 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001560 '''This command calls the setmode method for all the entries in this
1561 Tree widget: if an entry has no child entries, its mode is set to
1562 none. Otherwise, if the entry has any hidden child entries, its mode is
1563 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001564 self.tk.call(self._w, 'autosetmode')
1565
1566 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001567 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001568 self.tk.call(self._w, 'close', entrypath)
1569
1570 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001571 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001572 return self.tk.call(self._w, 'getmode', entrypath)
1573
1574 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001575 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001576 self.tk.call(self._w, 'open', entrypath)
1577
1578 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001579 '''Returns a list of items whose status matches status. If status is
1580 not specified, the list of items in the "on" status will be returned.
1581 Mode can be on, off, default'''
1582 c = self.tk.split(self.tk.call(self._w, 'getselection', mode))
1583 return self.tk.splitlist(c)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001584
1585 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001586 '''Returns the current status of entryPath.'''
1587 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001588
1589 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001590 '''Sets the status of entryPath to be status. A bitmap will be
1591 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001592 self.tk.call(self._w, 'setstatus', entrypath, mode)
1593
1594
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001595###########################################################################
1596### The subclassing below is used to instantiate the subwidgets in each ###
1597### mega widget. This allows us to access their methods directly. ###
1598###########################################################################
1599
1600class _dummyButton(Button, TixSubWidget):
1601 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001602 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001603
1604class _dummyCheckbutton(Checkbutton, TixSubWidget):
1605 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001606 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001607
1608class _dummyEntry(Entry, TixSubWidget):
1609 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001610 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001611
1612class _dummyFrame(Frame, TixSubWidget):
1613 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001614 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001615
1616class _dummyLabel(Label, TixSubWidget):
1617 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001618 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001619
1620class _dummyListbox(Listbox, TixSubWidget):
1621 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001622 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001623
1624class _dummyMenu(Menu, TixSubWidget):
1625 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001626 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001627
1628class _dummyMenubutton(Menubutton, TixSubWidget):
1629 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001630 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001631
1632class _dummyScrollbar(Scrollbar, TixSubWidget):
1633 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001634 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001635
1636class _dummyText(Text, TixSubWidget):
1637 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001638 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001639
1640class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1641 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001642 TixSubWidget.__init__(self, master, name, destroy_physically)
1643 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1644 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1645 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001646
1647class _dummyHList(HList, TixSubWidget):
1648 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001649 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001650
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001651class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1652 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001653 TixSubWidget.__init__(self, master, name, destroy_physically)
1654 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1655 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1656 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001657
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001658class _dummyTList(TList, TixSubWidget):
1659 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001660 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001661
1662class _dummyComboBox(ComboBox, TixSubWidget):
1663 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001664 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1665 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001666 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1667 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001668
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001669 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001670 'slistbox')
1671 try:
1672 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1673 #cross Button : present if created with the fancy option
1674 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1675 except TypeError:
1676 # unavailable when -fancy not specified
1677 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001678
1679class _dummyDirList(DirList, TixSubWidget):
1680 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001681 TixSubWidget.__init__(self, master, name, destroy_physically)
1682 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1683 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1684 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001685
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001686class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1687 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001688 TixSubWidget.__init__(self, master, name, destroy_physically)
1689 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1690 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001691
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001692class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1693 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001694 TixSubWidget.__init__(self, master, name, destroy_physically)
1695 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1696 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1697 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1698 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1699 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1700 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1701 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1702 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001703
1704class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1705 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001706 TixSubWidget.__init__(self, master, name, destroy_physically)
1707 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1708 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1709 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1710 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001711
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001712class _dummyFileComboBox(ComboBox, TixSubWidget):
1713 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001714 TixSubWidget.__init__(self, master, name, destroy_physically)
1715 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001716
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001717class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1718 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001719 TixSubWidget.__init__(self, master, name, destroy_physically)
1720 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1721 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1722 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1723 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001724
1725class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1726 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001727 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001728
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001729class _dummyPanedWindow(PanedWindow, TixSubWidget):
1730 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001731 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001732
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001733########################
1734### Utility Routines ###
1735########################
1736
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001737#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1738
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001739def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001740 '''Returns the qualified path name for the widget. Normally used to set
1741 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001742 return widget.tk.call('tixOptionName', widget._w)
1743
1744# Called with a dictionary argument of the form
1745# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1746# returns a string which can be used to configure the fsbox file types
1747# in an ExFileSelectBox. i.e.,
1748# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1749def FileTypeList(dict):
1750 s = ''
1751 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001752 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001753 return s
1754
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001755# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001756# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001757class CObjView(TixWidget):
1758 """This file implements the Canvas Object View widget. This is a base
1759 class of IconView. It implements automatic placement/adjustment of the
1760 scrollbars according to the canvas objects inside the canvas subwidget.
1761 The scrollbars are adjusted so that the canvas is just large enough
1762 to see all the objects.
1763 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001764 # FIXME: It should inherit -superclass tixScrolledWidget
1765 pass
1766
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001767
Guilherme Polo1fff0082009-08-14 15:05:30 +00001768class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001769 '''The Tix Grid command creates a new window and makes it into a
1770 tixGrid widget. Additional options, may be specified on the command
1771 line or in the option database to configure aspects such as its cursor
1772 and relief.
1773
1774 A Grid widget displays its contents in a two dimensional grid of cells.
1775 Each cell may contain one Tix display item, which may be in text,
1776 graphics or other formats. See the DisplayStyle class for more information
1777 about Tix display items. Individual cells, or groups of cells, can be
1778 formatted with a wide range of attributes, such as its color, relief and
1779 border.
1780
1781 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001782 # valid specific resources as of Tk 8.4
1783 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1784 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1785 # selectunit, topmargin,
1786 def __init__(self, master=None, cnf={}, **kw):
1787 static= []
1788 self.cnf= cnf
1789 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001790
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001791 # valid options as of Tk 8.4
1792 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget, edit
1793 # entryconfigure, format, geometryinfo, info, index, move, nearest, selection
1794 # set, size, unset, xview, yview
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001795 # def anchor option ?args ...?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001796 def anchor_get(self):
1797 "Get the (x,y) coordinate of the current anchor cell"
1798 return self._getints(self.tk.call(self, 'anchor', 'get'))
1799
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001800 # def bdtype
1801 # def delete dim from ?to?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001802 def delete_row(self, from_, to=None):
1803 """Delete rows between from_ and to inclusive.
1804 If to is not provided, delete only row at from_"""
1805 if to is None:
1806 self.tk.call(self, 'delete', 'row', from_)
1807 else:
1808 self.tk.call(self, 'delete', 'row', from_, to)
1809 def delete_column(self, from_, to=None):
1810 """Delete columns between from_ and to inclusive.
1811 If to is not provided, delete only column at from_"""
1812 if to is None:
1813 self.tk.call(self, 'delete', 'column', from_)
1814 else:
1815 self.tk.call(self, 'delete', 'column', from_, to)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001816 # def edit apply
1817 # def edit set x y
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001818
1819 def entrycget(self, x, y, option):
1820 "Get the option value for cell at (x,y)"
1821 return self.tk.call(self, 'entrycget', x, y, option)
1822
1823 def entryconfigure(self, x, y, **kw):
1824 return self.tk.call(self, 'entryconfigure', x, y, *self._options(None, kw))
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001825 # def format
1826 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001827
1828 def info_exists(self, x, y):
1829 "Return True if display item exists at (x,y)"
1830 return bool(int(self.tk.call(self, 'info', 'exists', x, y)))
1831
1832 def info_bbox(self, x, y):
1833 # This seems to always return '', at least for 'text' displayitems
1834 return self.tk.call(self, 'info', 'bbox', x, y)
1835
1836 def nearest(self, x, y):
1837 "Return coordinate of cell nearest pixel coordinate (x,y)"
1838 return self._getints(self.tk.call(self, 'nearest', x, y))
1839
1840 # def selection adjust
1841 # def selection clear
1842 # def selection includes
1843 # def selection set
1844 # def selection toggle
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001845 # def move dim from to offset
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846
1847 def set(self, x, y, itemtype=None, **kw):
1848 args= self._options(self.cnf, kw)
1849 if itemtype is not None:
1850 args= ('-itemtype', itemtype) + args
1851 self.tk.call(self, 'set', x, y, *args)
1852
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001853 # def size dim index ?option value ...?
1854 # def unset x y
Raymond Hettingerff41c482003-04-06 09:01:11 +00001855
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001856class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001857 '''Scrolled Grid widgets'''
1858
1859 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001860 def __init__(self, master=None, cnf={}, **kw):
1861 static= []
1862 self.cnf= cnf
1863 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)