blob: c1cdfa7c0337c844e182dc191b96994c5ed8e847 [file] [log] [blame]
Guido van Rossumd77d6992007-07-16 23:10:57 +00001# -*-mode: python; fill-column: 75; tab-width: 8 -*-
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00002#
3# $Id$
4#
Martin v. Löwisb7b32602001-11-02 23:48:20 +00005# Tix.py -- Tix widget wrappers.
6#
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00007# For Tix, see http://tix.sourceforge.net
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00008#
Moshe Zadka22710822001-03-21 17:24:49 +00009# - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000010# based on an idea of Jean-Marc Lugrin (lugrin@ms.com)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000011#
12# NOTE: In order to minimize changes to Tkinter.py, some of the code here
Moshe Zadka22710822001-03-21 17:24:49 +000013# (TixWidget.__init__) has been taken from Tkinter (Widget.__init__)
14# and will break if there are major changes in Tkinter.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000015#
16# The Tix widgets are represented by a class hierarchy in python with proper
17# inheritance of base classes.
18#
19# As a result after creating a 'w = StdButtonBox', I can write
Moshe Zadka22710822001-03-21 17:24:49 +000020# w.ok['text'] = 'Who Cares'
21# or w.ok['bg'] = w['bg']
22# or even w.ok.invoke()
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000023# etc.
24#
25# Compare the demo tixwidgets.py to the original Tcl program and you will
26# appreciate the advantages.
27#
28
Georg Brandl14fc4272008-05-17 18:39:55 +000029from tkinter import *
Victor Stinner7fa767e2014-03-20 09:16:38 +010030from tkinter import _cnfmerge, _default_root
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000031
32# WARNING - TkVersion is a limited precision floating point number
33if TkVersion < 3.999:
Collin Winterce36ad82007-08-30 01:19:48 +000034 raise ImportError("This version of Tix.py requires Tk 4.0 or higher")
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000035
36import _tkinter # If this fails your Python may not be configured for Tk
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000037
38# Some more constants (for consistency with Tkinter)
39WINDOW = 'window'
40TEXT = 'text'
41STATUS = 'status'
42IMMEDIATE = 'immediate'
43IMAGE = 'image'
44IMAGETEXT = 'imagetext'
45BALLOON = 'balloon'
46AUTO = 'auto'
47ACROSSTOP = 'acrosstop'
48
Guilherme Polobcd03df2009-08-18 15:35:57 +000049# A few useful constants for the Grid widget
50ASCII = 'ascii'
51CELL = 'cell'
52COLUMN = 'column'
53DECREASING = 'decreasing'
54INCREASING = 'increasing'
55INTEGER = 'integer'
56MAIN = 'main'
57MAX = 'max'
58REAL = 'real'
59ROW = 'row'
60S_REGION = 's-region'
61X_REGION = 'x-region'
62Y_REGION = 'y-region'
63
Fred Drake723293c2001-12-13 04:53:07 +000064# Some constants used by Tkinter dooneevent()
65TCL_DONT_WAIT = 1 << 1
66TCL_WINDOW_EVENTS = 1 << 2
67TCL_FILE_EVENTS = 1 << 3
68TCL_TIMER_EVENTS = 1 << 4
69TCL_IDLE_EVENTS = 1 << 5
70TCL_ALL_EVENTS = 0
71
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000072# BEWARE - this is implemented by copying some code from the Widget class
73# in Tkinter (to override Widget initialization) and is therefore
74# liable to break.
Georg Brandl14fc4272008-05-17 18:39:55 +000075import tkinter, os
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):
224 # For safety, remove an delete_window binding before destroy
225 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):
396 if not master:
Georg Brandl14fc4272008-05-17 18:39:55 +0000397 master = tkinter._default_root
Neal Norwitz731a9862002-12-10 02:18:49 +0000398 if not master:
Collin Winterce36ad82007-08-30 01:19:48 +0000399 raise RuntimeError('Too early to create image')
Neal Norwitz731a9862002-12-10 02:18:49 +0000400 if kw and cnf: cnf = _cnfmerge((cnf, kw))
401 elif kw: cnf = kw
402 options = ()
403 for k, v in cnf.items():
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200404 if callable(v):
Neal Norwitz731a9862002-12-10 02:18:49 +0000405 v = self._register(v)
406 options = options + ('-'+k, v)
407 return master.tk.call(('image', 'create', imgtype,) + options)
408 def image_delete(self, imgname):
409 try:
410 self.tk.call('image', 'delete', imgname)
411 except TclError:
412 # May happen if the root was destroyed
413 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000414
415# Subwidgets are child widgets created automatically by mega-widgets.
416# In python, we have to create these subwidgets manually to mirror their
417# existence in Tk/Tix.
418class TixSubWidget(TixWidget):
419 """Subwidget class.
420
421 This is used to mirror child widgets automatically created
422 by Tix/Tk as part of a mega-widget in Python (which is not informed
423 of this)"""
424
425 def __init__(self, master, name,
Moshe Zadka22710822001-03-21 17:24:49 +0000426 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000427 if check_intermediate:
428 path = master._subwidget_name(name)
429 try:
430 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000431 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000432 except:
433 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000434
Thomas Wouters89f507f2006-12-13 04:49:30 +0000435 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000436 # immediate descendant
437 TixWidget.__init__(self, master, None, None, {'name' : name})
438 else:
439 # Ensure that the intermediate widgets exist
440 parent = master
441 for i in range(len(plist) - 1):
Neal Norwitzebb41902002-05-31 20:51:31 +0000442 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000443 try:
444 w = master._nametowidget(n)
445 parent = w
446 except KeyError:
447 # Create the intermediate widget
448 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000449 destroy_physically=0,
450 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000451 # The Tk widget name is in plist, not in name
452 if plist:
453 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000454 TixWidget.__init__(self, parent, None, None, {'name' : name})
455 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000456
457 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000458 # For some widgets e.g., a NoteBook, when we call destructors,
459 # we must be careful not to destroy the frame widget since this
460 # also destroys the parent NoteBook thus leading to an exception
461 # in Tkinter when it finally calls Tcl to destroy the NoteBook
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000462 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000463 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000464 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000465 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000466 del self.master.subwidget_list[self._name]
467 if self.destroy_physically:
468 # This is bypassed only for a few widgets
469 self.tk.call('destroy', self._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000470
471
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000472# Useful class to create a display style - later shared by many items.
473# Contributed by Steffen Kremser
474class DisplayStyle:
475 """DisplayStyle - handle configuration options shared by
476 (multiple) Display Items"""
477
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000478 def __init__(self, itemtype, cnf={}, **kw):
Moshe Zadka22710822001-03-21 17:24:49 +0000479 master = _default_root # global from Tkinter
Guido van Rossume014a132006-08-19 16:53:45 +0000480 if not master and 'refwindow' in cnf: master=cnf['refwindow']
481 elif not master and 'refwindow' in kw: master= kw['refwindow']
Collin Winterce36ad82007-08-30 01:19:48 +0000482 elif not master: raise RuntimeError("Too early to create display style: no root window")
Moshe Zadka22710822001-03-21 17:24:49 +0000483 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000484 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
485 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000486
487 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000488 return self.stylename
489
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000490 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000491 if kw and cnf:
492 cnf = _cnfmerge((cnf, kw))
493 elif kw:
494 cnf = kw
495 opts = ()
496 for k, v in cnf.items():
497 opts = opts + ('-'+k, v)
498 return opts
499
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000500 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000501 self.tk.call(self.stylename, 'delete')
502
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000503 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000504 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
505
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000506 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200507 return self._getconfigure(
508 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000509
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000510 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000511 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000512
513
514######################################################
515### The Tix Widget classes - in alphabetical order ###
516######################################################
517
518class Balloon(TixWidget):
519 """Balloon help widget.
520
Moshe Zadka22710822001-03-21 17:24:49 +0000521 Subwidget Class
522 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000523 label Label
524 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000525
Martin v. Löwis46874282002-12-06 10:33:45 +0000526 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000527 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000528 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000529 static = ['options', 'installcolormap', 'initwait', 'statusbar',
530 'cursor']
531 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
532 self.subwidget_list['label'] = _dummyLabel(self, 'label',
533 destroy_physically=0)
534 self.subwidget_list['message'] = _dummyLabel(self, 'message',
535 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000536
537 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000538 """Bind balloon widget to another.
539 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000540 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000541
542 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000543 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000544
545class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000546 """ButtonBox - A container for pushbuttons.
547 Subwidgets are the buttons added with the add method.
548 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000549 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000550 TixWidget.__init__(self, master, 'tixButtonBox',
551 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000552
553 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000554 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000555
Raymond Hettingerff41c482003-04-06 09:01:11 +0000556 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000557 self.subwidget_list[name] = _dummyButton(self, name)
558 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000559
560 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000561 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000562 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000563
564class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000565 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200566 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000567 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000568
Moshe Zadka22710822001-03-21 17:24:49 +0000569 Subwidget Class
570 --------- -----
571 entry Entry
572 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000573 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000574 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000575 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000576
Martin v. Löwis46874282002-12-06 10:33:45 +0000577 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000578 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000579 TixWidget.__init__(self, master, 'tixComboBox',
580 ['editable', 'dropdown', 'fancy', 'options'],
581 cnf, kw)
582 self.subwidget_list['label'] = _dummyLabel(self, 'label')
583 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
584 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
585 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
586 'slistbox')
587 try:
588 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
589 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
590 except TypeError:
591 # unavailable when -fancy not specified
592 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000593
Neal Norwitz731a9862002-12-10 02:18:49 +0000594 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000595
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000596 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000597 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000598
599 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000600 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000601
602 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000603 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000604
605 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000606 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000607
608class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000609 """Control - An entry field with value change arrows. The user can
610 adjust the value by pressing the two arrow buttons or by entering
611 the value directly into the entry. The new value will be checked
612 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000613
Moshe Zadka22710822001-03-21 17:24:49 +0000614 Subwidget Class
615 --------- -----
616 incr Button
617 decr Button
618 entry Entry
619 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000620
Martin v. Löwis46874282002-12-06 10:33:45 +0000621 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000622 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000623 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
624 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
625 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
626 self.subwidget_list['label'] = _dummyLabel(self, 'label')
627 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000628
629 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000630 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000631
632 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000633 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000634
635 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000636 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000637
638 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000639 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000640
641class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000642 """DirList - displays a list view of a directory, its previous
643 directories and its sub-directories. The user can choose one of
644 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000645
Moshe Zadka22710822001-03-21 17:24:49 +0000646 Subwidget Class
647 --------- -----
648 hlist HList
649 hsb Scrollbar
650 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000651
Martin v. Löwis46874282002-12-06 10:33:45 +0000652 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000653 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000654 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
655 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
656 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
657 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000658
659 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000660 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000661
662class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000663 """DirTree - Directory Listing in a hierarchical view.
664 Displays a tree view of a directory, its previous directories and its
665 sub-directories. The user can choose one of the directories displayed
666 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000667
Moshe Zadka22710822001-03-21 17:24:49 +0000668 Subwidget Class
669 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000670 hlist HList
671 hsb Scrollbar
672 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000673
Martin v. Löwis46874282002-12-06 10:33:45 +0000674 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000675 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000676 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
677 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
678 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
679 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000680
681 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000682 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000683
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000684class DirSelectBox(TixWidget):
685 """DirSelectBox - Motif style file select box.
686 It is generally used for
687 the user to choose a file. FileSelectBox stores the files mostly
688 recently selected into a ComboBox widget so that they can be quickly
689 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000690
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000691 Subwidget Class
692 --------- -----
693 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000694 filter ComboBox
695 dirlist ScrolledListBox
696 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000697
698 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000699 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
700 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
701 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000702
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000703class ExFileSelectBox(TixWidget):
704 """ExFileSelectBox - MS Windows style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000705 It provides an convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000706
Moshe Zadka22710822001-03-21 17:24:49 +0000707 Subwidget Class
708 --------- -----
709 cancel Button
710 ok Button
711 hidden Checkbutton
712 types ComboBox
713 dir ComboBox
714 file ComboBox
715 dirlist ScrolledListBox
716 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000717
718 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000719 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
720 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
721 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
722 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
723 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
724 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
725 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
726 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
727 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000728
729 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000730 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000731
732 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000733 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000734
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000735
736# Should inherit from a Dialog class
737class DirSelectDialog(TixWidget):
738 """The DirSelectDialog widget presents the directories in the file
739 system in a dialog window. The user can use this dialog window to
740 navigate through the file system to select the desired directory.
741
742 Subwidgets Class
743 ---------- -----
744 dirbox DirSelectDialog"""
745
Martin v. Löwis46874282002-12-06 10:33:45 +0000746 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000747 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000748 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000749 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000750 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
751 # cancel and ok buttons are missing
752
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000753 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000754 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000755
756 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000757 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000758
759
760# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000761class ExFileSelectDialog(TixWidget):
762 """ExFileSelectDialog - MS Windows style file select dialog.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000763 It provides an convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000764
Moshe Zadka22710822001-03-21 17:24:49 +0000765 Subwidgets Class
766 ---------- -----
767 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000768
Martin v. Löwis46874282002-12-06 10:33:45 +0000769 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000770 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000771 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000772 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000773 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000774
775 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000776 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000777
778 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000779 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000780
781class FileSelectBox(TixWidget):
782 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000783 It is generally used for
784 the user to choose a file. FileSelectBox stores the files mostly
785 recently selected into a ComboBox widget so that they can be quickly
786 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000787
Moshe Zadka22710822001-03-21 17:24:49 +0000788 Subwidget Class
789 --------- -----
790 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000791 filter ComboBox
792 dirlist ScrolledListBox
793 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000794
795 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000796 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
797 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
798 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
799 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
800 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000801
Moshe Zadka22710822001-03-21 17:24:49 +0000802 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000803 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000804
805 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000806 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000807
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000808# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000809class FileSelectDialog(TixWidget):
810 """FileSelectDialog - Motif style file select dialog.
811
Moshe Zadka22710822001-03-21 17:24:49 +0000812 Subwidgets Class
813 ---------- -----
814 btns StdButtonBox
815 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000816
Martin v. Löwis46874282002-12-06 10:33:45 +0000817 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000818 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000819 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000820 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000821 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
822 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000823
824 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000825 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000826
827 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000828 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000829
830class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000831 """FileEntry - Entry field with button that invokes a FileSelectDialog.
832 The user can type in the filename manually. Alternatively, the user can
833 press the button widget that sits next to the entry, which will bring
834 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000835
Moshe Zadka22710822001-03-21 17:24:49 +0000836 Subwidgets Class
837 ---------- -----
838 button Button
839 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000840
Martin v. Löwis46874282002-12-06 10:33:45 +0000841 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000842 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000843 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000844 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000845 self.subwidget_list['button'] = _dummyButton(self, 'button')
846 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000847
848 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000849 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000850
851 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000852 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000853 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000854
Guilherme Polo1fff0082009-08-14 15:05:30 +0000855class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000856 """HList - Hierarchy display widget can be used to display any data
857 that have a hierarchical structure, for example, file system directory
858 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200859 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000860
861 Subwidgets - None"""
862
863 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000864 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000865 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000866
867 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000868 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000869
870 def add_child(self, parent=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000871 if not parent:
872 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000873 return self.tk.call(
874 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000875
876 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000877 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000878
879 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000880 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000881
882 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000883 if not chars:
884 return self.tk.call(self._w, 'column', 'width', col, width)
885 else:
886 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000887 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000888
889 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000890 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000891
892 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000893 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000894
895 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000896 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000897
898 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000899 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000900
901 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000902 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000903
904 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000905 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000906
907 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000908 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000909
910 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000911 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000912
913 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000914 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000915
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000916 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000917 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200918 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000919 self.tk.call(self._w, 'header', 'configure', col,
920 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000921
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000922 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000923 return self.tk.call(self._w, 'header', 'cget', col, opt)
924
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000925 def header_exists(self, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000926 return self.tk.call(self._w, 'header', 'exists', col)
927
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000928 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000929 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000930
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000931 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000932 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000933
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000934 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000935 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000936
937 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000938 self.tk.call(
939 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000940
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000941 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000942 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200943 return self._getconfigure(
944 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000945 self.tk.call(
946 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000947
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000948 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000949 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
950
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000951 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000952 return self.tk.call (self._w, 'indicator', 'exists', entry)
953
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000954 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000955 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000956
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000957 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000958 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000959
960 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000961 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000962
Guilherme Polobcd03df2009-08-18 15:35:57 +0000963 def info_bbox(self, entry):
964 return self._getints(
965 self.tk.call(self._w, 'info', 'bbox', entry)) or None
966
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000967 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000968 c = self.tk.call(self._w, 'info', 'children', entry)
969 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000970
971 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000972 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000973
Guilherme Polobcd03df2009-08-18 15:35:57 +0000974 def info_dragsite(self):
975 return self.tk.call(self._w, 'info', 'dragsite')
976
977 def info_dropsite(self):
978 return self.tk.call(self._w, 'info', 'dropsite')
979
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000980 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000981 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000982
983 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000984 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000985
986 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000987 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000988
989 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000990 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000991
992 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000993 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000994
995 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000996 c = self.tk.call(self._w, 'info', 'selection')
997 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000998
Martin v. Löwis3e048482001-10-09 11:50:55 +0000999 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001000 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
1001
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001002 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001003 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001004 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001005 self.tk.call(self._w, 'item', 'configure', entry, col,
1006 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001007
1008 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001009 self.tk.call(
1010 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001011
1012 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001013 return self.tk.call(self._w, 'item', 'exists', entry, col)
1014
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001015 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001016 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001017
Martin v. Löwis433fa692004-03-21 15:26:44 +00001018 def entrycget(self, entry, opt):
1019 return self.tk.call(self._w, 'entrycget', entry, opt)
1020
1021 def entryconfigure(self, entry, cnf={}, **kw):
1022 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001023 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001024 self.tk.call(self._w, 'entryconfigure', entry,
1025 *self._options(cnf, kw))
1026
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001027 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001028 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001029
1030 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001031 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001032
1033 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001034 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001035
1036 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001037 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001038
1039 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001040 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001041
1042 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001043 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001044
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001045class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001046 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001047
1048 Subwidgets - None"""
1049
1050 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001051 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001052
1053class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001054 """LabelEntry - Entry field with label. Packages an entry widget
1055 and a label into one mega widget. It can beused be used to simplify
1056 the creation of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001057
Moshe Zadka22710822001-03-21 17:24:49 +00001058 Subwidgets Class
1059 ---------- -----
1060 label Label
1061 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001062
1063 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001064 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001065 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001066 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1067 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001068
1069class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001070 """LabelFrame - Labelled Frame container. Packages a frame widget
1071 and a label into one mega widget. To create widgets inside a
1072 LabelFrame widget, one creates the new widgets relative to the
1073 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001074
Moshe Zadka22710822001-03-21 17:24:49 +00001075 Subwidgets Class
1076 ---------- -----
1077 label Label
1078 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001079
1080 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001081 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001082 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001083 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1084 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001085
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001086
1087class ListNoteBook(TixWidget):
1088 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1089 it can be used to display many windows in a limited space using a
1090 notebook metaphor. The notebook is divided into a stack of pages
1091 (windows). At one time only one of these pages can be shown.
1092 The user can navigate through these pages by
1093 choosing the name of the desired page in the hlist subwidget."""
1094
1095 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001096 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1097 # Is this necessary? It's not an exposed subwidget in Tix.
1098 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1099 destroy_physically=0)
1100 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1101 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001102
1103 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001104 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001105 self.subwidget_list[name] = TixSubWidget(self, name)
1106 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001107
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001108 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001109 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001110
1111 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001112 # Can't call subwidgets_all directly because we don't want .nbframe
1113 names = self.tk.split(self.tk.call(self._w, 'pages'))
1114 ret = []
1115 for x in names:
1116 ret.append(self.subwidget(x))
1117 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001118
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001119 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001120 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001121
1122class Meter(TixWidget):
1123 """The Meter widget can be used to show the progress of a background
1124 job which may take a long time to execute.
1125 """
1126
1127 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001128 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001129 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001130
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001131class NoteBook(TixWidget):
1132 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1133
Moshe Zadka22710822001-03-21 17:24:49 +00001134 Subwidgets Class
1135 ---------- -----
1136 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001137 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001138
1139 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001140 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1141 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001142 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001143
1144 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001145 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001146 self.subwidget_list[name] = TixSubWidget(self, name)
1147 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001148
1149 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001150 self.tk.call(self._w, 'delete', name)
1151 self.subwidget_list[name].destroy()
1152 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001153
1154 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001155 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001156
1157 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001158 # Can't call subwidgets_all directly because we don't want .nbframe
1159 names = self.tk.split(self.tk.call(self._w, 'pages'))
1160 ret = []
1161 for x in names:
1162 ret.append(self.subwidget(x))
1163 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001164
Moshe Zadka22710822001-03-21 17:24:49 +00001165 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001166 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001167
1168 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001169 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001170
1171class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001172 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001173 pass
1174
1175class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001176 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001177
Moshe Zadka22710822001-03-21 17:24:49 +00001178 Subwidget Class
1179 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001180 menubutton Menubutton
1181 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001182
1183 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001184 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1185 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1186 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001187
1188 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001189 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001190
1191 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001192 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001193
1194 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001195 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001196
1197 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001198 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001199
1200 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001201 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001202
1203class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001204 """PanedWindow - Multi-pane container widget
1205 allows the user to interactively manipulate the sizes of several
1206 panes. The panes can be arranged either vertically or horizontally.The
1207 user changes the sizes of the panes by dragging the resize handle
1208 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001209
Moshe Zadka22710822001-03-21 17:24:49 +00001210 Subwidgets Class
1211 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001212 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001213
1214 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001215 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001216
Neal Norwitzf539bde2002-11-14 02:43:40 +00001217 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001218 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001219 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001220 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001221 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001222 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001223
Neal Norwitzf539bde2002-11-14 02:43:40 +00001224 def delete(self, name):
1225 self.tk.call(self._w, 'delete', name)
1226 self.subwidget_list[name].destroy()
1227 del self.subwidget_list[name]
1228
1229 def forget(self, name):
1230 self.tk.call(self._w, 'forget', name)
1231
1232 def panecget(self, entry, opt):
1233 return self.tk.call(self._w, 'panecget', entry, opt)
1234
1235 def paneconfigure(self, entry, cnf={}, **kw):
1236 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001237 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001238 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001239
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001240 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001241 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1242 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001243
1244class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001245 """PopupMenu widget can be used as a replacement of the tk_popup command.
1246 The advantage of the Tix PopupMenu widget is it requires less application
1247 code to manipulate.
1248
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001249
Moshe Zadka22710822001-03-21 17:24:49 +00001250 Subwidgets Class
1251 ---------- -----
1252 menubutton Menubutton
1253 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001254
Martin v. Löwis46874282002-12-06 10:33:45 +00001255 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001256 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001257 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1258 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1259 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001260
1261 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001262 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001263
1264 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001265 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001266
1267 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001268 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001269
1270class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001271 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001272 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001273 # There seems to be a Tix bug rejecting the configure method
1274 # Let's try making the flags -static
1275 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1276 'handlesize', 'hintcolor', 'hintwidth',
1277 'x', 'y']
1278 # In fact, x y height width are configurable
1279 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001280 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001281
1282 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001283 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001284
Martin v. Löwis652e1912001-11-25 14:50:56 +00001285 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001286 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001287
1288 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001289 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001290
1291 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001292 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001293
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001294class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001295 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001296
Martin v. Löwis46874282002-12-06 10:33:45 +00001297 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001298 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001299 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001300 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001301 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1302 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1303 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001304
1305class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001306 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001307
Martin v. Löwis46874282002-12-06 10:33:45 +00001308 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001309 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001310 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1311 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1312 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1313 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001314
1315class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001316 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001317
Martin v. Löwis46874282002-12-06 10:33:45 +00001318 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001319 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001320 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1321 self.subwidget_list['text'] = _dummyText(self, 'text')
1322 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1323 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001324
1325class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001326 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001327
Martin v. Löwis46874282002-12-06 10:33:45 +00001328 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001329 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001330 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001331 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001332 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1333 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1334 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001335
1336class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001337 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001338
Martin v. Löwis46874282002-12-06 10:33:45 +00001339 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001340 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001341 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1342 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1343 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1344 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001345
1346class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001347 """Select - Container of button subwidgets. It can be used to provide
1348 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001349
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001350 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001351
Martin v. Löwis46874282002-12-06 10:33:45 +00001352 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001353 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001354 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001355 ['allowzero', 'radio', 'orientation', 'labelside',
1356 'options'],
1357 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001358 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001359
1360 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001361 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001362 self.subwidget_list[name] = _dummyButton(self, name)
1363 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001364
1365 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001366 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001367
Neal Norwitzf539bde2002-11-14 02:43:40 +00001368class Shell(TixWidget):
1369 """Toplevel window.
1370
1371 Subwidgets - None"""
1372
1373 def __init__ (self,master=None,cnf={}, **kw):
1374 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1375
1376class DialogShell(TixWidget):
1377 """Toplevel window, with popup popdown and center methods.
1378 It tells the window manager that it is a dialog window and should be
1379 treated specially. The exact treatment depends on the treatment of
1380 the window manager.
1381
1382 Subwidgets - None"""
1383
Martin v. Löwis46874282002-12-06 10:33:45 +00001384 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001385 def __init__ (self,master=None,cnf={}, **kw):
1386 TixWidget.__init__(self, master,
1387 'tixDialogShell',
1388 ['options', 'title', 'mapped',
1389 'minheight', 'minwidth',
1390 'parent', 'transient'], cnf, kw)
1391
1392 def popdown(self):
1393 self.tk.call(self._w, 'popdown')
1394
1395 def popup(self):
1396 self.tk.call(self._w, 'popup')
1397
1398 def center(self):
1399 self.tk.call(self._w, 'center')
1400
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001401class StdButtonBox(TixWidget):
1402 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1403
1404 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001405 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001406 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001407 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1408 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1409 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1410 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001411
1412 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001413 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001414 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001415
Guilherme Polo1fff0082009-08-14 15:05:30 +00001416class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001417 """TList - Hierarchy display widget which can be
1418 used to display data in a tabular format. The list entries of a TList
1419 widget are similar to the entries in the Tk listbox widget. The main
1420 differences are (1) the TList widget can display the list entries in a
1421 two dimensional format and (2) you can use graphical images as well as
1422 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001423
1424 Subwidgets - None"""
1425
1426 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001427 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001428
1429 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001430 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001431
1432 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001433 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001434
1435 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001436 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001437
1438 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001439 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001440
1441 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001442 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001443
1444 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001445 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001446
1447 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001448 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001449
1450 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001451 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001452
1453 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001454 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001455
1456 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001457 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001458
1459 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001460 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001461
1462 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001463 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001464
1465 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001466 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001467
1468 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001469 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001470
1471 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001472 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001473
1474 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001475 c = self.tk.call(self._w, 'info', 'selection')
1476 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001477
1478 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001479 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001480
1481 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001482 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001483
1484 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001485 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001486
1487 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001488 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001489
1490 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001491 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001492
1493 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001494 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001495
1496 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001497 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001498
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001499class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001500 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001501 data in a tree form. The user can adjust
1502 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001503
Martin v. Löwis46874282002-12-06 10:33:45 +00001504 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001505 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001506 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001507 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001508 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1509 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1510 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001511
1512 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001513 '''This command calls the setmode method for all the entries in this
1514 Tree widget: if an entry has no child entries, its mode is set to
1515 none. Otherwise, if the entry has any hidden child entries, its mode is
1516 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001517 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001518
1519 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001520 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001521 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001522
1523 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001524 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001525 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001526
1527 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001528 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001529 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001530
1531 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001532 '''This command is used to indicate whether the entry given by
1533 entryPath has children entries and whether the children are visible. mode
1534 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001535 indicator is drawn next the entry. If mode is set to close, a (-)
1536 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001537 indicators will be drawn for this entry. The default mode is none. The
1538 open mode indicates the entry has hidden children and this entry can be
1539 opened by the user. The close mode indicates that all the children of the
1540 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001541 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001542
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001543
1544# Could try subclassing Tree for CheckList - would need another arg to init
1545class CheckList(TixWidget):
1546 """The CheckList widget
1547 displays a list of items to be selected by the user. CheckList acts
1548 similarly to the Tk checkbutton or radiobutton widgets, except it is
1549 capable of handling many more items than checkbuttons or radiobuttons.
1550 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001551 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001552 def __init__(self, master=None, cnf={}, **kw):
1553 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001554 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001555 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1556 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1557 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001558
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001559 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001560 '''This command calls the setmode method for all the entries in this
1561 Tree widget: if an entry has no child entries, its mode is set to
1562 none. Otherwise, if the entry has any hidden child entries, its mode is
1563 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001564 self.tk.call(self._w, 'autosetmode')
1565
1566 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001567 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001568 self.tk.call(self._w, 'close', entrypath)
1569
1570 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001571 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001572 return self.tk.call(self._w, 'getmode', entrypath)
1573
1574 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001575 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001576 self.tk.call(self._w, 'open', entrypath)
1577
1578 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001579 '''Returns a list of items whose status matches status. If status is
1580 not specified, the list of items in the "on" status will be returned.
1581 Mode can be on, off, default'''
1582 c = self.tk.split(self.tk.call(self._w, 'getselection', mode))
1583 return self.tk.splitlist(c)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001584
1585 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001586 '''Returns the current status of entryPath.'''
1587 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001588
1589 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001590 '''Sets the status of entryPath to be status. A bitmap will be
1591 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001592 self.tk.call(self._w, 'setstatus', entrypath, mode)
1593
1594
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001595###########################################################################
1596### The subclassing below is used to instantiate the subwidgets in each ###
1597### mega widget. This allows us to access their methods directly. ###
1598###########################################################################
1599
1600class _dummyButton(Button, TixSubWidget):
1601 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001602 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001603
1604class _dummyCheckbutton(Checkbutton, TixSubWidget):
1605 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001606 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001607
1608class _dummyEntry(Entry, TixSubWidget):
1609 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001610 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001611
1612class _dummyFrame(Frame, TixSubWidget):
1613 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001614 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001615
1616class _dummyLabel(Label, TixSubWidget):
1617 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001618 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001619
1620class _dummyListbox(Listbox, TixSubWidget):
1621 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001622 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001623
1624class _dummyMenu(Menu, TixSubWidget):
1625 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001626 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001627
1628class _dummyMenubutton(Menubutton, TixSubWidget):
1629 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001630 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001631
1632class _dummyScrollbar(Scrollbar, TixSubWidget):
1633 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001634 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001635
1636class _dummyText(Text, TixSubWidget):
1637 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001638 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001639
1640class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1641 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001642 TixSubWidget.__init__(self, master, name, destroy_physically)
1643 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1644 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1645 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001646
1647class _dummyHList(HList, TixSubWidget):
1648 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001649 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001650
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001651class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1652 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001653 TixSubWidget.__init__(self, master, name, destroy_physically)
1654 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1655 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1656 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001657
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001658class _dummyTList(TList, TixSubWidget):
1659 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001660 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001661
1662class _dummyComboBox(ComboBox, TixSubWidget):
1663 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001664 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1665 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001666 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1667 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001668
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001669 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001670 'slistbox')
1671 try:
1672 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1673 #cross Button : present if created with the fancy option
1674 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1675 except TypeError:
1676 # unavailable when -fancy not specified
1677 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001678
1679class _dummyDirList(DirList, TixSubWidget):
1680 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001681 TixSubWidget.__init__(self, master, name, destroy_physically)
1682 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1683 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1684 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001685
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001686class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1687 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001688 TixSubWidget.__init__(self, master, name, destroy_physically)
1689 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1690 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001691
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001692class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1693 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001694 TixSubWidget.__init__(self, master, name, destroy_physically)
1695 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1696 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1697 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1698 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1699 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1700 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1701 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1702 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001703
1704class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1705 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001706 TixSubWidget.__init__(self, master, name, destroy_physically)
1707 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1708 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1709 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1710 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001711
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001712class _dummyFileComboBox(ComboBox, TixSubWidget):
1713 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001714 TixSubWidget.__init__(self, master, name, destroy_physically)
1715 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001716
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001717class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1718 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001719 TixSubWidget.__init__(self, master, name, destroy_physically)
1720 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1721 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1722 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1723 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001724
1725class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1726 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001727 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001728
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001729class _dummyPanedWindow(PanedWindow, TixSubWidget):
1730 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001731 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001732
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001733########################
1734### Utility Routines ###
1735########################
1736
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001737#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1738
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001739def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001740 '''Returns the qualified path name for the widget. Normally used to set
1741 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001742 return widget.tk.call('tixOptionName', widget._w)
1743
1744# Called with a dictionary argument of the form
1745# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1746# returns a string which can be used to configure the fsbox file types
1747# in an ExFileSelectBox. i.e.,
1748# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1749def FileTypeList(dict):
1750 s = ''
1751 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001752 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001753 return s
1754
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001755# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001756# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001757class CObjView(TixWidget):
1758 """This file implements the Canvas Object View widget. This is a base
1759 class of IconView. It implements automatic placement/adjustment of the
1760 scrollbars according to the canvas objects inside the canvas subwidget.
1761 The scrollbars are adjusted so that the canvas is just large enough
1762 to see all the objects.
1763 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001764 # FIXME: It should inherit -superclass tixScrolledWidget
1765 pass
1766
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001767
Guilherme Polo1fff0082009-08-14 15:05:30 +00001768class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001769 '''The Tix Grid command creates a new window and makes it into a
1770 tixGrid widget. Additional options, may be specified on the command
1771 line or in the option database to configure aspects such as its cursor
1772 and relief.
1773
1774 A Grid widget displays its contents in a two dimensional grid of cells.
1775 Each cell may contain one Tix display item, which may be in text,
1776 graphics or other formats. See the DisplayStyle class for more information
1777 about Tix display items. Individual cells, or groups of cells, can be
1778 formatted with a wide range of attributes, such as its color, relief and
1779 border.
1780
1781 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001782 # valid specific resources as of Tk 8.4
1783 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1784 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1785 # selectunit, topmargin,
1786 def __init__(self, master=None, cnf={}, **kw):
1787 static= []
1788 self.cnf= cnf
1789 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001790
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001791 # valid options as of Tk 8.4
Guilherme Polobcd03df2009-08-18 15:35:57 +00001792 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
1793 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
1794 # selection, set, size, unset, xview, yview
1795 def anchor_clear(self):
1796 """Removes the selection anchor."""
1797 self.tk.call(self, 'anchor', 'clear')
1798
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001799 def anchor_get(self):
1800 "Get the (x,y) coordinate of the current anchor cell"
1801 return self._getints(self.tk.call(self, 'anchor', 'get'))
1802
Guilherme Polobcd03df2009-08-18 15:35:57 +00001803 def anchor_set(self, x, y):
1804 """Set the selection anchor to the cell at (x, y)."""
1805 self.tk.call(self, 'anchor', 'set', x, y)
1806
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001807 def delete_row(self, from_, to=None):
1808 """Delete rows between from_ and to inclusive.
1809 If to is not provided, delete only row at from_"""
1810 if to is None:
1811 self.tk.call(self, 'delete', 'row', from_)
1812 else:
1813 self.tk.call(self, 'delete', 'row', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001814
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815 def delete_column(self, from_, to=None):
1816 """Delete columns between from_ and to inclusive.
1817 If to is not provided, delete only column at from_"""
1818 if to is None:
1819 self.tk.call(self, 'delete', 'column', from_)
1820 else:
1821 self.tk.call(self, 'delete', 'column', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001822
1823 def edit_apply(self):
1824 """If any cell is being edited, de-highlight the cell and applies
1825 the changes."""
1826 self.tk.call(self, 'edit', 'apply')
1827
1828 def edit_set(self, x, y):
1829 """Highlights the cell at (x, y) for editing, if the -editnotify
1830 command returns True for this cell."""
1831 self.tk.call(self, 'edit', 'set', x, y)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001832
1833 def entrycget(self, x, y, option):
1834 "Get the option value for cell at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001835 if option and option[0] != '-':
1836 option = '-' + option
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001837 return self.tk.call(self, 'entrycget', x, y, option)
1838
Guilherme Polobcd03df2009-08-18 15:35:57 +00001839 def entryconfigure(self, x, y, cnf=None, **kw):
1840 return self._configure(('entryconfigure', x, y), cnf, kw)
1841
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001842 # def format
1843 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001844
1845 def info_exists(self, x, y):
1846 "Return True if display item exists at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001847 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001848
1849 def info_bbox(self, x, y):
1850 # This seems to always return '', at least for 'text' displayitems
1851 return self.tk.call(self, 'info', 'bbox', x, y)
1852
Guilherme Polobcd03df2009-08-18 15:35:57 +00001853 def move_column(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001854 """Moves the range of columns from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001855 the distance indicated by OFFSET. For example, move_column(2, 4, 1)
1856 moves the columns 2,3,4 to columns 3,4,5."""
1857 self.tk.call(self, 'move', 'column', from_, to, offset)
1858
1859 def move_row(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001860 """Moves the range of rows from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001861 the distance indicated by OFFSET.
1862 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
1863 self.tk.call(self, 'move', 'row', from_, to, offset)
1864
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001865 def nearest(self, x, y):
1866 "Return coordinate of cell nearest pixel coordinate (x,y)"
1867 return self._getints(self.tk.call(self, 'nearest', x, y))
1868
1869 # def selection adjust
1870 # def selection clear
1871 # def selection includes
1872 # def selection set
1873 # def selection toggle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001874
1875 def set(self, x, y, itemtype=None, **kw):
1876 args= self._options(self.cnf, kw)
1877 if itemtype is not None:
1878 args= ('-itemtype', itemtype) + args
1879 self.tk.call(self, 'set', x, y, *args)
1880
Guilherme Polobcd03df2009-08-18 15:35:57 +00001881 def size_column(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001882 """Queries or sets the size of the column given by
1883 INDEX. INDEX may be any non-negative
1884 integer that gives the position of a given column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001885 INDEX can also be the string "default"; in this case, this command
1886 queries or sets the default size of all columns.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001887 When no option-value pair is given, this command returns a tuple
1888 containing the current size setting of the given column. When
1889 option-value pairs are given, the corresponding options of the
Guilherme Polobcd03df2009-08-18 15:35:57 +00001890 size setting of the given column are changed. Options may be one
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001891 of the follwing:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001892 pad0 pixels
1893 Specifies the paddings to the left of a column.
1894 pad1 pixels
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001895 Specifies the paddings to the right of a column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001896 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001897 Specifies the width of a column. Val may be:
1898 "auto" -- the width of the column is set to the
1899 width of the widest cell in the column;
1900 a valid Tk screen distance unit;
1901 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001902 (e.g. 3.4chars) that sets the width of the column to the
1903 given number of characters."""
1904 return self.tk.split(self.tk.call(self._w, 'size', 'column', index,
1905 *self._options({}, kw)))
1906
1907 def size_row(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001908 """Queries or sets the size of the row given by
1909 INDEX. INDEX may be any non-negative
1910 integer that gives the position of a given row .
Guilherme Polobcd03df2009-08-18 15:35:57 +00001911 INDEX can also be the string "default"; in this case, this command
1912 queries or sets the default size of all rows.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001913 When no option-value pair is given, this command returns a list con-
1914 taining the current size setting of the given row . When option-value
Guilherme Polobcd03df2009-08-18 15:35:57 +00001915 pairs are given, the corresponding options of the size setting of the
1916 given row are changed. Options may be one of the follwing:
1917 pad0 pixels
1918 Specifies the paddings to the top of a row.
1919 pad1 pixels
Ezio Melottie130a522011-10-19 10:58:56 +03001920 Specifies the paddings to the bottom of a row.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001921 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001922 Specifies the height of a row. Val may be:
1923 "auto" -- the height of the row is set to the
1924 height of the highest cell in the row;
1925 a valid Tk screen distance unit;
1926 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001927 (e.g. 3.4chars) that sets the height of the row to the
1928 given number of characters."""
1929 return self.tk.split(self.tk.call(
1930 self, 'size', 'row', index, *self._options({}, kw)))
1931
1932 def unset(self, x, y):
1933 """Clears the cell at (x, y) by removing its display item."""
1934 self.tk.call(self._w, 'unset', x, y)
1935
Raymond Hettingerff41c482003-04-06 09:01:11 +00001936
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001937class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001938 '''Scrolled Grid widgets'''
1939
1940 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001941 def __init__(self, master=None, cnf={}, **kw):
1942 static= []
1943 self.cnf= cnf
1944 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)