blob: d9c097a77cdd186dec775405c1b36d7b6ee64766 [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):
389 if not master:
Georg Brandl14fc4272008-05-17 18:39:55 +0000390 master = tkinter._default_root
Neal Norwitz731a9862002-12-10 02:18:49 +0000391 if not master:
Collin Winterce36ad82007-08-30 01:19:48 +0000392 raise RuntimeError('Too early to create image')
Neal Norwitz731a9862002-12-10 02:18:49 +0000393 if kw and cnf: cnf = _cnfmerge((cnf, kw))
394 elif kw: cnf = kw
395 options = ()
396 for k, v in cnf.items():
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200397 if callable(v):
Neal Norwitz731a9862002-12-10 02:18:49 +0000398 v = self._register(v)
399 options = options + ('-'+k, v)
400 return master.tk.call(('image', 'create', imgtype,) + options)
401 def image_delete(self, imgname):
402 try:
403 self.tk.call('image', 'delete', imgname)
404 except TclError:
405 # May happen if the root was destroyed
406 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000407
408# Subwidgets are child widgets created automatically by mega-widgets.
409# In python, we have to create these subwidgets manually to mirror their
410# existence in Tk/Tix.
411class TixSubWidget(TixWidget):
412 """Subwidget class.
413
414 This is used to mirror child widgets automatically created
415 by Tix/Tk as part of a mega-widget in Python (which is not informed
416 of this)"""
417
418 def __init__(self, master, name,
Moshe Zadka22710822001-03-21 17:24:49 +0000419 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000420 if check_intermediate:
421 path = master._subwidget_name(name)
422 try:
423 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000424 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000425 except:
426 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000427
Thomas Wouters89f507f2006-12-13 04:49:30 +0000428 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000429 # immediate descendant
430 TixWidget.__init__(self, master, None, None, {'name' : name})
431 else:
432 # Ensure that the intermediate widgets exist
433 parent = master
434 for i in range(len(plist) - 1):
Neal Norwitzebb41902002-05-31 20:51:31 +0000435 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000436 try:
437 w = master._nametowidget(n)
438 parent = w
439 except KeyError:
440 # Create the intermediate widget
441 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000442 destroy_physically=0,
443 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000444 # The Tk widget name is in plist, not in name
445 if plist:
446 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000447 TixWidget.__init__(self, parent, None, None, {'name' : name})
448 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000449
450 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000451 # For some widgets e.g., a NoteBook, when we call destructors,
452 # we must be careful not to destroy the frame widget since this
453 # also destroys the parent NoteBook thus leading to an exception
454 # in Tkinter when it finally calls Tcl to destroy the NoteBook
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000455 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000456 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000457 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000458 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000459 del self.master.subwidget_list[self._name]
460 if self.destroy_physically:
461 # This is bypassed only for a few widgets
462 self.tk.call('destroy', self._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000463
464
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000465# Useful class to create a display style - later shared by many items.
466# Contributed by Steffen Kremser
467class DisplayStyle:
468 """DisplayStyle - handle configuration options shared by
469 (multiple) Display Items"""
470
Serhiy Storchaka1aca3892016-09-25 16:52:13 +0300471 def __init__(self, itemtype, cnf={}, *, master=None, **kw):
472 if not master:
473 if 'refwindow' in kw:
474 master = kw['refwindow']
475 elif 'refwindow' in cnf:
476 master = cnf['refwindow']
477 else:
478 master = tkinter._default_root
479 if not master:
480 raise RuntimeError("Too early to create display style: "
481 "no root window")
Moshe Zadka22710822001-03-21 17:24:49 +0000482 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000483 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
484 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000485
486 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000487 return self.stylename
488
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000489 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000490 if kw and cnf:
491 cnf = _cnfmerge((cnf, kw))
492 elif kw:
493 cnf = kw
494 opts = ()
495 for k, v in cnf.items():
496 opts = opts + ('-'+k, v)
497 return opts
498
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000499 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000500 self.tk.call(self.stylename, 'delete')
501
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000502 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000503 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
504
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000505 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200506 return self._getconfigure(
507 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000508
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000509 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000510 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000511
512
513######################################################
514### The Tix Widget classes - in alphabetical order ###
515######################################################
516
517class Balloon(TixWidget):
518 """Balloon help widget.
519
Moshe Zadka22710822001-03-21 17:24:49 +0000520 Subwidget Class
521 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000522 label Label
523 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000524
Martin v. Löwis46874282002-12-06 10:33:45 +0000525 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000526 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000527 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000528 static = ['options', 'installcolormap', 'initwait', 'statusbar',
529 'cursor']
530 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
531 self.subwidget_list['label'] = _dummyLabel(self, 'label',
532 destroy_physically=0)
533 self.subwidget_list['message'] = _dummyLabel(self, 'message',
534 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000535
536 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000537 """Bind balloon widget to another.
538 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000539 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000540
541 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000542 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000543
544class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000545 """ButtonBox - A container for pushbuttons.
546 Subwidgets are the buttons added with the add method.
547 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000548 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000549 TixWidget.__init__(self, master, 'tixButtonBox',
550 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000551
552 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000553 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000554
Raymond Hettingerff41c482003-04-06 09:01:11 +0000555 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000556 self.subwidget_list[name] = _dummyButton(self, name)
557 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000558
559 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000560 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000561 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000562
563class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000564 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200565 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000566 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000567
Moshe Zadka22710822001-03-21 17:24:49 +0000568 Subwidget Class
569 --------- -----
570 entry Entry
571 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000572 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000573 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000574 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000575
Martin v. Löwis46874282002-12-06 10:33:45 +0000576 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000577 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000578 TixWidget.__init__(self, master, 'tixComboBox',
579 ['editable', 'dropdown', 'fancy', 'options'],
580 cnf, kw)
581 self.subwidget_list['label'] = _dummyLabel(self, 'label')
582 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
583 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
584 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
585 'slistbox')
586 try:
587 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
588 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
589 except TypeError:
590 # unavailable when -fancy not specified
591 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000592
Neal Norwitz731a9862002-12-10 02:18:49 +0000593 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000594
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000595 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000596 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000597
598 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000599 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000600
601 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000602 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000603
604 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000605 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000606
607class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000608 """Control - An entry field with value change arrows. The user can
609 adjust the value by pressing the two arrow buttons or by entering
610 the value directly into the entry. The new value will be checked
611 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000612
Moshe Zadka22710822001-03-21 17:24:49 +0000613 Subwidget Class
614 --------- -----
615 incr Button
616 decr Button
617 entry Entry
618 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000619
Martin v. Löwis46874282002-12-06 10:33:45 +0000620 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000621 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000622 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
623 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
624 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
625 self.subwidget_list['label'] = _dummyLabel(self, 'label')
626 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000627
628 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000629 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000630
631 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000632 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000633
634 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000635 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000636
637 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000638 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000639
640class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000641 """DirList - displays a list view of a directory, its previous
642 directories and its sub-directories. The user can choose one of
643 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000644
Moshe Zadka22710822001-03-21 17:24:49 +0000645 Subwidget Class
646 --------- -----
647 hlist HList
648 hsb Scrollbar
649 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000650
Martin v. Löwis46874282002-12-06 10:33:45 +0000651 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000652 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000653 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
654 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
655 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
656 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000657
658 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000659 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000660
661class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000662 """DirTree - Directory Listing in a hierarchical view.
663 Displays a tree view of a directory, its previous directories and its
664 sub-directories. The user can choose one of the directories displayed
665 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000666
Moshe Zadka22710822001-03-21 17:24:49 +0000667 Subwidget Class
668 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000669 hlist HList
670 hsb Scrollbar
671 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000672
Martin v. Löwis46874282002-12-06 10:33:45 +0000673 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000674 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000675 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
676 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
677 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
678 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000679
680 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000681 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000682
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000683class DirSelectBox(TixWidget):
684 """DirSelectBox - Motif style file select box.
685 It is generally used for
686 the user to choose a file. FileSelectBox stores the files mostly
687 recently selected into a ComboBox widget so that they can be quickly
688 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000689
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000690 Subwidget Class
691 --------- -----
692 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000693 filter ComboBox
694 dirlist ScrolledListBox
695 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000696
697 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000698 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
699 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
700 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000701
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000702class ExFileSelectBox(TixWidget):
703 """ExFileSelectBox - MS Windows style file select box.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300704 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000705
Moshe Zadka22710822001-03-21 17:24:49 +0000706 Subwidget Class
707 --------- -----
708 cancel Button
709 ok Button
710 hidden Checkbutton
711 types ComboBox
712 dir ComboBox
713 file ComboBox
714 dirlist ScrolledListBox
715 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000716
717 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000718 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
719 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
720 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
721 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
722 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
723 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
724 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
725 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
726 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000727
728 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000729 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000730
731 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000732 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000733
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000734
735# Should inherit from a Dialog class
736class DirSelectDialog(TixWidget):
737 """The DirSelectDialog widget presents the directories in the file
738 system in a dialog window. The user can use this dialog window to
739 navigate through the file system to select the desired directory.
740
741 Subwidgets Class
742 ---------- -----
743 dirbox DirSelectDialog"""
744
Martin v. Löwis46874282002-12-06 10:33:45 +0000745 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000746 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000747 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000748 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000749 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
750 # cancel and ok buttons are missing
751
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000752 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000753 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000754
755 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000756 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000757
758
759# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000760class ExFileSelectDialog(TixWidget):
761 """ExFileSelectDialog - MS Windows style file select dialog.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300762 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000763
Moshe Zadka22710822001-03-21 17:24:49 +0000764 Subwidgets Class
765 ---------- -----
766 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000767
Martin v. Löwis46874282002-12-06 10:33:45 +0000768 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000769 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000770 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000771 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000772 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000773
774 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000775 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000776
777 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000778 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000779
780class FileSelectBox(TixWidget):
781 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000782 It is generally used for
783 the user to choose a file. FileSelectBox stores the files mostly
784 recently selected into a ComboBox widget so that they can be quickly
785 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000786
Moshe Zadka22710822001-03-21 17:24:49 +0000787 Subwidget Class
788 --------- -----
789 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000790 filter ComboBox
791 dirlist ScrolledListBox
792 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000793
794 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000795 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
796 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
797 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
798 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
799 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000800
Moshe Zadka22710822001-03-21 17:24:49 +0000801 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000802 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000803
804 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000805 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000806
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000807# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000808class FileSelectDialog(TixWidget):
809 """FileSelectDialog - Motif style file select dialog.
810
Moshe Zadka22710822001-03-21 17:24:49 +0000811 Subwidgets Class
812 ---------- -----
813 btns StdButtonBox
814 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000815
Martin v. Löwis46874282002-12-06 10:33:45 +0000816 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000817 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000818 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000819 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000820 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
821 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000822
823 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000824 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000825
826 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000827 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000828
829class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000830 """FileEntry - Entry field with button that invokes a FileSelectDialog.
831 The user can type in the filename manually. Alternatively, the user can
832 press the button widget that sits next to the entry, which will bring
833 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000834
Moshe Zadka22710822001-03-21 17:24:49 +0000835 Subwidgets Class
836 ---------- -----
837 button Button
838 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000839
Martin v. Löwis46874282002-12-06 10:33:45 +0000840 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000841 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000842 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000843 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000844 self.subwidget_list['button'] = _dummyButton(self, 'button')
845 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000846
847 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000848 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000849
850 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000851 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000852 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000853
Guilherme Polo1fff0082009-08-14 15:05:30 +0000854class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000855 """HList - Hierarchy display widget can be used to display any data
856 that have a hierarchical structure, for example, file system directory
857 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200858 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000859
860 Subwidgets - None"""
861
862 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000863 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000864 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000865
866 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000867 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000868
869 def add_child(self, parent=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000870 if not parent:
871 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000872 return self.tk.call(
873 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000874
875 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000876 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000877
878 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000879 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000880
881 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000882 if not chars:
883 return self.tk.call(self._w, 'column', 'width', col, width)
884 else:
885 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000886 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000887
888 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000889 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000890
891 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000892 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000893
894 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000895 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000896
897 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000898 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000899
900 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000901 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000902
903 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000904 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000905
906 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000907 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000908
909 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000910 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000911
912 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000913 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000914
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000915 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000916 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200917 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000918 self.tk.call(self._w, 'header', 'configure', col,
919 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000920
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000921 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000922 return self.tk.call(self._w, 'header', 'cget', col, opt)
923
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000924 def header_exists(self, col):
Serhiy Storchaka071dec22016-10-24 23:47:28 +0300925 # A workaround to Tix library bug (issue #25464).
926 # The documented command is "exists", but only erroneous "exist" is
927 # accepted.
928 return self.tk.getboolean(self.tk.call(self._w, 'header', 'exist', col))
929 header_exist = header_exists
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000930
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000931 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000932 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000933
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000934 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000935 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000936
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000937 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000938 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000939
940 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000941 self.tk.call(
942 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000943
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000944 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000945 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200946 return self._getconfigure(
947 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000948 self.tk.call(
949 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000950
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000951 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000952 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
953
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000954 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000955 return self.tk.call (self._w, 'indicator', 'exists', entry)
956
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000957 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000958 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000959
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000960 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000961 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000962
963 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000964 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000965
Guilherme Polobcd03df2009-08-18 15:35:57 +0000966 def info_bbox(self, entry):
967 return self._getints(
968 self.tk.call(self._w, 'info', 'bbox', entry)) or None
969
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000970 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000971 c = self.tk.call(self._w, 'info', 'children', entry)
972 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000973
974 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000975 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000976
Guilherme Polobcd03df2009-08-18 15:35:57 +0000977 def info_dragsite(self):
978 return self.tk.call(self._w, 'info', 'dragsite')
979
980 def info_dropsite(self):
981 return self.tk.call(self._w, 'info', 'dropsite')
982
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000983 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000984 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000985
986 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000987 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000988
989 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000990 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000991
992 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000993 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000994
995 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000996 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000997
998 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000999 c = self.tk.call(self._w, 'info', 'selection')
1000 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001001
Martin v. Löwis3e048482001-10-09 11:50:55 +00001002 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001003 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
1004
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001005 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001006 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001007 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001008 self.tk.call(self._w, 'item', 'configure', entry, col,
1009 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001010
1011 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001012 self.tk.call(
1013 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001014
1015 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001016 return self.tk.call(self._w, 'item', 'exists', entry, col)
1017
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001018 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001019 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001020
Martin v. Löwis433fa692004-03-21 15:26:44 +00001021 def entrycget(self, entry, opt):
1022 return self.tk.call(self._w, 'entrycget', entry, opt)
1023
1024 def entryconfigure(self, entry, cnf={}, **kw):
1025 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001026 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001027 self.tk.call(self._w, 'entryconfigure', entry,
1028 *self._options(cnf, kw))
1029
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001030 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001031 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001032
1033 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001034 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001035
1036 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001037 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001038
1039 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001040 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001041
1042 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001043 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001044
1045 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001046 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001047
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001048class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001049 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001050
1051 Subwidgets - None"""
1052
1053 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001054 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001055
1056class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001057 """LabelEntry - Entry field with label. Packages an entry widget
Martin Pantera90a4a92016-05-30 04:04:50 +00001058 and a label into one mega widget. It can be used to simplify the creation
1059 of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001060
Moshe Zadka22710822001-03-21 17:24:49 +00001061 Subwidgets Class
1062 ---------- -----
1063 label Label
1064 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001065
1066 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001067 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001068 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001069 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1070 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001071
1072class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001073 """LabelFrame - Labelled Frame container. Packages a frame widget
1074 and a label into one mega widget. To create widgets inside a
1075 LabelFrame widget, one creates the new widgets relative to the
1076 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001077
Moshe Zadka22710822001-03-21 17:24:49 +00001078 Subwidgets Class
1079 ---------- -----
1080 label Label
1081 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001082
1083 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001084 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001085 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001086 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1087 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001088
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001089
1090class ListNoteBook(TixWidget):
1091 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1092 it can be used to display many windows in a limited space using a
1093 notebook metaphor. The notebook is divided into a stack of pages
1094 (windows). At one time only one of these pages can be shown.
1095 The user can navigate through these pages by
1096 choosing the name of the desired page in the hlist subwidget."""
1097
1098 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001099 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1100 # Is this necessary? It's not an exposed subwidget in Tix.
1101 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1102 destroy_physically=0)
1103 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1104 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001105
1106 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001107 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001108 self.subwidget_list[name] = TixSubWidget(self, name)
1109 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001110
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001111 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001112 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001113
1114 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001115 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001116 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Tim Peters182b5ac2004-07-18 06:16:08 +00001117 ret = []
1118 for x in names:
1119 ret.append(self.subwidget(x))
1120 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001121
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001122 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001123 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001124
1125class Meter(TixWidget):
1126 """The Meter widget can be used to show the progress of a background
1127 job which may take a long time to execute.
1128 """
1129
1130 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001131 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001132 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001133
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001134class NoteBook(TixWidget):
1135 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1136
Moshe Zadka22710822001-03-21 17:24:49 +00001137 Subwidgets Class
1138 ---------- -----
1139 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001140 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001141
1142 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001143 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1144 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001145 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001146
1147 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001148 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001149 self.subwidget_list[name] = TixSubWidget(self, name)
1150 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001151
1152 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001153 self.tk.call(self._w, 'delete', name)
1154 self.subwidget_list[name].destroy()
1155 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001156
1157 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001158 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001159
1160 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001161 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001162 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001163 ret = []
1164 for x in names:
1165 ret.append(self.subwidget(x))
1166 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001167
Moshe Zadka22710822001-03-21 17:24:49 +00001168 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001169 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001170
1171 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001172 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001173
1174class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001175 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001176 pass
1177
1178class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001179 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001180
Moshe Zadka22710822001-03-21 17:24:49 +00001181 Subwidget Class
1182 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001183 menubutton Menubutton
1184 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001185
1186 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001187 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1188 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1189 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001190
1191 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001192 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001193
1194 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001195 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001196
1197 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001198 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001199
1200 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001201 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001202
1203 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001204 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001205
1206class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001207 """PanedWindow - Multi-pane container widget
1208 allows the user to interactively manipulate the sizes of several
1209 panes. The panes can be arranged either vertically or horizontally.The
1210 user changes the sizes of the panes by dragging the resize handle
1211 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001212
Moshe Zadka22710822001-03-21 17:24:49 +00001213 Subwidgets Class
1214 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001215 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001216
1217 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001218 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001219
Neal Norwitzf539bde2002-11-14 02:43:40 +00001220 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001221 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001222 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001223 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001224 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001225 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001226
Neal Norwitzf539bde2002-11-14 02:43:40 +00001227 def delete(self, name):
1228 self.tk.call(self._w, 'delete', name)
1229 self.subwidget_list[name].destroy()
1230 del self.subwidget_list[name]
1231
1232 def forget(self, name):
1233 self.tk.call(self._w, 'forget', name)
1234
1235 def panecget(self, entry, opt):
1236 return self.tk.call(self._w, 'panecget', entry, opt)
1237
1238 def paneconfigure(self, entry, cnf={}, **kw):
1239 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001240 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001241 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001242
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001243 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001244 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1245 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001246
1247class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001248 """PopupMenu widget can be used as a replacement of the tk_popup command.
1249 The advantage of the Tix PopupMenu widget is it requires less application
1250 code to manipulate.
1251
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001252
Moshe Zadka22710822001-03-21 17:24:49 +00001253 Subwidgets Class
1254 ---------- -----
1255 menubutton Menubutton
1256 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001257
Martin v. Löwis46874282002-12-06 10:33:45 +00001258 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001259 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001260 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1261 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1262 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001263
1264 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001265 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001266
1267 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001268 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001269
1270 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001271 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001272
1273class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001274 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001275 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001276 # There seems to be a Tix bug rejecting the configure method
1277 # Let's try making the flags -static
1278 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1279 'handlesize', 'hintcolor', 'hintwidth',
1280 'x', 'y']
1281 # In fact, x y height width are configurable
1282 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001283 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001284
1285 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001286 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001287
Martin v. Löwis652e1912001-11-25 14:50:56 +00001288 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001289 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001290
1291 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001292 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001293
1294 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001295 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001296
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001297class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001298 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001299
Martin v. Löwis46874282002-12-06 10:33:45 +00001300 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001301 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001302 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001303 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001304 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1305 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1306 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001307
1308class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001309 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001310
Martin v. Löwis46874282002-12-06 10:33:45 +00001311 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001312 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001313 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1314 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1315 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1316 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001317
1318class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001319 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001320
Martin v. Löwis46874282002-12-06 10:33:45 +00001321 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001322 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001323 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1324 self.subwidget_list['text'] = _dummyText(self, 'text')
1325 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1326 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001327
1328class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001329 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001330
Martin v. Löwis46874282002-12-06 10:33:45 +00001331 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001332 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001333 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001334 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001335 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1336 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1337 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001338
1339class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001340 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001341
Martin v. Löwis46874282002-12-06 10:33:45 +00001342 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001343 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001344 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1345 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1346 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1347 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001348
1349class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001350 """Select - Container of button subwidgets. It can be used to provide
1351 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001352
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001353 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001354
Martin v. Löwis46874282002-12-06 10:33:45 +00001355 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001356 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001357 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001358 ['allowzero', 'radio', 'orientation', 'labelside',
1359 'options'],
1360 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001361 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001362
1363 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001364 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001365 self.subwidget_list[name] = _dummyButton(self, name)
1366 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001367
1368 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001369 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001370
Neal Norwitzf539bde2002-11-14 02:43:40 +00001371class Shell(TixWidget):
1372 """Toplevel window.
1373
1374 Subwidgets - None"""
1375
1376 def __init__ (self,master=None,cnf={}, **kw):
1377 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1378
1379class DialogShell(TixWidget):
1380 """Toplevel window, with popup popdown and center methods.
1381 It tells the window manager that it is a dialog window and should be
1382 treated specially. The exact treatment depends on the treatment of
1383 the window manager.
1384
1385 Subwidgets - None"""
1386
Martin v. Löwis46874282002-12-06 10:33:45 +00001387 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001388 def __init__ (self,master=None,cnf={}, **kw):
1389 TixWidget.__init__(self, master,
1390 'tixDialogShell',
1391 ['options', 'title', 'mapped',
1392 'minheight', 'minwidth',
1393 'parent', 'transient'], cnf, kw)
1394
1395 def popdown(self):
1396 self.tk.call(self._w, 'popdown')
1397
1398 def popup(self):
1399 self.tk.call(self._w, 'popup')
1400
1401 def center(self):
1402 self.tk.call(self._w, 'center')
1403
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001404class StdButtonBox(TixWidget):
1405 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1406
1407 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001408 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001409 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001410 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1411 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1412 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1413 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001414
1415 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001416 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001417 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001418
Guilherme Polo1fff0082009-08-14 15:05:30 +00001419class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001420 """TList - Hierarchy display widget which can be
1421 used to display data in a tabular format. The list entries of a TList
1422 widget are similar to the entries in the Tk listbox widget. The main
1423 differences are (1) the TList widget can display the list entries in a
1424 two dimensional format and (2) you can use graphical images as well as
1425 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001426
1427 Subwidgets - None"""
1428
1429 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001430 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001431
1432 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001433 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001434
1435 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001436 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001437
1438 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001439 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001440
1441 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001442 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001443
1444 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001445 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001446
1447 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001448 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001449
1450 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001451 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001452
1453 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001454 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001455
1456 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001457 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001458
1459 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001460 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001461
1462 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001463 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001464
1465 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001466 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001467
1468 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001469 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001470
1471 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001472 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001473
1474 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001475 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001476
1477 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001478 c = self.tk.call(self._w, 'info', 'selection')
1479 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001480
1481 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001482 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001483
1484 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001485 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001486
1487 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001488 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001489
1490 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001491 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001492
1493 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001494 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001495
1496 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001497 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001498
1499 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001500 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001501
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001502class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001503 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001504 data in a tree form. The user can adjust
1505 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001506
Martin v. Löwis46874282002-12-06 10:33:45 +00001507 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001508 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001509 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001510 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001511 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1512 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1513 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001514
1515 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001516 '''This command calls the setmode method for all the entries in this
1517 Tree widget: if an entry has no child entries, its mode is set to
1518 none. Otherwise, if the entry has any hidden child entries, its mode is
1519 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001520 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001521
1522 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001523 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001524 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001525
1526 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001527 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001528 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001529
1530 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001531 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001532 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001533
1534 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001535 '''This command is used to indicate whether the entry given by
1536 entryPath has children entries and whether the children are visible. mode
1537 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001538 indicator is drawn next the entry. If mode is set to close, a (-)
1539 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001540 indicators will be drawn for this entry. The default mode is none. The
1541 open mode indicates the entry has hidden children and this entry can be
1542 opened by the user. The close mode indicates that all the children of the
1543 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001544 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001545
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001546
1547# Could try subclassing Tree for CheckList - would need another arg to init
1548class CheckList(TixWidget):
1549 """The CheckList widget
1550 displays a list of items to be selected by the user. CheckList acts
1551 similarly to the Tk checkbutton or radiobutton widgets, except it is
1552 capable of handling many more items than checkbuttons or radiobuttons.
1553 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001554 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001555 def __init__(self, master=None, cnf={}, **kw):
1556 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001557 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001558 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1559 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1560 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001561
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001562 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001563 '''This command calls the setmode method for all the entries in this
1564 Tree widget: if an entry has no child entries, its mode is set to
1565 none. Otherwise, if the entry has any hidden child entries, its mode is
1566 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001567 self.tk.call(self._w, 'autosetmode')
1568
1569 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001570 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001571 self.tk.call(self._w, 'close', entrypath)
1572
1573 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001574 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001575 return self.tk.call(self._w, 'getmode', entrypath)
1576
1577 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001578 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001579 self.tk.call(self._w, 'open', entrypath)
1580
1581 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001582 '''Returns a list of items whose status matches status. If status is
1583 not specified, the list of items in the "on" status will be returned.
1584 Mode can be on, off, default'''
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001585 return self.tk.splitlist(self.tk.call(self._w, 'getselection', mode))
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001586
1587 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001588 '''Returns the current status of entryPath.'''
1589 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001590
1591 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001592 '''Sets the status of entryPath to be status. A bitmap will be
1593 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001594 self.tk.call(self._w, 'setstatus', entrypath, mode)
1595
1596
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001597###########################################################################
1598### The subclassing below is used to instantiate the subwidgets in each ###
1599### mega widget. This allows us to access their methods directly. ###
1600###########################################################################
1601
1602class _dummyButton(Button, TixSubWidget):
1603 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001604 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001605
1606class _dummyCheckbutton(Checkbutton, TixSubWidget):
1607 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001608 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001609
1610class _dummyEntry(Entry, TixSubWidget):
1611 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001612 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001613
1614class _dummyFrame(Frame, TixSubWidget):
1615 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001616 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001617
1618class _dummyLabel(Label, TixSubWidget):
1619 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001620 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001621
1622class _dummyListbox(Listbox, TixSubWidget):
1623 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001624 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001625
1626class _dummyMenu(Menu, TixSubWidget):
1627 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001628 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001629
1630class _dummyMenubutton(Menubutton, TixSubWidget):
1631 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001632 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001633
1634class _dummyScrollbar(Scrollbar, TixSubWidget):
1635 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001636 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001637
1638class _dummyText(Text, TixSubWidget):
1639 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001640 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001641
1642class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1643 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001644 TixSubWidget.__init__(self, master, name, destroy_physically)
1645 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1646 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1647 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001648
1649class _dummyHList(HList, TixSubWidget):
1650 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001651 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001652
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001653class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1654 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001655 TixSubWidget.__init__(self, master, name, destroy_physically)
1656 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1657 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1658 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001659
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001660class _dummyTList(TList, TixSubWidget):
1661 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001662 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001663
1664class _dummyComboBox(ComboBox, TixSubWidget):
1665 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001666 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1667 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001668 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1669 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001670
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001671 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001672 'slistbox')
1673 try:
1674 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1675 #cross Button : present if created with the fancy option
1676 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1677 except TypeError:
1678 # unavailable when -fancy not specified
1679 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001680
1681class _dummyDirList(DirList, TixSubWidget):
1682 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001683 TixSubWidget.__init__(self, master, name, destroy_physically)
1684 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1685 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1686 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001687
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001688class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1689 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001690 TixSubWidget.__init__(self, master, name, destroy_physically)
1691 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1692 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001693
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001694class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1695 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001696 TixSubWidget.__init__(self, master, name, destroy_physically)
1697 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1698 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1699 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1700 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1701 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1702 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1703 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1704 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001705
1706class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1707 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001708 TixSubWidget.__init__(self, master, name, destroy_physically)
1709 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1710 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1711 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1712 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001713
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001714class _dummyFileComboBox(ComboBox, 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['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001718
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001719class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1720 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001721 TixSubWidget.__init__(self, master, name, destroy_physically)
1722 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1723 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1724 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1725 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001726
1727class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1728 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001729 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001730
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001731class _dummyPanedWindow(PanedWindow, TixSubWidget):
1732 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001733 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001734
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001735########################
1736### Utility Routines ###
1737########################
1738
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001739#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1740
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001741def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001742 '''Returns the qualified path name for the widget. Normally used to set
1743 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001744 return widget.tk.call('tixOptionName', widget._w)
1745
1746# Called with a dictionary argument of the form
1747# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1748# returns a string which can be used to configure the fsbox file types
1749# in an ExFileSelectBox. i.e.,
1750# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1751def FileTypeList(dict):
1752 s = ''
1753 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001754 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001755 return s
1756
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001757# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001758# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001759class CObjView(TixWidget):
1760 """This file implements the Canvas Object View widget. This is a base
1761 class of IconView. It implements automatic placement/adjustment of the
1762 scrollbars according to the canvas objects inside the canvas subwidget.
1763 The scrollbars are adjusted so that the canvas is just large enough
1764 to see all the objects.
1765 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001766 # FIXME: It should inherit -superclass tixScrolledWidget
1767 pass
1768
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001769
Guilherme Polo1fff0082009-08-14 15:05:30 +00001770class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001771 '''The Tix Grid command creates a new window and makes it into a
1772 tixGrid widget. Additional options, may be specified on the command
1773 line or in the option database to configure aspects such as its cursor
1774 and relief.
1775
1776 A Grid widget displays its contents in a two dimensional grid of cells.
1777 Each cell may contain one Tix display item, which may be in text,
1778 graphics or other formats. See the DisplayStyle class for more information
1779 about Tix display items. Individual cells, or groups of cells, can be
1780 formatted with a wide range of attributes, such as its color, relief and
1781 border.
1782
1783 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001784 # valid specific resources as of Tk 8.4
1785 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1786 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1787 # selectunit, topmargin,
1788 def __init__(self, master=None, cnf={}, **kw):
1789 static= []
1790 self.cnf= cnf
1791 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001792
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001793 # valid options as of Tk 8.4
Guilherme Polobcd03df2009-08-18 15:35:57 +00001794 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
1795 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
1796 # selection, set, size, unset, xview, yview
1797 def anchor_clear(self):
1798 """Removes the selection anchor."""
1799 self.tk.call(self, 'anchor', 'clear')
1800
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001801 def anchor_get(self):
1802 "Get the (x,y) coordinate of the current anchor cell"
1803 return self._getints(self.tk.call(self, 'anchor', 'get'))
1804
Guilherme Polobcd03df2009-08-18 15:35:57 +00001805 def anchor_set(self, x, y):
1806 """Set the selection anchor to the cell at (x, y)."""
1807 self.tk.call(self, 'anchor', 'set', x, y)
1808
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001809 def delete_row(self, from_, to=None):
1810 """Delete rows between from_ and to inclusive.
1811 If to is not provided, delete only row at from_"""
1812 if to is None:
1813 self.tk.call(self, 'delete', 'row', from_)
1814 else:
1815 self.tk.call(self, 'delete', 'row', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001816
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001817 def delete_column(self, from_, to=None):
1818 """Delete columns between from_ and to inclusive.
1819 If to is not provided, delete only column at from_"""
1820 if to is None:
1821 self.tk.call(self, 'delete', 'column', from_)
1822 else:
1823 self.tk.call(self, 'delete', 'column', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001824
1825 def edit_apply(self):
1826 """If any cell is being edited, de-highlight the cell and applies
1827 the changes."""
1828 self.tk.call(self, 'edit', 'apply')
1829
1830 def edit_set(self, x, y):
1831 """Highlights the cell at (x, y) for editing, if the -editnotify
1832 command returns True for this cell."""
1833 self.tk.call(self, 'edit', 'set', x, y)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001834
1835 def entrycget(self, x, y, option):
1836 "Get the option value for cell at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001837 if option and option[0] != '-':
1838 option = '-' + option
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001839 return self.tk.call(self, 'entrycget', x, y, option)
1840
Guilherme Polobcd03df2009-08-18 15:35:57 +00001841 def entryconfigure(self, x, y, cnf=None, **kw):
1842 return self._configure(('entryconfigure', x, y), cnf, kw)
1843
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001844 # def format
1845 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001846
1847 def info_exists(self, x, y):
1848 "Return True if display item exists at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001849 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001850
1851 def info_bbox(self, x, y):
1852 # This seems to always return '', at least for 'text' displayitems
1853 return self.tk.call(self, 'info', 'bbox', x, y)
1854
Guilherme Polobcd03df2009-08-18 15:35:57 +00001855 def move_column(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001856 """Moves the range of columns from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001857 the distance indicated by OFFSET. For example, move_column(2, 4, 1)
1858 moves the columns 2,3,4 to columns 3,4,5."""
1859 self.tk.call(self, 'move', 'column', from_, to, offset)
1860
1861 def move_row(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001862 """Moves the range of rows from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001863 the distance indicated by OFFSET.
1864 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
1865 self.tk.call(self, 'move', 'row', from_, to, offset)
1866
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001867 def nearest(self, x, y):
1868 "Return coordinate of cell nearest pixel coordinate (x,y)"
1869 return self._getints(self.tk.call(self, 'nearest', x, y))
1870
1871 # def selection adjust
1872 # def selection clear
1873 # def selection includes
1874 # def selection set
1875 # def selection toggle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001876
1877 def set(self, x, y, itemtype=None, **kw):
1878 args= self._options(self.cnf, kw)
1879 if itemtype is not None:
1880 args= ('-itemtype', itemtype) + args
1881 self.tk.call(self, 'set', x, y, *args)
1882
Guilherme Polobcd03df2009-08-18 15:35:57 +00001883 def size_column(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001884 """Queries or sets the size of the column given by
1885 INDEX. INDEX may be any non-negative
1886 integer that gives the position of a given column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001887 INDEX can also be the string "default"; in this case, this command
1888 queries or sets the default size of all columns.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001889 When no option-value pair is given, this command returns a tuple
1890 containing the current size setting of the given column. When
1891 option-value pairs are given, the corresponding options of the
Guilherme Polobcd03df2009-08-18 15:35:57 +00001892 size setting of the given column are changed. Options may be one
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001893 of the follwing:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001894 pad0 pixels
1895 Specifies the paddings to the left of a column.
1896 pad1 pixels
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001897 Specifies the paddings to the right of a column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001898 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001899 Specifies the width of a column. Val may be:
1900 "auto" -- the width of the column is set to the
1901 width of the widest cell in the column;
1902 a valid Tk screen distance unit;
1903 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001904 (e.g. 3.4chars) that sets the width of the column to the
1905 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001906 return self.tk.splitlist(self.tk.call(self._w, 'size', 'column', index,
Guilherme Polobcd03df2009-08-18 15:35:57 +00001907 *self._options({}, kw)))
1908
1909 def size_row(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001910 """Queries or sets the size of the row given by
1911 INDEX. INDEX may be any non-negative
1912 integer that gives the position of a given row .
Guilherme Polobcd03df2009-08-18 15:35:57 +00001913 INDEX can also be the string "default"; in this case, this command
1914 queries or sets the default size of all rows.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001915 When no option-value pair is given, this command returns a list con-
1916 taining the current size setting of the given row . When option-value
Guilherme Polobcd03df2009-08-18 15:35:57 +00001917 pairs are given, the corresponding options of the size setting of the
1918 given row are changed. Options may be one of the follwing:
1919 pad0 pixels
1920 Specifies the paddings to the top of a row.
1921 pad1 pixels
Ezio Melottie130a522011-10-19 10:58:56 +03001922 Specifies the paddings to the bottom of a row.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001923 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001924 Specifies the height of a row. Val may be:
1925 "auto" -- the height of the row is set to the
1926 height of the highest cell in the row;
1927 a valid Tk screen distance unit;
1928 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001929 (e.g. 3.4chars) that sets the height of the row to the
1930 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001931 return self.tk.splitlist(self.tk.call(
Guilherme Polobcd03df2009-08-18 15:35:57 +00001932 self, 'size', 'row', index, *self._options({}, kw)))
1933
1934 def unset(self, x, y):
1935 """Clears the cell at (x, y) by removing its display item."""
1936 self.tk.call(self._w, 'unset', x, y)
1937
Raymond Hettingerff41c482003-04-06 09:01:11 +00001938
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001939class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001940 '''Scrolled Grid widgets'''
1941
1942 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001943 def __init__(self, master=None, cnf={}, **kw):
1944 static= []
1945 self.cnf= cnf
1946 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)