blob: e7cb10adfdd356f6c7bb5e2016afa44a9d1d7730 [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
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000034import _tkinter # If this fails your Python may not be configured for Tk
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000035
36# Some more constants (for consistency with Tkinter)
37WINDOW = 'window'
38TEXT = 'text'
39STATUS = 'status'
40IMMEDIATE = 'immediate'
41IMAGE = 'image'
42IMAGETEXT = 'imagetext'
43BALLOON = 'balloon'
44AUTO = 'auto'
45ACROSSTOP = 'acrosstop'
46
Guilherme Polobcd03df2009-08-18 15:35:57 +000047# A few useful constants for the Grid widget
48ASCII = 'ascii'
49CELL = 'cell'
50COLUMN = 'column'
51DECREASING = 'decreasing'
52INCREASING = 'increasing'
53INTEGER = 'integer'
54MAIN = 'main'
55MAX = 'max'
56REAL = 'real'
57ROW = 'row'
58S_REGION = 's-region'
59X_REGION = 'x-region'
60Y_REGION = 'y-region'
61
Fred Drake723293c2001-12-13 04:53:07 +000062# Some constants used by Tkinter dooneevent()
63TCL_DONT_WAIT = 1 << 1
64TCL_WINDOW_EVENTS = 1 << 2
65TCL_FILE_EVENTS = 1 << 3
66TCL_TIMER_EVENTS = 1 << 4
67TCL_IDLE_EVENTS = 1 << 5
68TCL_ALL_EVENTS = 0
69
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +000070# BEWARE - this is implemented by copying some code from the Widget class
71# in Tkinter (to override Widget initialization) and is therefore
72# liable to break.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000073
74# Could probably add this to Tkinter.Misc
75class tixCommand:
Fred Drake723293c2001-12-13 04:53:07 +000076 """The tix commands provide access to miscellaneous elements
Martin v. Löwisb7b32602001-11-02 23:48:20 +000077 of Tix's internal state and the Tix application context.
Fred Drake723293c2001-12-13 04:53:07 +000078 Most of the information manipulated by these commands pertains
79 to the application as a whole, or to a screen or
80 display, rather than to a particular window.
Martin v. Löwisb7b32602001-11-02 23:48:20 +000081
82 This is a mixin class, assumed to be mixed to Tkinter.Tk
83 that supports the self.tk.call method.
84 """
Fred Drake723293c2001-12-13 04:53:07 +000085
Martin v. Löwisb7b32602001-11-02 23:48:20 +000086 def tix_addbitmapdir(self, directory):
Fred Drake723293c2001-12-13 04:53:07 +000087 """Tix maintains a list of directories under which
Martin v. Löwisb7b32602001-11-02 23:48:20 +000088 the tix_getimage and tix_getbitmap commands will
Fred Drake723293c2001-12-13 04:53:07 +000089 search for image files. The standard bitmap directory
90 is $TIX_LIBRARY/bitmaps. The addbitmapdir command
91 adds directory into this list. By using this
Martin v. Löwisb7b32602001-11-02 23:48:20 +000092 command, the image files of an applications can
93 also be located using the tix_getimage or tix_getbitmap
94 command.
95 """
96 return self.tk.call('tix', 'addbitmapdir', directory)
97
98 def tix_cget(self, option):
99 """Returns the current value of the configuration
100 option given by option. Option may be any of the
101 options described in the CONFIGURATION OPTIONS section.
102 """
103 return self.tk.call('tix', 'cget', option)
104
105 def tix_configure(self, cnf=None, **kw):
Fred Drake723293c2001-12-13 04:53:07 +0000106 """Query or modify the configuration options of the Tix application
107 context. If no option is specified, returns a dictionary all of the
108 available options. If option is specified with no value, then the
109 command returns a list describing the one named option (this list
110 will be identical to the corresponding sublist of the value
111 returned if no option is specified). If one or more option-value
112 pairs are specified, then the command modifies the given option(s)
113 to have the given value(s); in this case the command returns an
114 empty string. Option may be any of the configuration options.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000115 """
Fred Drake723293c2001-12-13 04:53:07 +0000116 # Copied from Tkinter.py
117 if kw:
118 cnf = _cnfmerge((cnf, kw))
119 elif cnf:
120 cnf = _cnfmerge(cnf)
121 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200122 return self._getconfigure('tix', 'configure')
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300123 if isinstance(cnf, str):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200124 return self._getconfigure1('tix', 'configure', '-'+cnf)
Fred Drake723293c2001-12-13 04:53:07 +0000125 return self.tk.call(('tix', 'configure') + self._options(cnf))
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000126
127 def tix_filedialog(self, dlgclass=None):
Fred Drake723293c2001-12-13 04:53:07 +0000128 """Returns the file selection dialog that may be shared among
129 different calls from this application. This command will create a
130 file selection dialog widget when it is called the first time. This
131 dialog will be returned by all subsequent calls to tix_filedialog.
132 An optional dlgclass parameter can be passed to specified what type
133 of file selection dialog widget is desired. Possible options are
134 tix FileSelectDialog or tixExFileSelectDialog.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000135 """
136 if dlgclass is not None:
137 return self.tk.call('tix', 'filedialog', dlgclass)
138 else:
139 return self.tk.call('tix', 'filedialog')
140
141 def tix_getbitmap(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000142 """Locates a bitmap file of the name name.xpm or name in one of the
143 bitmap directories (see the tix_addbitmapdir command above). By
144 using tix_getbitmap, you can avoid hard coding the pathnames of the
145 bitmap files in your application. When successful, it returns the
146 complete pathname of the bitmap file, prefixed with the character
147 '@'. The returned value can be used to configure the -bitmap
148 option of the TK and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000149 """
150 return self.tk.call('tix', 'getbitmap', name)
151
152 def tix_getimage(self, name):
Fred Drake723293c2001-12-13 04:53:07 +0000153 """Locates an image file of the name name.xpm, name.xbm or name.ppm
154 in one of the bitmap directories (see the addbitmapdir command
155 above). If more than one file with the same name (but different
156 extensions) exist, then the image type is chosen according to the
157 depth of the X display: xbm images are chosen on monochrome
158 displays and color images are chosen on color displays. By using
Ezio Melotti42da6632011-03-15 05:18:48 +0200159 tix_ getimage, you can avoid hard coding the pathnames of the
Fred Drake723293c2001-12-13 04:53:07 +0000160 image files in your application. When successful, this command
161 returns the name of the newly created image, which can be used to
162 configure the -image option of the Tk and Tix widgets.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000163 """
164 return self.tk.call('tix', 'getimage', name)
165
166 def tix_option_get(self, name):
Ezio Melotti13925002011-03-16 11:05:33 +0200167 """Gets the options maintained by the Tix
Fred Drake723293c2001-12-13 04:53:07 +0000168 scheme mechanism. Available options include:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000169
170 active_bg active_fg bg
171 bold_font dark1_bg dark1_fg
172 dark2_bg dark2_fg disabled_fg
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000173 fg fixed_font font
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000174 inactive_bg inactive_fg input1_bg
175 input2_bg italic_font light1_bg
176 light1_fg light2_bg light2_fg
177 menu_font output1_bg output2_bg
178 select_bg select_fg selector
179 """
180 # could use self.tk.globalgetvar('tixOption', name)
181 return self.tk.call('tix', 'option', 'get', name)
182
183 def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None):
Fred Drake723293c2001-12-13 04:53:07 +0000184 """Resets the scheme and fontset of the Tix application to
185 newScheme and newFontSet, respectively. This affects only those
186 widgets created after this call. Therefore, it is best to call the
187 resetoptions command before the creation of any widgets in a Tix
188 application.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000189
Fred Drake723293c2001-12-13 04:53:07 +0000190 The optional parameter newScmPrio can be given to reset the
191 priority level of the Tk options set by the Tix schemes.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000192
Fred Drake723293c2001-12-13 04:53:07 +0000193 Because of the way Tk handles the X option database, after Tix has
194 been has imported and inited, it is not possible to reset the color
195 schemes and font sets using the tix config command. Instead, the
196 tix_resetoptions command must be used.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000197 """
198 if newScmPrio is not None:
199 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio)
200 else:
201 return self.tk.call('tix', 'resetoptions', newScheme, newFontSet)
202
Georg Brandl14fc4272008-05-17 18:39:55 +0000203class Tk(tkinter.Tk, tixCommand):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000204 """Toplevel widget of Tix which represents mostly the main window
205 of an application. It has an associated Tcl interpreter."""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000206 def __init__(self, screenName=None, baseName=None, className='Tix'):
Georg Brandl14fc4272008-05-17 18:39:55 +0000207 tkinter.Tk.__init__(self, screenName, baseName, className)
Moshe Zadka22710822001-03-21 17:24:49 +0000208 tixlib = os.environ.get('TIX_LIBRARY')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000209 self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]')
Moshe Zadka22710822001-03-21 17:24:49 +0000210 if tixlib is not None:
211 self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib)
212 self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000213 # Load Tix - this should work dynamically or statically
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000214 # If it's static, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000215 # 'load {} Tix'
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000216 # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000217 # 'load libtix8.1.8.3.so Tix'
Moshe Zadka22710822001-03-21 17:24:49 +0000218 self.tk.eval('package require Tix')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000219
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000220 def destroy(self):
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300221 # For safety, remove the delete_window binding before destroy
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +0000222 self.protocol("WM_DELETE_WINDOW", "")
Georg Brandl14fc4272008-05-17 18:39:55 +0000223 tkinter.Tk.destroy(self)
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000224
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000225# The Tix 'tixForm' geometry manager
226class Form:
227 """The Tix Form geometry manager
228
229 Widgets can be arranged by specifying attachments to other widgets.
230 See Tix documentation for complete details"""
231
232 def config(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000233 self.tk.call('tixForm', self._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000234
235 form = config
236
237 def __setitem__(self, key, value):
Guido van Rossum49fa2bd2001-08-13 14:12:35 +0000238 Form.form(self, {key: value})
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000239
240 def check(self):
241 return self.tk.call('tixForm', 'check', self._w)
242
243 def forget(self):
244 self.tk.call('tixForm', 'forget', self._w)
245
246 def grid(self, xsize=0, ysize=0):
247 if (not xsize) and (not ysize):
248 x = self.tk.call('tixForm', 'grid', self._w)
249 y = self.tk.splitlist(x)
250 z = ()
251 for x in y:
252 z = z + (self.tk.getint(x),)
253 return z
Martin v. Löwis46874282002-12-06 10:33:45 +0000254 return self.tk.call('tixForm', 'grid', self._w, xsize, ysize)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000255
256 def info(self, option=None):
257 if not option:
258 return self.tk.call('tixForm', 'info', self._w)
259 if option[0] != '-':
260 option = '-' + option
261 return self.tk.call('tixForm', 'info', self._w, option)
262
263 def slaves(self):
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000264 return [self._nametowidget(x) for x in
265 self.tk.splitlist(
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000266 self.tk.call(
Alexander Belopolsky022f0492010-11-22 19:40:51 +0000267 'tixForm', 'slaves', self._w))]
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000268
269
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000270
Georg Brandl14fc4272008-05-17 18:39:55 +0000271tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000272
Georg Brandl14fc4272008-05-17 18:39:55 +0000273class TixWidget(tkinter.Widget):
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000274 """A TixWidget class is used to package all (or most) Tix widgets.
275
276 Widget initialization is extended in two ways:
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000277 1) It is possible to give a list of options which must be part of
Moshe Zadka22710822001-03-21 17:24:49 +0000278 the creation command (so called Tix 'static' options). These cannot be
279 given as a 'config' command later.
280 2) It is possible to give the name of an existing TK widget. These are
281 child widgets created automatically by a Tix mega-widget. The Tk call
282 to create these widgets is therefore bypassed in TixWidget.__init__
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000283
284 Both options are for use by subclasses only.
285 """
286 def __init__ (self, master=None, widgetName=None,
Moshe Zadka22710822001-03-21 17:24:49 +0000287 static_options=None, cnf={}, kw={}):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000288 # Merge keywords and dictionary arguments
289 if kw:
Moshe Zadka22710822001-03-21 17:24:49 +0000290 cnf = _cnfmerge((cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000291 else:
292 cnf = _cnfmerge(cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000293
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000294 # Move static options into extra. static_options must be
295 # a list of keywords (or None).
296 extra=()
Neal Norwitzf539bde2002-11-14 02:43:40 +0000297
298 # 'options' is always a static option
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000299 if static_options:
Neal Norwitzf539bde2002-11-14 02:43:40 +0000300 static_options.append('options')
301 else:
302 static_options = ['options']
Raymond Hettingerff41c482003-04-06 09:01:11 +0000303
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000304 for k,v in list(cnf.items()):
Neal Norwitzf539bde2002-11-14 02:43:40 +0000305 if k in static_options:
306 extra = extra + ('-' + k, v)
307 del cnf[k]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000308
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000309 self.widgetName = widgetName
310 Widget._setup(self, master, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000311
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000312 # If widgetName is None, this is a dummy creation call where the
313 # corresponding Tk widget has already been created by Tix
314 if widgetName:
Raymond Hettingerff41c482003-04-06 09:01:11 +0000315 self.tk.call(widgetName, self._w, *extra)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000316
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000317 # Non-static options - to be done via a 'config' command
318 if cnf:
319 Widget.config(self, cnf)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000320
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000321 # Dictionary to hold subwidget names for easier access. We can't
322 # use the children list because the public Tix names may not be the
323 # same as the pathname component
324 self.subwidget_list = {}
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000325
326 # We set up an attribute access function so that it is possible to
327 # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello'
328 # when w is a StdButtonBox.
329 # We can even do w.ok.invoke() because w.ok is subclassed from the
330 # Button class if you go through the proper constructors
331 def __getattr__(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000332 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000333 return self.subwidget_list[name]
Collin Winterce36ad82007-08-30 01:19:48 +0000334 raise AttributeError(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000335
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000336 def set_silent(self, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000337 """Set a variable without calling its action routine"""
338 self.tk.call('tixSetSilent', self._w, value)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000339
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000340 def subwidget(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000341 """Return the named subwidget (which must have been created by
342 the sub-class)."""
343 n = self._subwidget_name(name)
344 if not n:
Collin Winterce36ad82007-08-30 01:19:48 +0000345 raise TclError("Subwidget " + name + " not child of " + self._name)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000346 # Remove header of name and leading dot
347 n = n[len(self._w)+1:]
348 return self._nametowidget(n)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000349
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000350 def subwidgets_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000351 """Return all subwidgets."""
352 names = self._subwidget_names()
353 if not names:
354 return []
355 retlist = []
356 for name in names:
357 name = name[len(self._w)+1:]
358 try:
359 retlist.append(self._nametowidget(name))
360 except:
361 # some of the widgets are unknown e.g. border in LabelFrame
362 pass
363 return retlist
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000364
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000365 def _subwidget_name(self,name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000366 """Get a subwidget name (returns a String, not a Widget !)"""
367 try:
368 return self.tk.call(self._w, 'subwidget', name)
369 except TclError:
370 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000371
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000372 def _subwidget_names(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000373 """Return the name of all subwidgets."""
374 try:
375 x = self.tk.call(self._w, 'subwidgets', '-all')
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200376 return self.tk.splitlist(x)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000377 except TclError:
378 return None
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000379
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000380 def config_all(self, option, value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000381 """Set configuration options for all subwidgets (and self)."""
382 if option == '':
383 return
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300384 elif not isinstance(option, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000385 option = repr(option)
Serhiy Storchaka975fce32013-09-16 11:01:31 +0300386 if not isinstance(value, str):
Walter Dörwald70a6b492004-02-12 17:35:32 +0000387 value = repr(value)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000388 names = self._subwidget_names()
389 for name in names:
390 self.tk.call(name, 'configure', '-' + option, value)
Neal Norwitz731a9862002-12-10 02:18:49 +0000391 # These are missing from Tkinter
392 def image_create(self, imgtype, cnf={}, master=None, **kw):
393 if not master:
Georg Brandl14fc4272008-05-17 18:39:55 +0000394 master = tkinter._default_root
Neal Norwitz731a9862002-12-10 02:18:49 +0000395 if not master:
Collin Winterce36ad82007-08-30 01:19:48 +0000396 raise RuntimeError('Too early to create image')
Neal Norwitz731a9862002-12-10 02:18:49 +0000397 if kw and cnf: cnf = _cnfmerge((cnf, kw))
398 elif kw: cnf = kw
399 options = ()
400 for k, v in cnf.items():
Florent Xicluna5d1155c2011-10-28 14:45:05 +0200401 if callable(v):
Neal Norwitz731a9862002-12-10 02:18:49 +0000402 v = self._register(v)
403 options = options + ('-'+k, v)
404 return master.tk.call(('image', 'create', imgtype,) + options)
405 def image_delete(self, imgname):
406 try:
407 self.tk.call('image', 'delete', imgname)
408 except TclError:
409 # May happen if the root was destroyed
410 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000411
412# Subwidgets are child widgets created automatically by mega-widgets.
413# In python, we have to create these subwidgets manually to mirror their
414# existence in Tk/Tix.
415class TixSubWidget(TixWidget):
416 """Subwidget class.
417
418 This is used to mirror child widgets automatically created
419 by Tix/Tk as part of a mega-widget in Python (which is not informed
420 of this)"""
421
422 def __init__(self, master, name,
Moshe Zadka22710822001-03-21 17:24:49 +0000423 destroy_physically=1, check_intermediate=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000424 if check_intermediate:
425 path = master._subwidget_name(name)
426 try:
427 path = path[len(master._w)+1:]
Neal Norwitzebb41902002-05-31 20:51:31 +0000428 plist = path.split('.')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000429 except:
430 plist = []
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000431
Thomas Wouters89f507f2006-12-13 04:49:30 +0000432 if not check_intermediate:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000433 # immediate descendant
434 TixWidget.__init__(self, master, None, None, {'name' : name})
435 else:
436 # Ensure that the intermediate widgets exist
437 parent = master
438 for i in range(len(plist) - 1):
Neal Norwitzebb41902002-05-31 20:51:31 +0000439 n = '.'.join(plist[:i+1])
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000440 try:
441 w = master._nametowidget(n)
442 parent = w
443 except KeyError:
444 # Create the intermediate widget
445 parent = TixSubWidget(parent, plist[i],
Neal Norwitzf539bde2002-11-14 02:43:40 +0000446 destroy_physically=0,
447 check_intermediate=0)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000448 # The Tk widget name is in plist, not in name
449 if plist:
450 name = plist[-1]
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000451 TixWidget.__init__(self, parent, None, None, {'name' : name})
452 self.destroy_physically = destroy_physically
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000453
454 def destroy(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000455 # For some widgets e.g., a NoteBook, when we call destructors,
456 # we must be careful not to destroy the frame widget since this
457 # also destroys the parent NoteBook thus leading to an exception
458 # in Tkinter when it finally calls Tcl to destroy the NoteBook
Hirokazu Yamamoto21027e62009-01-10 12:15:23 +0000459 for c in list(self.children.values()): c.destroy()
Guido van Rossume014a132006-08-19 16:53:45 +0000460 if self._name in self.master.children:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000461 del self.master.children[self._name]
Guido van Rossume014a132006-08-19 16:53:45 +0000462 if self._name in self.master.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000463 del self.master.subwidget_list[self._name]
464 if self.destroy_physically:
465 # This is bypassed only for a few widgets
466 self.tk.call('destroy', self._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000467
468
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000469# Useful class to create a display style - later shared by many items.
470# Contributed by Steffen Kremser
471class DisplayStyle:
472 """DisplayStyle - handle configuration options shared by
473 (multiple) Display Items"""
474
Serhiy Storchaka1aca3892016-09-25 16:52:13 +0300475 def __init__(self, itemtype, cnf={}, *, master=None, **kw):
476 if not master:
477 if 'refwindow' in kw:
478 master = kw['refwindow']
479 elif 'refwindow' in cnf:
480 master = cnf['refwindow']
481 else:
482 master = tkinter._default_root
483 if not master:
484 raise RuntimeError("Too early to create display style: "
485 "no root window")
Moshe Zadka22710822001-03-21 17:24:49 +0000486 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000487 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
488 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000489
490 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000491 return self.stylename
492
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000493 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000494 if kw and cnf:
495 cnf = _cnfmerge((cnf, kw))
496 elif kw:
497 cnf = kw
498 opts = ()
499 for k, v in cnf.items():
500 opts = opts + ('-'+k, v)
501 return opts
502
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000503 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000504 self.tk.call(self.stylename, 'delete')
505
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000506 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000507 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
508
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000509 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200510 return self._getconfigure(
511 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000512
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000513 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000514 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000515
516
517######################################################
518### The Tix Widget classes - in alphabetical order ###
519######################################################
520
521class Balloon(TixWidget):
522 """Balloon help widget.
523
Moshe Zadka22710822001-03-21 17:24:49 +0000524 Subwidget Class
525 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000526 label Label
527 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000528
Martin v. Löwis46874282002-12-06 10:33:45 +0000529 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000530 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000531 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000532 static = ['options', 'installcolormap', 'initwait', 'statusbar',
533 'cursor']
534 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
535 self.subwidget_list['label'] = _dummyLabel(self, 'label',
536 destroy_physically=0)
537 self.subwidget_list['message'] = _dummyLabel(self, 'message',
538 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000539
540 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000541 """Bind balloon widget to another.
542 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000543 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000544
545 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000546 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000547
548class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000549 """ButtonBox - A container for pushbuttons.
550 Subwidgets are the buttons added with the add method.
551 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000552 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000553 TixWidget.__init__(self, master, 'tixButtonBox',
554 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000555
556 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000557 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000558
Raymond Hettingerff41c482003-04-06 09:01:11 +0000559 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000560 self.subwidget_list[name] = _dummyButton(self, name)
561 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000562
563 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000564 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000565 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000566
567class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000568 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200569 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000570 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000571
Moshe Zadka22710822001-03-21 17:24:49 +0000572 Subwidget Class
573 --------- -----
574 entry Entry
575 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000576 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000577 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000578 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000579
Martin v. Löwis46874282002-12-06 10:33:45 +0000580 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000581 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000582 TixWidget.__init__(self, master, 'tixComboBox',
583 ['editable', 'dropdown', 'fancy', 'options'],
584 cnf, kw)
585 self.subwidget_list['label'] = _dummyLabel(self, 'label')
586 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
587 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
588 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
589 'slistbox')
590 try:
591 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
592 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
593 except TypeError:
594 # unavailable when -fancy not specified
595 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000596
Neal Norwitz731a9862002-12-10 02:18:49 +0000597 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000598
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000599 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000600 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000601
602 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000603 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000604
605 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000606 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000607
608 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000609 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000610
611class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000612 """Control - An entry field with value change arrows. The user can
613 adjust the value by pressing the two arrow buttons or by entering
614 the value directly into the entry. The new value will be checked
615 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000616
Moshe Zadka22710822001-03-21 17:24:49 +0000617 Subwidget Class
618 --------- -----
619 incr Button
620 decr Button
621 entry Entry
622 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000623
Martin v. Löwis46874282002-12-06 10:33:45 +0000624 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000625 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000626 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
627 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
628 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
629 self.subwidget_list['label'] = _dummyLabel(self, 'label')
630 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000631
632 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000633 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000634
635 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000636 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000637
638 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000639 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000640
641 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000642 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000643
644class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000645 """DirList - displays a list view of a directory, its previous
646 directories and its sub-directories. The user can choose one of
647 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000648
Moshe Zadka22710822001-03-21 17:24:49 +0000649 Subwidget Class
650 --------- -----
651 hlist HList
652 hsb Scrollbar
653 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000654
Martin v. Löwis46874282002-12-06 10:33:45 +0000655 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000656 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000657 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
658 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
659 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
660 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000661
662 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000663 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000664
665class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000666 """DirTree - Directory Listing in a hierarchical view.
667 Displays a tree view of a directory, its previous directories and its
668 sub-directories. The user can choose one of the directories displayed
669 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000670
Moshe Zadka22710822001-03-21 17:24:49 +0000671 Subwidget Class
672 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000673 hlist HList
674 hsb Scrollbar
675 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000676
Martin v. Löwis46874282002-12-06 10:33:45 +0000677 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000678 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000679 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
680 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
681 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
682 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000683
684 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000685 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000686
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000687class DirSelectBox(TixWidget):
688 """DirSelectBox - Motif style file select box.
689 It is generally used for
690 the user to choose a file. FileSelectBox stores the files mostly
691 recently selected into a ComboBox widget so that they can be quickly
692 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000693
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000694 Subwidget Class
695 --------- -----
696 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000697 filter ComboBox
698 dirlist ScrolledListBox
699 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000700
701 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000702 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
703 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
704 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000705
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000706class ExFileSelectBox(TixWidget):
707 """ExFileSelectBox - MS Windows style file select box.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300708 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000709
Moshe Zadka22710822001-03-21 17:24:49 +0000710 Subwidget Class
711 --------- -----
712 cancel Button
713 ok Button
714 hidden Checkbutton
715 types ComboBox
716 dir ComboBox
717 file ComboBox
718 dirlist ScrolledListBox
719 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000720
721 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000722 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
723 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
724 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
725 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
726 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
727 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
728 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
729 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
730 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000731
732 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000733 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000734
735 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000736 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000737
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000738
739# Should inherit from a Dialog class
740class DirSelectDialog(TixWidget):
741 """The DirSelectDialog widget presents the directories in the file
742 system in a dialog window. The user can use this dialog window to
743 navigate through the file system to select the desired directory.
744
745 Subwidgets Class
746 ---------- -----
747 dirbox DirSelectDialog"""
748
Martin v. Löwis46874282002-12-06 10:33:45 +0000749 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000750 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000751 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000752 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000753 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
754 # cancel and ok buttons are missing
755
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000756 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000757 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000758
759 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000760 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000761
762
763# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000764class ExFileSelectDialog(TixWidget):
765 """ExFileSelectDialog - MS Windows style file select dialog.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300766 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000767
Moshe Zadka22710822001-03-21 17:24:49 +0000768 Subwidgets Class
769 ---------- -----
770 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000771
Martin v. Löwis46874282002-12-06 10:33:45 +0000772 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000773 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000774 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000775 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000776 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000777
778 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000779 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000780
781 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000782 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000783
784class FileSelectBox(TixWidget):
785 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000786 It is generally used for
787 the user to choose a file. FileSelectBox stores the files mostly
788 recently selected into a ComboBox widget so that they can be quickly
789 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000790
Moshe Zadka22710822001-03-21 17:24:49 +0000791 Subwidget Class
792 --------- -----
793 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000794 filter ComboBox
795 dirlist ScrolledListBox
796 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000797
798 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000799 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
800 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
801 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
802 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
803 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000804
Moshe Zadka22710822001-03-21 17:24:49 +0000805 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000806 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000807
808 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000809 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000810
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000811# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000812class FileSelectDialog(TixWidget):
813 """FileSelectDialog - Motif style file select dialog.
814
Moshe Zadka22710822001-03-21 17:24:49 +0000815 Subwidgets Class
816 ---------- -----
817 btns StdButtonBox
818 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000819
Martin v. Löwis46874282002-12-06 10:33:45 +0000820 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000821 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000822 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000823 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000824 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
825 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000826
827 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000828 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000829
830 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000831 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000832
833class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000834 """FileEntry - Entry field with button that invokes a FileSelectDialog.
835 The user can type in the filename manually. Alternatively, the user can
836 press the button widget that sits next to the entry, which will bring
837 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000838
Moshe Zadka22710822001-03-21 17:24:49 +0000839 Subwidgets Class
840 ---------- -----
841 button Button
842 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000843
Martin v. Löwis46874282002-12-06 10:33:45 +0000844 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000845 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000846 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000847 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000848 self.subwidget_list['button'] = _dummyButton(self, 'button')
849 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000850
851 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000852 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000853
854 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000855 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000856 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000857
Guilherme Polo1fff0082009-08-14 15:05:30 +0000858class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000859 """HList - Hierarchy display widget can be used to display any data
860 that have a hierarchical structure, for example, file system directory
861 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200862 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000863
864 Subwidgets - None"""
865
866 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000867 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000868 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000869
870 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000871 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000872
873 def add_child(self, parent=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000874 if not parent:
875 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000876 return self.tk.call(
877 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000878
879 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000880 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000881
882 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000883 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000884
885 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000886 if not chars:
887 return self.tk.call(self._w, 'column', 'width', col, width)
888 else:
889 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000890 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000891
892 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000893 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000894
895 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000896 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000897
898 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000899 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000900
901 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000902 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000903
904 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000905 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000906
907 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000908 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000909
910 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000911 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000912
913 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000914 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000915
916 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000917 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000918
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000919 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000920 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200921 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000922 self.tk.call(self._w, 'header', 'configure', col,
923 *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000924
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000925 def header_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000926 return self.tk.call(self._w, 'header', 'cget', col, opt)
927
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000928 def header_exists(self, col):
Serhiy Storchaka071dec22016-10-24 23:47:28 +0300929 # A workaround to Tix library bug (issue #25464).
930 # The documented command is "exists", but only erroneous "exist" is
931 # accepted.
932 return self.tk.getboolean(self.tk.call(self._w, 'header', 'exist', col))
933 header_exist = header_exists
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000934
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000935 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000936 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000937
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000938 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000939 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000940
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000941 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000942 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000943
944 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000945 self.tk.call(
946 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000947
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000948 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000949 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200950 return self._getconfigure(
951 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000952 self.tk.call(
953 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000954
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000955 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000956 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
957
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000958 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000959 return self.tk.call (self._w, 'indicator', 'exists', entry)
960
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000961 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000962 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000963
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000964 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000965 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000966
967 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000968 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000969
Guilherme Polobcd03df2009-08-18 15:35:57 +0000970 def info_bbox(self, entry):
971 return self._getints(
972 self.tk.call(self._w, 'info', 'bbox', entry)) or None
973
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000974 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000975 c = self.tk.call(self._w, 'info', 'children', entry)
976 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000977
978 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000979 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000980
Guilherme Polobcd03df2009-08-18 15:35:57 +0000981 def info_dragsite(self):
982 return self.tk.call(self._w, 'info', 'dragsite')
983
984 def info_dropsite(self):
985 return self.tk.call(self._w, 'info', 'dropsite')
986
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000987 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000988 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000989
990 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000991 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000992
993 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000994 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000995
996 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000997 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000998
999 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001000 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001001
1002 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001003 c = self.tk.call(self._w, 'info', 'selection')
1004 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001005
Martin v. Löwis3e048482001-10-09 11:50:55 +00001006 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001007 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
1008
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001009 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001010 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001011 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001012 self.tk.call(self._w, 'item', 'configure', entry, col,
1013 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001014
1015 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001016 self.tk.call(
1017 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001018
1019 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001020 return self.tk.call(self._w, 'item', 'exists', entry, col)
1021
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001022 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001023 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001024
Martin v. Löwis433fa692004-03-21 15:26:44 +00001025 def entrycget(self, entry, opt):
1026 return self.tk.call(self._w, 'entrycget', entry, opt)
1027
1028 def entryconfigure(self, entry, cnf={}, **kw):
1029 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001030 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001031 self.tk.call(self._w, 'entryconfigure', entry,
1032 *self._options(cnf, kw))
1033
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001034 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001035 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001036
1037 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001038 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001039
1040 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001041 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001042
1043 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001044 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001045
1046 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001047 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001048
1049 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001050 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001051
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001052class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001053 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001054
1055 Subwidgets - None"""
1056
1057 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001058 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001059
1060class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001061 """LabelEntry - Entry field with label. Packages an entry widget
Martin Pantera90a4a92016-05-30 04:04:50 +00001062 and a label into one mega widget. It can be used to simplify the creation
1063 of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001064
Moshe Zadka22710822001-03-21 17:24:49 +00001065 Subwidgets Class
1066 ---------- -----
1067 label Label
1068 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001069
1070 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001071 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001072 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001073 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1074 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001075
1076class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001077 """LabelFrame - Labelled Frame container. Packages a frame widget
1078 and a label into one mega widget. To create widgets inside a
1079 LabelFrame widget, one creates the new widgets relative to the
1080 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001081
Moshe Zadka22710822001-03-21 17:24:49 +00001082 Subwidgets Class
1083 ---------- -----
1084 label Label
1085 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001086
1087 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001088 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001089 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001090 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1091 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001092
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001093
1094class ListNoteBook(TixWidget):
1095 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1096 it can be used to display many windows in a limited space using a
1097 notebook metaphor. The notebook is divided into a stack of pages
1098 (windows). At one time only one of these pages can be shown.
1099 The user can navigate through these pages by
1100 choosing the name of the desired page in the hlist subwidget."""
1101
1102 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001103 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1104 # Is this necessary? It's not an exposed subwidget in Tix.
1105 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1106 destroy_physically=0)
1107 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1108 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001109
1110 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001111 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001112 self.subwidget_list[name] = TixSubWidget(self, name)
1113 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001114
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001115 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001116 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001117
1118 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001119 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001120 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Tim Peters182b5ac2004-07-18 06:16:08 +00001121 ret = []
1122 for x in names:
1123 ret.append(self.subwidget(x))
1124 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001125
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001126 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001127 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001128
1129class Meter(TixWidget):
1130 """The Meter widget can be used to show the progress of a background
1131 job which may take a long time to execute.
1132 """
1133
1134 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001135 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001136 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001137
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001138class NoteBook(TixWidget):
1139 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1140
Moshe Zadka22710822001-03-21 17:24:49 +00001141 Subwidgets Class
1142 ---------- -----
1143 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001144 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001145
1146 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001147 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1148 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001149 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001150
1151 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001152 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001153 self.subwidget_list[name] = TixSubWidget(self, name)
1154 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001155
1156 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001157 self.tk.call(self._w, 'delete', name)
1158 self.subwidget_list[name].destroy()
1159 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001160
1161 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001162 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001163
1164 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001165 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001166 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001167 ret = []
1168 for x in names:
1169 ret.append(self.subwidget(x))
1170 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001171
Moshe Zadka22710822001-03-21 17:24:49 +00001172 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001173 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001174
1175 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001176 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001177
1178class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001179 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001180 pass
1181
1182class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001183 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001184
Moshe Zadka22710822001-03-21 17:24:49 +00001185 Subwidget Class
1186 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001187 menubutton Menubutton
1188 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001189
1190 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001191 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1192 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1193 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001194
1195 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001196 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001197
1198 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001199 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001200
1201 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001202 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001203
1204 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001205 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001206
1207 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001208 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001209
1210class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001211 """PanedWindow - Multi-pane container widget
1212 allows the user to interactively manipulate the sizes of several
1213 panes. The panes can be arranged either vertically or horizontally.The
1214 user changes the sizes of the panes by dragging the resize handle
1215 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001216
Moshe Zadka22710822001-03-21 17:24:49 +00001217 Subwidgets Class
1218 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001219 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001220
1221 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001222 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001223
Neal Norwitzf539bde2002-11-14 02:43:40 +00001224 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001225 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001226 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001227 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001228 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001229 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001230
Neal Norwitzf539bde2002-11-14 02:43:40 +00001231 def delete(self, name):
1232 self.tk.call(self._w, 'delete', name)
1233 self.subwidget_list[name].destroy()
1234 del self.subwidget_list[name]
1235
1236 def forget(self, name):
1237 self.tk.call(self._w, 'forget', name)
1238
1239 def panecget(self, entry, opt):
1240 return self.tk.call(self._w, 'panecget', entry, opt)
1241
1242 def paneconfigure(self, entry, cnf={}, **kw):
1243 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001244 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001245 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001246
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001247 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001248 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1249 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001250
1251class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001252 """PopupMenu widget can be used as a replacement of the tk_popup command.
1253 The advantage of the Tix PopupMenu widget is it requires less application
1254 code to manipulate.
1255
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001256
Moshe Zadka22710822001-03-21 17:24:49 +00001257 Subwidgets Class
1258 ---------- -----
1259 menubutton Menubutton
1260 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001261
Martin v. Löwis46874282002-12-06 10:33:45 +00001262 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001263 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001264 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1265 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1266 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001267
1268 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001269 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001270
1271 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001272 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001273
1274 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001275 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001276
1277class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001278 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001279 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001280 # There seems to be a Tix bug rejecting the configure method
1281 # Let's try making the flags -static
1282 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1283 'handlesize', 'hintcolor', 'hintwidth',
1284 'x', 'y']
1285 # In fact, x y height width are configurable
1286 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001287 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001288
1289 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001290 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001291
Martin v. Löwis652e1912001-11-25 14:50:56 +00001292 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001293 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001294
1295 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001296 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001297
1298 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001299 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001300
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001301class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001302 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001303
Martin v. Löwis46874282002-12-06 10:33:45 +00001304 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001305 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001306 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001307 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001308 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1309 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1310 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001311
1312class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001313 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001314
Martin v. Löwis46874282002-12-06 10:33:45 +00001315 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001316 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001317 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1318 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1319 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1320 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001321
1322class ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001323 """ScrolledText - Text with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001324
Martin v. Löwis46874282002-12-06 10:33:45 +00001325 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001326 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001327 TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
1328 self.subwidget_list['text'] = _dummyText(self, 'text')
1329 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1330 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001331
1332class ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001333 """ScrolledTList - TList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001334
Martin v. Löwis46874282002-12-06 10:33:45 +00001335 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001336 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001337 TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001338 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001339 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1340 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1341 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001342
1343class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001344 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001345
Martin v. Löwis46874282002-12-06 10:33:45 +00001346 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001347 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001348 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1349 self.subwidget_list['window'] = _dummyFrame(self, 'window')
1350 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1351 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001352
1353class Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001354 """Select - Container of button subwidgets. It can be used to provide
1355 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001356
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001357 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001358
Martin v. Löwis46874282002-12-06 10:33:45 +00001359 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001360 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001361 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001362 ['allowzero', 'radio', 'orientation', 'labelside',
1363 'options'],
1364 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001365 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001366
1367 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001368 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001369 self.subwidget_list[name] = _dummyButton(self, name)
1370 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001371
1372 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001373 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001374
Neal Norwitzf539bde2002-11-14 02:43:40 +00001375class Shell(TixWidget):
1376 """Toplevel window.
1377
1378 Subwidgets - None"""
1379
1380 def __init__ (self,master=None,cnf={}, **kw):
1381 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1382
1383class DialogShell(TixWidget):
1384 """Toplevel window, with popup popdown and center methods.
1385 It tells the window manager that it is a dialog window and should be
1386 treated specially. The exact treatment depends on the treatment of
1387 the window manager.
1388
1389 Subwidgets - None"""
1390
Martin v. Löwis46874282002-12-06 10:33:45 +00001391 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001392 def __init__ (self,master=None,cnf={}, **kw):
1393 TixWidget.__init__(self, master,
1394 'tixDialogShell',
1395 ['options', 'title', 'mapped',
1396 'minheight', 'minwidth',
1397 'parent', 'transient'], cnf, kw)
1398
1399 def popdown(self):
1400 self.tk.call(self._w, 'popdown')
1401
1402 def popup(self):
1403 self.tk.call(self._w, 'popup')
1404
1405 def center(self):
1406 self.tk.call(self._w, 'center')
1407
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001408class StdButtonBox(TixWidget):
1409 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1410
1411 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001412 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001413 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001414 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1415 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1416 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1417 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001418
1419 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001420 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001421 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001422
Guilherme Polo1fff0082009-08-14 15:05:30 +00001423class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001424 """TList - Hierarchy display widget which can be
1425 used to display data in a tabular format. The list entries of a TList
1426 widget are similar to the entries in the Tk listbox widget. The main
1427 differences are (1) the TList widget can display the list entries in a
1428 two dimensional format and (2) you can use graphical images as well as
1429 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001430
1431 Subwidgets - None"""
1432
1433 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001434 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001435
1436 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001437 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001438
1439 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001440 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001441
1442 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001443 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001444
1445 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001446 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001447
1448 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001449 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001450
1451 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001452 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001453
1454 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001455 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001456
1457 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001458 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001459
1460 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001461 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001462
1463 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001464 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001465
1466 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001467 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001468
1469 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001470 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001471
1472 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001473 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001474
1475 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001476 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001477
1478 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001479 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001480
1481 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001482 c = self.tk.call(self._w, 'info', 'selection')
1483 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001484
1485 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001486 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001487
1488 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001489 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001490
1491 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001492 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001493
1494 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001495 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001496
1497 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001498 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001499
1500 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001501 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001502
1503 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001504 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001505
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001506class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001507 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001508 data in a tree form. The user can adjust
1509 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001510
Martin v. Löwis46874282002-12-06 10:33:45 +00001511 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001512 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001513 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001514 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001515 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1516 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1517 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001518
1519 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001520 '''This command calls the setmode method for all the entries in this
1521 Tree widget: if an entry has no child entries, its mode is set to
1522 none. Otherwise, if the entry has any hidden child entries, its mode is
1523 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001524 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001525
1526 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001527 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001528 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001529
1530 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001531 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001532 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001533
1534 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001535 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001536 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001537
1538 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001539 '''This command is used to indicate whether the entry given by
1540 entryPath has children entries and whether the children are visible. mode
1541 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001542 indicator is drawn next the entry. If mode is set to close, a (-)
1543 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001544 indicators will be drawn for this entry. The default mode is none. The
1545 open mode indicates the entry has hidden children and this entry can be
1546 opened by the user. The close mode indicates that all the children of the
1547 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001548 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001549
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001550
1551# Could try subclassing Tree for CheckList - would need another arg to init
1552class CheckList(TixWidget):
1553 """The CheckList widget
1554 displays a list of items to be selected by the user. CheckList acts
1555 similarly to the Tk checkbutton or radiobutton widgets, except it is
1556 capable of handling many more items than checkbuttons or radiobuttons.
1557 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001558 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001559 def __init__(self, master=None, cnf={}, **kw):
1560 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001561 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001562 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1563 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1564 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001565
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001566 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001567 '''This command calls the setmode method for all the entries in this
1568 Tree widget: if an entry has no child entries, its mode is set to
1569 none. Otherwise, if the entry has any hidden child entries, its mode is
1570 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001571 self.tk.call(self._w, 'autosetmode')
1572
1573 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001574 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001575 self.tk.call(self._w, 'close', entrypath)
1576
1577 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001578 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001579 return self.tk.call(self._w, 'getmode', entrypath)
1580
1581 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001582 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001583 self.tk.call(self._w, 'open', entrypath)
1584
1585 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001586 '''Returns a list of items whose status matches status. If status is
1587 not specified, the list of items in the "on" status will be returned.
1588 Mode can be on, off, default'''
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001589 return self.tk.splitlist(self.tk.call(self._w, 'getselection', mode))
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."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001910 return self.tk.splitlist(self.tk.call(self._w, 'size', 'column', index,
Guilherme Polobcd03df2009-08-18 15:35:57 +00001911 *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."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001935 return self.tk.splitlist(self.tk.call(
Guilherme Polobcd03df2009-08-18 15:35:57 +00001936 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)