blob: 89113fd1eb0ce30b827da22436d6ccd1606f2fdb [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
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040029import os
30import tkinter
Georg Brandl14fc4272008-05-17 18:39:55 +000031from tkinter import *
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040032from tkinter import _cnfmerge
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000033
34# WARNING - TkVersion is a limited precision floating point number
35if TkVersion < 3.999:
Collin Winterce36ad82007-08-30 01:19:48 +000036 raise ImportError("This version of Tix.py requires Tk 4.0 or higher")
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000037
38import _tkinter # If this fails your Python may not be configured for Tk
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000039
40# Some more constants (for consistency with Tkinter)
41WINDOW = 'window'
42TEXT = 'text'
43STATUS = 'status'
44IMMEDIATE = 'immediate'
45IMAGE = 'image'
46IMAGETEXT = 'imagetext'
47BALLOON = 'balloon'
48AUTO = 'auto'
49ACROSSTOP = 'acrosstop'
50
Guilherme Polobcd03df2009-08-18 15:35:57 +000051# A few useful constants for the Grid widget
52ASCII = 'ascii'
53CELL = 'cell'
54COLUMN = 'column'
55DECREASING = 'decreasing'
56INCREASING = 'increasing'
57INTEGER = 'integer'
58MAIN = 'main'
59MAX = 'max'
60REAL = 'real'
61ROW = 'row'
62S_REGION = 's-region'
63X_REGION = 'x-region'
64Y_REGION = 'y-region'
65
Fred Drake723293c2001-12-13 04:53:07 +000066# Some constants used by Tkinter dooneevent()
67TCL_DONT_WAIT = 1 << 1
68TCL_WINDOW_EVENTS = 1 << 2
69TCL_FILE_EVENTS = 1 << 3
70TCL_TIMER_EVENTS = 1 << 4
71TCL_IDLE_EVENTS = 1 << 5
72TCL_ALL_EVENTS = 0
73
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000074# BEWARE - this is implemented by copying some code from the Widget class
75# in Tkinter (to override Widget initialization) and is therefore
76# liable to break.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000077
78# Could probably add this to Tkinter.Misc
79class tixCommand:
Fred Drake723293c2001-12-13 04:53:07 +000080 """The tix commands provide access to miscellaneous elements
Martin v. Löwisb7b32602001-11-02 23:48:20 +000081 of Tix's internal state and the Tix application context.
Fred Drake723293c2001-12-13 04:53:07 +000082 Most of the information manipulated by these commands pertains
83 to the application as a whole, or to a screen or
84 display, rather than to a particular window.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000085
86 This is a mixin class, assumed to be mixed to Tkinter.Tk
87 that supports the self.tk.call method.
88 """
Fred Drake723293c2001-12-13 04:53:07 +000089
Martin v. Löwisb7b32602001-11-02 23:48:20 +000090 def tix_addbitmapdir(self, directory):
Fred Drake723293c2001-12-13 04:53:07 +000091 """Tix maintains a list of directories under which
Martin v. Löwisb7b32602001-11-02 23:48:20 +000092 the tix_getimage and tix_getbitmap commands will
Fred Drake723293c2001-12-13 04:53:07 +000093 search for image files. The standard bitmap directory
94 is $TIX_LIBRARY/bitmaps. The addbitmapdir command
95 adds directory into this list. By using this
Martin v. Löwisb7b32602001-11-02 23:48:20 +000096 command, the image files of an applications can
97 also be located using the tix_getimage or tix_getbitmap
98 command.
99 """
100 return self.tk.call('tix', 'addbitmapdir', directory)
101
102 def tix_cget(self, option):
103 """Returns the current value of the configuration
104 option given by option. Option may be any of the
105 options described in the CONFIGURATION OPTIONS section.
106 """
107 return self.tk.call('tix', 'cget', option)
108
109 def tix_configure(self, cnf=None, **kw):
Fred Drake723293c2001-12-13 04:53:07 +0000110 """Query or modify the configuration options of the Tix application
111 context. If no option is specified, returns a dictionary all of the
112 available options. If option is specified with no value, then the
113 command returns a list describing the one named option (this list
114 will be identical to the corresponding sublist of the value
115 returned if no option is specified). If one or more option-value
116 pairs are specified, then the command modifies the given option(s)
117 to have the given value(s); in this case the command returns an
118 empty string. Option may be any of the configuration options.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000119 """
Fred Drake723293c2001-12-13 04:53:07 +0000120 # Copied from Tkinter.py
121 if kw:
122 cnf = _cnfmerge((cnf, kw))
123 elif cnf:
124 cnf = _cnfmerge(cnf)
125 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200126 return self._getconfigure('tix', 'configure')
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300127 if isinstance(cnf, str):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200128 return self._getconfigure1('tix', 'configure', '-'+cnf)
Fred Drake723293c2001-12-13 04:53:07 +0000129 return self.tk.call(('tix', 'configure') + self._options(cnf))
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000130
131 def tix_filedialog(self, dlgclass=None):
Fred Drake723293c2001-12-13 04:53:07 +0000132 """Returns the file selection dialog that may be shared among
133 different calls from this application. This command will create a
134 file selection dialog widget when it is called the first time. This
135 dialog will be returned by all subsequent calls to tix_filedialog.
136 An optional dlgclass parameter can be passed to specified what type
137 of file selection dialog widget is desired. Possible options are
138 tix FileSelectDialog or tixExFileSelectDialog.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000139 """
140 if dlgclass is not None:
141 return self.tk.call('tix', 'filedialog', dlgclass)
142 else:
143 return self.tk.call('tix', 'filedialog')
144
145 def tix_getbitmap(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000146 """Locates a bitmap file of the name name.xpm or name in one of the
147 bitmap directories (see the tix_addbitmapdir command above). By
148 using tix_getbitmap, you can avoid hard coding the pathnames of the
149 bitmap files in your application. When successful, it returns the
150 complete pathname of the bitmap file, prefixed with the character
151 '@'. The returned value can be used to configure the -bitmap
152 option of the TK and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000153 """
154 return self.tk.call('tix', 'getbitmap', name)
155
156 def tix_getimage(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000157 """Locates an image file of the name name.xpm, name.xbm or name.ppm
158 in one of the bitmap directories (see the addbitmapdir command
159 above). If more than one file with the same name (but different
160 extensions) exist, then the image type is chosen according to the
161 depth of the X display: xbm images are chosen on monochrome
162 displays and color images are chosen on color displays. By using
Ezio Melotti42da6632011-03-15 05:18:48 +0200163 tix_ getimage, you can avoid hard coding the pathnames of the
Fred Drake723293c2001-12-13 04:53:07 +0000164 image files in your application. When successful, this command
165 returns the name of the newly created image, which can be used to
166 configure the -image option of the Tk and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000167 """
168 return self.tk.call('tix', 'getimage', name)
169
170 def tix_option_get(self, name):
Ezio Melotti13925002011-03-16 11:05:33 +0200171 """Gets the options maintained by the Tix
Fred Drake723293c2001-12-13 04:53:07 +0000172 scheme mechanism. Available options include:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000173
174 active_bg active_fg bg
175 bold_font dark1_bg dark1_fg
176 dark2_bg dark2_fg disabled_fg
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000177 fg fixed_font font
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000178 inactive_bg inactive_fg input1_bg
179 input2_bg italic_font light1_bg
180 light1_fg light2_bg light2_fg
181 menu_font output1_bg output2_bg
182 select_bg select_fg selector
183 """
184 # could use self.tk.globalgetvar('tixOption', name)
185 return self.tk.call('tix', 'option', 'get', name)
186
187 def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None):
Fred Drake723293c2001-12-13 04:53:07 +0000188 """Resets the scheme and fontset of the Tix application to
189 newScheme and newFontSet, respectively. This affects only those
190 widgets created after this call. Therefore, it is best to call the
191 resetoptions command before the creation of any widgets in a Tix
192 application.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000193
Fred Drake723293c2001-12-13 04:53:07 +0000194 The optional parameter newScmPrio can be given to reset the
195 priority level of the Tk options set by the Tix schemes.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000196
Fred Drake723293c2001-12-13 04:53:07 +0000197 Because of the way Tk handles the X option database, after Tix has
198 been has imported and inited, it is not possible to reset the color
199 schemes and font sets using the tix config command. Instead, the
200 tix_resetoptions command must be used.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000201 """
202 if newScmPrio is not None:
203 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio)
204 else:
205 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet)
206
Georg Brandl14fc4272008-05-17 18:39:55 +0000207class Tk(tkinter.Tk, tixCommand):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000208 """Toplevel widget of Tix which represents mostly the main window
209 of an application. It has an associated Tcl interpreter."""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000210 def __init__(self, screenName=None, baseName=None, className='Tix'):
Georg Brandl14fc4272008-05-17 18:39:55 +0000211 tkinter.Tk.__init__(self, screenName, baseName, className)
Moshe Zadka22710822001-03-21 17:24:49 +0000212 tixlib = os.environ.get('TIX_LIBRARY')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000213 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]')
Moshe Zadka22710822001-03-21 17:24:49 +0000214 if tixlib is not None:
215 self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib)
216 self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000217 # Load Tix - this should work dynamically or statically
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000218 # If it's static, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000219 # 'load {} Tix'
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000220 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000221 # 'load libtix8.1.8.3.so Tix'
Moshe Zadka22710822001-03-21 17:24:49 +0000222 self.tk.eval('package require Tix')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000223
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000224 def destroy(self):
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300225 # For safety, remove the delete_window binding before destroy
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000226 self.protocol("WM_DELETE_WINDOW", "")
Georg Brandl14fc4272008-05-17 18:39:55 +0000227 tkinter.Tk.destroy(self)
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000228
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000229# The Tix 'tixForm' geometry manager
230class Form:
231 """The Tix Form geometry manager
232
233 Widgets can be arranged by specifying attachments to other widgets.
234 See Tix documentation for complete details"""
235
236 def config(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000237 self.tk.call('tixForm', self._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000238
239 form = config
240
241 def __setitem__(self, key, value):
Guido van Rossum49fa2bd2001-08-13 14:12:35 +0000242 Form.form(self, {key: value})
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000243
244 def check(self):
245 return self.tk.call('tixForm', 'check', self._w)
246
247 def forget(self):
248 self.tk.call('tixForm', 'forget', self._w)
249
250 def grid(self, xsize=0, ysize=0):
251 if (not xsize) and (not ysize):
252 x = self.tk.call('tixForm', 'grid', self._w)
253 y = self.tk.splitlist(x)
254 z = ()
255 for x in y:
256 z = z + (self.tk.getint(x),)
257 return z
Martin v. Löwis46874282002-12-06 10:33:45 +0000258 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000259
260 def info(self, option=None):
261 if not option:
262 return self.tk.call('tixForm', 'info', self._w)
263 if option[0] != '-':
264 option = '-' + option
265 return self.tk.call('tixForm', 'info', self._w, option)
266
267 def slaves(self):
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000268 return [self._nametowidget(x) for x in
269 self.tk.splitlist(
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000270 self.tk.call(
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000271 'tixForm', 'slaves', self._w))]
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000272
273
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000274
Georg Brandl14fc4272008-05-17 18:39:55 +0000275tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000276
Georg Brandl14fc4272008-05-17 18:39:55 +0000277class TixWidget(tkinter.Widget):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000278 """A TixWidget class is used to package all (or most) Tix widgets.
279
280 Widget initialization is extended in two ways:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000281 1) It is possible to give a list of options which must be part of
Moshe Zadka22710822001-03-21 17:24:49 +0000282 the creation command (so called Tix 'static' options). These cannot be
283 given as a 'config' command later.
284 2) It is possible to give the name of an existing TK widget. These are
285 child widgets created automatically by a Tix mega-widget. The Tk call
286 to create these widgets is therefore bypassed in TixWidget.__init__
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000287
288 Both options are for use by subclasses only.
289 """
290 def __init__ (self, master=None, widgetName=None,
Moshe Zadka22710822001-03-21 17:24:49 +0000291 static_options=None, cnf={}, kw={}):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000292 # Merge keywords and dictionary arguments
293 if kw:
Moshe Zadka22710822001-03-21 17:24:49 +0000294 cnf = _cnfmerge((cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000295 else:
296 cnf = _cnfmerge(cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000297
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000298 # Move static options into extra. static_options must be
299 # a list of keywords (or None).
300 extra=()
Neal Norwitzf539bde2002-11-14 02:43:40 +0000301
302 # 'options' is always a static option
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000303 if static_options:
Neal Norwitzf539bde2002-11-14 02:43:40 +0000304 static_options.append('options')
305 else:
306 static_options = ['options']
Raymond Hettingerff41c482003-04-06 09:01:11 +0000307
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000308 for k,v in list(cnf.items()):
Neal Norwitzf539bde2002-11-14 02:43:40 +0000309 if k in static_options:
310 extra = extra + ('-' + k, v)
311 del cnf[k]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000312
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000313 self.widgetName = widgetName
314 Widget._setup(self, master, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000315
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000316 # If widgetName is None, this is a dummy creation call where the
317 # corresponding Tk widget has already been created by Tix
318 if widgetName:
Raymond Hettingerff41c482003-04-06 09:01:11 +0000319 self.tk.call(widgetName, self._w, *extra)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000320
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000321 # Non-static options - to be done via a 'config' command
322 if cnf:
323 Widget.config(self, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000324
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000325 # Dictionary to hold subwidget names for easier access. We can't
326 # use the children list because the public Tix names may not be the
327 # same as the pathname component
328 self.subwidget_list = {}
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000329
330 # We set up an attribute access function so that it is possible to
331 # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello'
332 # when w is a StdButtonBox.
333 # We can even do w.ok.invoke() because w.ok is subclassed from the
334 # Button class if you go through the proper constructors
335 def __getattr__(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000336 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000337 return self.subwidget_list[name]
Collin Winterce36ad82007-08-30 01:19:48 +0000338 raise AttributeError(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000339
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000340 def set_silent(self, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000341 """Set a variable without calling its action routine"""
342 self.tk.call('tixSetSilent', self._w, value)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000343
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000344 def subwidget(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000345 """Return the named subwidget (which must have been created by
346 the sub-class)."""
347 n = self._subwidget_name(name)
348 if not n:
Collin Winterce36ad82007-08-30 01:19:48 +0000349 raise TclError("Subwidget " + name + " not child of " + self._name)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000350 # Remove header of name and leading dot
351 n = n[len(self._w)+1:]
352 return self._nametowidget(n)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000353
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000354 def subwidgets_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000355 """Return all subwidgets."""
356 names = self._subwidget_names()
357 if not names:
358 return []
359 retlist = []
360 for name in names:
361 name = name[len(self._w)+1:]
362 try:
363 retlist.append(self._nametowidget(name))
364 except:
365 # some of the widgets are unknown e.g. border in LabelFrame
366 pass
367 return retlist
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000368
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000369 def _subwidget_name(self,name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000370 """Get a subwidget name (returns a String, not a Widget !)"""
371 try:
372 return self.tk.call(self._w, 'subwidget', name)
373 except TclError:
374 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000375
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000376 def _subwidget_names(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000377 """Return the name of all subwidgets."""
378 try:
379 x = self.tk.call(self._w, 'subwidgets', '-all')
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200380 return self.tk.splitlist(x)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000381 except TclError:
382 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000383
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000384 def config_all(self, option, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000385 """Set configuration options for all subwidgets (and self)."""
386 if option == '':
387 return
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300388 elif not isinstance(option, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000389 option = repr(option)
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300390 if not isinstance(value, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000391 value = repr(value)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000392 names = self._subwidget_names()
393 for name in names:
394 self.tk.call(name, 'configure', '-' + option, value)
Neal Norwitz731a9862002-12-10 02:18:49 +0000395 # These are missing from Tkinter
396 def image_create(self, imgtype, cnf={}, master=None, **kw):
397 if not master:
Georg Brandl14fc4272008-05-17 18:39:55 +0000398 master = tkinter._default_root
Neal Norwitz731a9862002-12-10 02:18:49 +0000399 if not master:
Collin Winterce36ad82007-08-30 01:19:48 +0000400 raise RuntimeError('Too early to create image')
Neal Norwitz731a9862002-12-10 02:18:49 +0000401 if kw and cnf: cnf = _cnfmerge((cnf, kw))
402 elif kw: cnf = kw
403 options = ()
404 for k, v in cnf.items():
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200405 if callable(v):
Neal Norwitz731a9862002-12-10 02:18:49 +0000406 v = self._register(v)
407 options = options + ('-'+k, v)
408 return master.tk.call(('image', 'create', imgtype,) + options)
409 def image_delete(self, imgname):
410 try:
411 self.tk.call('image', 'delete', imgname)
412 except TclError:
413 # May happen if the root was destroyed
414 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000415
416# Subwidgets are child widgets created automatically by mega-widgets.
417# In python, we have to create these subwidgets manually to mirror their
418# existence in Tk/Tix.
419class TixSubWidget(TixWidget):
420 """Subwidget class.
421
422 This is used to mirror child widgets automatically created
423 by Tix/Tk as part of a mega-widget in Python (which is not informed
424 of this)"""
425
426 def __init__(self, master, name,
Moshe Zadka22710822001-03-21 17:24:49 +0000427 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000428 if check_intermediate:
429 path = master._subwidget_name(name)
430 try:
431 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000432 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000433 except:
434 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000435
Thomas Wouters89f507f2006-12-13 04:49:30 +0000436 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000437 # immediate descendant
438 TixWidget.__init__(self, master, None, None, {'name' : name})
439 else:
440 # Ensure that the intermediate widgets exist
441 parent = master
442 for i in range(len(plist) - 1):
Neal Norwitzebb41902002-05-31 20:51:31 +0000443 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000444 try:
445 w = master._nametowidget(n)
446 parent = w
447 except KeyError:
448 # Create the intermediate widget
449 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000450 destroy_physically=0,
451 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000452 # The Tk widget name is in plist, not in name
453 if plist:
454 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000455 TixWidget.__init__(self, parent, None, None, {'name' : name})
456 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000457
458 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000459 # For some widgets e.g., a NoteBook, when we call destructors,
460 # we must be careful not to destroy the frame widget since this
461 # also destroys the parent NoteBook thus leading to an exception
462 # in Tkinter when it finally calls Tcl to destroy the NoteBook
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000463 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000464 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000465 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000466 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000467 del self.master.subwidget_list[self._name]
468 if self.destroy_physically:
469 # This is bypassed only for a few widgets
470 self.tk.call('destroy', self._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000471
472
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000473# Useful class to create a display style - later shared by many items.
474# Contributed by Steffen Kremser
475class DisplayStyle:
476 """DisplayStyle - handle configuration options shared by
477 (multiple) Display Items"""
478
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000479 def __init__(self, itemtype, cnf={}, **kw):
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -0400480 master = tkinter._default_root # global from Tkinter
Guido van Rossume014a132006-08-19 16:53:45 +0000481 if not master and 'refwindow' in cnf: master=cnf['refwindow']
482 elif not master and 'refwindow' in kw: master= kw['refwindow']
Collin Winterce36ad82007-08-30 01:19:48 +0000483 elif not master: raise RuntimeError("Too early to create display style: no root window")
Moshe Zadka22710822001-03-21 17:24:49 +0000484 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000485 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
486 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000487
488 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000489 return self.stylename
490
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000491 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000492 if kw and cnf:
493 cnf = _cnfmerge((cnf, kw))
494 elif kw:
495 cnf = kw
496 opts = ()
497 for k, v in cnf.items():
498 opts = opts + ('-'+k, v)
499 return opts
500
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000501 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000502 self.tk.call(self.stylename, 'delete')
503
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000504 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000505 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
506
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000507 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200508 return self._getconfigure(
509 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000510
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000511 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000512 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000513
514
515######################################################
516### The Tix Widget classes - in alphabetical order ###
517######################################################
518
519class Balloon(TixWidget):
520 """Balloon help widget.
521
Moshe Zadka22710822001-03-21 17:24:49 +0000522 Subwidget Class
523 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000524 label Label
525 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000526
Martin v. Löwis46874282002-12-06 10:33:45 +0000527 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000528 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000529 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000530 static = ['options', 'installcolormap', 'initwait', 'statusbar',
531 'cursor']
532 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
533 self.subwidget_list['label'] = _dummyLabel(self, 'label',
534 destroy_physically=0)
535 self.subwidget_list['message'] = _dummyLabel(self, 'message',
536 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000537
538 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000539 """Bind balloon widget to another.
540 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000541 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000542
543 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000544 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000545
546class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000547 """ButtonBox - A container for pushbuttons.
548 Subwidgets are the buttons added with the add method.
549 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000550 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000551 TixWidget.__init__(self, master, 'tixButtonBox',
552 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000553
554 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000555 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000556
Raymond Hettingerff41c482003-04-06 09:01:11 +0000557 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000558 self.subwidget_list[name] = _dummyButton(self, name)
559 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000560
561 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000562 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000563 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000564
565class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000566 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200567 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000568 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000569
Moshe Zadka22710822001-03-21 17:24:49 +0000570 Subwidget Class
571 --------- -----
572 entry Entry
573 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000574 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000575 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000576 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000577
Martin v. Löwis46874282002-12-06 10:33:45 +0000578 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000579 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000580 TixWidget.__init__(self, master, 'tixComboBox',
581 ['editable', 'dropdown', 'fancy', 'options'],
582 cnf, kw)
583 self.subwidget_list['label'] = _dummyLabel(self, 'label')
584 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
585 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
586 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
587 'slistbox')
588 try:
589 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
590 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
591 except TypeError:
592 # unavailable when -fancy not specified
593 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000594
Neal Norwitz731a9862002-12-10 02:18:49 +0000595 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000596
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000597 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000598 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000599
600 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000601 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000602
603 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000604 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000605
606 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000607 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000608
609class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000610 """Control - An entry field with value change arrows. The user can
611 adjust the value by pressing the two arrow buttons or by entering
612 the value directly into the entry. The new value will be checked
613 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000614
Moshe Zadka22710822001-03-21 17:24:49 +0000615 Subwidget Class
616 --------- -----
617 incr Button
618 decr Button
619 entry Entry
620 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000621
Martin v. Löwis46874282002-12-06 10:33:45 +0000622 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000623 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000624 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
625 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
626 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
627 self.subwidget_list['label'] = _dummyLabel(self, 'label')
628 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000629
630 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000631 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000632
633 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000634 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000635
636 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000637 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000638
639 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000640 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000641
642class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000643 """DirList - displays a list view of a directory, its previous
644 directories and its sub-directories. The user can choose one of
645 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000646
Moshe Zadka22710822001-03-21 17:24:49 +0000647 Subwidget Class
648 --------- -----
649 hlist HList
650 hsb Scrollbar
651 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000652
Martin v. Löwis46874282002-12-06 10:33:45 +0000653 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000654 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000655 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
656 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
657 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
658 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000659
660 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000661 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000662
663class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000664 """DirTree - Directory Listing in a hierarchical view.
665 Displays a tree view of a directory, its previous directories and its
666 sub-directories. The user can choose one of the directories displayed
667 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000668
Moshe Zadka22710822001-03-21 17:24:49 +0000669 Subwidget Class
670 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000671 hlist HList
672 hsb Scrollbar
673 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000674
Martin v. Löwis46874282002-12-06 10:33:45 +0000675 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000676 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000677 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
678 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
679 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
680 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000681
682 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000683 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000684
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000685class DirSelectBox(TixWidget):
686 """DirSelectBox - Motif style file select box.
687 It is generally used for
688 the user to choose a file. FileSelectBox stores the files mostly
689 recently selected into a ComboBox widget so that they can be quickly
690 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000691
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000692 Subwidget Class
693 --------- -----
694 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000695 filter ComboBox
696 dirlist ScrolledListBox
697 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000698
699 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000700 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
701 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
702 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000703
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000704class ExFileSelectBox(TixWidget):
705 """ExFileSelectBox - MS Windows style file select box.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300706 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000707
Moshe Zadka22710822001-03-21 17:24:49 +0000708 Subwidget Class
709 --------- -----
710 cancel Button
711 ok Button
712 hidden Checkbutton
713 types ComboBox
714 dir ComboBox
715 file ComboBox
716 dirlist ScrolledListBox
717 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000718
719 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000720 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
721 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
722 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
723 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
724 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
725 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
726 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
727 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
728 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000729
730 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000731 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000732
733 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000734 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000735
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000736
737# Should inherit from a Dialog class
738class DirSelectDialog(TixWidget):
739 """The DirSelectDialog widget presents the directories in the file
740 system in a dialog window. The user can use this dialog window to
741 navigate through the file system to select the desired directory.
742
743 Subwidgets Class
744 ---------- -----
745 dirbox DirSelectDialog"""
746
Martin v. Löwis46874282002-12-06 10:33:45 +0000747 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000748 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000749 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000750 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000751 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
752 # cancel and ok buttons are missing
753
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000754 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000755 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000756
757 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000758 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000759
760
761# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000762class ExFileSelectDialog(TixWidget):
763 """ExFileSelectDialog - MS Windows style file select dialog.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300764 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000765
Moshe Zadka22710822001-03-21 17:24:49 +0000766 Subwidgets Class
767 ---------- -----
768 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000769
Martin v. Löwis46874282002-12-06 10:33:45 +0000770 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000771 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000772 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000773 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000774 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000775
776 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000777 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000778
779 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000780 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000781
782class FileSelectBox(TixWidget):
783 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000784 It is generally used for
785 the user to choose a file. FileSelectBox stores the files mostly
786 recently selected into a ComboBox widget so that they can be quickly
787 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000788
Moshe Zadka22710822001-03-21 17:24:49 +0000789 Subwidget Class
790 --------- -----
791 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000792 filter ComboBox
793 dirlist ScrolledListBox
794 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000795
796 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000797 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
798 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
799 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
800 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
801 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000802
Moshe Zadka22710822001-03-21 17:24:49 +0000803 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000804 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000805
806 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000807 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000808
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000809# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000810class FileSelectDialog(TixWidget):
811 """FileSelectDialog - Motif style file select dialog.
812
Moshe Zadka22710822001-03-21 17:24:49 +0000813 Subwidgets Class
814 ---------- -----
815 btns StdButtonBox
816 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000817
Martin v. Löwis46874282002-12-06 10:33:45 +0000818 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000819 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000820 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000821 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000822 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
823 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000824
825 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000826 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000827
828 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000829 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000830
831class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000832 """FileEntry - Entry field with button that invokes a FileSelectDialog.
833 The user can type in the filename manually. Alternatively, the user can
834 press the button widget that sits next to the entry, which will bring
835 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000836
Moshe Zadka22710822001-03-21 17:24:49 +0000837 Subwidgets Class
838 ---------- -----
839 button Button
840 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000841
Martin v. Löwis46874282002-12-06 10:33:45 +0000842 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000843 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000844 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000845 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000846 self.subwidget_list['button'] = _dummyButton(self, 'button')
847 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000848
849 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000850 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000851
852 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000853 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000854 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000855
Guilherme Polo1fff0082009-08-14 15:05:30 +0000856class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000857 """HList - Hierarchy display widget can be used to display any data
858 that have a hierarchical structure, for example, file system directory
859 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200860 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000861
862 Subwidgets - None"""
863
864 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000865 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000866 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000867
868 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000869 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000870
871 def add_child(self, parent=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000872 if not parent:
873 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000874 return self.tk.call(
875 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000876
877 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000878 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000879
880 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000881 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000882
883 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000884 if not chars:
885 return self.tk.call(self._w, 'column', 'width', col, width)
886 else:
887 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000888 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000889
890 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000891 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000892
893 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000894 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000895
896 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000897 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000898
899 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000900 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000901
902 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000903 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000904
905 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000906 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000907
908 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000909 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000910
911 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000912 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000913
914 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000915 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000916
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000917 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000918 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200919 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000920 self.tk.call(self._w, 'header', 'configure', col,
921 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000922
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000923 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000924 return self.tk.call(self._w, 'header', 'cget', col, opt)
925
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000926 def header_exists(self, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000927 return self.tk.call(self._w, 'header', 'exists', col)
928
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000929 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000930 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000931
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000932 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000933 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000934
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000935 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000936 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000937
938 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000939 self.tk.call(
940 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000941
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000942 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000943 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200944 return self._getconfigure(
945 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000946 self.tk.call(
947 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000948
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000949 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000950 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
951
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000952 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000953 return self.tk.call (self._w, 'indicator', 'exists', entry)
954
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000955 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000956 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000957
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000958 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000959 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000960
961 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000962 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000963
Guilherme Polobcd03df2009-08-18 15:35:57 +0000964 def info_bbox(self, entry):
965 return self._getints(
966 self.tk.call(self._w, 'info', 'bbox', entry)) or None
967
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000968 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000969 c = self.tk.call(self._w, 'info', 'children', entry)
970 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000971
972 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000973 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000974
Guilherme Polobcd03df2009-08-18 15:35:57 +0000975 def info_dragsite(self):
976 return self.tk.call(self._w, 'info', 'dragsite')
977
978 def info_dropsite(self):
979 return self.tk.call(self._w, 'info', 'dropsite')
980
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000981 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000982 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000983
984 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000985 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000986
987 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000988 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000989
990 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000991 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000992
993 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000994 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000995
996 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000997 c = self.tk.call(self._w, 'info', 'selection')
998 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000999
Martin v. Löwis3e048482001-10-09 11:50:55 +00001000 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001001 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
1002
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001003 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001004 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001005 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001006 self.tk.call(self._w, 'item', 'configure', entry, col,
1007 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001008
1009 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001010 self.tk.call(
1011 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001012
1013 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001014 return self.tk.call(self._w, 'item', 'exists', entry, col)
1015
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001016 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001017 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001018
Martin v. Löwis433fa692004-03-21 15:26:44 +00001019 def entrycget(self, entry, opt):
1020 return self.tk.call(self._w, 'entrycget', entry, opt)
1021
1022 def entryconfigure(self, entry, cnf={}, **kw):
1023 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001024 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001025 self.tk.call(self._w, 'entryconfigure', entry,
1026 *self._options(cnf, kw))
1027
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001028 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001029 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001030
1031 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001032 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001033
1034 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001035 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001036
1037 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001038 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001039
1040 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001041 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001042
1043 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001044 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001045
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001046class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001047 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001048
1049 Subwidgets - None"""
1050
1051 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001052 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001053
1054class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001055 """LabelEntry - Entry field with label. Packages an entry widget
Martin Pantera90a4a92016-05-30 04:04:50 +00001056 and a label into one mega widget. It can be used to simplify the creation
1057 of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001058
Moshe Zadka22710822001-03-21 17:24:49 +00001059 Subwidgets Class
1060 ---------- -----
1061 label Label
1062 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001063
1064 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001065 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001066 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001067 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1068 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001069
1070class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001071 """LabelFrame - Labelled Frame container. Packages a frame widget
1072 and a label into one mega widget. To create widgets inside a
1073 LabelFrame widget, one creates the new widgets relative to the
1074 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001075
Moshe Zadka22710822001-03-21 17:24:49 +00001076 Subwidgets Class
1077 ---------- -----
1078 label Label
1079 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001080
1081 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001082 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001083 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001084 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1085 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001086
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001087
1088class ListNoteBook(TixWidget):
1089 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1090 it can be used to display many windows in a limited space using a
1091 notebook metaphor. The notebook is divided into a stack of pages
1092 (windows). At one time only one of these pages can be shown.
1093 The user can navigate through these pages by
1094 choosing the name of the desired page in the hlist subwidget."""
1095
1096 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001097 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1098 # Is this necessary? It's not an exposed subwidget in Tix.
1099 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1100 destroy_physically=0)
1101 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1102 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001103
1104 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001105 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001106 self.subwidget_list[name] = TixSubWidget(self, name)
1107 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001108
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001109 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001110 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001111
1112 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001113 # Can't call subwidgets_all directly because we don't want .nbframe
1114 names = self.tk.split(self.tk.call(self._w, 'pages'))
1115 ret = []
1116 for x in names:
1117 ret.append(self.subwidget(x))
1118 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001119
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001120 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001121 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001122
1123class Meter(TixWidget):
1124 """The Meter widget can be used to show the progress of a background
1125 job which may take a long time to execute.
1126 """
1127
1128 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001129 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001130 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001131
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001132class NoteBook(TixWidget):
1133 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1134
Moshe Zadka22710822001-03-21 17:24:49 +00001135 Subwidgets Class
1136 ---------- -----
1137 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001138 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001139
1140 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001141 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1142 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001143 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001144
1145 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001146 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001147 self.subwidget_list[name] = TixSubWidget(self, name)
1148 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001149
1150 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001151 self.tk.call(self._w, 'delete', name)
1152 self.subwidget_list[name].destroy()
1153 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001154
1155 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001156 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001157
1158 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001159 # Can't call subwidgets_all directly because we don't want .nbframe
1160 names = self.tk.split(self.tk.call(self._w, 'pages'))
1161 ret = []
1162 for x in names:
1163 ret.append(self.subwidget(x))
1164 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001165
Moshe Zadka22710822001-03-21 17:24:49 +00001166 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001167 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001168
1169 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001170 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001171
1172class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001173 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001174 pass
1175
1176class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001177 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001178
Moshe Zadka22710822001-03-21 17:24:49 +00001179 Subwidget Class
1180 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001181 menubutton Menubutton
1182 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001183
1184 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001185 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1186 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1187 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001188
1189 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001190 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001191
1192 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001193 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001194
1195 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001196 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001197
1198 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001199 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001200
1201 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001202 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001203
1204class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001205 """PanedWindow - Multi-pane container widget
1206 allows the user to interactively manipulate the sizes of several
1207 panes. The panes can be arranged either vertically or horizontally.The
1208 user changes the sizes of the panes by dragging the resize handle
1209 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001210
Moshe Zadka22710822001-03-21 17:24:49 +00001211 Subwidgets Class
1212 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001213 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001214
1215 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001216 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001217
Neal Norwitzf539bde2002-11-14 02:43:40 +00001218 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001219 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001220 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001221 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001222 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001223 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001224
Neal Norwitzf539bde2002-11-14 02:43:40 +00001225 def delete(self, name):
1226 self.tk.call(self._w, 'delete', name)
1227 self.subwidget_list[name].destroy()
1228 del self.subwidget_list[name]
1229
1230 def forget(self, name):
1231 self.tk.call(self._w, 'forget', name)
1232
1233 def panecget(self, entry, opt):
1234 return self.tk.call(self._w, 'panecget', entry, opt)
1235
1236 def paneconfigure(self, entry, cnf={}, **kw):
1237 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001238 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001239 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001240
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001241 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001242 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1243 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001244
1245class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001246 """PopupMenu widget can be used as a replacement of the tk_popup command.
1247 The advantage of the Tix PopupMenu widget is it requires less application
1248 code to manipulate.
1249
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001250
Moshe Zadka22710822001-03-21 17:24:49 +00001251 Subwidgets Class
1252 ---------- -----
1253 menubutton Menubutton
1254 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001255
Martin v. Löwis46874282002-12-06 10:33:45 +00001256 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001257 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001258 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1259 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1260 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001261
1262 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001263 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001264
1265 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001266 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001267
1268 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001269 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001270
1271class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001272 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001273 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001274 # There seems to be a Tix bug rejecting the configure method
1275 # Let's try making the flags -static
1276 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1277 'handlesize', 'hintcolor', 'hintwidth',
1278 'x', 'y']
1279 # In fact, x y height width are configurable
1280 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001281 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001282
1283 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001284 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001285
Martin v. Löwis652e1912001-11-25 14:50:56 +00001286 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001287 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001288
1289 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001290 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001291
1292 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001293 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001294
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001295class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001296 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001297
Martin v. Löwis46874282002-12-06 10:33:45 +00001298 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001299 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001300 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001301 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001302 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1303 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1304 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001305
1306class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001307 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001308
Martin v. Löwis46874282002-12-06 10:33:45 +00001309 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001310 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001311 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1312 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1313 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1314 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001315
1316class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001317 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001318
Martin v. Löwis46874282002-12-06 10:33:45 +00001319 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001320 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001321 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1322 self.subwidget_list['text'] = _dummyText(self, 'text')
1323 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1324 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001325
1326class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001327 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001328
Martin v. Löwis46874282002-12-06 10:33:45 +00001329 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001330 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001331 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001332 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001333 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1334 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1335 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001336
1337class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001338 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001339
Martin v. Löwis46874282002-12-06 10:33:45 +00001340 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001341 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001342 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1343 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1344 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1345 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001346
1347class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001348 """Select - Container of button subwidgets. It can be used to provide
1349 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001350
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001351 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001352
Martin v. Löwis46874282002-12-06 10:33:45 +00001353 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001354 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001355 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001356 ['allowzero', 'radio', 'orientation', 'labelside',
1357 'options'],
1358 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001359 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001360
1361 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001362 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001363 self.subwidget_list[name] = _dummyButton(self, name)
1364 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001365
1366 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001367 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001368
Neal Norwitzf539bde2002-11-14 02:43:40 +00001369class Shell(TixWidget):
1370 """Toplevel window.
1371
1372 Subwidgets - None"""
1373
1374 def __init__ (self,master=None,cnf={}, **kw):
1375 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1376
1377class DialogShell(TixWidget):
1378 """Toplevel window, with popup popdown and center methods.
1379 It tells the window manager that it is a dialog window and should be
1380 treated specially. The exact treatment depends on the treatment of
1381 the window manager.
1382
1383 Subwidgets - None"""
1384
Martin v. Löwis46874282002-12-06 10:33:45 +00001385 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001386 def __init__ (self,master=None,cnf={}, **kw):
1387 TixWidget.__init__(self, master,
1388 'tixDialogShell',
1389 ['options', 'title', 'mapped',
1390 'minheight', 'minwidth',
1391 'parent', 'transient'], cnf, kw)
1392
1393 def popdown(self):
1394 self.tk.call(self._w, 'popdown')
1395
1396 def popup(self):
1397 self.tk.call(self._w, 'popup')
1398
1399 def center(self):
1400 self.tk.call(self._w, 'center')
1401
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001402class StdButtonBox(TixWidget):
1403 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1404
1405 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001406 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001407 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001408 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1409 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1410 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1411 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001412
1413 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001414 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001415 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001416
Guilherme Polo1fff0082009-08-14 15:05:30 +00001417class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001418 """TList - Hierarchy display widget which can be
1419 used to display data in a tabular format. The list entries of a TList
1420 widget are similar to the entries in the Tk listbox widget. The main
1421 differences are (1) the TList widget can display the list entries in a
1422 two dimensional format and (2) you can use graphical images as well as
1423 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001424
1425 Subwidgets - None"""
1426
1427 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001428 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001429
1430 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001431 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001432
1433 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001434 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001435
1436 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001437 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001438
1439 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001440 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001441
1442 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001443 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001444
1445 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001446 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001447
1448 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001449 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001450
1451 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001452 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001453
1454 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001455 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001456
1457 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001458 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001459
1460 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001461 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001462
1463 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001464 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001465
1466 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001467 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001468
1469 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001470 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001471
1472 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001473 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001474
1475 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001476 c = self.tk.call(self._w, 'info', 'selection')
1477 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001478
1479 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001480 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001481
1482 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001483 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001484
1485 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001486 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001487
1488 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001489 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001490
1491 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001492 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001493
1494 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001495 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001496
1497 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001498 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001499
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001500class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001501 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001502 data in a tree form. The user can adjust
1503 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001504
Martin v. Löwis46874282002-12-06 10:33:45 +00001505 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001506 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001507 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001508 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001509 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1510 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1511 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001512
1513 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001514 '''This command calls the setmode method for all the entries in this
1515 Tree widget: if an entry has no child entries, its mode is set to
1516 none. Otherwise, if the entry has any hidden child entries, its mode is
1517 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001518 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001519
1520 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001521 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001522 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001523
1524 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001525 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001526 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001527
1528 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001529 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001530 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001531
1532 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001533 '''This command is used to indicate whether the entry given by
1534 entryPath has children entries and whether the children are visible. mode
1535 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001536 indicator is drawn next the entry. If mode is set to close, a (-)
1537 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001538 indicators will be drawn for this entry. The default mode is none. The
1539 open mode indicates the entry has hidden children and this entry can be
1540 opened by the user. The close mode indicates that all the children of the
1541 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001542 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001543
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001544
1545# Could try subclassing Tree for CheckList - would need another arg to init
1546class CheckList(TixWidget):
1547 """The CheckList widget
1548 displays a list of items to be selected by the user. CheckList acts
1549 similarly to the Tk checkbutton or radiobutton widgets, except it is
1550 capable of handling many more items than checkbuttons or radiobuttons.
1551 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001552 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001553 def __init__(self, master=None, cnf={}, **kw):
1554 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001555 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001556 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1557 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1558 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001559
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001560 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001561 '''This command calls the setmode method for all the entries in this
1562 Tree widget: if an entry has no child entries, its mode is set to
1563 none. Otherwise, if the entry has any hidden child entries, its mode is
1564 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001565 self.tk.call(self._w, 'autosetmode')
1566
1567 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001568 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001569 self.tk.call(self._w, 'close', entrypath)
1570
1571 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001572 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001573 return self.tk.call(self._w, 'getmode', entrypath)
1574
1575 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001576 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001577 self.tk.call(self._w, 'open', entrypath)
1578
1579 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001580 '''Returns a list of items whose status matches status. If status is
1581 not specified, the list of items in the "on" status will be returned.
1582 Mode can be on, off, default'''
1583 c = self.tk.split(self.tk.call(self._w, 'getselection', mode))
1584 return self.tk.splitlist(c)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001585
1586 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001587 '''Returns the current status of entryPath.'''
1588 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001589
1590 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001591 '''Sets the status of entryPath to be status. A bitmap will be
1592 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001593 self.tk.call(self._w, 'setstatus', entrypath, mode)
1594
1595
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001596###########################################################################
1597### The subclassing below is used to instantiate the subwidgets in each ###
1598### mega widget. This allows us to access their methods directly. ###
1599###########################################################################
1600
1601class _dummyButton(Button, TixSubWidget):
1602 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001603 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001604
1605class _dummyCheckbutton(Checkbutton, TixSubWidget):
1606 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001607 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001608
1609class _dummyEntry(Entry, TixSubWidget):
1610 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001611 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001612
1613class _dummyFrame(Frame, TixSubWidget):
1614 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001615 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001616
1617class _dummyLabel(Label, TixSubWidget):
1618 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001619 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001620
1621class _dummyListbox(Listbox, TixSubWidget):
1622 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001623 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001624
1625class _dummyMenu(Menu, TixSubWidget):
1626 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001627 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001628
1629class _dummyMenubutton(Menubutton, TixSubWidget):
1630 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001631 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001632
1633class _dummyScrollbar(Scrollbar, TixSubWidget):
1634 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001635 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001636
1637class _dummyText(Text, TixSubWidget):
1638 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001639 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001640
1641class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1642 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001643 TixSubWidget.__init__(self, master, name, destroy_physically)
1644 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1645 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1646 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001647
1648class _dummyHList(HList, TixSubWidget):
1649 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001650 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001651
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001652class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1653 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001654 TixSubWidget.__init__(self, master, name, destroy_physically)
1655 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1656 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1657 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001658
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001659class _dummyTList(TList, TixSubWidget):
1660 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001661 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001662
1663class _dummyComboBox(ComboBox, TixSubWidget):
1664 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001665 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1666 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001667 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1668 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001669
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001670 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001671 'slistbox')
1672 try:
1673 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1674 #cross Button : present if created with the fancy option
1675 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1676 except TypeError:
1677 # unavailable when -fancy not specified
1678 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001679
1680class _dummyDirList(DirList, TixSubWidget):
1681 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001682 TixSubWidget.__init__(self, master, name, destroy_physically)
1683 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1684 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1685 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001686
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001687class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1688 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001689 TixSubWidget.__init__(self, master, name, destroy_physically)
1690 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1691 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001692
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001693class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1694 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001695 TixSubWidget.__init__(self, master, name, destroy_physically)
1696 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1697 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1698 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1699 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1700 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1701 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1702 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1703 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001704
1705class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1706 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001707 TixSubWidget.__init__(self, master, name, destroy_physically)
1708 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1709 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1710 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1711 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001712
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001713class _dummyFileComboBox(ComboBox, TixSubWidget):
1714 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001715 TixSubWidget.__init__(self, master, name, destroy_physically)
1716 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001717
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001718class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1719 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001720 TixSubWidget.__init__(self, master, name, destroy_physically)
1721 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1722 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1723 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1724 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001725
1726class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1727 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001728 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001729
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001730class _dummyPanedWindow(PanedWindow, TixSubWidget):
1731 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001732 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001733
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001734########################
1735### Utility Routines ###
1736########################
1737
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001738#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1739
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001740def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001741 '''Returns the qualified path name for the widget. Normally used to set
1742 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001743 return widget.tk.call('tixOptionName', widget._w)
1744
1745# Called with a dictionary argument of the form
1746# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1747# returns a string which can be used to configure the fsbox file types
1748# in an ExFileSelectBox. i.e.,
1749# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1750def FileTypeList(dict):
1751 s = ''
1752 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001753 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001754 return s
1755
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001756# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001757# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001758class CObjView(TixWidget):
1759 """This file implements the Canvas Object View widget. This is a base
1760 class of IconView. It implements automatic placement/adjustment of the
1761 scrollbars according to the canvas objects inside the canvas subwidget.
1762 The scrollbars are adjusted so that the canvas is just large enough
1763 to see all the objects.
1764 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001765 # FIXME: It should inherit -superclass tixScrolledWidget
1766 pass
1767
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001768
Guilherme Polo1fff0082009-08-14 15:05:30 +00001769class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001770 '''The Tix Grid command creates a new window and makes it into a
1771 tixGrid widget. Additional options, may be specified on the command
1772 line or in the option database to configure aspects such as its cursor
1773 and relief.
1774
1775 A Grid widget displays its contents in a two dimensional grid of cells.
1776 Each cell may contain one Tix display item, which may be in text,
1777 graphics or other formats. See the DisplayStyle class for more information
1778 about Tix display items. Individual cells, or groups of cells, can be
1779 formatted with a wide range of attributes, such as its color, relief and
1780 border.
1781
1782 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001783 # valid specific resources as of Tk 8.4
1784 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1785 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1786 # selectunit, topmargin,
1787 def __init__(self, master=None, cnf={}, **kw):
1788 static= []
1789 self.cnf= cnf
1790 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001791
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001792 # valid options as of Tk 8.4
Guilherme Polobcd03df2009-08-18 15:35:57 +00001793 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
1794 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
1795 # selection, set, size, unset, xview, yview
1796 def anchor_clear(self):
1797 """Removes the selection anchor."""
1798 self.tk.call(self, 'anchor', 'clear')
1799
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001800 def anchor_get(self):
1801 "Get the (x,y) coordinate of the current anchor cell"
1802 return self._getints(self.tk.call(self, 'anchor', 'get'))
1803
Guilherme Polobcd03df2009-08-18 15:35:57 +00001804 def anchor_set(self, x, y):
1805 """Set the selection anchor to the cell at (x, y)."""
1806 self.tk.call(self, 'anchor', 'set', x, y)
1807
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001808 def delete_row(self, from_, to=None):
1809 """Delete rows between from_ and to inclusive.
1810 If to is not provided, delete only row at from_"""
1811 if to is None:
1812 self.tk.call(self, 'delete', 'row', from_)
1813 else:
1814 self.tk.call(self, 'delete', 'row', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001815
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001816 def delete_column(self, from_, to=None):
1817 """Delete columns between from_ and to inclusive.
1818 If to is not provided, delete only column at from_"""
1819 if to is None:
1820 self.tk.call(self, 'delete', 'column', from_)
1821 else:
1822 self.tk.call(self, 'delete', 'column', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001823
1824 def edit_apply(self):
1825 """If any cell is being edited, de-highlight the cell and applies
1826 the changes."""
1827 self.tk.call(self, 'edit', 'apply')
1828
1829 def edit_set(self, x, y):
1830 """Highlights the cell at (x, y) for editing, if the -editnotify
1831 command returns True for this cell."""
1832 self.tk.call(self, 'edit', 'set', x, y)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001833
1834 def entrycget(self, x, y, option):
1835 "Get the option value for cell at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001836 if option and option[0] != '-':
1837 option = '-' + option
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001838 return self.tk.call(self, 'entrycget', x, y, option)
1839
Guilherme Polobcd03df2009-08-18 15:35:57 +00001840 def entryconfigure(self, x, y, cnf=None, **kw):
1841 return self._configure(('entryconfigure', x, y), cnf, kw)
1842
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001843 # def format
1844 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845
1846 def info_exists(self, x, y):
1847 "Return True if display item exists at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001848 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001849
1850 def info_bbox(self, x, y):
1851 # This seems to always return '', at least for 'text' displayitems
1852 return self.tk.call(self, 'info', 'bbox', x, y)
1853
Guilherme Polobcd03df2009-08-18 15:35:57 +00001854 def move_column(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001855 """Moves the range of columns from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001856 the distance indicated by OFFSET. For example, move_column(2, 4, 1)
1857 moves the columns 2,3,4 to columns 3,4,5."""
1858 self.tk.call(self, 'move', 'column', from_, to, offset)
1859
1860 def move_row(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001861 """Moves the range of rows from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001862 the distance indicated by OFFSET.
1863 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
1864 self.tk.call(self, 'move', 'row', from_, to, offset)
1865
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866 def nearest(self, x, y):
1867 "Return coordinate of cell nearest pixel coordinate (x,y)"
1868 return self._getints(self.tk.call(self, 'nearest', x, y))
1869
1870 # def selection adjust
1871 # def selection clear
1872 # def selection includes
1873 # def selection set
1874 # def selection toggle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001875
1876 def set(self, x, y, itemtype=None, **kw):
1877 args= self._options(self.cnf, kw)
1878 if itemtype is not None:
1879 args= ('-itemtype', itemtype) + args
1880 self.tk.call(self, 'set', x, y, *args)
1881
Guilherme Polobcd03df2009-08-18 15:35:57 +00001882 def size_column(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001883 """Queries or sets the size of the column given by
1884 INDEX. INDEX may be any non-negative
1885 integer that gives the position of a given column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001886 INDEX can also be the string "default"; in this case, this command
1887 queries or sets the default size of all columns.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001888 When no option-value pair is given, this command returns a tuple
1889 containing the current size setting of the given column. When
1890 option-value pairs are given, the corresponding options of the
Guilherme Polobcd03df2009-08-18 15:35:57 +00001891 size setting of the given column are changed. Options may be one
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001892 of the follwing:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001893 pad0 pixels
1894 Specifies the paddings to the left of a column.
1895 pad1 pixels
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001896 Specifies the paddings to the right of a column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001897 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001898 Specifies the width of a column. Val may be:
1899 "auto" -- the width of the column is set to the
1900 width of the widest cell in the column;
1901 a valid Tk screen distance unit;
1902 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001903 (e.g. 3.4chars) that sets the width of the column to the
1904 given number of characters."""
1905 return self.tk.split(self.tk.call(self._w, 'size', 'column', index,
1906 *self._options({}, kw)))
1907
1908 def size_row(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001909 """Queries or sets the size of the row given by
1910 INDEX. INDEX may be any non-negative
1911 integer that gives the position of a given row .
Guilherme Polobcd03df2009-08-18 15:35:57 +00001912 INDEX can also be the string "default"; in this case, this command
1913 queries or sets the default size of all rows.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001914 When no option-value pair is given, this command returns a list con-
1915 taining the current size setting of the given row . When option-value
Guilherme Polobcd03df2009-08-18 15:35:57 +00001916 pairs are given, the corresponding options of the size setting of the
1917 given row are changed. Options may be one of the follwing:
1918 pad0 pixels
1919 Specifies the paddings to the top of a row.
1920 pad1 pixels
Ezio Melottie130a522011-10-19 10:58:56 +03001921 Specifies the paddings to the bottom of a row.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001922 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001923 Specifies the height of a row. Val may be:
1924 "auto" -- the height of the row is set to the
1925 height of the highest cell in the row;
1926 a valid Tk screen distance unit;
1927 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001928 (e.g. 3.4chars) that sets the height of the row to the
1929 given number of characters."""
1930 return self.tk.split(self.tk.call(
1931 self, 'size', 'row', index, *self._options({}, kw)))
1932
1933 def unset(self, x, y):
1934 """Clears the cell at (x, y) by removing its display item."""
1935 self.tk.call(self._w, 'unset', x, y)
1936
Raymond Hettingerff41c482003-04-06 09:01:11 +00001937
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001938class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001939 '''Scrolled Grid widgets'''
1940
1941 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001942 def __init__(self, master=None, cnf={}, **kw):
1943 static= []
1944 self.cnf= cnf
1945 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)