blob: 7d24075403649c811fa6c751220d18264759fbc4 [file] [log] [blame]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001# Tix.py -- Tix widget wrappers.
2#
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00003# For Tix, see http://tix.sourceforge.net
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00004#
Moshe Zadka22710822001-03-21 17:24:49 +00005# - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995.
Martin v. Löwisb7b32602001-11-02 23:48:20 +00006# based on an idea of Jean-Marc Lugrin (lugrin@ms.com)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00007#
8# NOTE: In order to minimize changes to Tkinter.py, some of the code here
Moshe Zadka22710822001-03-21 17:24:49 +00009# (TixWidget.__init__) has been taken from Tkinter (Widget.__init__)
10# and will break if there are major changes in Tkinter.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000011#
12# The Tix widgets are represented by a class hierarchy in python with proper
13# inheritance of base classes.
14#
15# As a result after creating a 'w = StdButtonBox', I can write
Moshe Zadka22710822001-03-21 17:24:49 +000016# w.ok['text'] = 'Who Cares'
17# or w.ok['bg'] = w['bg']
18# or even w.ok.invoke()
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000019# etc.
20#
21# Compare the demo tixwidgets.py to the original Tcl program and you will
22# appreciate the advantages.
23#
24
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040025import os
26import tkinter
Georg Brandl14fc4272008-05-17 18:39:55 +000027from tkinter import *
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040028from tkinter import _cnfmerge
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000029
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000030import _tkinter # If this fails your Python may not be configured for Tk
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000031
32# Some more constants (for consistency with Tkinter)
33WINDOW = 'window'
34TEXT = 'text'
35STATUS = 'status'
36IMMEDIATE = 'immediate'
37IMAGE = 'image'
38IMAGETEXT = 'imagetext'
39BALLOON = 'balloon'
40AUTO = 'auto'
41ACROSSTOP = 'acrosstop'
42
Guilherme Polobcd03df2009-08-18 15:35:57 +000043# A few useful constants for the Grid widget
44ASCII = 'ascii'
45CELL = 'cell'
46COLUMN = 'column'
47DECREASING = 'decreasing'
48INCREASING = 'increasing'
49INTEGER = 'integer'
50MAIN = 'main'
51MAX = 'max'
52REAL = 'real'
53ROW = 'row'
54S_REGION = 's-region'
55X_REGION = 'x-region'
56Y_REGION = 'y-region'
57
Fred Drake723293c2001-12-13 04:53:07 +000058# Some constants used by Tkinter dooneevent()
59TCL_DONT_WAIT = 1 << 1
60TCL_WINDOW_EVENTS = 1 << 2
61TCL_FILE_EVENTS = 1 << 3
62TCL_TIMER_EVENTS = 1 << 4
63TCL_IDLE_EVENTS = 1 << 5
64TCL_ALL_EVENTS = 0
65
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000066# BEWARE - this is implemented by copying some code from the Widget class
67# in Tkinter (to override Widget initialization) and is therefore
68# liable to break.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000069
70# Could probably add this to Tkinter.Misc
71class tixCommand:
Fred Drake723293c2001-12-13 04:53:07 +000072 """The tix commands provide access to miscellaneous elements
Martin v. Löwisb7b32602001-11-02 23:48:20 +000073 of Tix's internal state and the Tix application context.
Fred Drake723293c2001-12-13 04:53:07 +000074 Most of the information manipulated by these commands pertains
75 to the application as a whole, or to a screen or
76 display, rather than to a particular window.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000077
78 This is a mixin class, assumed to be mixed to Tkinter.Tk
79 that supports the self.tk.call method.
80 """
Fred Drake723293c2001-12-13 04:53:07 +000081
Martin v. Löwisb7b32602001-11-02 23:48:20 +000082 def tix_addbitmapdir(self, directory):
Fred Drake723293c2001-12-13 04:53:07 +000083 """Tix maintains a list of directories under which
Martin v. Löwisb7b32602001-11-02 23:48:20 +000084 the tix_getimage and tix_getbitmap commands will
Fred Drake723293c2001-12-13 04:53:07 +000085 search for image files. The standard bitmap directory
86 is $TIX_LIBRARY/bitmaps. The addbitmapdir command
87 adds directory into this list. By using this
Martin v. Löwisb7b32602001-11-02 23:48:20 +000088 command, the image files of an applications can
89 also be located using the tix_getimage or tix_getbitmap
90 command.
91 """
92 return self.tk.call('tix', 'addbitmapdir', directory)
93
94 def tix_cget(self, option):
95 """Returns the current value of the configuration
96 option given by option. Option may be any of the
97 options described in the CONFIGURATION OPTIONS section.
98 """
99 return self.tk.call('tix', 'cget', option)
100
101 def tix_configure(self, cnf=None, **kw):
Fred Drake723293c2001-12-13 04:53:07 +0000102 """Query or modify the configuration options of the Tix application
103 context. If no option is specified, returns a dictionary all of the
104 available options. If option is specified with no value, then the
105 command returns a list describing the one named option (this list
106 will be identical to the corresponding sublist of the value
107 returned if no option is specified). If one or more option-value
108 pairs are specified, then the command modifies the given option(s)
109 to have the given value(s); in this case the command returns an
110 empty string. Option may be any of the configuration options.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000111 """
Fred Drake723293c2001-12-13 04:53:07 +0000112 # Copied from Tkinter.py
113 if kw:
114 cnf = _cnfmerge((cnf, kw))
115 elif cnf:
116 cnf = _cnfmerge(cnf)
117 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200118 return self._getconfigure('tix', 'configure')
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300119 if isinstance(cnf, str):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200120 return self._getconfigure1('tix', 'configure', '-'+cnf)
Fred Drake723293c2001-12-13 04:53:07 +0000121 return self.tk.call(('tix', 'configure') + self._options(cnf))
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000122
123 def tix_filedialog(self, dlgclass=None):
Fred Drake723293c2001-12-13 04:53:07 +0000124 """Returns the file selection dialog that may be shared among
125 different calls from this application. This command will create a
126 file selection dialog widget when it is called the first time. This
127 dialog will be returned by all subsequent calls to tix_filedialog.
128 An optional dlgclass parameter can be passed to specified what type
129 of file selection dialog widget is desired. Possible options are
130 tix FileSelectDialog or tixExFileSelectDialog.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000131 """
132 if dlgclass is not None:
133 return self.tk.call('tix', 'filedialog', dlgclass)
134 else:
135 return self.tk.call('tix', 'filedialog')
136
137 def tix_getbitmap(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000138 """Locates a bitmap file of the name name.xpm or name in one of the
139 bitmap directories (see the tix_addbitmapdir command above). By
140 using tix_getbitmap, you can avoid hard coding the pathnames of the
141 bitmap files in your application. When successful, it returns the
142 complete pathname of the bitmap file, prefixed with the character
143 '@'. The returned value can be used to configure the -bitmap
144 option of the TK and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000145 """
146 return self.tk.call('tix', 'getbitmap', name)
147
148 def tix_getimage(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000149 """Locates an image file of the name name.xpm, name.xbm or name.ppm
150 in one of the bitmap directories (see the addbitmapdir command
151 above). If more than one file with the same name (but different
152 extensions) exist, then the image type is chosen according to the
153 depth of the X display: xbm images are chosen on monochrome
154 displays and color images are chosen on color displays. By using
Ezio Melotti42da6632011-03-15 05:18:48 +0200155 tix_ getimage, you can avoid hard coding the pathnames of the
Fred Drake723293c2001-12-13 04:53:07 +0000156 image files in your application. When successful, this command
157 returns the name of the newly created image, which can be used to
158 configure the -image option of the Tk and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000159 """
160 return self.tk.call('tix', 'getimage', name)
161
162 def tix_option_get(self, name):
Ezio Melotti13925002011-03-16 11:05:33 +0200163 """Gets the options maintained by the Tix
Fred Drake723293c2001-12-13 04:53:07 +0000164 scheme mechanism. Available options include:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000165
166 active_bg active_fg bg
167 bold_font dark1_bg dark1_fg
168 dark2_bg dark2_fg disabled_fg
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000169 fg fixed_font font
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000170 inactive_bg inactive_fg input1_bg
171 input2_bg italic_font light1_bg
172 light1_fg light2_bg light2_fg
173 menu_font output1_bg output2_bg
174 select_bg select_fg selector
175 """
176 # could use self.tk.globalgetvar('tixOption', name)
177 return self.tk.call('tix', 'option', 'get', name)
178
179 def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None):
Fred Drake723293c2001-12-13 04:53:07 +0000180 """Resets the scheme and fontset of the Tix application to
181 newScheme and newFontSet, respectively. This affects only those
182 widgets created after this call. Therefore, it is best to call the
183 resetoptions command before the creation of any widgets in a Tix
184 application.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000185
Fred Drake723293c2001-12-13 04:53:07 +0000186 The optional parameter newScmPrio can be given to reset the
187 priority level of the Tk options set by the Tix schemes.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000188
Fred Drake723293c2001-12-13 04:53:07 +0000189 Because of the way Tk handles the X option database, after Tix has
190 been has imported and inited, it is not possible to reset the color
191 schemes and font sets using the tix config command. Instead, the
192 tix_resetoptions command must be used.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000193 """
194 if newScmPrio is not None:
195 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio)
196 else:
197 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet)
198
Georg Brandl14fc4272008-05-17 18:39:55 +0000199class Tk(tkinter.Tk, tixCommand):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000200 """Toplevel widget of Tix which represents mostly the main window
201 of an application. It has an associated Tcl interpreter."""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000202 def __init__(self, screenName=None, baseName=None, className='Tix'):
Georg Brandl14fc4272008-05-17 18:39:55 +0000203 tkinter.Tk.__init__(self, screenName, baseName, className)
Moshe Zadka22710822001-03-21 17:24:49 +0000204 tixlib = os.environ.get('TIX_LIBRARY')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000205 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]')
Moshe Zadka22710822001-03-21 17:24:49 +0000206 if tixlib is not None:
207 self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib)
208 self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000209 # Load Tix - this should work dynamically or statically
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000210 # If it's static, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000211 # 'load {} Tix'
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000212 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000213 # 'load libtix8.1.8.3.so Tix'
Moshe Zadka22710822001-03-21 17:24:49 +0000214 self.tk.eval('package require Tix')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000215
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000216 def destroy(self):
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300217 # For safety, remove the delete_window binding before destroy
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000218 self.protocol("WM_DELETE_WINDOW", "")
Georg Brandl14fc4272008-05-17 18:39:55 +0000219 tkinter.Tk.destroy(self)
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000220
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000221# The Tix 'tixForm' geometry manager
222class Form:
223 """The Tix Form geometry manager
224
225 Widgets can be arranged by specifying attachments to other widgets.
226 See Tix documentation for complete details"""
227
228 def config(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000229 self.tk.call('tixForm', self._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000230
231 form = config
232
233 def __setitem__(self, key, value):
Guido van Rossum49fa2bd2001-08-13 14:12:35 +0000234 Form.form(self, {key: value})
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000235
236 def check(self):
237 return self.tk.call('tixForm', 'check', self._w)
238
239 def forget(self):
240 self.tk.call('tixForm', 'forget', self._w)
241
242 def grid(self, xsize=0, ysize=0):
243 if (not xsize) and (not ysize):
244 x = self.tk.call('tixForm', 'grid', self._w)
245 y = self.tk.splitlist(x)
246 z = ()
247 for x in y:
248 z = z + (self.tk.getint(x),)
249 return z
Martin v. Löwis46874282002-12-06 10:33:45 +0000250 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000251
252 def info(self, option=None):
253 if not option:
254 return self.tk.call('tixForm', 'info', self._w)
255 if option[0] != '-':
256 option = '-' + option
257 return self.tk.call('tixForm', 'info', self._w, option)
258
259 def slaves(self):
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000260 return [self._nametowidget(x) for x in
261 self.tk.splitlist(
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000262 self.tk.call(
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000263 'tixForm', 'slaves', self._w))]
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000264
265
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000266
Georg Brandl14fc4272008-05-17 18:39:55 +0000267tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000268
Georg Brandl14fc4272008-05-17 18:39:55 +0000269class TixWidget(tkinter.Widget):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000270 """A TixWidget class is used to package all (or most) Tix widgets.
271
272 Widget initialization is extended in two ways:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000273 1) It is possible to give a list of options which must be part of
Moshe Zadka22710822001-03-21 17:24:49 +0000274 the creation command (so called Tix 'static' options). These cannot be
275 given as a 'config' command later.
276 2) It is possible to give the name of an existing TK widget. These are
277 child widgets created automatically by a Tix mega-widget. The Tk call
278 to create these widgets is therefore bypassed in TixWidget.__init__
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000279
280 Both options are for use by subclasses only.
281 """
282 def __init__ (self, master=None, widgetName=None,
Moshe Zadka22710822001-03-21 17:24:49 +0000283 static_options=None, cnf={}, kw={}):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000284 # Merge keywords and dictionary arguments
285 if kw:
Moshe Zadka22710822001-03-21 17:24:49 +0000286 cnf = _cnfmerge((cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000287 else:
288 cnf = _cnfmerge(cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000289
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000290 # Move static options into extra. static_options must be
291 # a list of keywords (or None).
292 extra=()
Neal Norwitzf539bde2002-11-14 02:43:40 +0000293
294 # 'options' is always a static option
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000295 if static_options:
Neal Norwitzf539bde2002-11-14 02:43:40 +0000296 static_options.append('options')
297 else:
298 static_options = ['options']
Raymond Hettingerff41c482003-04-06 09:01:11 +0000299
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000300 for k,v in list(cnf.items()):
Neal Norwitzf539bde2002-11-14 02:43:40 +0000301 if k in static_options:
302 extra = extra + ('-' + k, v)
303 del cnf[k]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000304
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000305 self.widgetName = widgetName
306 Widget._setup(self, master, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000307
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000308 # If widgetName is None, this is a dummy creation call where the
309 # corresponding Tk widget has already been created by Tix
310 if widgetName:
Raymond Hettingerff41c482003-04-06 09:01:11 +0000311 self.tk.call(widgetName, self._w, *extra)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000312
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000313 # Non-static options - to be done via a 'config' command
314 if cnf:
315 Widget.config(self, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000316
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000317 # Dictionary to hold subwidget names for easier access. We can't
318 # use the children list because the public Tix names may not be the
319 # same as the pathname component
320 self.subwidget_list = {}
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000321
322 # We set up an attribute access function so that it is possible to
323 # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello'
324 # when w is a StdButtonBox.
325 # We can even do w.ok.invoke() because w.ok is subclassed from the
326 # Button class if you go through the proper constructors
327 def __getattr__(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000328 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000329 return self.subwidget_list[name]
Collin Winterce36ad82007-08-30 01:19:48 +0000330 raise AttributeError(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000331
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000332 def set_silent(self, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000333 """Set a variable without calling its action routine"""
334 self.tk.call('tixSetSilent', self._w, value)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000335
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000336 def subwidget(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000337 """Return the named subwidget (which must have been created by
338 the sub-class)."""
339 n = self._subwidget_name(name)
340 if not n:
Collin Winterce36ad82007-08-30 01:19:48 +0000341 raise TclError("Subwidget " + name + " not child of " + self._name)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000342 # Remove header of name and leading dot
343 n = n[len(self._w)+1:]
344 return self._nametowidget(n)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000345
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000346 def subwidgets_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000347 """Return all subwidgets."""
348 names = self._subwidget_names()
349 if not names:
350 return []
351 retlist = []
352 for name in names:
353 name = name[len(self._w)+1:]
354 try:
355 retlist.append(self._nametowidget(name))
356 except:
357 # some of the widgets are unknown e.g. border in LabelFrame
358 pass
359 return retlist
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000360
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000361 def _subwidget_name(self,name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000362 """Get a subwidget name (returns a String, not a Widget !)"""
363 try:
364 return self.tk.call(self._w, 'subwidget', name)
365 except TclError:
366 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000367
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000368 def _subwidget_names(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000369 """Return the name of all subwidgets."""
370 try:
371 x = self.tk.call(self._w, 'subwidgets', '-all')
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200372 return self.tk.splitlist(x)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000373 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 config_all(self, option, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000377 """Set configuration options for all subwidgets (and self)."""
378 if option == '':
379 return
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300380 elif not isinstance(option, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000381 option = repr(option)
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300382 if not isinstance(value, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000383 value = repr(value)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000384 names = self._subwidget_names()
385 for name in names:
386 self.tk.call(name, 'configure', '-' + option, value)
Neal Norwitz731a9862002-12-10 02:18:49 +0000387 # These are missing from Tkinter
388 def image_create(self, imgtype, cnf={}, master=None, **kw):
Serhiy Storchakabb70b2a2020-12-25 17:04:26 +0200389 if master is None:
Serhiy Storchaka3d569fd2020-12-19 12:17:08 +0200390 master = self
Neal Norwitz731a9862002-12-10 02:18:49 +0000391 if kw and cnf: cnf = _cnfmerge((cnf, kw))
392 elif kw: cnf = kw
393 options = ()
394 for k, v in cnf.items():
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200395 if callable(v):
Neal Norwitz731a9862002-12-10 02:18:49 +0000396 v = self._register(v)
397 options = options + ('-'+k, v)
398 return master.tk.call(('image', 'create', imgtype,) + options)
399 def image_delete(self, imgname):
400 try:
401 self.tk.call('image', 'delete', imgname)
402 except TclError:
403 # May happen if the root was destroyed
404 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000405
406# Subwidgets are child widgets created automatically by mega-widgets.
407# In python, we have to create these subwidgets manually to mirror their
408# existence in Tk/Tix.
409class TixSubWidget(TixWidget):
410 """Subwidget class.
411
412 This is used to mirror child widgets automatically created
413 by Tix/Tk as part of a mega-widget in Python (which is not informed
414 of this)"""
415
416 def __init__(self, master, name,
Moshe Zadka22710822001-03-21 17:24:49 +0000417 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000418 if check_intermediate:
419 path = master._subwidget_name(name)
420 try:
421 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000422 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000423 except:
424 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000425
Thomas Wouters89f507f2006-12-13 04:49:30 +0000426 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000427 # immediate descendant
428 TixWidget.__init__(self, master, None, None, {'name' : name})
429 else:
430 # Ensure that the intermediate widgets exist
431 parent = master
432 for i in range(len(plist) - 1):
Neal Norwitzebb41902002-05-31 20:51:31 +0000433 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000434 try:
435 w = master._nametowidget(n)
436 parent = w
437 except KeyError:
438 # Create the intermediate widget
439 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000440 destroy_physically=0,
441 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000442 # The Tk widget name is in plist, not in name
443 if plist:
444 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000445 TixWidget.__init__(self, parent, None, None, {'name' : name})
446 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000447
448 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000449 # For some widgets e.g., a NoteBook, when we call destructors,
450 # we must be careful not to destroy the frame widget since this
451 # also destroys the parent NoteBook thus leading to an exception
452 # in Tkinter when it finally calls Tcl to destroy the NoteBook
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000453 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000454 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000455 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000456 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000457 del self.master.subwidget_list[self._name]
458 if self.destroy_physically:
459 # This is bypassed only for a few widgets
460 self.tk.call('destroy', self._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000461
462
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000463# Useful class to create a display style - later shared by many items.
464# Contributed by Steffen Kremser
465class DisplayStyle:
466 """DisplayStyle - handle configuration options shared by
467 (multiple) Display Items"""
468
Serhiy Storchaka1aca3892016-09-25 16:52:13 +0300469 def __init__(self, itemtype, cnf={}, *, master=None, **kw):
Serhiy Storchakabb70b2a2020-12-25 17:04:26 +0200470 if master is None:
Serhiy Storchaka1aca3892016-09-25 16:52:13 +0300471 if 'refwindow' in kw:
472 master = kw['refwindow']
473 elif 'refwindow' in cnf:
474 master = cnf['refwindow']
475 else:
Serhiy Storchaka3d569fd2020-12-19 12:17:08 +0200476 master = tkinter._get_default_root('create display style')
Moshe Zadka22710822001-03-21 17:24:49 +0000477 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000478 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
479 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000480
481 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000482 return self.stylename
483
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000484 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000485 if kw and cnf:
486 cnf = _cnfmerge((cnf, kw))
487 elif kw:
488 cnf = kw
489 opts = ()
490 for k, v in cnf.items():
491 opts = opts + ('-'+k, v)
492 return opts
493
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000494 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000495 self.tk.call(self.stylename, 'delete')
496
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000497 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000498 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
499
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000500 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200501 return self._getconfigure(
502 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000503
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000504 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000505 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000506
507
508######################################################
509### The Tix Widget classes - in alphabetical order ###
510######################################################
511
512class Balloon(TixWidget):
513 """Balloon help widget.
514
Moshe Zadka22710822001-03-21 17:24:49 +0000515 Subwidget Class
516 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000517 label Label
518 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000519
Martin v. Löwis46874282002-12-06 10:33:45 +0000520 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000521 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000522 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000523 static = ['options', 'installcolormap', 'initwait', 'statusbar',
524 'cursor']
525 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
526 self.subwidget_list['label'] = _dummyLabel(self, 'label',
527 destroy_physically=0)
528 self.subwidget_list['message'] = _dummyLabel(self, 'message',
529 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000530
531 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000532 """Bind balloon widget to another.
533 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000534 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000535
536 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000537 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000538
539class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000540 """ButtonBox - A container for pushbuttons.
541 Subwidgets are the buttons added with the add method.
542 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000543 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000544 TixWidget.__init__(self, master, 'tixButtonBox',
545 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000546
547 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000548 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000549
Raymond Hettingerff41c482003-04-06 09:01:11 +0000550 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000551 self.subwidget_list[name] = _dummyButton(self, name)
552 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000553
554 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000555 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000556 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000557
558class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000559 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200560 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000561 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000562
Moshe Zadka22710822001-03-21 17:24:49 +0000563 Subwidget Class
564 --------- -----
565 entry Entry
566 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000567 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000568 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000569 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000570
Martin v. Löwis46874282002-12-06 10:33:45 +0000571 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000572 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000573 TixWidget.__init__(self, master, 'tixComboBox',
574 ['editable', 'dropdown', 'fancy', 'options'],
575 cnf, kw)
576 self.subwidget_list['label'] = _dummyLabel(self, 'label')
577 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
578 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
579 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
580 'slistbox')
581 try:
582 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
583 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
584 except TypeError:
585 # unavailable when -fancy not specified
586 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000587
Neal Norwitz731a9862002-12-10 02:18:49 +0000588 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000589
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000590 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000591 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000592
593 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000594 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000595
596 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000597 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000598
599 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000600 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000601
602class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000603 """Control - An entry field with value change arrows. The user can
604 adjust the value by pressing the two arrow buttons or by entering
605 the value directly into the entry. The new value will be checked
606 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000607
Moshe Zadka22710822001-03-21 17:24:49 +0000608 Subwidget Class
609 --------- -----
610 incr Button
611 decr Button
612 entry Entry
613 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000614
Martin v. Löwis46874282002-12-06 10:33:45 +0000615 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000616 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000617 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
618 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
619 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
620 self.subwidget_list['label'] = _dummyLabel(self, 'label')
621 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000622
623 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000624 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000625
626 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000627 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000628
629 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000630 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000631
632 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000633 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000634
635class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000636 """DirList - displays a list view of a directory, its previous
637 directories and its sub-directories. The user can choose one of
638 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000639
Moshe Zadka22710822001-03-21 17:24:49 +0000640 Subwidget Class
641 --------- -----
642 hlist HList
643 hsb Scrollbar
644 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000645
Martin v. Löwis46874282002-12-06 10:33:45 +0000646 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000647 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000648 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
649 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
650 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
651 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000652
653 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000654 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000655
656class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000657 """DirTree - Directory Listing in a hierarchical view.
658 Displays a tree view of a directory, its previous directories and its
659 sub-directories. The user can choose one of the directories displayed
660 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000661
Moshe Zadka22710822001-03-21 17:24:49 +0000662 Subwidget Class
663 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000664 hlist HList
665 hsb Scrollbar
666 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000667
Martin v. Löwis46874282002-12-06 10:33:45 +0000668 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000669 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000670 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
671 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
672 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
673 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000674
675 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000676 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000677
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000678class DirSelectBox(TixWidget):
679 """DirSelectBox - Motif style file select box.
680 It is generally used for
681 the user to choose a file. FileSelectBox stores the files mostly
682 recently selected into a ComboBox widget so that they can be quickly
683 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000684
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000685 Subwidget Class
686 --------- -----
687 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000688 filter ComboBox
689 dirlist ScrolledListBox
690 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000691
692 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000693 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
694 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
695 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000696
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000697class ExFileSelectBox(TixWidget):
698 """ExFileSelectBox - MS Windows style file select box.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300699 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000700
Moshe Zadka22710822001-03-21 17:24:49 +0000701 Subwidget Class
702 --------- -----
703 cancel Button
704 ok Button
705 hidden Checkbutton
706 types ComboBox
707 dir ComboBox
708 file ComboBox
709 dirlist ScrolledListBox
710 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000711
712 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000713 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
714 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
715 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
716 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
717 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
718 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
719 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
720 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
721 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000722
723 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000724 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000725
726 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000727 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000728
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000729
730# Should inherit from a Dialog class
731class DirSelectDialog(TixWidget):
732 """The DirSelectDialog widget presents the directories in the file
733 system in a dialog window. The user can use this dialog window to
734 navigate through the file system to select the desired directory.
735
736 Subwidgets Class
737 ---------- -----
738 dirbox DirSelectDialog"""
739
Martin v. Löwis46874282002-12-06 10:33:45 +0000740 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000741 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000742 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000743 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000744 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
745 # cancel and ok buttons are missing
746
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000747 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000748 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000749
750 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000751 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000752
753
754# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000755class ExFileSelectDialog(TixWidget):
756 """ExFileSelectDialog - MS Windows style file select dialog.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300757 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000758
Moshe Zadka22710822001-03-21 17:24:49 +0000759 Subwidgets Class
760 ---------- -----
761 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000762
Martin v. Löwis46874282002-12-06 10:33:45 +0000763 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000764 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000765 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000766 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000767 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000768
769 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000770 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000771
772 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000773 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000774
775class FileSelectBox(TixWidget):
776 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000777 It is generally used for
778 the user to choose a file. FileSelectBox stores the files mostly
779 recently selected into a ComboBox widget so that they can be quickly
780 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000781
Moshe Zadka22710822001-03-21 17:24:49 +0000782 Subwidget Class
783 --------- -----
784 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000785 filter ComboBox
786 dirlist ScrolledListBox
787 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000788
789 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000790 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
791 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
792 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
793 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
794 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000795
Moshe Zadka22710822001-03-21 17:24:49 +0000796 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000797 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000798
799 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000800 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000801
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000802# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000803class FileSelectDialog(TixWidget):
804 """FileSelectDialog - Motif style file select dialog.
805
Moshe Zadka22710822001-03-21 17:24:49 +0000806 Subwidgets Class
807 ---------- -----
808 btns StdButtonBox
809 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000810
Martin v. Löwis46874282002-12-06 10:33:45 +0000811 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000812 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000813 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000814 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000815 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
816 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000817
818 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000819 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000820
821 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000822 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000823
824class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000825 """FileEntry - Entry field with button that invokes a FileSelectDialog.
826 The user can type in the filename manually. Alternatively, the user can
827 press the button widget that sits next to the entry, which will bring
828 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000829
Moshe Zadka22710822001-03-21 17:24:49 +0000830 Subwidgets Class
831 ---------- -----
832 button Button
833 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000834
Martin v. Löwis46874282002-12-06 10:33:45 +0000835 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000836 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000837 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000838 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000839 self.subwidget_list['button'] = _dummyButton(self, 'button')
840 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000841
842 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000843 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000844
845 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000846 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000847 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000848
Guilherme Polo1fff0082009-08-14 15:05:30 +0000849class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000850 """HList - Hierarchy display widget can be used to display any data
851 that have a hierarchical structure, for example, file system directory
852 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200853 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000854
855 Subwidgets - None"""
856
857 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000858 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000859 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000860
861 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000862 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000863
864 def add_child(self, parent=None, cnf={}, **kw):
Serhiy Storchakabb70b2a2020-12-25 17:04:26 +0200865 if parent is None:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000866 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000867 return self.tk.call(
868 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000869
870 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000871 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000872
873 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000874 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000875
876 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000877 if not chars:
878 return self.tk.call(self._w, 'column', 'width', col, width)
879 else:
880 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000881 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000882
883 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000884 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000885
886 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000887 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000888
889 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000890 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000891
892 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000893 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000894
895 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000896 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000897
898 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000899 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000900
901 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000902 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000903
904 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000905 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000906
907 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000908 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000909
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000910 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000911 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200912 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000913 self.tk.call(self._w, 'header', 'configure', col,
914 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000915
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000916 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000917 return self.tk.call(self._w, 'header', 'cget', col, opt)
918
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000919 def header_exists(self, col):
Serhiy Storchaka071dec22016-10-24 23:47:28 +0300920 # A workaround to Tix library bug (issue #25464).
921 # The documented command is "exists", but only erroneous "exist" is
922 # accepted.
923 return self.tk.getboolean(self.tk.call(self._w, 'header', 'exist', col))
924 header_exist = header_exists
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000925
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000926 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000927 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000928
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000929 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000930 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000931
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000932 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000933 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000934
935 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000936 self.tk.call(
937 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000938
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000939 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000940 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200941 return self._getconfigure(
942 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000943 self.tk.call(
944 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000945
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000946 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000947 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
948
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000949 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000950 return self.tk.call (self._w, 'indicator', 'exists', entry)
951
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000952 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000953 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000954
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000955 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000956 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000957
958 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000959 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000960
Guilherme Polobcd03df2009-08-18 15:35:57 +0000961 def info_bbox(self, entry):
962 return self._getints(
963 self.tk.call(self._w, 'info', 'bbox', entry)) or None
964
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000965 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000966 c = self.tk.call(self._w, 'info', 'children', entry)
967 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000968
969 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000970 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000971
Guilherme Polobcd03df2009-08-18 15:35:57 +0000972 def info_dragsite(self):
973 return self.tk.call(self._w, 'info', 'dragsite')
974
975 def info_dropsite(self):
976 return self.tk.call(self._w, 'info', 'dropsite')
977
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000978 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000979 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000980
981 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000982 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000983
984 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000985 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000986
987 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000988 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000989
990 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000991 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000992
993 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000994 c = self.tk.call(self._w, 'info', 'selection')
995 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000996
Martin v. Löwis3e048482001-10-09 11:50:55 +0000997 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000998 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
999
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001000 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001001 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001002 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001003 self.tk.call(self._w, 'item', 'configure', entry, col,
1004 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001005
1006 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001007 self.tk.call(
1008 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001009
1010 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001011 return self.tk.call(self._w, 'item', 'exists', entry, col)
1012
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001013 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001014 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001015
Martin v. Löwis433fa692004-03-21 15:26:44 +00001016 def entrycget(self, entry, opt):
1017 return self.tk.call(self._w, 'entrycget', entry, opt)
1018
1019 def entryconfigure(self, entry, cnf={}, **kw):
1020 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001021 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001022 self.tk.call(self._w, 'entryconfigure', entry,
1023 *self._options(cnf, kw))
1024
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001025 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001026 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001027
1028 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001029 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001030
1031 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001032 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001033
1034 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001035 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001036
1037 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001038 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001039
1040 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001041 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001042
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001043class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001044 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001045
1046 Subwidgets - None"""
1047
1048 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001049 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001050
1051class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001052 """LabelEntry - Entry field with label. Packages an entry widget
Martin Pantera90a4a92016-05-30 04:04:50 +00001053 and a label into one mega widget. It can be used to simplify the creation
1054 of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001055
Moshe Zadka22710822001-03-21 17:24:49 +00001056 Subwidgets Class
1057 ---------- -----
1058 label Label
1059 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001060
1061 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001062 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001063 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001064 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1065 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001066
1067class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001068 """LabelFrame - Labelled Frame container. Packages a frame widget
1069 and a label into one mega widget. To create widgets inside a
1070 LabelFrame widget, one creates the new widgets relative to the
1071 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001072
Moshe Zadka22710822001-03-21 17:24:49 +00001073 Subwidgets Class
1074 ---------- -----
1075 label Label
1076 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001077
1078 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001079 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001080 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001081 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1082 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001083
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001084
1085class ListNoteBook(TixWidget):
1086 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1087 it can be used to display many windows in a limited space using a
1088 notebook metaphor. The notebook is divided into a stack of pages
1089 (windows). At one time only one of these pages can be shown.
1090 The user can navigate through these pages by
1091 choosing the name of the desired page in the hlist subwidget."""
1092
1093 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001094 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1095 # Is this necessary? It's not an exposed subwidget in Tix.
1096 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1097 destroy_physically=0)
1098 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1099 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001100
1101 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001102 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001103 self.subwidget_list[name] = TixSubWidget(self, name)
1104 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001105
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001106 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001107 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001108
1109 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001110 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001111 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Tim Peters182b5ac2004-07-18 06:16:08 +00001112 ret = []
1113 for x in names:
1114 ret.append(self.subwidget(x))
1115 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001116
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001117 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001118 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001119
1120class Meter(TixWidget):
1121 """The Meter widget can be used to show the progress of a background
1122 job which may take a long time to execute.
1123 """
1124
1125 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001126 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001127 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001128
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001129class NoteBook(TixWidget):
1130 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1131
Moshe Zadka22710822001-03-21 17:24:49 +00001132 Subwidgets Class
1133 ---------- -----
1134 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001135 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001136
1137 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001138 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1139 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001140 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001141
1142 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001143 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001144 self.subwidget_list[name] = TixSubWidget(self, name)
1145 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001146
1147 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001148 self.tk.call(self._w, 'delete', name)
1149 self.subwidget_list[name].destroy()
1150 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001151
1152 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001153 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001154
1155 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001156 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001157 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001158 ret = []
1159 for x in names:
1160 ret.append(self.subwidget(x))
1161 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001162
Moshe Zadka22710822001-03-21 17:24:49 +00001163 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001164 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001165
1166 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001167 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001168
1169class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001170 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001171 pass
1172
1173class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001174 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001175
Moshe Zadka22710822001-03-21 17:24:49 +00001176 Subwidget Class
1177 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001178 menubutton Menubutton
1179 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001180
1181 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001182 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1183 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1184 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001185
1186 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001187 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001188
1189 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001190 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001191
1192 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001193 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001194
1195 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001196 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001197
1198 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001199 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001200
1201class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001202 """PanedWindow - Multi-pane container widget
1203 allows the user to interactively manipulate the sizes of several
1204 panes. The panes can be arranged either vertically or horizontally.The
1205 user changes the sizes of the panes by dragging the resize handle
1206 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001207
Moshe Zadka22710822001-03-21 17:24:49 +00001208 Subwidgets Class
1209 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001210 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001211
1212 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001213 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001214
Neal Norwitzf539bde2002-11-14 02:43:40 +00001215 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001216 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001217 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001218 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001219 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001220 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001221
Neal Norwitzf539bde2002-11-14 02:43:40 +00001222 def delete(self, name):
1223 self.tk.call(self._w, 'delete', name)
1224 self.subwidget_list[name].destroy()
1225 del self.subwidget_list[name]
1226
1227 def forget(self, name):
1228 self.tk.call(self._w, 'forget', name)
1229
1230 def panecget(self, entry, opt):
1231 return self.tk.call(self._w, 'panecget', entry, opt)
1232
1233 def paneconfigure(self, entry, cnf={}, **kw):
1234 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001235 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001236 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001237
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001238 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001239 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1240 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001241
1242class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001243 """PopupMenu widget can be used as a replacement of the tk_popup command.
1244 The advantage of the Tix PopupMenu widget is it requires less application
1245 code to manipulate.
1246
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001247
Moshe Zadka22710822001-03-21 17:24:49 +00001248 Subwidgets Class
1249 ---------- -----
1250 menubutton Menubutton
1251 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001252
Martin v. Löwis46874282002-12-06 10:33:45 +00001253 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001254 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001255 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1256 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1257 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001258
1259 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001260 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001261
1262 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001263 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001264
1265 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001266 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001267
1268class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001269 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001270 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001271 # There seems to be a Tix bug rejecting the configure method
1272 # Let's try making the flags -static
1273 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1274 'handlesize', 'hintcolor', 'hintwidth',
1275 'x', 'y']
1276 # In fact, x y height width are configurable
1277 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001278 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001279
1280 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001281 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001282
Martin v. Löwis652e1912001-11-25 14:50:56 +00001283 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001284 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001285
1286 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001287 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001288
1289 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001290 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001291
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001292class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001293 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001294
Martin v. Löwis46874282002-12-06 10:33:45 +00001295 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001296 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001297 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001298 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001299 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1300 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1301 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001302
1303class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001304 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001305
Martin v. Löwis46874282002-12-06 10:33:45 +00001306 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001307 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001308 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1309 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1310 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1311 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001312
1313class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001314 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001315
Martin v. Löwis46874282002-12-06 10:33:45 +00001316 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001317 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001318 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1319 self.subwidget_list['text'] = _dummyText(self, 'text')
1320 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1321 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001322
1323class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001324 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001325
Martin v. Löwis46874282002-12-06 10:33:45 +00001326 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001327 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001328 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001329 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001330 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1331 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1332 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001333
1334class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001335 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001336
Martin v. Löwis46874282002-12-06 10:33:45 +00001337 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001338 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001339 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1340 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1341 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1342 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001343
1344class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001345 """Select - Container of button subwidgets. It can be used to provide
1346 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001347
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001348 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001349
Martin v. Löwis46874282002-12-06 10:33:45 +00001350 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001351 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001352 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001353 ['allowzero', 'radio', 'orientation', 'labelside',
1354 'options'],
1355 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001356 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001357
1358 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001359 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001360 self.subwidget_list[name] = _dummyButton(self, name)
1361 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001362
1363 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001364 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001365
Neal Norwitzf539bde2002-11-14 02:43:40 +00001366class Shell(TixWidget):
1367 """Toplevel window.
1368
1369 Subwidgets - None"""
1370
1371 def __init__ (self,master=None,cnf={}, **kw):
1372 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1373
1374class DialogShell(TixWidget):
1375 """Toplevel window, with popup popdown and center methods.
1376 It tells the window manager that it is a dialog window and should be
1377 treated specially. The exact treatment depends on the treatment of
1378 the window manager.
1379
1380 Subwidgets - None"""
1381
Martin v. Löwis46874282002-12-06 10:33:45 +00001382 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001383 def __init__ (self,master=None,cnf={}, **kw):
1384 TixWidget.__init__(self, master,
1385 'tixDialogShell',
1386 ['options', 'title', 'mapped',
1387 'minheight', 'minwidth',
1388 'parent', 'transient'], cnf, kw)
1389
1390 def popdown(self):
1391 self.tk.call(self._w, 'popdown')
1392
1393 def popup(self):
1394 self.tk.call(self._w, 'popup')
1395
1396 def center(self):
1397 self.tk.call(self._w, 'center')
1398
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001399class StdButtonBox(TixWidget):
1400 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1401
1402 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001403 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001404 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001405 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1406 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1407 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1408 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001409
1410 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001411 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001412 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001413
Guilherme Polo1fff0082009-08-14 15:05:30 +00001414class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001415 """TList - Hierarchy display widget which can be
1416 used to display data in a tabular format. The list entries of a TList
1417 widget are similar to the entries in the Tk listbox widget. The main
1418 differences are (1) the TList widget can display the list entries in a
1419 two dimensional format and (2) you can use graphical images as well as
1420 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001421
1422 Subwidgets - None"""
1423
1424 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001425 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001426
1427 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001428 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001429
1430 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001431 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001432
1433 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001434 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001435
1436 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001437 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001438
1439 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001440 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001441
1442 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001443 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001444
1445 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001446 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001447
1448 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001449 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001450
1451 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001452 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001453
1454 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001455 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001456
1457 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001458 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001459
1460 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001461 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001462
1463 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001464 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001465
1466 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001467 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001468
1469 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001470 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001471
1472 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001473 c = self.tk.call(self._w, 'info', 'selection')
1474 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001475
1476 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001477 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001478
1479 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001480 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001481
1482 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001483 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001484
1485 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001486 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001487
1488 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001489 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001490
1491 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001492 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001493
1494 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001495 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001496
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001497class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001498 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001499 data in a tree form. The user can adjust
1500 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001501
Martin v. Löwis46874282002-12-06 10:33:45 +00001502 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001503 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001504 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001505 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001506 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1507 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1508 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001509
1510 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001511 '''This command calls the setmode method for all the entries in this
1512 Tree widget: if an entry has no child entries, its mode is set to
1513 none. Otherwise, if the entry has any hidden child entries, its mode is
1514 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001515 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001516
1517 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001518 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001519 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001520
1521 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001522 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001523 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001524
1525 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001526 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001527 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001528
1529 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001530 '''This command is used to indicate whether the entry given by
1531 entryPath has children entries and whether the children are visible. mode
1532 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001533 indicator is drawn next the entry. If mode is set to close, a (-)
1534 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001535 indicators will be drawn for this entry. The default mode is none. The
1536 open mode indicates the entry has hidden children and this entry can be
1537 opened by the user. The close mode indicates that all the children of the
1538 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001539 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001540
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001541
1542# Could try subclassing Tree for CheckList - would need another arg to init
1543class CheckList(TixWidget):
1544 """The CheckList widget
1545 displays a list of items to be selected by the user. CheckList acts
1546 similarly to the Tk checkbutton or radiobutton widgets, except it is
1547 capable of handling many more items than checkbuttons or radiobuttons.
1548 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001549 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001550 def __init__(self, master=None, cnf={}, **kw):
1551 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001552 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001553 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1554 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1555 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001556
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001557 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001558 '''This command calls the setmode method for all the entries in this
1559 Tree widget: if an entry has no child entries, its mode is set to
1560 none. Otherwise, if the entry has any hidden child entries, its mode is
1561 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001562 self.tk.call(self._w, 'autosetmode')
1563
1564 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001565 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001566 self.tk.call(self._w, 'close', entrypath)
1567
1568 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001569 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001570 return self.tk.call(self._w, 'getmode', entrypath)
1571
1572 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001573 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001574 self.tk.call(self._w, 'open', entrypath)
1575
1576 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001577 '''Returns a list of items whose status matches status. If status is
1578 not specified, the list of items in the "on" status will be returned.
1579 Mode can be on, off, default'''
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001580 return self.tk.splitlist(self.tk.call(self._w, 'getselection', mode))
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001581
1582 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001583 '''Returns the current status of entryPath.'''
1584 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001585
1586 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001587 '''Sets the status of entryPath to be status. A bitmap will be
1588 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001589 self.tk.call(self._w, 'setstatus', entrypath, mode)
1590
1591
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001592###########################################################################
1593### The subclassing below is used to instantiate the subwidgets in each ###
1594### mega widget. This allows us to access their methods directly. ###
1595###########################################################################
1596
1597class _dummyButton(Button, TixSubWidget):
1598 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001599 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001600
1601class _dummyCheckbutton(Checkbutton, 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 _dummyEntry(Entry, 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 _dummyFrame(Frame, 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 _dummyLabel(Label, 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 _dummyListbox(Listbox, 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 _dummyMenu(Menu, 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 _dummyMenubutton(Menubutton, 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 _dummyScrollbar(Scrollbar, 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 _dummyText(Text, 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 _dummyScrolledListBox(ScrolledListBox, 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)
1640 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1641 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1642 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001643
1644class _dummyHList(HList, TixSubWidget):
1645 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001646 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001647
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001648class _dummyScrolledHList(ScrolledHList, 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)
1651 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1652 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1653 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001654
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001655class _dummyTList(TList, TixSubWidget):
1656 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001657 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001658
1659class _dummyComboBox(ComboBox, TixSubWidget):
1660 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001661 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1662 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001663 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1664 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001665
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001666 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001667 'slistbox')
1668 try:
1669 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1670 #cross Button : present if created with the fancy option
1671 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1672 except TypeError:
1673 # unavailable when -fancy not specified
1674 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001675
1676class _dummyDirList(DirList, TixSubWidget):
1677 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001678 TixSubWidget.__init__(self, master, name, destroy_physically)
1679 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1680 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1681 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001682
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001683class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1684 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001685 TixSubWidget.__init__(self, master, name, destroy_physically)
1686 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1687 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001688
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001689class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1690 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001691 TixSubWidget.__init__(self, master, name, destroy_physically)
1692 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1693 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1694 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1695 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1696 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1697 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1698 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1699 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001700
1701class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1702 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001703 TixSubWidget.__init__(self, master, name, destroy_physically)
1704 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1705 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1706 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1707 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001708
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001709class _dummyFileComboBox(ComboBox, TixSubWidget):
1710 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001711 TixSubWidget.__init__(self, master, name, destroy_physically)
1712 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001713
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001714class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1715 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001716 TixSubWidget.__init__(self, master, name, destroy_physically)
1717 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1718 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1719 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1720 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001721
1722class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1723 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001724 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001725
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001726class _dummyPanedWindow(PanedWindow, TixSubWidget):
1727 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001728 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001729
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001730########################
1731### Utility Routines ###
1732########################
1733
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001734#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1735
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001736def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001737 '''Returns the qualified path name for the widget. Normally used to set
1738 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001739 return widget.tk.call('tixOptionName', widget._w)
1740
1741# Called with a dictionary argument of the form
1742# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1743# returns a string which can be used to configure the fsbox file types
1744# in an ExFileSelectBox. i.e.,
1745# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1746def FileTypeList(dict):
1747 s = ''
1748 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001749 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001750 return s
1751
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001752# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001753# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001754class CObjView(TixWidget):
1755 """This file implements the Canvas Object View widget. This is a base
1756 class of IconView. It implements automatic placement/adjustment of the
1757 scrollbars according to the canvas objects inside the canvas subwidget.
1758 The scrollbars are adjusted so that the canvas is just large enough
1759 to see all the objects.
1760 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001761 # FIXME: It should inherit -superclass tixScrolledWidget
1762 pass
1763
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001764
Guilherme Polo1fff0082009-08-14 15:05:30 +00001765class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001766 '''The Tix Grid command creates a new window and makes it into a
1767 tixGrid widget. Additional options, may be specified on the command
1768 line or in the option database to configure aspects such as its cursor
1769 and relief.
1770
1771 A Grid widget displays its contents in a two dimensional grid of cells.
1772 Each cell may contain one Tix display item, which may be in text,
1773 graphics or other formats. See the DisplayStyle class for more information
1774 about Tix display items. Individual cells, or groups of cells, can be
1775 formatted with a wide range of attributes, such as its color, relief and
1776 border.
1777
1778 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779 # valid specific resources as of Tk 8.4
1780 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1781 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1782 # selectunit, topmargin,
1783 def __init__(self, master=None, cnf={}, **kw):
1784 static= []
1785 self.cnf= cnf
1786 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001787
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001788 # valid options as of Tk 8.4
Guilherme Polobcd03df2009-08-18 15:35:57 +00001789 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
1790 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
1791 # selection, set, size, unset, xview, yview
1792 def anchor_clear(self):
1793 """Removes the selection anchor."""
1794 self.tk.call(self, 'anchor', 'clear')
1795
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001796 def anchor_get(self):
1797 "Get the (x,y) coordinate of the current anchor cell"
1798 return self._getints(self.tk.call(self, 'anchor', 'get'))
1799
Guilherme Polobcd03df2009-08-18 15:35:57 +00001800 def anchor_set(self, x, y):
1801 """Set the selection anchor to the cell at (x, y)."""
1802 self.tk.call(self, 'anchor', 'set', x, y)
1803
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001804 def delete_row(self, from_, to=None):
1805 """Delete rows between from_ and to inclusive.
1806 If to is not provided, delete only row at from_"""
1807 if to is None:
1808 self.tk.call(self, 'delete', 'row', from_)
1809 else:
1810 self.tk.call(self, 'delete', 'row', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001811
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001812 def delete_column(self, from_, to=None):
1813 """Delete columns between from_ and to inclusive.
1814 If to is not provided, delete only column at from_"""
1815 if to is None:
1816 self.tk.call(self, 'delete', 'column', from_)
1817 else:
1818 self.tk.call(self, 'delete', 'column', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001819
1820 def edit_apply(self):
1821 """If any cell is being edited, de-highlight the cell and applies
1822 the changes."""
1823 self.tk.call(self, 'edit', 'apply')
1824
1825 def edit_set(self, x, y):
1826 """Highlights the cell at (x, y) for editing, if the -editnotify
1827 command returns True for this cell."""
1828 self.tk.call(self, 'edit', 'set', x, y)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829
1830 def entrycget(self, x, y, option):
1831 "Get the option value for cell at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001832 if option and option[0] != '-':
1833 option = '-' + option
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001834 return self.tk.call(self, 'entrycget', x, y, option)
1835
Guilherme Polobcd03df2009-08-18 15:35:57 +00001836 def entryconfigure(self, x, y, cnf=None, **kw):
1837 return self._configure(('entryconfigure', x, y), cnf, kw)
1838
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001839 # def format
1840 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001841
1842 def info_exists(self, x, y):
1843 "Return True if display item exists at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001844 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001845
1846 def info_bbox(self, x, y):
1847 # This seems to always return '', at least for 'text' displayitems
1848 return self.tk.call(self, 'info', 'bbox', x, y)
1849
Guilherme Polobcd03df2009-08-18 15:35:57 +00001850 def move_column(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001851 """Moves the range of columns from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001852 the distance indicated by OFFSET. For example, move_column(2, 4, 1)
1853 moves the columns 2,3,4 to columns 3,4,5."""
1854 self.tk.call(self, 'move', 'column', from_, to, offset)
1855
1856 def move_row(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001857 """Moves the range of rows from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001858 the distance indicated by OFFSET.
1859 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
1860 self.tk.call(self, 'move', 'row', from_, to, offset)
1861
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001862 def nearest(self, x, y):
1863 "Return coordinate of cell nearest pixel coordinate (x,y)"
1864 return self._getints(self.tk.call(self, 'nearest', x, y))
1865
1866 # def selection adjust
1867 # def selection clear
1868 # def selection includes
1869 # def selection set
1870 # def selection toggle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001871
1872 def set(self, x, y, itemtype=None, **kw):
1873 args= self._options(self.cnf, kw)
1874 if itemtype is not None:
1875 args= ('-itemtype', itemtype) + args
1876 self.tk.call(self, 'set', x, y, *args)
1877
Guilherme Polobcd03df2009-08-18 15:35:57 +00001878 def size_column(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001879 """Queries or sets the size of the column given by
1880 INDEX. INDEX may be any non-negative
1881 integer that gives the position of a given column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001882 INDEX can also be the string "default"; in this case, this command
1883 queries or sets the default size of all columns.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001884 When no option-value pair is given, this command returns a tuple
1885 containing the current size setting of the given column. When
1886 option-value pairs are given, the corresponding options of the
Guilherme Polobcd03df2009-08-18 15:35:57 +00001887 size setting of the given column are changed. Options may be one
Gurupad Hegde6c7bb382019-12-28 17:16:02 -05001888 of the following:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001889 pad0 pixels
1890 Specifies the paddings to the left of a column.
1891 pad1 pixels
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001892 Specifies the paddings to the right of a column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001893 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001894 Specifies the width of a column. Val may be:
1895 "auto" -- the width of the column is set to the
1896 width of the widest cell in the column;
1897 a valid Tk screen distance unit;
1898 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001899 (e.g. 3.4chars) that sets the width of the column to the
1900 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001901 return self.tk.splitlist(self.tk.call(self._w, 'size', 'column', index,
Guilherme Polobcd03df2009-08-18 15:35:57 +00001902 *self._options({}, kw)))
1903
1904 def size_row(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001905 """Queries or sets the size of the row given by
1906 INDEX. INDEX may be any non-negative
1907 integer that gives the position of a given row .
Guilherme Polobcd03df2009-08-18 15:35:57 +00001908 INDEX can also be the string "default"; in this case, this command
1909 queries or sets the default size of all rows.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001910 When no option-value pair is given, this command returns a list con-
1911 taining the current size setting of the given row . When option-value
Guilherme Polobcd03df2009-08-18 15:35:57 +00001912 pairs are given, the corresponding options of the size setting of the
Gurupad Hegde6c7bb382019-12-28 17:16:02 -05001913 given row are changed. Options may be one of the following:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001914 pad0 pixels
1915 Specifies the paddings to the top of a row.
1916 pad1 pixels
Ezio Melottie130a522011-10-19 10:58:56 +03001917 Specifies the paddings to the bottom of a row.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001918 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001919 Specifies the height of a row. Val may be:
1920 "auto" -- the height of the row is set to the
1921 height of the highest cell in the row;
1922 a valid Tk screen distance unit;
1923 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001924 (e.g. 3.4chars) that sets the height of the row to the
1925 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001926 return self.tk.splitlist(self.tk.call(
Guilherme Polobcd03df2009-08-18 15:35:57 +00001927 self, 'size', 'row', index, *self._options({}, kw)))
1928
1929 def unset(self, x, y):
1930 """Clears the cell at (x, y) by removing its display item."""
1931 self.tk.call(self._w, 'unset', x, y)
1932
Raymond Hettingerff41c482003-04-06 09:01:11 +00001933
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001934class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001935 '''Scrolled Grid widgets'''
1936
1937 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001938 def __init__(self, master=None, cnf={}, **kw):
1939 static= []
1940 self.cnf= cnf
1941 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)