blob: 44ecae1a326831d9fc39aaa497f2375a83ce7758 [file] [log] [blame]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001# Tix.py -- Tix widget wrappers.
2#
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00003# For Tix, see http://tix.sourceforge.net
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00004#
Moshe Zadka22710822001-03-21 17:24:49 +00005# - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995.
Martin v. Löwisb7b32602001-11-02 23:48:20 +00006# based on an idea of Jean-Marc Lugrin (lugrin@ms.com)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00007#
8# NOTE: In order to minimize changes to Tkinter.py, some of the code here
Moshe Zadka22710822001-03-21 17:24:49 +00009# (TixWidget.__init__) has been taken from Tkinter (Widget.__init__)
10# and will break if there are major changes in Tkinter.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000011#
12# The Tix widgets are represented by a class hierarchy in python with proper
13# inheritance of base classes.
14#
15# As a result after creating a 'w = StdButtonBox', I can write
Moshe Zadka22710822001-03-21 17:24:49 +000016# w.ok['text'] = 'Who Cares'
17# or w.ok['bg'] = w['bg']
18# or even w.ok.invoke()
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000019# etc.
20#
21# Compare the demo tixwidgets.py to the original Tcl program and you will
22# appreciate the advantages.
23#
Miss Islington (bot)ec6a1ea2021-05-07 09:14:48 -070024# NOTE: This module is deprecated since Python 3.6.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000025
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040026import os
Miss Islington (bot)ec6a1ea2021-05-07 09:14:48 -070027import warnings
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040028import tkinter
Georg Brandl14fc4272008-05-17 18:39:55 +000029from tkinter import *
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040030from tkinter import _cnfmerge
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000031
Miss Islington (bot)ec6a1ea2021-05-07 09:14:48 -070032warnings.warn(
33 'The Tix Tk extension is unmaintained, and the tkinter.tix wrapper module'
34 ' is deprecated in favor of tkinter.ttk',
35 DeprecationWarning,
36 stacklevel=2,
37 )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000038
39# Some more constants (for consistency with Tkinter)
40WINDOW = 'window'
41TEXT = 'text'
42STATUS = 'status'
43IMMEDIATE = 'immediate'
44IMAGE = 'image'
45IMAGETEXT = 'imagetext'
46BALLOON = 'balloon'
47AUTO = 'auto'
48ACROSSTOP = 'acrosstop'
49
Guilherme Polobcd03df2009-08-18 15:35:57 +000050# A few useful constants for the Grid widget
51ASCII = 'ascii'
52CELL = 'cell'
53COLUMN = 'column'
54DECREASING = 'decreasing'
55INCREASING = 'increasing'
56INTEGER = 'integer'
57MAIN = 'main'
58MAX = 'max'
59REAL = 'real'
60ROW = 'row'
61S_REGION = 's-region'
62X_REGION = 'x-region'
63Y_REGION = 'y-region'
64
Fred Drake723293c2001-12-13 04:53:07 +000065# Some constants used by Tkinter dooneevent()
66TCL_DONT_WAIT = 1 << 1
67TCL_WINDOW_EVENTS = 1 << 2
68TCL_FILE_EVENTS = 1 << 3
69TCL_TIMER_EVENTS = 1 << 4
70TCL_IDLE_EVENTS = 1 << 5
71TCL_ALL_EVENTS = 0
72
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000073# BEWARE - this is implemented by copying some code from the Widget class
74# in Tkinter (to override Widget initialization) and is therefore
75# liable to break.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000076
77# Could probably add this to Tkinter.Misc
78class tixCommand:
Fred Drake723293c2001-12-13 04:53:07 +000079 """The tix commands provide access to miscellaneous elements
Martin v. Löwisb7b32602001-11-02 23:48:20 +000080 of Tix's internal state and the Tix application context.
Fred Drake723293c2001-12-13 04:53:07 +000081 Most of the information manipulated by these commands pertains
82 to the application as a whole, or to a screen or
83 display, rather than to a particular window.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000084
85 This is a mixin class, assumed to be mixed to Tkinter.Tk
86 that supports the self.tk.call method.
87 """
Fred Drake723293c2001-12-13 04:53:07 +000088
Martin v. Löwisb7b32602001-11-02 23:48:20 +000089 def tix_addbitmapdir(self, directory):
Fred Drake723293c2001-12-13 04:53:07 +000090 """Tix maintains a list of directories under which
Martin v. Löwisb7b32602001-11-02 23:48:20 +000091 the tix_getimage and tix_getbitmap commands will
Fred Drake723293c2001-12-13 04:53:07 +000092 search for image files. The standard bitmap directory
93 is $TIX_LIBRARY/bitmaps. The addbitmapdir command
94 adds directory into this list. By using this
Martin v. Löwisb7b32602001-11-02 23:48:20 +000095 command, the image files of an applications can
96 also be located using the tix_getimage or tix_getbitmap
97 command.
98 """
99 return self.tk.call('tix', 'addbitmapdir', directory)
100
101 def tix_cget(self, option):
102 """Returns the current value of the configuration
103 option given by option. Option may be any of the
104 options described in the CONFIGURATION OPTIONS section.
105 """
106 return self.tk.call('tix', 'cget', option)
107
108 def tix_configure(self, cnf=None, **kw):
Fred Drake723293c2001-12-13 04:53:07 +0000109 """Query or modify the configuration options of the Tix application
110 context. If no option is specified, returns a dictionary all of the
111 available options. If option is specified with no value, then the
112 command returns a list describing the one named option (this list
113 will be identical to the corresponding sublist of the value
114 returned if no option is specified). If one or more option-value
115 pairs are specified, then the command modifies the given option(s)
116 to have the given value(s); in this case the command returns an
117 empty string. Option may be any of the configuration options.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000118 """
Fred Drake723293c2001-12-13 04:53:07 +0000119 # Copied from Tkinter.py
120 if kw:
121 cnf = _cnfmerge((cnf, kw))
122 elif cnf:
123 cnf = _cnfmerge(cnf)
124 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200125 return self._getconfigure('tix', 'configure')
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300126 if isinstance(cnf, str):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200127 return self._getconfigure1('tix', 'configure', '-'+cnf)
Fred Drake723293c2001-12-13 04:53:07 +0000128 return self.tk.call(('tix', 'configure') + self._options(cnf))
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000129
130 def tix_filedialog(self, dlgclass=None):
Fred Drake723293c2001-12-13 04:53:07 +0000131 """Returns the file selection dialog that may be shared among
132 different calls from this application. This command will create a
133 file selection dialog widget when it is called the first time. This
134 dialog will be returned by all subsequent calls to tix_filedialog.
135 An optional dlgclass parameter can be passed to specified what type
136 of file selection dialog widget is desired. Possible options are
137 tix FileSelectDialog or tixExFileSelectDialog.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000138 """
139 if dlgclass is not None:
140 return self.tk.call('tix', 'filedialog', dlgclass)
141 else:
142 return self.tk.call('tix', 'filedialog')
143
144 def tix_getbitmap(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000145 """Locates a bitmap file of the name name.xpm or name in one of the
146 bitmap directories (see the tix_addbitmapdir command above). By
147 using tix_getbitmap, you can avoid hard coding the pathnames of the
148 bitmap files in your application. When successful, it returns the
149 complete pathname of the bitmap file, prefixed with the character
150 '@'. The returned value can be used to configure the -bitmap
151 option of the TK and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000152 """
153 return self.tk.call('tix', 'getbitmap', name)
154
155 def tix_getimage(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000156 """Locates an image file of the name name.xpm, name.xbm or name.ppm
157 in one of the bitmap directories (see the addbitmapdir command
158 above). If more than one file with the same name (but different
159 extensions) exist, then the image type is chosen according to the
160 depth of the X display: xbm images are chosen on monochrome
161 displays and color images are chosen on color displays. By using
Ezio Melotti42da6632011-03-15 05:18:48 +0200162 tix_ getimage, you can avoid hard coding the pathnames of the
Fred Drake723293c2001-12-13 04:53:07 +0000163 image files in your application. When successful, this command
164 returns the name of the newly created image, which can be used to
165 configure the -image option of the Tk and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000166 """
167 return self.tk.call('tix', 'getimage', name)
168
169 def tix_option_get(self, name):
Ezio Melotti13925002011-03-16 11:05:33 +0200170 """Gets the options maintained by the Tix
Fred Drake723293c2001-12-13 04:53:07 +0000171 scheme mechanism. Available options include:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000172
173 active_bg active_fg bg
174 bold_font dark1_bg dark1_fg
175 dark2_bg dark2_fg disabled_fg
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000176 fg fixed_font font
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000177 inactive_bg inactive_fg input1_bg
178 input2_bg italic_font light1_bg
179 light1_fg light2_bg light2_fg
180 menu_font output1_bg output2_bg
181 select_bg select_fg selector
182 """
183 # could use self.tk.globalgetvar('tixOption', name)
184 return self.tk.call('tix', 'option', 'get', name)
185
186 def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None):
Fred Drake723293c2001-12-13 04:53:07 +0000187 """Resets the scheme and fontset of the Tix application to
188 newScheme and newFontSet, respectively. This affects only those
189 widgets created after this call. Therefore, it is best to call the
190 resetoptions command before the creation of any widgets in a Tix
191 application.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000192
Fred Drake723293c2001-12-13 04:53:07 +0000193 The optional parameter newScmPrio can be given to reset the
194 priority level of the Tk options set by the Tix schemes.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000195
Fred Drake723293c2001-12-13 04:53:07 +0000196 Because of the way Tk handles the X option database, after Tix has
197 been has imported and inited, it is not possible to reset the color
198 schemes and font sets using the tix config command. Instead, the
199 tix_resetoptions command must be used.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000200 """
201 if newScmPrio is not None:
202 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio)
203 else:
204 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet)
205
Georg Brandl14fc4272008-05-17 18:39:55 +0000206class Tk(tkinter.Tk, tixCommand):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000207 """Toplevel widget of Tix which represents mostly the main window
208 of an application. It has an associated Tcl interpreter."""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000209 def __init__(self, screenName=None, baseName=None, className='Tix'):
Georg Brandl14fc4272008-05-17 18:39:55 +0000210 tkinter.Tk.__init__(self, screenName, baseName, className)
Moshe Zadka22710822001-03-21 17:24:49 +0000211 tixlib = os.environ.get('TIX_LIBRARY')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000212 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]')
Moshe Zadka22710822001-03-21 17:24:49 +0000213 if tixlib is not None:
214 self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib)
215 self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000216 # Load Tix - this should work dynamically or statically
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000217 # If it's static, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000218 # 'load {} Tix'
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000219 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000220 # 'load libtix8.1.8.3.so Tix'
Moshe Zadka22710822001-03-21 17:24:49 +0000221 self.tk.eval('package require Tix')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000222
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000223 def destroy(self):
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300224 # For safety, remove the delete_window binding before destroy
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000225 self.protocol("WM_DELETE_WINDOW", "")
Georg Brandl14fc4272008-05-17 18:39:55 +0000226 tkinter.Tk.destroy(self)
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000227
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000228# The Tix 'tixForm' geometry manager
229class Form:
230 """The Tix Form geometry manager
231
232 Widgets can be arranged by specifying attachments to other widgets.
233 See Tix documentation for complete details"""
234
235 def config(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000236 self.tk.call('tixForm', self._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000237
238 form = config
239
240 def __setitem__(self, key, value):
Guido van Rossum49fa2bd2001-08-13 14:12:35 +0000241 Form.form(self, {key: value})
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000242
243 def check(self):
244 return self.tk.call('tixForm', 'check', self._w)
245
246 def forget(self):
247 self.tk.call('tixForm', 'forget', self._w)
248
249 def grid(self, xsize=0, ysize=0):
250 if (not xsize) and (not ysize):
251 x = self.tk.call('tixForm', 'grid', self._w)
252 y = self.tk.splitlist(x)
253 z = ()
254 for x in y:
255 z = z + (self.tk.getint(x),)
256 return z
Martin v. Löwis46874282002-12-06 10:33:45 +0000257 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000258
259 def info(self, option=None):
260 if not option:
261 return self.tk.call('tixForm', 'info', self._w)
262 if option[0] != '-':
263 option = '-' + option
264 return self.tk.call('tixForm', 'info', self._w, option)
265
266 def slaves(self):
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000267 return [self._nametowidget(x) for x in
268 self.tk.splitlist(
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000269 self.tk.call(
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000270 'tixForm', 'slaves', self._w))]
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000271
272
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000273
Georg Brandl14fc4272008-05-17 18:39:55 +0000274tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000275
Georg Brandl14fc4272008-05-17 18:39:55 +0000276class TixWidget(tkinter.Widget):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000277 """A TixWidget class is used to package all (or most) Tix widgets.
278
279 Widget initialization is extended in two ways:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000280 1) It is possible to give a list of options which must be part of
Moshe Zadka22710822001-03-21 17:24:49 +0000281 the creation command (so called Tix 'static' options). These cannot be
282 given as a 'config' command later.
283 2) It is possible to give the name of an existing TK widget. These are
284 child widgets created automatically by a Tix mega-widget. The Tk call
285 to create these widgets is therefore bypassed in TixWidget.__init__
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000286
287 Both options are for use by subclasses only.
288 """
289 def __init__ (self, master=None, widgetName=None,
Moshe Zadka22710822001-03-21 17:24:49 +0000290 static_options=None, cnf={}, kw={}):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000291 # Merge keywords and dictionary arguments
292 if kw:
Moshe Zadka22710822001-03-21 17:24:49 +0000293 cnf = _cnfmerge((cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000294 else:
295 cnf = _cnfmerge(cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000296
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000297 # Move static options into extra. static_options must be
298 # a list of keywords (or None).
299 extra=()
Neal Norwitzf539bde2002-11-14 02:43:40 +0000300
301 # 'options' is always a static option
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000302 if static_options:
Neal Norwitzf539bde2002-11-14 02:43:40 +0000303 static_options.append('options')
304 else:
305 static_options = ['options']
Raymond Hettingerff41c482003-04-06 09:01:11 +0000306
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000307 for k,v in list(cnf.items()):
Neal Norwitzf539bde2002-11-14 02:43:40 +0000308 if k in static_options:
309 extra = extra + ('-' + k, v)
310 del cnf[k]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000311
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000312 self.widgetName = widgetName
313 Widget._setup(self, master, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000314
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000315 # If widgetName is None, this is a dummy creation call where the
316 # corresponding Tk widget has already been created by Tix
317 if widgetName:
Raymond Hettingerff41c482003-04-06 09:01:11 +0000318 self.tk.call(widgetName, self._w, *extra)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000319
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000320 # Non-static options - to be done via a 'config' command
321 if cnf:
322 Widget.config(self, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000323
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000324 # Dictionary to hold subwidget names for easier access. We can't
325 # use the children list because the public Tix names may not be the
326 # same as the pathname component
327 self.subwidget_list = {}
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000328
329 # We set up an attribute access function so that it is possible to
330 # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello'
331 # when w is a StdButtonBox.
332 # We can even do w.ok.invoke() because w.ok is subclassed from the
333 # Button class if you go through the proper constructors
334 def __getattr__(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000335 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000336 return self.subwidget_list[name]
Collin Winterce36ad82007-08-30 01:19:48 +0000337 raise AttributeError(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000338
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000339 def set_silent(self, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000340 """Set a variable without calling its action routine"""
341 self.tk.call('tixSetSilent', self._w, value)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000342
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000343 def subwidget(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000344 """Return the named subwidget (which must have been created by
345 the sub-class)."""
346 n = self._subwidget_name(name)
347 if not n:
Collin Winterce36ad82007-08-30 01:19:48 +0000348 raise TclError("Subwidget " + name + " not child of " + self._name)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000349 # Remove header of name and leading dot
350 n = n[len(self._w)+1:]
351 return self._nametowidget(n)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000352
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000353 def subwidgets_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000354 """Return all subwidgets."""
355 names = self._subwidget_names()
356 if not names:
357 return []
358 retlist = []
359 for name in names:
360 name = name[len(self._w)+1:]
361 try:
362 retlist.append(self._nametowidget(name))
363 except:
364 # some of the widgets are unknown e.g. border in LabelFrame
365 pass
366 return retlist
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000367
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000368 def _subwidget_name(self,name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000369 """Get a subwidget name (returns a String, not a Widget !)"""
370 try:
371 return self.tk.call(self._w, 'subwidget', name)
372 except TclError:
373 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000374
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000375 def _subwidget_names(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000376 """Return the name of all subwidgets."""
377 try:
378 x = self.tk.call(self._w, 'subwidgets', '-all')
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200379 return self.tk.splitlist(x)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000380 except TclError:
381 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000382
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000383 def config_all(self, option, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000384 """Set configuration options for all subwidgets (and self)."""
385 if option == '':
386 return
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300387 elif not isinstance(option, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000388 option = repr(option)
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300389 if not isinstance(value, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000390 value = repr(value)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000391 names = self._subwidget_names()
392 for name in names:
393 self.tk.call(name, 'configure', '-' + option, value)
Neal Norwitz731a9862002-12-10 02:18:49 +0000394 # These are missing from Tkinter
395 def image_create(self, imgtype, cnf={}, master=None, **kw):
Serhiy Storchakabb70b2a2020-12-25 17:04:26 +0200396 if master is None:
Serhiy Storchaka3d569fd2020-12-19 12:17:08 +0200397 master = self
Neal Norwitz731a9862002-12-10 02:18:49 +0000398 if kw and cnf: cnf = _cnfmerge((cnf, kw))
399 elif kw: cnf = kw
400 options = ()
401 for k, v in cnf.items():
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200402 if callable(v):
Neal Norwitz731a9862002-12-10 02:18:49 +0000403 v = self._register(v)
404 options = options + ('-'+k, v)
405 return master.tk.call(('image', 'create', imgtype,) + options)
406 def image_delete(self, imgname):
407 try:
408 self.tk.call('image', 'delete', imgname)
409 except TclError:
410 # May happen if the root was destroyed
411 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000412
413# Subwidgets are child widgets created automatically by mega-widgets.
414# In python, we have to create these subwidgets manually to mirror their
415# existence in Tk/Tix.
416class TixSubWidget(TixWidget):
417 """Subwidget class.
418
419 This is used to mirror child widgets automatically created
420 by Tix/Tk as part of a mega-widget in Python (which is not informed
421 of this)"""
422
423 def __init__(self, master, name,
Moshe Zadka22710822001-03-21 17:24:49 +0000424 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000425 if check_intermediate:
426 path = master._subwidget_name(name)
427 try:
428 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000429 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000430 except:
431 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000432
Thomas Wouters89f507f2006-12-13 04:49:30 +0000433 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000434 # immediate descendant
435 TixWidget.__init__(self, master, None, None, {'name' : name})
436 else:
437 # Ensure that the intermediate widgets exist
438 parent = master
439 for i in range(len(plist) - 1):
Neal Norwitzebb41902002-05-31 20:51:31 +0000440 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000441 try:
442 w = master._nametowidget(n)
443 parent = w
444 except KeyError:
445 # Create the intermediate widget
446 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000447 destroy_physically=0,
448 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000449 # The Tk widget name is in plist, not in name
450 if plist:
451 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000452 TixWidget.__init__(self, parent, None, None, {'name' : name})
453 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000454
455 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000456 # For some widgets e.g., a NoteBook, when we call destructors,
457 # we must be careful not to destroy the frame widget since this
458 # also destroys the parent NoteBook thus leading to an exception
459 # in Tkinter when it finally calls Tcl to destroy the NoteBook
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000460 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000461 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000462 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000463 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000464 del self.master.subwidget_list[self._name]
465 if self.destroy_physically:
466 # This is bypassed only for a few widgets
467 self.tk.call('destroy', self._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000468
469
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000470# Useful class to create a display style - later shared by many items.
471# Contributed by Steffen Kremser
472class DisplayStyle:
473 """DisplayStyle - handle configuration options shared by
474 (multiple) Display Items"""
475
Serhiy Storchaka1aca3892016-09-25 16:52:13 +0300476 def __init__(self, itemtype, cnf={}, *, master=None, **kw):
Serhiy Storchakabb70b2a2020-12-25 17:04:26 +0200477 if master is None:
Serhiy Storchaka1aca3892016-09-25 16:52:13 +0300478 if 'refwindow' in kw:
479 master = kw['refwindow']
480 elif 'refwindow' in cnf:
481 master = cnf['refwindow']
482 else:
Serhiy Storchaka3d569fd2020-12-19 12:17:08 +0200483 master = tkinter._get_default_root('create display style')
Moshe Zadka22710822001-03-21 17:24:49 +0000484 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000485 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
486 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000487
488 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000489 return self.stylename
490
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000491 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000492 if kw and cnf:
493 cnf = _cnfmerge((cnf, kw))
494 elif kw:
495 cnf = kw
496 opts = ()
497 for k, v in cnf.items():
498 opts = opts + ('-'+k, v)
499 return opts
500
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000501 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000502 self.tk.call(self.stylename, 'delete')
503
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000504 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000505 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
506
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000507 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200508 return self._getconfigure(
509 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000510
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000511 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000512 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000513
514
515######################################################
516### The Tix Widget classes - in alphabetical order ###
517######################################################
518
519class Balloon(TixWidget):
520 """Balloon help widget.
521
Moshe Zadka22710822001-03-21 17:24:49 +0000522 Subwidget Class
523 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000524 label Label
525 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000526
Martin v. Löwis46874282002-12-06 10:33:45 +0000527 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000528 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000529 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000530 static = ['options', 'installcolormap', 'initwait', 'statusbar',
531 'cursor']
532 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
533 self.subwidget_list['label'] = _dummyLabel(self, 'label',
534 destroy_physically=0)
535 self.subwidget_list['message'] = _dummyLabel(self, 'message',
536 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000537
538 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000539 """Bind balloon widget to another.
540 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000541 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000542
543 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000544 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000545
546class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000547 """ButtonBox - A container for pushbuttons.
548 Subwidgets are the buttons added with the add method.
549 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000550 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000551 TixWidget.__init__(self, master, 'tixButtonBox',
552 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000553
554 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000555 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000556
Raymond Hettingerff41c482003-04-06 09:01:11 +0000557 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000558 self.subwidget_list[name] = _dummyButton(self, name)
559 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000560
561 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000562 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000563 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000564
565class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000566 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200567 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000568 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000569
Moshe Zadka22710822001-03-21 17:24:49 +0000570 Subwidget Class
571 --------- -----
572 entry Entry
573 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000574 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000575 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000576 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000577
Martin v. Löwis46874282002-12-06 10:33:45 +0000578 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000579 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000580 TixWidget.__init__(self, master, 'tixComboBox',
581 ['editable', 'dropdown', 'fancy', 'options'],
582 cnf, kw)
583 self.subwidget_list['label'] = _dummyLabel(self, 'label')
584 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
585 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
586 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
587 'slistbox')
588 try:
589 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
590 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
591 except TypeError:
592 # unavailable when -fancy not specified
593 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000594
Neal Norwitz731a9862002-12-10 02:18:49 +0000595 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000596
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000597 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000598 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000599
600 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000601 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000602
603 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000604 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000605
606 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000607 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000608
609class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000610 """Control - An entry field with value change arrows. The user can
611 adjust the value by pressing the two arrow buttons or by entering
612 the value directly into the entry. The new value will be checked
613 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000614
Moshe Zadka22710822001-03-21 17:24:49 +0000615 Subwidget Class
616 --------- -----
617 incr Button
618 decr Button
619 entry Entry
620 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000621
Martin v. Löwis46874282002-12-06 10:33:45 +0000622 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000623 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000624 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
625 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
626 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
627 self.subwidget_list['label'] = _dummyLabel(self, 'label')
628 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000629
630 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000631 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000632
633 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000634 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000635
636 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000637 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000638
639 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000640 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000641
642class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000643 """DirList - displays a list view of a directory, its previous
644 directories and its sub-directories. The user can choose one of
645 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000646
Moshe Zadka22710822001-03-21 17:24:49 +0000647 Subwidget Class
648 --------- -----
649 hlist HList
650 hsb Scrollbar
651 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000652
Martin v. Löwis46874282002-12-06 10:33:45 +0000653 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000654 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000655 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
656 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
657 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
658 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000659
660 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000661 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000662
663class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000664 """DirTree - Directory Listing in a hierarchical view.
665 Displays a tree view of a directory, its previous directories and its
666 sub-directories. The user can choose one of the directories displayed
667 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000668
Moshe Zadka22710822001-03-21 17:24:49 +0000669 Subwidget Class
670 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000671 hlist HList
672 hsb Scrollbar
673 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000674
Martin v. Löwis46874282002-12-06 10:33:45 +0000675 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000676 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000677 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
678 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
679 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
680 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000681
682 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000683 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000684
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000685class DirSelectBox(TixWidget):
686 """DirSelectBox - Motif style file select box.
687 It is generally used for
688 the user to choose a file. FileSelectBox stores the files mostly
689 recently selected into a ComboBox widget so that they can be quickly
690 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000691
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000692 Subwidget Class
693 --------- -----
694 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000695 filter ComboBox
696 dirlist ScrolledListBox
697 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000698
699 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000700 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
701 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
702 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000703
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000704class ExFileSelectBox(TixWidget):
705 """ExFileSelectBox - MS Windows style file select box.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300706 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000707
Moshe Zadka22710822001-03-21 17:24:49 +0000708 Subwidget Class
709 --------- -----
710 cancel Button
711 ok Button
712 hidden Checkbutton
713 types ComboBox
714 dir ComboBox
715 file ComboBox
716 dirlist ScrolledListBox
717 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000718
719 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000720 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
721 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
722 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
723 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
724 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
725 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
726 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
727 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
728 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000729
730 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000731 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000732
733 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000734 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000735
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000736
737# Should inherit from a Dialog class
738class DirSelectDialog(TixWidget):
739 """The DirSelectDialog widget presents the directories in the file
740 system in a dialog window. The user can use this dialog window to
741 navigate through the file system to select the desired directory.
742
743 Subwidgets Class
744 ---------- -----
745 dirbox DirSelectDialog"""
746
Martin v. Löwis46874282002-12-06 10:33:45 +0000747 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000748 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000749 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000750 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000751 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
752 # cancel and ok buttons are missing
753
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000754 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000755 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000756
757 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000758 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000759
760
761# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000762class ExFileSelectDialog(TixWidget):
763 """ExFileSelectDialog - MS Windows style file select dialog.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300764 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000765
Moshe Zadka22710822001-03-21 17:24:49 +0000766 Subwidgets Class
767 ---------- -----
768 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000769
Martin v. Löwis46874282002-12-06 10:33:45 +0000770 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000771 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000772 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000773 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000774 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000775
776 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000777 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000778
779 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000780 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000781
782class FileSelectBox(TixWidget):
783 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000784 It is generally used for
785 the user to choose a file. FileSelectBox stores the files mostly
786 recently selected into a ComboBox widget so that they can be quickly
787 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000788
Moshe Zadka22710822001-03-21 17:24:49 +0000789 Subwidget Class
790 --------- -----
791 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000792 filter ComboBox
793 dirlist ScrolledListBox
794 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000795
796 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000797 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
798 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
799 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
800 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
801 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000802
Moshe Zadka22710822001-03-21 17:24:49 +0000803 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000804 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000805
806 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000807 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000808
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000809# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000810class FileSelectDialog(TixWidget):
811 """FileSelectDialog - Motif style file select dialog.
812
Moshe Zadka22710822001-03-21 17:24:49 +0000813 Subwidgets Class
814 ---------- -----
815 btns StdButtonBox
816 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000817
Martin v. Löwis46874282002-12-06 10:33:45 +0000818 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000819 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000820 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000821 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000822 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
823 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000824
825 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000826 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000827
828 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000829 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000830
831class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000832 """FileEntry - Entry field with button that invokes a FileSelectDialog.
833 The user can type in the filename manually. Alternatively, the user can
834 press the button widget that sits next to the entry, which will bring
835 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000836
Moshe Zadka22710822001-03-21 17:24:49 +0000837 Subwidgets Class
838 ---------- -----
839 button Button
840 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000841
Martin v. Löwis46874282002-12-06 10:33:45 +0000842 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000843 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000844 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000845 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000846 self.subwidget_list['button'] = _dummyButton(self, 'button')
847 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000848
849 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000850 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000851
852 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000853 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000854 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000855
Guilherme Polo1fff0082009-08-14 15:05:30 +0000856class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000857 """HList - Hierarchy display widget can be used to display any data
858 that have a hierarchical structure, for example, file system directory
859 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200860 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000861
862 Subwidgets - None"""
863
864 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000865 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000866 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000867
868 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000869 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000870
871 def add_child(self, parent=None, cnf={}, **kw):
Serhiy Storchakabb70b2a2020-12-25 17:04:26 +0200872 if parent is None:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000873 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000874 return self.tk.call(
875 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000876
877 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000878 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000879
880 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000881 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000882
883 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000884 if not chars:
885 return self.tk.call(self._w, 'column', 'width', col, width)
886 else:
887 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000888 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000889
890 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000891 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000892
893 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000894 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000895
896 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000897 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000898
899 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000900 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000901
902 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000903 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000904
905 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000906 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000907
908 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000909 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000910
911 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000912 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000913
914 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000915 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000916
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000917 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000918 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200919 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000920 self.tk.call(self._w, 'header', 'configure', col,
921 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000922
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000923 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000924 return self.tk.call(self._w, 'header', 'cget', col, opt)
925
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000926 def header_exists(self, col):
Serhiy Storchaka071dec22016-10-24 23:47:28 +0300927 # A workaround to Tix library bug (issue #25464).
928 # The documented command is "exists", but only erroneous "exist" is
929 # accepted.
930 return self.tk.getboolean(self.tk.call(self._w, 'header', 'exist', col))
931 header_exist = header_exists
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000932
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000933 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000934 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000935
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000936 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000937 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000938
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000939 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000940 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000941
942 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000943 self.tk.call(
944 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000945
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000946 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000947 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200948 return self._getconfigure(
949 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000950 self.tk.call(
951 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000952
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000953 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000954 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
955
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000956 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000957 return self.tk.call (self._w, 'indicator', 'exists', entry)
958
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000959 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000960 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000961
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000962 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000963 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000964
965 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000966 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000967
Guilherme Polobcd03df2009-08-18 15:35:57 +0000968 def info_bbox(self, entry):
969 return self._getints(
970 self.tk.call(self._w, 'info', 'bbox', entry)) or None
971
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000972 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000973 c = self.tk.call(self._w, 'info', 'children', entry)
974 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000975
976 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000977 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000978
Guilherme Polobcd03df2009-08-18 15:35:57 +0000979 def info_dragsite(self):
980 return self.tk.call(self._w, 'info', 'dragsite')
981
982 def info_dropsite(self):
983 return self.tk.call(self._w, 'info', 'dropsite')
984
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000985 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000986 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000987
988 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000989 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000990
991 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000992 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000993
994 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000995 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000996
997 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000998 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000999
1000 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001001 c = self.tk.call(self._w, 'info', 'selection')
1002 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001003
Martin v. Löwis3e048482001-10-09 11:50:55 +00001004 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001005 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
1006
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001007 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001008 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001009 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001010 self.tk.call(self._w, 'item', 'configure', entry, col,
1011 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001012
1013 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001014 self.tk.call(
1015 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001016
1017 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001018 return self.tk.call(self._w, 'item', 'exists', entry, col)
1019
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001020 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001021 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001022
Martin v. Löwis433fa692004-03-21 15:26:44 +00001023 def entrycget(self, entry, opt):
1024 return self.tk.call(self._w, 'entrycget', entry, opt)
1025
1026 def entryconfigure(self, entry, cnf={}, **kw):
1027 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001028 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001029 self.tk.call(self._w, 'entryconfigure', entry,
1030 *self._options(cnf, kw))
1031
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001032 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001033 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001034
1035 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001036 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001037
1038 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001039 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001040
1041 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001042 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001043
1044 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001045 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001046
1047 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001048 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001049
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001050class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001051 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001052
1053 Subwidgets - None"""
1054
1055 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001056 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001057
1058class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001059 """LabelEntry - Entry field with label. Packages an entry widget
Martin Pantera90a4a92016-05-30 04:04:50 +00001060 and a label into one mega widget. It can be used to simplify the creation
1061 of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001062
Moshe Zadka22710822001-03-21 17:24:49 +00001063 Subwidgets Class
1064 ---------- -----
1065 label Label
1066 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001067
1068 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001069 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001070 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001071 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1072 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001073
1074class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001075 """LabelFrame - Labelled Frame container. Packages a frame widget
1076 and a label into one mega widget. To create widgets inside a
1077 LabelFrame widget, one creates the new widgets relative to the
1078 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001079
Moshe Zadka22710822001-03-21 17:24:49 +00001080 Subwidgets Class
1081 ---------- -----
1082 label Label
1083 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001084
1085 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001086 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001087 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001088 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1089 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001090
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001091
1092class ListNoteBook(TixWidget):
1093 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1094 it can be used to display many windows in a limited space using a
1095 notebook metaphor. The notebook is divided into a stack of pages
1096 (windows). At one time only one of these pages can be shown.
1097 The user can navigate through these pages by
1098 choosing the name of the desired page in the hlist subwidget."""
1099
1100 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001101 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1102 # Is this necessary? It's not an exposed subwidget in Tix.
1103 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1104 destroy_physically=0)
1105 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1106 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001107
1108 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001109 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001110 self.subwidget_list[name] = TixSubWidget(self, name)
1111 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001112
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001113 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001114 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001115
1116 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001117 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001118 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Tim Peters182b5ac2004-07-18 06:16:08 +00001119 ret = []
1120 for x in names:
1121 ret.append(self.subwidget(x))
1122 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001123
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001124 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001125 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001126
1127class Meter(TixWidget):
1128 """The Meter widget can be used to show the progress of a background
1129 job which may take a long time to execute.
1130 """
1131
1132 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001133 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001134 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001135
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001136class NoteBook(TixWidget):
1137 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1138
Moshe Zadka22710822001-03-21 17:24:49 +00001139 Subwidgets Class
1140 ---------- -----
1141 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001142 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001143
1144 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001145 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1146 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001147 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001148
1149 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001150 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001151 self.subwidget_list[name] = TixSubWidget(self, name)
1152 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001153
1154 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001155 self.tk.call(self._w, 'delete', name)
1156 self.subwidget_list[name].destroy()
1157 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001158
1159 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001160 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001161
1162 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001163 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001164 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001165 ret = []
1166 for x in names:
1167 ret.append(self.subwidget(x))
1168 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001169
Moshe Zadka22710822001-03-21 17:24:49 +00001170 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001171 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001172
1173 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001174 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001175
1176class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001177 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001178 pass
1179
1180class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001181 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001182
Moshe Zadka22710822001-03-21 17:24:49 +00001183 Subwidget Class
1184 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001185 menubutton Menubutton
1186 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001187
1188 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001189 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1190 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1191 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001192
1193 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001194 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001195
1196 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001197 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001198
1199 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001200 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001201
1202 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001203 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001204
1205 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001206 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001207
1208class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001209 """PanedWindow - Multi-pane container widget
1210 allows the user to interactively manipulate the sizes of several
1211 panes. The panes can be arranged either vertically or horizontally.The
1212 user changes the sizes of the panes by dragging the resize handle
1213 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001214
Moshe Zadka22710822001-03-21 17:24:49 +00001215 Subwidgets Class
1216 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001217 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001218
1219 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001220 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001221
Neal Norwitzf539bde2002-11-14 02:43:40 +00001222 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001223 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001224 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001225 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001226 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001227 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001228
Neal Norwitzf539bde2002-11-14 02:43:40 +00001229 def delete(self, name):
1230 self.tk.call(self._w, 'delete', name)
1231 self.subwidget_list[name].destroy()
1232 del self.subwidget_list[name]
1233
1234 def forget(self, name):
1235 self.tk.call(self._w, 'forget', name)
1236
1237 def panecget(self, entry, opt):
1238 return self.tk.call(self._w, 'panecget', entry, opt)
1239
1240 def paneconfigure(self, entry, cnf={}, **kw):
1241 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001242 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001243 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001244
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001245 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001246 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1247 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001248
1249class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001250 """PopupMenu widget can be used as a replacement of the tk_popup command.
1251 The advantage of the Tix PopupMenu widget is it requires less application
1252 code to manipulate.
1253
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001254
Moshe Zadka22710822001-03-21 17:24:49 +00001255 Subwidgets Class
1256 ---------- -----
1257 menubutton Menubutton
1258 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001259
Martin v. Löwis46874282002-12-06 10:33:45 +00001260 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001261 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001262 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1263 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1264 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001265
1266 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001267 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001268
1269 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001270 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001271
1272 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001273 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001274
1275class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001276 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001277 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001278 # There seems to be a Tix bug rejecting the configure method
1279 # Let's try making the flags -static
1280 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1281 'handlesize', 'hintcolor', 'hintwidth',
1282 'x', 'y']
1283 # In fact, x y height width are configurable
1284 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001285 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001286
1287 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001288 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001289
Martin v. Löwis652e1912001-11-25 14:50:56 +00001290 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001291 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001292
1293 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001294 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001295
1296 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001297 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001298
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001299class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001300 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001301
Martin v. Löwis46874282002-12-06 10:33:45 +00001302 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001303 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001304 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001305 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001306 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1307 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1308 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001309
1310class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001311 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001312
Martin v. Löwis46874282002-12-06 10:33:45 +00001313 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001314 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001315 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1316 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1317 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1318 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001319
1320class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001321 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001322
Martin v. Löwis46874282002-12-06 10:33:45 +00001323 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001324 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001325 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1326 self.subwidget_list['text'] = _dummyText(self, 'text')
1327 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1328 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001329
1330class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001331 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001332
Martin v. Löwis46874282002-12-06 10:33:45 +00001333 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001334 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001335 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001336 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001337 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1338 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1339 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001340
1341class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001342 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001343
Martin v. Löwis46874282002-12-06 10:33:45 +00001344 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001345 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001346 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1347 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1348 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1349 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001350
1351class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001352 """Select - Container of button subwidgets. It can be used to provide
1353 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001354
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001355 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001356
Martin v. Löwis46874282002-12-06 10:33:45 +00001357 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001358 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001359 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001360 ['allowzero', 'radio', 'orientation', 'labelside',
1361 'options'],
1362 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001363 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001364
1365 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001366 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001367 self.subwidget_list[name] = _dummyButton(self, name)
1368 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001369
1370 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001371 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001372
Neal Norwitzf539bde2002-11-14 02:43:40 +00001373class Shell(TixWidget):
1374 """Toplevel window.
1375
1376 Subwidgets - None"""
1377
1378 def __init__ (self,master=None,cnf={}, **kw):
1379 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1380
1381class DialogShell(TixWidget):
1382 """Toplevel window, with popup popdown and center methods.
1383 It tells the window manager that it is a dialog window and should be
1384 treated specially. The exact treatment depends on the treatment of
1385 the window manager.
1386
1387 Subwidgets - None"""
1388
Martin v. Löwis46874282002-12-06 10:33:45 +00001389 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001390 def __init__ (self,master=None,cnf={}, **kw):
1391 TixWidget.__init__(self, master,
1392 'tixDialogShell',
1393 ['options', 'title', 'mapped',
1394 'minheight', 'minwidth',
1395 'parent', 'transient'], cnf, kw)
1396
1397 def popdown(self):
1398 self.tk.call(self._w, 'popdown')
1399
1400 def popup(self):
1401 self.tk.call(self._w, 'popup')
1402
1403 def center(self):
1404 self.tk.call(self._w, 'center')
1405
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001406class StdButtonBox(TixWidget):
1407 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1408
1409 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001410 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001411 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001412 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1413 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1414 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1415 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001416
1417 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001418 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001419 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001420
Guilherme Polo1fff0082009-08-14 15:05:30 +00001421class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001422 """TList - Hierarchy display widget which can be
1423 used to display data in a tabular format. The list entries of a TList
1424 widget are similar to the entries in the Tk listbox widget. The main
1425 differences are (1) the TList widget can display the list entries in a
1426 two dimensional format and (2) you can use graphical images as well as
1427 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001428
1429 Subwidgets - None"""
1430
1431 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001432 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001433
1434 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001435 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001436
1437 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001438 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001439
1440 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001441 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001442
1443 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001444 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001445
1446 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001447 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001448
1449 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001450 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001451
1452 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001453 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001454
1455 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001456 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001457
1458 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001459 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001460
1461 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001462 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001463
1464 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001465 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001466
1467 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001468 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001469
1470 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001471 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001472
1473 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001474 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001475
1476 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001477 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001478
1479 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001480 c = self.tk.call(self._w, 'info', 'selection')
1481 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001482
1483 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001484 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001485
1486 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001487 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001488
1489 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001490 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001491
1492 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001493 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001494
1495 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001496 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001497
1498 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001499 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001500
1501 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001502 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001503
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001504class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001505 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001506 data in a tree form. The user can adjust
1507 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001508
Martin v. Löwis46874282002-12-06 10:33:45 +00001509 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001510 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001511 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001512 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001513 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1514 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1515 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001516
1517 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001518 '''This command calls the setmode method for all the entries in this
1519 Tree widget: if an entry has no child entries, its mode is set to
1520 none. Otherwise, if the entry has any hidden child entries, its mode is
1521 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001522 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001523
1524 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001525 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001526 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001527
1528 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001529 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001530 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001531
1532 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001533 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001534 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001535
1536 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001537 '''This command is used to indicate whether the entry given by
1538 entryPath has children entries and whether the children are visible. mode
1539 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001540 indicator is drawn next the entry. If mode is set to close, a (-)
1541 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001542 indicators will be drawn for this entry. The default mode is none. The
1543 open mode indicates the entry has hidden children and this entry can be
1544 opened by the user. The close mode indicates that all the children of the
1545 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001546 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001547
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001548
1549# Could try subclassing Tree for CheckList - would need another arg to init
1550class CheckList(TixWidget):
1551 """The CheckList widget
1552 displays a list of items to be selected by the user. CheckList acts
1553 similarly to the Tk checkbutton or radiobutton widgets, except it is
1554 capable of handling many more items than checkbuttons or radiobuttons.
1555 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001556 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001557 def __init__(self, master=None, cnf={}, **kw):
1558 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001559 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001560 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1561 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1562 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001563
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001564 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001565 '''This command calls the setmode method for all the entries in this
1566 Tree widget: if an entry has no child entries, its mode is set to
1567 none. Otherwise, if the entry has any hidden child entries, its mode is
1568 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001569 self.tk.call(self._w, 'autosetmode')
1570
1571 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001572 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001573 self.tk.call(self._w, 'close', entrypath)
1574
1575 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001576 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001577 return self.tk.call(self._w, 'getmode', entrypath)
1578
1579 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001580 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001581 self.tk.call(self._w, 'open', entrypath)
1582
1583 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001584 '''Returns a list of items whose status matches status. If status is
1585 not specified, the list of items in the "on" status will be returned.
1586 Mode can be on, off, default'''
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001587 return self.tk.splitlist(self.tk.call(self._w, 'getselection', mode))
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001588
1589 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001590 '''Returns the current status of entryPath.'''
1591 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001592
1593 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001594 '''Sets the status of entryPath to be status. A bitmap will be
1595 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001596 self.tk.call(self._w, 'setstatus', entrypath, mode)
1597
1598
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001599###########################################################################
1600### The subclassing below is used to instantiate the subwidgets in each ###
1601### mega widget. This allows us to access their methods directly. ###
1602###########################################################################
1603
1604class _dummyButton(Button, 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 _dummyCheckbutton(Checkbutton, 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 _dummyEntry(Entry, 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 _dummyFrame(Frame, 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 _dummyLabel(Label, 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 _dummyListbox(Listbox, 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 _dummyMenu(Menu, 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 _dummyMenubutton(Menubutton, 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 _dummyScrollbar(Scrollbar, 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 _dummyText(Text, 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)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001643
1644class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1645 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001646 TixSubWidget.__init__(self, master, name, destroy_physically)
1647 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1648 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1649 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001650
1651class _dummyHList(HList, 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)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001654
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001655class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1656 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001657 TixSubWidget.__init__(self, master, name, destroy_physically)
1658 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1659 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1660 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001661
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001662class _dummyTList(TList, TixSubWidget):
1663 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001664 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001665
1666class _dummyComboBox(ComboBox, TixSubWidget):
1667 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001668 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1669 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001670 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1671 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001672
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001673 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001674 'slistbox')
1675 try:
1676 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1677 #cross Button : present if created with the fancy option
1678 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1679 except TypeError:
1680 # unavailable when -fancy not specified
1681 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001682
1683class _dummyDirList(DirList, TixSubWidget):
1684 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001685 TixSubWidget.__init__(self, master, name, destroy_physically)
1686 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1687 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1688 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001689
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001690class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1691 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001692 TixSubWidget.__init__(self, master, name, destroy_physically)
1693 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1694 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001695
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001696class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1697 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001698 TixSubWidget.__init__(self, master, name, destroy_physically)
1699 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1700 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1701 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1702 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1703 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1704 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1705 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1706 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001707
1708class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1709 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001710 TixSubWidget.__init__(self, master, name, destroy_physically)
1711 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1712 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1713 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1714 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001715
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001716class _dummyFileComboBox(ComboBox, TixSubWidget):
1717 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001718 TixSubWidget.__init__(self, master, name, destroy_physically)
1719 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001720
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001721class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1722 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001723 TixSubWidget.__init__(self, master, name, destroy_physically)
1724 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1725 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1726 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1727 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001728
1729class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1730 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001731 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001732
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001733class _dummyPanedWindow(PanedWindow, TixSubWidget):
1734 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001735 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001736
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001737########################
1738### Utility Routines ###
1739########################
1740
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001741#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1742
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001743def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001744 '''Returns the qualified path name for the widget. Normally used to set
1745 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001746 return widget.tk.call('tixOptionName', widget._w)
1747
1748# Called with a dictionary argument of the form
1749# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1750# returns a string which can be used to configure the fsbox file types
1751# in an ExFileSelectBox. i.e.,
1752# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1753def FileTypeList(dict):
1754 s = ''
1755 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001756 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001757 return s
1758
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001759# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001760# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001761class CObjView(TixWidget):
1762 """This file implements the Canvas Object View widget. This is a base
1763 class of IconView. It implements automatic placement/adjustment of the
1764 scrollbars according to the canvas objects inside the canvas subwidget.
1765 The scrollbars are adjusted so that the canvas is just large enough
1766 to see all the objects.
1767 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001768 # FIXME: It should inherit -superclass tixScrolledWidget
1769 pass
1770
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001771
Guilherme Polo1fff0082009-08-14 15:05:30 +00001772class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001773 '''The Tix Grid command creates a new window and makes it into a
1774 tixGrid widget. Additional options, may be specified on the command
1775 line or in the option database to configure aspects such as its cursor
1776 and relief.
1777
1778 A Grid widget displays its contents in a two dimensional grid of cells.
1779 Each cell may contain one Tix display item, which may be in text,
1780 graphics or other formats. See the DisplayStyle class for more information
1781 about Tix display items. Individual cells, or groups of cells, can be
1782 formatted with a wide range of attributes, such as its color, relief and
1783 border.
1784
1785 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001786 # valid specific resources as of Tk 8.4
1787 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1788 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1789 # selectunit, topmargin,
1790 def __init__(self, master=None, cnf={}, **kw):
1791 static= []
1792 self.cnf= cnf
1793 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001794
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795 # valid options as of Tk 8.4
Guilherme Polobcd03df2009-08-18 15:35:57 +00001796 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
1797 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
1798 # selection, set, size, unset, xview, yview
1799 def anchor_clear(self):
1800 """Removes the selection anchor."""
1801 self.tk.call(self, 'anchor', 'clear')
1802
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803 def anchor_get(self):
1804 "Get the (x,y) coordinate of the current anchor cell"
1805 return self._getints(self.tk.call(self, 'anchor', 'get'))
1806
Guilherme Polobcd03df2009-08-18 15:35:57 +00001807 def anchor_set(self, x, y):
1808 """Set the selection anchor to the cell at (x, y)."""
1809 self.tk.call(self, 'anchor', 'set', x, y)
1810
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001811 def delete_row(self, from_, to=None):
1812 """Delete rows between from_ and to inclusive.
1813 If to is not provided, delete only row at from_"""
1814 if to is None:
1815 self.tk.call(self, 'delete', 'row', from_)
1816 else:
1817 self.tk.call(self, 'delete', 'row', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001818
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001819 def delete_column(self, from_, to=None):
1820 """Delete columns between from_ and to inclusive.
1821 If to is not provided, delete only column at from_"""
1822 if to is None:
1823 self.tk.call(self, 'delete', 'column', from_)
1824 else:
1825 self.tk.call(self, 'delete', 'column', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001826
1827 def edit_apply(self):
1828 """If any cell is being edited, de-highlight the cell and applies
1829 the changes."""
1830 self.tk.call(self, 'edit', 'apply')
1831
1832 def edit_set(self, x, y):
1833 """Highlights the cell at (x, y) for editing, if the -editnotify
1834 command returns True for this cell."""
1835 self.tk.call(self, 'edit', 'set', x, y)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001836
1837 def entrycget(self, x, y, option):
1838 "Get the option value for cell at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001839 if option and option[0] != '-':
1840 option = '-' + option
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001841 return self.tk.call(self, 'entrycget', x, y, option)
1842
Guilherme Polobcd03df2009-08-18 15:35:57 +00001843 def entryconfigure(self, x, y, cnf=None, **kw):
1844 return self._configure(('entryconfigure', x, y), cnf, kw)
1845
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001846 # def format
1847 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001848
1849 def info_exists(self, x, y):
1850 "Return True if display item exists at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001851 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001852
1853 def info_bbox(self, x, y):
1854 # This seems to always return '', at least for 'text' displayitems
1855 return self.tk.call(self, 'info', 'bbox', x, y)
1856
Guilherme Polobcd03df2009-08-18 15:35:57 +00001857 def move_column(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001858 """Moves the range of columns from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001859 the distance indicated by OFFSET. For example, move_column(2, 4, 1)
1860 moves the columns 2,3,4 to columns 3,4,5."""
1861 self.tk.call(self, 'move', 'column', from_, to, offset)
1862
1863 def move_row(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001864 """Moves the range of rows from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001865 the distance indicated by OFFSET.
1866 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
1867 self.tk.call(self, 'move', 'row', from_, to, offset)
1868
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 def nearest(self, x, y):
1870 "Return coordinate of cell nearest pixel coordinate (x,y)"
1871 return self._getints(self.tk.call(self, 'nearest', x, y))
1872
1873 # def selection adjust
1874 # def selection clear
1875 # def selection includes
1876 # def selection set
1877 # def selection toggle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001878
1879 def set(self, x, y, itemtype=None, **kw):
1880 args= self._options(self.cnf, kw)
1881 if itemtype is not None:
1882 args= ('-itemtype', itemtype) + args
1883 self.tk.call(self, 'set', x, y, *args)
1884
Guilherme Polobcd03df2009-08-18 15:35:57 +00001885 def size_column(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001886 """Queries or sets the size of the column given by
1887 INDEX. INDEX may be any non-negative
1888 integer that gives the position of a given column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001889 INDEX can also be the string "default"; in this case, this command
1890 queries or sets the default size of all columns.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001891 When no option-value pair is given, this command returns a tuple
1892 containing the current size setting of the given column. When
1893 option-value pairs are given, the corresponding options of the
Guilherme Polobcd03df2009-08-18 15:35:57 +00001894 size setting of the given column are changed. Options may be one
Gurupad Hegde6c7bb382019-12-28 17:16:02 -05001895 of the following:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001896 pad0 pixels
1897 Specifies the paddings to the left of a column.
1898 pad1 pixels
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001899 Specifies the paddings to the right of a column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001900 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001901 Specifies the width of a column. Val may be:
1902 "auto" -- the width of the column is set to the
1903 width of the widest cell in the column;
1904 a valid Tk screen distance unit;
1905 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001906 (e.g. 3.4chars) that sets the width of the column to the
1907 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001908 return self.tk.splitlist(self.tk.call(self._w, 'size', 'column', index,
Guilherme Polobcd03df2009-08-18 15:35:57 +00001909 *self._options({}, kw)))
1910
1911 def size_row(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001912 """Queries or sets the size of the row given by
1913 INDEX. INDEX may be any non-negative
1914 integer that gives the position of a given row .
Guilherme Polobcd03df2009-08-18 15:35:57 +00001915 INDEX can also be the string "default"; in this case, this command
1916 queries or sets the default size of all rows.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001917 When no option-value pair is given, this command returns a list con-
1918 taining the current size setting of the given row . When option-value
Guilherme Polobcd03df2009-08-18 15:35:57 +00001919 pairs are given, the corresponding options of the size setting of the
Gurupad Hegde6c7bb382019-12-28 17:16:02 -05001920 given row are changed. Options may be one of the following:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001921 pad0 pixels
1922 Specifies the paddings to the top of a row.
1923 pad1 pixels
Ezio Melottie130a522011-10-19 10:58:56 +03001924 Specifies the paddings to the bottom of a row.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001925 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001926 Specifies the height of a row. Val may be:
1927 "auto" -- the height of the row is set to the
1928 height of the highest cell in the row;
1929 a valid Tk screen distance unit;
1930 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001931 (e.g. 3.4chars) that sets the height of the row to the
1932 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001933 return self.tk.splitlist(self.tk.call(
Guilherme Polobcd03df2009-08-18 15:35:57 +00001934 self, 'size', 'row', index, *self._options({}, kw)))
1935
1936 def unset(self, x, y):
1937 """Clears the cell at (x, y) by removing its display item."""
1938 self.tk.call(self._w, 'unset', x, y)
1939
Raymond Hettingerff41c482003-04-06 09:01:11 +00001940
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001941class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001942 '''Scrolled Grid widgets'''
1943
1944 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001945 def __init__(self, master=None, cnf={}, **kw):
1946 static= []
1947 self.cnf= cnf
1948 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)