blob: 7fb4bc54177878e9ae38c8bd2e0e47bb6f0da31f [file] [log] [blame]
Guido van Rossumd77d6992007-07-16 23:10:57 +00001# -*-mode: python; fill-column: 75; tab-width: 8 -*-
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00002#
3# $Id$
4#
Martin v. Löwisb7b32602001-11-02 23:48:20 +00005# Tix.py -- Tix widget wrappers.
6#
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00007# For Tix, see http://tix.sourceforge.net
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00008#
Moshe Zadka22710822001-03-21 17:24:49 +00009# - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000010# based on an idea of Jean-Marc Lugrin (lugrin@ms.com)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000011#
12# NOTE: In order to minimize changes to Tkinter.py, some of the code here
Moshe Zadka22710822001-03-21 17:24:49 +000013# (TixWidget.__init__) has been taken from Tkinter (Widget.__init__)
14# and will break if there are major changes in Tkinter.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000015#
16# The Tix widgets are represented by a class hierarchy in python with proper
17# inheritance of base classes.
18#
19# As a result after creating a 'w = StdButtonBox', I can write
Moshe Zadka22710822001-03-21 17:24:49 +000020# w.ok['text'] = 'Who Cares'
21# or w.ok['bg'] = w['bg']
22# or even w.ok.invoke()
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000023# etc.
24#
25# Compare the demo tixwidgets.py to the original Tcl program and you will
26# appreciate the advantages.
27#
28
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040029import os
30import tkinter
Georg Brandl14fc4272008-05-17 18:39:55 +000031from tkinter import *
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -040032from tkinter import _cnfmerge
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000033
34# WARNING - TkVersion is a limited precision floating point number
35if TkVersion < 3.999:
Collin Winterce36ad82007-08-30 01:19:48 +000036 raise ImportError("This version of Tix.py requires Tk 4.0 or higher")
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000037
38import _tkinter # If this fails your Python may not be configured for Tk
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000039
40# Some more constants (for consistency with Tkinter)
41WINDOW = 'window'
42TEXT = 'text'
43STATUS = 'status'
44IMMEDIATE = 'immediate'
45IMAGE = 'image'
46IMAGETEXT = 'imagetext'
47BALLOON = 'balloon'
48AUTO = 'auto'
49ACROSSTOP = 'acrosstop'
50
Guilherme Polobcd03df2009-08-18 15:35:57 +000051# A few useful constants for the Grid widget
52ASCII = 'ascii'
53CELL = 'cell'
54COLUMN = 'column'
55DECREASING = 'decreasing'
56INCREASING = 'increasing'
57INTEGER = 'integer'
58MAIN = 'main'
59MAX = 'max'
60REAL = 'real'
61ROW = 'row'
62S_REGION = 's-region'
63X_REGION = 'x-region'
64Y_REGION = 'y-region'
65
Fred Drake723293c2001-12-13 04:53:07 +000066# Some constants used by Tkinter dooneevent()
67TCL_DONT_WAIT = 1 << 1
68TCL_WINDOW_EVENTS = 1 << 2
69TCL_FILE_EVENTS = 1 << 3
70TCL_TIMER_EVENTS = 1 << 4
71TCL_IDLE_EVENTS = 1 << 5
72TCL_ALL_EVENTS = 0
73
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000074# BEWARE - this is implemented by copying some code from the Widget class
75# in Tkinter (to override Widget initialization) and is therefore
76# liable to break.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000077
78# Could probably add this to Tkinter.Misc
79class tixCommand:
Fred Drake723293c2001-12-13 04:53:07 +000080 """The tix commands provide access to miscellaneous elements
Martin v. Löwisb7b32602001-11-02 23:48:20 +000081 of Tix's internal state and the Tix application context.
Fred Drake723293c2001-12-13 04:53:07 +000082 Most of the information manipulated by these commands pertains
83 to the application as a whole, or to a screen or
84 display, rather than to a particular window.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000085
86 This is a mixin class, assumed to be mixed to Tkinter.Tk
87 that supports the self.tk.call method.
88 """
Fred Drake723293c2001-12-13 04:53:07 +000089
Martin v. Löwisb7b32602001-11-02 23:48:20 +000090 def tix_addbitmapdir(self, directory):
Fred Drake723293c2001-12-13 04:53:07 +000091 """Tix maintains a list of directories under which
Martin v. Löwisb7b32602001-11-02 23:48:20 +000092 the tix_getimage and tix_getbitmap commands will
Fred Drake723293c2001-12-13 04:53:07 +000093 search for image files. The standard bitmap directory
94 is $TIX_LIBRARY/bitmaps. The addbitmapdir command
95 adds directory into this list. By using this
Martin v. Löwisb7b32602001-11-02 23:48:20 +000096 command, the image files of an applications can
97 also be located using the tix_getimage or tix_getbitmap
98 command.
99 """
100 return self.tk.call('tix', 'addbitmapdir', directory)
101
102 def tix_cget(self, option):
103 """Returns the current value of the configuration
104 option given by option. Option may be any of the
105 options described in the CONFIGURATION OPTIONS section.
106 """
107 return self.tk.call('tix', 'cget', option)
108
109 def tix_configure(self, cnf=None, **kw):
Fred Drake723293c2001-12-13 04:53:07 +0000110 """Query or modify the configuration options of the Tix application
111 context. If no option is specified, returns a dictionary all of the
112 available options. If option is specified with no value, then the
113 command returns a list describing the one named option (this list
114 will be identical to the corresponding sublist of the value
115 returned if no option is specified). If one or more option-value
116 pairs are specified, then the command modifies the given option(s)
117 to have the given value(s); in this case the command returns an
118 empty string. Option may be any of the configuration options.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000119 """
Fred Drake723293c2001-12-13 04:53:07 +0000120 # Copied from Tkinter.py
121 if kw:
122 cnf = _cnfmerge((cnf, kw))
123 elif cnf:
124 cnf = _cnfmerge(cnf)
125 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200126 return self._getconfigure('tix', 'configure')
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300127 if isinstance(cnf, str):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200128 return self._getconfigure1('tix', 'configure', '-'+cnf)
Fred Drake723293c2001-12-13 04:53:07 +0000129 return self.tk.call(('tix', 'configure') + self._options(cnf))
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000130
131 def tix_filedialog(self, dlgclass=None):
Fred Drake723293c2001-12-13 04:53:07 +0000132 """Returns the file selection dialog that may be shared among
133 different calls from this application. This command will create a
134 file selection dialog widget when it is called the first time. This
135 dialog will be returned by all subsequent calls to tix_filedialog.
136 An optional dlgclass parameter can be passed to specified what type
137 of file selection dialog widget is desired. Possible options are
138 tix FileSelectDialog or tixExFileSelectDialog.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000139 """
140 if dlgclass is not None:
141 return self.tk.call('tix', 'filedialog', dlgclass)
142 else:
143 return self.tk.call('tix', 'filedialog')
144
145 def tix_getbitmap(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000146 """Locates a bitmap file of the name name.xpm or name in one of the
147 bitmap directories (see the tix_addbitmapdir command above). By
148 using tix_getbitmap, you can avoid hard coding the pathnames of the
149 bitmap files in your application. When successful, it returns the
150 complete pathname of the bitmap file, prefixed with the character
151 '@'. The returned value can be used to configure the -bitmap
152 option of the TK and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000153 """
154 return self.tk.call('tix', 'getbitmap', name)
155
156 def tix_getimage(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000157 """Locates an image file of the name name.xpm, name.xbm or name.ppm
158 in one of the bitmap directories (see the addbitmapdir command
159 above). If more than one file with the same name (but different
160 extensions) exist, then the image type is chosen according to the
161 depth of the X display: xbm images are chosen on monochrome
162 displays and color images are chosen on color displays. By using
Ezio Melotti42da6632011-03-15 05:18:48 +0200163 tix_ getimage, you can avoid hard coding the pathnames of the
Fred Drake723293c2001-12-13 04:53:07 +0000164 image files in your application. When successful, this command
165 returns the name of the newly created image, which can be used to
166 configure the -image option of the Tk and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000167 """
168 return self.tk.call('tix', 'getimage', name)
169
170 def tix_option_get(self, name):
Ezio Melotti13925002011-03-16 11:05:33 +0200171 """Gets the options maintained by the Tix
Fred Drake723293c2001-12-13 04:53:07 +0000172 scheme mechanism. Available options include:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000173
174 active_bg active_fg bg
175 bold_font dark1_bg dark1_fg
176 dark2_bg dark2_fg disabled_fg
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000177 fg fixed_font font
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000178 inactive_bg inactive_fg input1_bg
179 input2_bg italic_font light1_bg
180 light1_fg light2_bg light2_fg
181 menu_font output1_bg output2_bg
182 select_bg select_fg selector
183 """
184 # could use self.tk.globalgetvar('tixOption', name)
185 return self.tk.call('tix', 'option', 'get', name)
186
187 def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None):
Fred Drake723293c2001-12-13 04:53:07 +0000188 """Resets the scheme and fontset of the Tix application to
189 newScheme and newFontSet, respectively. This affects only those
190 widgets created after this call. Therefore, it is best to call the
191 resetoptions command before the creation of any widgets in a Tix
192 application.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000193
Fred Drake723293c2001-12-13 04:53:07 +0000194 The optional parameter newScmPrio can be given to reset the
195 priority level of the Tk options set by the Tix schemes.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000196
Fred Drake723293c2001-12-13 04:53:07 +0000197 Because of the way Tk handles the X option database, after Tix has
198 been has imported and inited, it is not possible to reset the color
199 schemes and font sets using the tix config command. Instead, the
200 tix_resetoptions command must be used.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000201 """
202 if newScmPrio is not None:
203 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio)
204 else:
205 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet)
206
Georg Brandl14fc4272008-05-17 18:39:55 +0000207class Tk(tkinter.Tk, tixCommand):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000208 """Toplevel widget of Tix which represents mostly the main window
209 of an application. It has an associated Tcl interpreter."""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000210 def __init__(self, screenName=None, baseName=None, className='Tix'):
Georg Brandl14fc4272008-05-17 18:39:55 +0000211 tkinter.Tk.__init__(self, screenName, baseName, className)
Moshe Zadka22710822001-03-21 17:24:49 +0000212 tixlib = os.environ.get('TIX_LIBRARY')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000213 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]')
Moshe Zadka22710822001-03-21 17:24:49 +0000214 if tixlib is not None:
215 self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib)
216 self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000217 # Load Tix - this should work dynamically or statically
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000218 # If it's static, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000219 # 'load {} Tix'
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000220 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000221 # 'load libtix8.1.8.3.so Tix'
Moshe Zadka22710822001-03-21 17:24:49 +0000222 self.tk.eval('package require Tix')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000223
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000224 def destroy(self):
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300225 # For safety, remove the delete_window binding before destroy
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000226 self.protocol("WM_DELETE_WINDOW", "")
Georg Brandl14fc4272008-05-17 18:39:55 +0000227 tkinter.Tk.destroy(self)
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000228
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000229# The Tix 'tixForm' geometry manager
230class Form:
231 """The Tix Form geometry manager
232
233 Widgets can be arranged by specifying attachments to other widgets.
234 See Tix documentation for complete details"""
235
236 def config(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000237 self.tk.call('tixForm', self._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000238
239 form = config
240
241 def __setitem__(self, key, value):
Guido van Rossum49fa2bd2001-08-13 14:12:35 +0000242 Form.form(self, {key: value})
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000243
244 def check(self):
245 return self.tk.call('tixForm', 'check', self._w)
246
247 def forget(self):
248 self.tk.call('tixForm', 'forget', self._w)
249
250 def grid(self, xsize=0, ysize=0):
251 if (not xsize) and (not ysize):
252 x = self.tk.call('tixForm', 'grid', self._w)
253 y = self.tk.splitlist(x)
254 z = ()
255 for x in y:
256 z = z + (self.tk.getint(x),)
257 return z
Martin v. Löwis46874282002-12-06 10:33:45 +0000258 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000259
260 def info(self, option=None):
261 if not option:
262 return self.tk.call('tixForm', 'info', self._w)
263 if option[0] != '-':
264 option = '-' + option
265 return self.tk.call('tixForm', 'info', self._w, option)
266
267 def slaves(self):
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000268 return [self._nametowidget(x) for x in
269 self.tk.splitlist(
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000270 self.tk.call(
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000271 'tixForm', 'slaves', self._w))]
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000272
273
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000274
Georg Brandl14fc4272008-05-17 18:39:55 +0000275tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000276
Georg Brandl14fc4272008-05-17 18:39:55 +0000277class TixWidget(tkinter.Widget):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000278 """A TixWidget class is used to package all (or most) Tix widgets.
279
280 Widget initialization is extended in two ways:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000281 1) It is possible to give a list of options which must be part of
Moshe Zadka22710822001-03-21 17:24:49 +0000282 the creation command (so called Tix 'static' options). These cannot be
283 given as a 'config' command later.
284 2) It is possible to give the name of an existing TK widget. These are
285 child widgets created automatically by a Tix mega-widget. The Tk call
286 to create these widgets is therefore bypassed in TixWidget.__init__
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000287
288 Both options are for use by subclasses only.
289 """
290 def __init__ (self, master=None, widgetName=None,
Moshe Zadka22710822001-03-21 17:24:49 +0000291 static_options=None, cnf={}, kw={}):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000292 # Merge keywords and dictionary arguments
293 if kw:
Moshe Zadka22710822001-03-21 17:24:49 +0000294 cnf = _cnfmerge((cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000295 else:
296 cnf = _cnfmerge(cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000297
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000298 # Move static options into extra. static_options must be
299 # a list of keywords (or None).
300 extra=()
Neal Norwitzf539bde2002-11-14 02:43:40 +0000301
302 # 'options' is always a static option
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000303 if static_options:
Neal Norwitzf539bde2002-11-14 02:43:40 +0000304 static_options.append('options')
305 else:
306 static_options = ['options']
Raymond Hettingerff41c482003-04-06 09:01:11 +0000307
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000308 for k,v in list(cnf.items()):
Neal Norwitzf539bde2002-11-14 02:43:40 +0000309 if k in static_options:
310 extra = extra + ('-' + k, v)
311 del cnf[k]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000312
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000313 self.widgetName = widgetName
314 Widget._setup(self, master, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000315
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000316 # If widgetName is None, this is a dummy creation call where the
317 # corresponding Tk widget has already been created by Tix
318 if widgetName:
Raymond Hettingerff41c482003-04-06 09:01:11 +0000319 self.tk.call(widgetName, self._w, *extra)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000320
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000321 # Non-static options - to be done via a 'config' command
322 if cnf:
323 Widget.config(self, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000324
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000325 # Dictionary to hold subwidget names for easier access. We can't
326 # use the children list because the public Tix names may not be the
327 # same as the pathname component
328 self.subwidget_list = {}
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000329
330 # We set up an attribute access function so that it is possible to
331 # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello'
332 # when w is a StdButtonBox.
333 # We can even do w.ok.invoke() because w.ok is subclassed from the
334 # Button class if you go through the proper constructors
335 def __getattr__(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000336 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000337 return self.subwidget_list[name]
Collin Winterce36ad82007-08-30 01:19:48 +0000338 raise AttributeError(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000339
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000340 def set_silent(self, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000341 """Set a variable without calling its action routine"""
342 self.tk.call('tixSetSilent', self._w, value)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000343
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000344 def subwidget(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000345 """Return the named subwidget (which must have been created by
346 the sub-class)."""
347 n = self._subwidget_name(name)
348 if not n:
Collin Winterce36ad82007-08-30 01:19:48 +0000349 raise TclError("Subwidget " + name + " not child of " + self._name)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000350 # Remove header of name and leading dot
351 n = n[len(self._w)+1:]
352 return self._nametowidget(n)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000353
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000354 def subwidgets_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000355 """Return all subwidgets."""
356 names = self._subwidget_names()
357 if not names:
358 return []
359 retlist = []
360 for name in names:
361 name = name[len(self._w)+1:]
362 try:
363 retlist.append(self._nametowidget(name))
364 except:
365 # some of the widgets are unknown e.g. border in LabelFrame
366 pass
367 return retlist
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000368
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000369 def _subwidget_name(self,name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000370 """Get a subwidget name (returns a String, not a Widget !)"""
371 try:
372 return self.tk.call(self._w, 'subwidget', name)
373 except TclError:
374 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000375
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000376 def _subwidget_names(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000377 """Return the name of all subwidgets."""
378 try:
379 x = self.tk.call(self._w, 'subwidgets', '-all')
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200380 return self.tk.splitlist(x)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000381 except TclError:
382 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000383
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000384 def config_all(self, option, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000385 """Set configuration options for all subwidgets (and self)."""
386 if option == '':
387 return
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300388 elif not isinstance(option, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000389 option = repr(option)
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300390 if not isinstance(value, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000391 value = repr(value)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000392 names = self._subwidget_names()
393 for name in names:
394 self.tk.call(name, 'configure', '-' + option, value)
Neal Norwitz731a9862002-12-10 02:18:49 +0000395 # These are missing from Tkinter
396 def image_create(self, imgtype, cnf={}, master=None, **kw):
397 if not master:
Georg Brandl14fc4272008-05-17 18:39:55 +0000398 master = tkinter._default_root
Neal Norwitz731a9862002-12-10 02:18:49 +0000399 if not master:
Collin Winterce36ad82007-08-30 01:19:48 +0000400 raise RuntimeError('Too early to create image')
Neal Norwitz731a9862002-12-10 02:18:49 +0000401 if kw and cnf: cnf = _cnfmerge((cnf, kw))
402 elif kw: cnf = kw
403 options = ()
404 for k, v in cnf.items():
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200405 if callable(v):
Neal Norwitz731a9862002-12-10 02:18:49 +0000406 v = self._register(v)
407 options = options + ('-'+k, v)
408 return master.tk.call(('image', 'create', imgtype,) + options)
409 def image_delete(self, imgname):
410 try:
411 self.tk.call('image', 'delete', imgname)
412 except TclError:
413 # May happen if the root was destroyed
414 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000415
416# Subwidgets are child widgets created automatically by mega-widgets.
417# In python, we have to create these subwidgets manually to mirror their
418# existence in Tk/Tix.
419class TixSubWidget(TixWidget):
420 """Subwidget class.
421
422 This is used to mirror child widgets automatically created
423 by Tix/Tk as part of a mega-widget in Python (which is not informed
424 of this)"""
425
426 def __init__(self, master, name,
Moshe Zadka22710822001-03-21 17:24:49 +0000427 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000428 if check_intermediate:
429 path = master._subwidget_name(name)
430 try:
431 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000432 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000433 except:
434 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000435
Thomas Wouters89f507f2006-12-13 04:49:30 +0000436 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000437 # immediate descendant
438 TixWidget.__init__(self, master, None, None, {'name' : name})
439 else:
440 # Ensure that the intermediate widgets exist
441 parent = master
442 for i in range(len(plist) - 1):
Neal Norwitzebb41902002-05-31 20:51:31 +0000443 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000444 try:
445 w = master._nametowidget(n)
446 parent = w
447 except KeyError:
448 # Create the intermediate widget
449 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000450 destroy_physically=0,
451 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000452 # The Tk widget name is in plist, not in name
453 if plist:
454 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000455 TixWidget.__init__(self, parent, None, None, {'name' : name})
456 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000457
458 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000459 # For some widgets e.g., a NoteBook, when we call destructors,
460 # we must be careful not to destroy the frame widget since this
461 # also destroys the parent NoteBook thus leading to an exception
462 # in Tkinter when it finally calls Tcl to destroy the NoteBook
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000463 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000464 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000465 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000466 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000467 del self.master.subwidget_list[self._name]
468 if self.destroy_physically:
469 # This is bypassed only for a few widgets
470 self.tk.call('destroy', self._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000471
472
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000473# Useful class to create a display style - later shared by many items.
474# Contributed by Steffen Kremser
475class DisplayStyle:
476 """DisplayStyle - handle configuration options shared by
477 (multiple) Display Items"""
478
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000479 def __init__(self, itemtype, cnf={}, **kw):
Serhiy Storchakae6f01992016-09-25 16:46:10 +0300480 if 'refwindow' in kw:
481 master = kw['refwindow']
482 elif 'refwindow' in cnf:
483 master = cnf['refwindow']
484 else:
485 master = tkinter._default_root
486 if not master:
487 raise RuntimeError("Too early to create display style: "
488 "no root window")
Moshe Zadka22710822001-03-21 17:24:49 +0000489 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000490 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
491 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000492
493 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000494 return self.stylename
495
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000496 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000497 if kw and cnf:
498 cnf = _cnfmerge((cnf, kw))
499 elif kw:
500 cnf = kw
501 opts = ()
502 for k, v in cnf.items():
503 opts = opts + ('-'+k, v)
504 return opts
505
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000506 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000507 self.tk.call(self.stylename, 'delete')
508
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000509 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000510 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
511
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000512 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200513 return self._getconfigure(
514 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000515
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000516 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000517 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000518
519
520######################################################
521### The Tix Widget classes - in alphabetical order ###
522######################################################
523
524class Balloon(TixWidget):
525 """Balloon help widget.
526
Moshe Zadka22710822001-03-21 17:24:49 +0000527 Subwidget Class
528 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000529 label Label
530 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000531
Martin v. Löwis46874282002-12-06 10:33:45 +0000532 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000533 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000534 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000535 static = ['options', 'installcolormap', 'initwait', 'statusbar',
536 'cursor']
537 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
538 self.subwidget_list['label'] = _dummyLabel(self, 'label',
539 destroy_physically=0)
540 self.subwidget_list['message'] = _dummyLabel(self, 'message',
541 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000542
543 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000544 """Bind balloon widget to another.
545 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000546 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000547
548 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000549 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000550
551class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000552 """ButtonBox - A container for pushbuttons.
553 Subwidgets are the buttons added with the add method.
554 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000555 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000556 TixWidget.__init__(self, master, 'tixButtonBox',
557 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000558
559 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000560 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000561
Raymond Hettingerff41c482003-04-06 09:01:11 +0000562 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000563 self.subwidget_list[name] = _dummyButton(self, name)
564 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000565
566 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000567 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000568 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000569
570class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000571 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200572 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000573 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000574
Moshe Zadka22710822001-03-21 17:24:49 +0000575 Subwidget Class
576 --------- -----
577 entry Entry
578 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000579 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000580 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000581 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000582
Martin v. Löwis46874282002-12-06 10:33:45 +0000583 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000584 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000585 TixWidget.__init__(self, master, 'tixComboBox',
586 ['editable', 'dropdown', 'fancy', 'options'],
587 cnf, kw)
588 self.subwidget_list['label'] = _dummyLabel(self, 'label')
589 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
590 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
591 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
592 'slistbox')
593 try:
594 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
595 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
596 except TypeError:
597 # unavailable when -fancy not specified
598 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000599
Neal Norwitz731a9862002-12-10 02:18:49 +0000600 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000601
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000602 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000603 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000604
605 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000606 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000607
608 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000609 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000610
611 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000612 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000613
614class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000615 """Control - An entry field with value change arrows. The user can
616 adjust the value by pressing the two arrow buttons or by entering
617 the value directly into the entry. The new value will be checked
618 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000619
Moshe Zadka22710822001-03-21 17:24:49 +0000620 Subwidget Class
621 --------- -----
622 incr Button
623 decr Button
624 entry Entry
625 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000626
Martin v. Löwis46874282002-12-06 10:33:45 +0000627 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000628 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000629 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
630 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
631 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
632 self.subwidget_list['label'] = _dummyLabel(self, 'label')
633 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000634
635 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000636 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000637
638 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000639 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000640
641 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000642 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000643
644 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000645 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000646
647class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000648 """DirList - displays a list view of a directory, its previous
649 directories and its sub-directories. The user can choose one of
650 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000651
Moshe Zadka22710822001-03-21 17:24:49 +0000652 Subwidget Class
653 --------- -----
654 hlist HList
655 hsb Scrollbar
656 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000657
Martin v. Löwis46874282002-12-06 10:33:45 +0000658 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000659 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000660 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
661 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
662 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
663 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000664
665 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000666 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000667
668class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000669 """DirTree - Directory Listing in a hierarchical view.
670 Displays a tree view of a directory, its previous directories and its
671 sub-directories. The user can choose one of the directories displayed
672 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000673
Moshe Zadka22710822001-03-21 17:24:49 +0000674 Subwidget Class
675 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000676 hlist HList
677 hsb Scrollbar
678 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000679
Martin v. Löwis46874282002-12-06 10:33:45 +0000680 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000681 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000682 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
683 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
684 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
685 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000686
687 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000688 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000689
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000690class DirSelectBox(TixWidget):
691 """DirSelectBox - Motif style file select box.
692 It is generally used for
693 the user to choose a file. FileSelectBox stores the files mostly
694 recently selected into a ComboBox widget so that they can be quickly
695 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000696
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000697 Subwidget Class
698 --------- -----
699 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000700 filter ComboBox
701 dirlist ScrolledListBox
702 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000703
704 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000705 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
706 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
707 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000708
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000709class ExFileSelectBox(TixWidget):
710 """ExFileSelectBox - MS Windows style file select box.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300711 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000712
Moshe Zadka22710822001-03-21 17:24:49 +0000713 Subwidget Class
714 --------- -----
715 cancel Button
716 ok Button
717 hidden Checkbutton
718 types ComboBox
719 dir ComboBox
720 file ComboBox
721 dirlist ScrolledListBox
722 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000723
724 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000725 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
726 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
727 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
728 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
729 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
730 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
731 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
732 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
733 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000734
735 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000736 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000737
738 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000739 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000740
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000741
742# Should inherit from a Dialog class
743class DirSelectDialog(TixWidget):
744 """The DirSelectDialog widget presents the directories in the file
745 system in a dialog window. The user can use this dialog window to
746 navigate through the file system to select the desired directory.
747
748 Subwidgets Class
749 ---------- -----
750 dirbox DirSelectDialog"""
751
Martin v. Löwis46874282002-12-06 10:33:45 +0000752 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000753 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000754 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000755 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000756 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
757 # cancel and ok buttons are missing
758
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000759 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000760 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000761
762 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000763 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000764
765
766# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000767class ExFileSelectDialog(TixWidget):
768 """ExFileSelectDialog - MS Windows style file select dialog.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300769 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000770
Moshe Zadka22710822001-03-21 17:24:49 +0000771 Subwidgets Class
772 ---------- -----
773 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000774
Martin v. Löwis46874282002-12-06 10:33:45 +0000775 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000776 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000777 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000778 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000779 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000780
781 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000782 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000783
784 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000785 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000786
787class FileSelectBox(TixWidget):
788 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000789 It is generally used for
790 the user to choose a file. FileSelectBox stores the files mostly
791 recently selected into a ComboBox widget so that they can be quickly
792 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000793
Moshe Zadka22710822001-03-21 17:24:49 +0000794 Subwidget Class
795 --------- -----
796 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000797 filter ComboBox
798 dirlist ScrolledListBox
799 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000800
801 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000802 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
803 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
804 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
805 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
806 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000807
Moshe Zadka22710822001-03-21 17:24:49 +0000808 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000809 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000810
811 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000812 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000813
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000814# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000815class FileSelectDialog(TixWidget):
816 """FileSelectDialog - Motif style file select dialog.
817
Moshe Zadka22710822001-03-21 17:24:49 +0000818 Subwidgets Class
819 ---------- -----
820 btns StdButtonBox
821 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000822
Martin v. Löwis46874282002-12-06 10:33:45 +0000823 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000824 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000825 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000826 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000827 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
828 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000829
830 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000831 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000832
833 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000834 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000835
836class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000837 """FileEntry - Entry field with button that invokes a FileSelectDialog.
838 The user can type in the filename manually. Alternatively, the user can
839 press the button widget that sits next to the entry, which will bring
840 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000841
Moshe Zadka22710822001-03-21 17:24:49 +0000842 Subwidgets Class
843 ---------- -----
844 button Button
845 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000846
Martin v. Löwis46874282002-12-06 10:33:45 +0000847 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000848 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000849 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000850 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000851 self.subwidget_list['button'] = _dummyButton(self, 'button')
852 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000853
854 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000855 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000856
857 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000858 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000859 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000860
Guilherme Polo1fff0082009-08-14 15:05:30 +0000861class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000862 """HList - Hierarchy display widget can be used to display any data
863 that have a hierarchical structure, for example, file system directory
864 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200865 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000866
867 Subwidgets - None"""
868
869 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000870 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000871 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000872
873 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000874 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000875
876 def add_child(self, parent=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000877 if not parent:
878 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000879 return self.tk.call(
880 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000881
882 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000883 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000884
885 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000886 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000887
888 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000889 if not chars:
890 return self.tk.call(self._w, 'column', 'width', col, width)
891 else:
892 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000893 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000894
895 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000896 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000897
898 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000899 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000900
901 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000902 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000903
904 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000905 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000906
907 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000908 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000909
910 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000911 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000912
913 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000914 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000915
916 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000917 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000918
919 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000920 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000921
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000922 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000923 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200924 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000925 self.tk.call(self._w, 'header', 'configure', col,
926 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000927
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000928 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000929 return self.tk.call(self._w, 'header', 'cget', col, opt)
930
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000931 def header_exists(self, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000932 return self.tk.call(self._w, 'header', 'exists', col)
933
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000934 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000935 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000936
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000937 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000938 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000939
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000940 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000941 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000942
943 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000944 self.tk.call(
945 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000946
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000947 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000948 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200949 return self._getconfigure(
950 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000951 self.tk.call(
952 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000953
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000954 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000955 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
956
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000957 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000958 return self.tk.call (self._w, 'indicator', 'exists', entry)
959
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000960 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000961 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000962
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000963 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000964 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000965
966 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000967 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000968
Guilherme Polobcd03df2009-08-18 15:35:57 +0000969 def info_bbox(self, entry):
970 return self._getints(
971 self.tk.call(self._w, 'info', 'bbox', entry)) or None
972
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000973 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000974 c = self.tk.call(self._w, 'info', 'children', entry)
975 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000976
977 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000978 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000979
Guilherme Polobcd03df2009-08-18 15:35:57 +0000980 def info_dragsite(self):
981 return self.tk.call(self._w, 'info', 'dragsite')
982
983 def info_dropsite(self):
984 return self.tk.call(self._w, 'info', 'dropsite')
985
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000986 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000987 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000988
989 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000990 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000991
992 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000993 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000994
995 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000996 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000997
998 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000999 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001000
1001 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001002 c = self.tk.call(self._w, 'info', 'selection')
1003 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001004
Martin v. Löwis3e048482001-10-09 11:50:55 +00001005 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001006 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
1007
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001008 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001009 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001010 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001011 self.tk.call(self._w, 'item', 'configure', entry, col,
1012 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001013
1014 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001015 self.tk.call(
1016 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001017
1018 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001019 return self.tk.call(self._w, 'item', 'exists', entry, col)
1020
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001021 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001022 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001023
Martin v. Löwis433fa692004-03-21 15:26:44 +00001024 def entrycget(self, entry, opt):
1025 return self.tk.call(self._w, 'entrycget', entry, opt)
1026
1027 def entryconfigure(self, entry, cnf={}, **kw):
1028 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001029 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001030 self.tk.call(self._w, 'entryconfigure', entry,
1031 *self._options(cnf, kw))
1032
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001033 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001034 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001035
1036 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001037 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001038
1039 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001040 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001041
1042 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001043 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001044
1045 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001046 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001047
1048 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001049 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001050
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001051class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001052 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001053
1054 Subwidgets - None"""
1055
1056 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001057 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001058
1059class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001060 """LabelEntry - Entry field with label. Packages an entry widget
Martin Pantera90a4a92016-05-30 04:04:50 +00001061 and a label into one mega widget. It can be used to simplify the creation
1062 of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001063
Moshe Zadka22710822001-03-21 17:24:49 +00001064 Subwidgets Class
1065 ---------- -----
1066 label Label
1067 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001068
1069 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001070 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001071 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001072 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1073 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001074
1075class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001076 """LabelFrame - Labelled Frame container. Packages a frame widget
1077 and a label into one mega widget. To create widgets inside a
1078 LabelFrame widget, one creates the new widgets relative to the
1079 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001080
Moshe Zadka22710822001-03-21 17:24:49 +00001081 Subwidgets Class
1082 ---------- -----
1083 label Label
1084 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001085
1086 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001087 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001088 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001089 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1090 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001091
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001092
1093class ListNoteBook(TixWidget):
1094 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1095 it can be used to display many windows in a limited space using a
1096 notebook metaphor. The notebook is divided into a stack of pages
1097 (windows). At one time only one of these pages can be shown.
1098 The user can navigate through these pages by
1099 choosing the name of the desired page in the hlist subwidget."""
1100
1101 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001102 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1103 # Is this necessary? It's not an exposed subwidget in Tix.
1104 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1105 destroy_physically=0)
1106 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1107 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001108
1109 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001110 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001111 self.subwidget_list[name] = TixSubWidget(self, name)
1112 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001113
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001114 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001115 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001116
1117 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001118 # Can't call subwidgets_all directly because we don't want .nbframe
1119 names = self.tk.split(self.tk.call(self._w, 'pages'))
1120 ret = []
1121 for x in names:
1122 ret.append(self.subwidget(x))
1123 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001124
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001125 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001126 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001127
1128class Meter(TixWidget):
1129 """The Meter widget can be used to show the progress of a background
1130 job which may take a long time to execute.
1131 """
1132
1133 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001134 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001135 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001136
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001137class NoteBook(TixWidget):
1138 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1139
Moshe Zadka22710822001-03-21 17:24:49 +00001140 Subwidgets Class
1141 ---------- -----
1142 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001143 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001144
1145 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001146 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1147 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001148 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001149
1150 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001151 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001152 self.subwidget_list[name] = TixSubWidget(self, name)
1153 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001154
1155 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001156 self.tk.call(self._w, 'delete', name)
1157 self.subwidget_list[name].destroy()
1158 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001159
1160 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001161 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001162
1163 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001164 # Can't call subwidgets_all directly because we don't want .nbframe
1165 names = self.tk.split(self.tk.call(self._w, 'pages'))
1166 ret = []
1167 for x in names:
1168 ret.append(self.subwidget(x))
1169 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001170
Moshe Zadka22710822001-03-21 17:24:49 +00001171 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001172 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001173
1174 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001175 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001176
1177class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001178 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001179 pass
1180
1181class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001182 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001183
Moshe Zadka22710822001-03-21 17:24:49 +00001184 Subwidget Class
1185 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001186 menubutton Menubutton
1187 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001188
1189 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001190 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1191 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1192 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001193
1194 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001195 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001196
1197 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001198 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001199
1200 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001201 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001202
1203 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001204 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001205
1206 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001207 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001208
1209class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001210 """PanedWindow - Multi-pane container widget
1211 allows the user to interactively manipulate the sizes of several
1212 panes. The panes can be arranged either vertically or horizontally.The
1213 user changes the sizes of the panes by dragging the resize handle
1214 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001215
Moshe Zadka22710822001-03-21 17:24:49 +00001216 Subwidgets Class
1217 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001218 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001219
1220 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001221 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001222
Neal Norwitzf539bde2002-11-14 02:43:40 +00001223 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001224 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001225 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001226 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001227 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001228 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001229
Neal Norwitzf539bde2002-11-14 02:43:40 +00001230 def delete(self, name):
1231 self.tk.call(self._w, 'delete', name)
1232 self.subwidget_list[name].destroy()
1233 del self.subwidget_list[name]
1234
1235 def forget(self, name):
1236 self.tk.call(self._w, 'forget', name)
1237
1238 def panecget(self, entry, opt):
1239 return self.tk.call(self._w, 'panecget', entry, opt)
1240
1241 def paneconfigure(self, entry, cnf={}, **kw):
1242 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001243 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001244 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001245
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001246 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001247 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1248 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001249
1250class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001251 """PopupMenu widget can be used as a replacement of the tk_popup command.
1252 The advantage of the Tix PopupMenu widget is it requires less application
1253 code to manipulate.
1254
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001255
Moshe Zadka22710822001-03-21 17:24:49 +00001256 Subwidgets Class
1257 ---------- -----
1258 menubutton Menubutton
1259 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001260
Martin v. Löwis46874282002-12-06 10:33:45 +00001261 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001262 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001263 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1264 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1265 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001266
1267 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001268 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001269
1270 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001271 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001272
1273 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001274 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001275
1276class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001277 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001278 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001279 # There seems to be a Tix bug rejecting the configure method
1280 # Let's try making the flags -static
1281 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1282 'handlesize', 'hintcolor', 'hintwidth',
1283 'x', 'y']
1284 # In fact, x y height width are configurable
1285 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001286 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001287
1288 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001289 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001290
Martin v. Löwis652e1912001-11-25 14:50:56 +00001291 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001292 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001293
1294 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001295 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001296
1297 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001298 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001299
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001300class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001301 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001302
Martin v. Löwis46874282002-12-06 10:33:45 +00001303 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001304 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001305 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001306 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001307 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1308 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1309 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001310
1311class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001312 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001313
Martin v. Löwis46874282002-12-06 10:33:45 +00001314 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001315 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001316 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1317 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1318 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1319 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001320
1321class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001322 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001323
Martin v. Löwis46874282002-12-06 10:33:45 +00001324 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001325 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001326 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1327 self.subwidget_list['text'] = _dummyText(self, 'text')
1328 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1329 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001330
1331class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001332 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001333
Martin v. Löwis46874282002-12-06 10:33:45 +00001334 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001335 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001336 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001337 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001338 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1339 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1340 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001341
1342class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001343 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001344
Martin v. Löwis46874282002-12-06 10:33:45 +00001345 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001346 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001347 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1348 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1349 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1350 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001351
1352class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001353 """Select - Container of button subwidgets. It can be used to provide
1354 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001355
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001356 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001357
Martin v. Löwis46874282002-12-06 10:33:45 +00001358 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001359 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001360 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001361 ['allowzero', 'radio', 'orientation', 'labelside',
1362 'options'],
1363 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001364 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001365
1366 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001367 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001368 self.subwidget_list[name] = _dummyButton(self, name)
1369 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001370
1371 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001372 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001373
Neal Norwitzf539bde2002-11-14 02:43:40 +00001374class Shell(TixWidget):
1375 """Toplevel window.
1376
1377 Subwidgets - None"""
1378
1379 def __init__ (self,master=None,cnf={}, **kw):
1380 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1381
1382class DialogShell(TixWidget):
1383 """Toplevel window, with popup popdown and center methods.
1384 It tells the window manager that it is a dialog window and should be
1385 treated specially. The exact treatment depends on the treatment of
1386 the window manager.
1387
1388 Subwidgets - None"""
1389
Martin v. Löwis46874282002-12-06 10:33:45 +00001390 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001391 def __init__ (self,master=None,cnf={}, **kw):
1392 TixWidget.__init__(self, master,
1393 'tixDialogShell',
1394 ['options', 'title', 'mapped',
1395 'minheight', 'minwidth',
1396 'parent', 'transient'], cnf, kw)
1397
1398 def popdown(self):
1399 self.tk.call(self._w, 'popdown')
1400
1401 def popup(self):
1402 self.tk.call(self._w, 'popup')
1403
1404 def center(self):
1405 self.tk.call(self._w, 'center')
1406
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001407class StdButtonBox(TixWidget):
1408 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1409
1410 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001411 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001412 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001413 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1414 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1415 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1416 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001417
1418 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001419 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001420 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001421
Guilherme Polo1fff0082009-08-14 15:05:30 +00001422class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001423 """TList - Hierarchy display widget which can be
1424 used to display data in a tabular format. The list entries of a TList
1425 widget are similar to the entries in the Tk listbox widget. The main
1426 differences are (1) the TList widget can display the list entries in a
1427 two dimensional format and (2) you can use graphical images as well as
1428 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001429
1430 Subwidgets - None"""
1431
1432 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001433 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001434
1435 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001436 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001437
1438 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001439 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001440
1441 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001442 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001443
1444 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001445 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001446
1447 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001448 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001449
1450 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001451 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001452
1453 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001454 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001455
1456 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001457 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001458
1459 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001460 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001461
1462 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001463 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001464
1465 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001466 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001467
1468 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001469 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001470
1471 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001472 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001473
1474 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001475 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001476
1477 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001478 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001479
1480 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001481 c = self.tk.call(self._w, 'info', 'selection')
1482 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001483
1484 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001485 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001486
1487 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001488 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001489
1490 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001491 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001492
1493 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001494 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001495
1496 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001497 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001498
1499 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001500 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001501
1502 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001503 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001504
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001505class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001506 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001507 data in a tree form. The user can adjust
1508 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001509
Martin v. Löwis46874282002-12-06 10:33:45 +00001510 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001511 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001512 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001513 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001514 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1515 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1516 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001517
1518 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001519 '''This command calls the setmode method for all the entries in this
1520 Tree widget: if an entry has no child entries, its mode is set to
1521 none. Otherwise, if the entry has any hidden child entries, its mode is
1522 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001523 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001524
1525 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001526 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001527 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001528
1529 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001530 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001531 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001532
1533 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001534 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001535 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001536
1537 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001538 '''This command is used to indicate whether the entry given by
1539 entryPath has children entries and whether the children are visible. mode
1540 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001541 indicator is drawn next the entry. If mode is set to close, a (-)
1542 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001543 indicators will be drawn for this entry. The default mode is none. The
1544 open mode indicates the entry has hidden children and this entry can be
1545 opened by the user. The close mode indicates that all the children of the
1546 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001547 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001548
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001549
1550# Could try subclassing Tree for CheckList - would need another arg to init
1551class CheckList(TixWidget):
1552 """The CheckList widget
1553 displays a list of items to be selected by the user. CheckList acts
1554 similarly to the Tk checkbutton or radiobutton widgets, except it is
1555 capable of handling many more items than checkbuttons or radiobuttons.
1556 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001557 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001558 def __init__(self, master=None, cnf={}, **kw):
1559 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001560 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001561 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1562 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1563 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001564
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001565 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001566 '''This command calls the setmode method for all the entries in this
1567 Tree widget: if an entry has no child entries, its mode is set to
1568 none. Otherwise, if the entry has any hidden child entries, its mode is
1569 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001570 self.tk.call(self._w, 'autosetmode')
1571
1572 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001573 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001574 self.tk.call(self._w, 'close', entrypath)
1575
1576 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001577 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001578 return self.tk.call(self._w, 'getmode', entrypath)
1579
1580 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001581 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001582 self.tk.call(self._w, 'open', entrypath)
1583
1584 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001585 '''Returns a list of items whose status matches status. If status is
1586 not specified, the list of items in the "on" status will be returned.
1587 Mode can be on, off, default'''
1588 c = self.tk.split(self.tk.call(self._w, 'getselection', mode))
1589 return self.tk.splitlist(c)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001590
1591 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001592 '''Returns the current status of entryPath.'''
1593 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001594
1595 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001596 '''Sets the status of entryPath to be status. A bitmap will be
1597 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001598 self.tk.call(self._w, 'setstatus', entrypath, mode)
1599
1600
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001601###########################################################################
1602### The subclassing below is used to instantiate the subwidgets in each ###
1603### mega widget. This allows us to access their methods directly. ###
1604###########################################################################
1605
1606class _dummyButton(Button, 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 _dummyCheckbutton(Checkbutton, 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 _dummyEntry(Entry, 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 _dummyFrame(Frame, 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 _dummyLabel(Label, 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 _dummyListbox(Listbox, 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 _dummyMenu(Menu, 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 _dummyMenubutton(Menubutton, 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 _dummyScrollbar(Scrollbar, 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 _dummyText(Text, 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)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001645
1646class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1647 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001648 TixSubWidget.__init__(self, master, name, destroy_physically)
1649 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1650 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1651 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001652
1653class _dummyHList(HList, 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)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001656
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001657class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1658 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001659 TixSubWidget.__init__(self, master, name, destroy_physically)
1660 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1661 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1662 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001663
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001664class _dummyTList(TList, TixSubWidget):
1665 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001666 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001667
1668class _dummyComboBox(ComboBox, TixSubWidget):
1669 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001670 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1671 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001672 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1673 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001674
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001675 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001676 'slistbox')
1677 try:
1678 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1679 #cross Button : present if created with the fancy option
1680 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1681 except TypeError:
1682 # unavailable when -fancy not specified
1683 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001684
1685class _dummyDirList(DirList, TixSubWidget):
1686 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001687 TixSubWidget.__init__(self, master, name, destroy_physically)
1688 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1689 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1690 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001691
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001692class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1693 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001694 TixSubWidget.__init__(self, master, name, destroy_physically)
1695 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1696 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001697
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001698class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1699 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001700 TixSubWidget.__init__(self, master, name, destroy_physically)
1701 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1702 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1703 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1704 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1705 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1706 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1707 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1708 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001709
1710class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1711 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001712 TixSubWidget.__init__(self, master, name, destroy_physically)
1713 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1714 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1715 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1716 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001717
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001718class _dummyFileComboBox(ComboBox, TixSubWidget):
1719 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001720 TixSubWidget.__init__(self, master, name, destroy_physically)
1721 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001722
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001723class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1724 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001725 TixSubWidget.__init__(self, master, name, destroy_physically)
1726 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1727 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1728 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1729 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001730
1731class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1732 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001733 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001734
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001735class _dummyPanedWindow(PanedWindow, TixSubWidget):
1736 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001737 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001738
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001739########################
1740### Utility Routines ###
1741########################
1742
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001743#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1744
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001745def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001746 '''Returns the qualified path name for the widget. Normally used to set
1747 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001748 return widget.tk.call('tixOptionName', widget._w)
1749
1750# Called with a dictionary argument of the form
1751# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1752# returns a string which can be used to configure the fsbox file types
1753# in an ExFileSelectBox. i.e.,
1754# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1755def FileTypeList(dict):
1756 s = ''
1757 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001758 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001759 return s
1760
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001761# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001762# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001763class CObjView(TixWidget):
1764 """This file implements the Canvas Object View widget. This is a base
1765 class of IconView. It implements automatic placement/adjustment of the
1766 scrollbars according to the canvas objects inside the canvas subwidget.
1767 The scrollbars are adjusted so that the canvas is just large enough
1768 to see all the objects.
1769 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001770 # FIXME: It should inherit -superclass tixScrolledWidget
1771 pass
1772
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001773
Guilherme Polo1fff0082009-08-14 15:05:30 +00001774class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001775 '''The Tix Grid command creates a new window and makes it into a
1776 tixGrid widget. Additional options, may be specified on the command
1777 line or in the option database to configure aspects such as its cursor
1778 and relief.
1779
1780 A Grid widget displays its contents in a two dimensional grid of cells.
1781 Each cell may contain one Tix display item, which may be in text,
1782 graphics or other formats. See the DisplayStyle class for more information
1783 about Tix display items. Individual cells, or groups of cells, can be
1784 formatted with a wide range of attributes, such as its color, relief and
1785 border.
1786
1787 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001788 # valid specific resources as of Tk 8.4
1789 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1790 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1791 # selectunit, topmargin,
1792 def __init__(self, master=None, cnf={}, **kw):
1793 static= []
1794 self.cnf= cnf
1795 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001796
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001797 # valid options as of Tk 8.4
Guilherme Polobcd03df2009-08-18 15:35:57 +00001798 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
1799 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
1800 # selection, set, size, unset, xview, yview
1801 def anchor_clear(self):
1802 """Removes the selection anchor."""
1803 self.tk.call(self, 'anchor', 'clear')
1804
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805 def anchor_get(self):
1806 "Get the (x,y) coordinate of the current anchor cell"
1807 return self._getints(self.tk.call(self, 'anchor', 'get'))
1808
Guilherme Polobcd03df2009-08-18 15:35:57 +00001809 def anchor_set(self, x, y):
1810 """Set the selection anchor to the cell at (x, y)."""
1811 self.tk.call(self, 'anchor', 'set', x, y)
1812
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001813 def delete_row(self, from_, to=None):
1814 """Delete rows between from_ and to inclusive.
1815 If to is not provided, delete only row at from_"""
1816 if to is None:
1817 self.tk.call(self, 'delete', 'row', from_)
1818 else:
1819 self.tk.call(self, 'delete', 'row', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001820
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001821 def delete_column(self, from_, to=None):
1822 """Delete columns between from_ and to inclusive.
1823 If to is not provided, delete only column at from_"""
1824 if to is None:
1825 self.tk.call(self, 'delete', 'column', from_)
1826 else:
1827 self.tk.call(self, 'delete', 'column', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001828
1829 def edit_apply(self):
1830 """If any cell is being edited, de-highlight the cell and applies
1831 the changes."""
1832 self.tk.call(self, 'edit', 'apply')
1833
1834 def edit_set(self, x, y):
1835 """Highlights the cell at (x, y) for editing, if the -editnotify
1836 command returns True for this cell."""
1837 self.tk.call(self, 'edit', 'set', x, y)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001838
1839 def entrycget(self, x, y, option):
1840 "Get the option value for cell at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001841 if option and option[0] != '-':
1842 option = '-' + option
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001843 return self.tk.call(self, 'entrycget', x, y, option)
1844
Guilherme Polobcd03df2009-08-18 15:35:57 +00001845 def entryconfigure(self, x, y, cnf=None, **kw):
1846 return self._configure(('entryconfigure', x, y), cnf, kw)
1847
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001848 # def format
1849 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001850
1851 def info_exists(self, x, y):
1852 "Return True if display item exists at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001853 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001854
1855 def info_bbox(self, x, y):
1856 # This seems to always return '', at least for 'text' displayitems
1857 return self.tk.call(self, 'info', 'bbox', x, y)
1858
Guilherme Polobcd03df2009-08-18 15:35:57 +00001859 def move_column(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001860 """Moves the range of columns from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001861 the distance indicated by OFFSET. For example, move_column(2, 4, 1)
1862 moves the columns 2,3,4 to columns 3,4,5."""
1863 self.tk.call(self, 'move', 'column', from_, to, offset)
1864
1865 def move_row(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001866 """Moves the range of rows from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001867 the distance indicated by OFFSET.
1868 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
1869 self.tk.call(self, 'move', 'row', from_, to, offset)
1870
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001871 def nearest(self, x, y):
1872 "Return coordinate of cell nearest pixel coordinate (x,y)"
1873 return self._getints(self.tk.call(self, 'nearest', x, y))
1874
1875 # def selection adjust
1876 # def selection clear
1877 # def selection includes
1878 # def selection set
1879 # def selection toggle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001880
1881 def set(self, x, y, itemtype=None, **kw):
1882 args= self._options(self.cnf, kw)
1883 if itemtype is not None:
1884 args= ('-itemtype', itemtype) + args
1885 self.tk.call(self, 'set', x, y, *args)
1886
Guilherme Polobcd03df2009-08-18 15:35:57 +00001887 def size_column(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001888 """Queries or sets the size of the column given by
1889 INDEX. INDEX may be any non-negative
1890 integer that gives the position of a given column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001891 INDEX can also be the string "default"; in this case, this command
1892 queries or sets the default size of all columns.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001893 When no option-value pair is given, this command returns a tuple
1894 containing the current size setting of the given column. When
1895 option-value pairs are given, the corresponding options of the
Guilherme Polobcd03df2009-08-18 15:35:57 +00001896 size setting of the given column are changed. Options may be one
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001897 of the follwing:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001898 pad0 pixels
1899 Specifies the paddings to the left of a column.
1900 pad1 pixels
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001901 Specifies the paddings to the right of a column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001902 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001903 Specifies the width of a column. Val may be:
1904 "auto" -- the width of the column is set to the
1905 width of the widest cell in the column;
1906 a valid Tk screen distance unit;
1907 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001908 (e.g. 3.4chars) that sets the width of the column to the
1909 given number of characters."""
1910 return self.tk.split(self.tk.call(self._w, 'size', 'column', index,
1911 *self._options({}, kw)))
1912
1913 def size_row(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001914 """Queries or sets the size of the row given by
1915 INDEX. INDEX may be any non-negative
1916 integer that gives the position of a given row .
Guilherme Polobcd03df2009-08-18 15:35:57 +00001917 INDEX can also be the string "default"; in this case, this command
1918 queries or sets the default size of all rows.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001919 When no option-value pair is given, this command returns a list con-
1920 taining the current size setting of the given row . When option-value
Guilherme Polobcd03df2009-08-18 15:35:57 +00001921 pairs are given, the corresponding options of the size setting of the
1922 given row are changed. Options may be one of the follwing:
1923 pad0 pixels
1924 Specifies the paddings to the top of a row.
1925 pad1 pixels
Ezio Melottie130a522011-10-19 10:58:56 +03001926 Specifies the paddings to the bottom of a row.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001927 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001928 Specifies the height of a row. Val may be:
1929 "auto" -- the height of the row is set to the
1930 height of the highest cell in the row;
1931 a valid Tk screen distance unit;
1932 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001933 (e.g. 3.4chars) that sets the height of the row to the
1934 given number of characters."""
1935 return self.tk.split(self.tk.call(
1936 self, 'size', 'row', index, *self._options({}, kw)))
1937
1938 def unset(self, x, y):
1939 """Clears the cell at (x, y) by removing its display item."""
1940 self.tk.call(self._w, 'unset', x, y)
1941
Raymond Hettingerff41c482003-04-06 09:01:11 +00001942
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001943class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001944 '''Scrolled Grid widgets'''
1945
1946 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001947 def __init__(self, master=None, cnf={}, **kw):
1948 static= []
1949 self.cnf= cnf
1950 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)