blob: 04465aa4d73284050e8bd4efa20b1751183d0735 [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
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000475 def __init__(self, itemtype, cnf={}, **kw):
Terry Jan Reedy22ba01e2016-08-16 01:44:12 -0400476 master = tkinter._default_root # global from Tkinter
Guido van Rossume014a132006-08-19 16:53:45 +0000477 if not master and 'refwindow' in cnf: master=cnf['refwindow']
478 elif not master and 'refwindow' in kw: master= kw['refwindow']
Collin Winterce36ad82007-08-30 01:19:48 +0000479 elif not master: raise RuntimeError("Too early to create display style: no root window")
Moshe Zadka22710822001-03-21 17:24:49 +0000480 self.tk = master.tk
Raymond Hettingerff41c482003-04-06 09:01:11 +0000481 self.stylename = self.tk.call('tixDisplayStyle', itemtype,
482 *self._options(cnf,kw) )
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000483
484 def __str__(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000485 return self.stylename
486
Thomas Wouters73e5a5b2006-06-08 15:35:45 +0000487 def _options(self, cnf, kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000488 if kw and cnf:
489 cnf = _cnfmerge((cnf, kw))
490 elif kw:
491 cnf = kw
492 opts = ()
493 for k, v in cnf.items():
494 opts = opts + ('-'+k, v)
495 return opts
496
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000497 def delete(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000498 self.tk.call(self.stylename, 'delete')
499
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000500 def __setitem__(self,key,value):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000501 self.tk.call(self.stylename, 'configure', '-%s'%key, value)
502
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000503 def config(self, cnf={}, **kw):
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200504 return self._getconfigure(
505 self.stylename, 'configure', *self._options(cnf,kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000506
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000507 def __getitem__(self,key):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000508 return self.tk.call(self.stylename, 'cget', '-%s'%key)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000509
510
511######################################################
512### The Tix Widget classes - in alphabetical order ###
513######################################################
514
515class Balloon(TixWidget):
516 """Balloon help widget.
517
Moshe Zadka22710822001-03-21 17:24:49 +0000518 Subwidget Class
519 --------- -----
Fred Drake723293c2001-12-13 04:53:07 +0000520 label Label
521 message Message"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000522
Martin v. Löwis46874282002-12-06 10:33:45 +0000523 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000524 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis652e1912001-11-25 14:50:56 +0000525 # static seem to be -installcolormap -initwait -statusbar -cursor
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000526 static = ['options', 'installcolormap', 'initwait', 'statusbar',
527 'cursor']
528 TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
529 self.subwidget_list['label'] = _dummyLabel(self, 'label',
530 destroy_physically=0)
531 self.subwidget_list['message'] = _dummyLabel(self, 'message',
532 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000533
534 def bind_widget(self, widget, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000535 """Bind balloon widget to another.
536 One balloon widget may be bound to several widgets at the same time"""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000537 self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000538
539 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000540 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000541
542class ButtonBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000543 """ButtonBox - A container for pushbuttons.
544 Subwidgets are the buttons added with the add method.
545 """
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000546 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000547 TixWidget.__init__(self, master, 'tixButtonBox',
548 ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000549
550 def add(self, name, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000551 """Add a button with given name to box."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000552
Raymond Hettingerff41c482003-04-06 09:01:11 +0000553 btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000554 self.subwidget_list[name] = _dummyButton(self, name)
555 return btn
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000556
557 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +0000558 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000559 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000560
561class ComboBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000562 """ComboBox - an Entry field with a dropdown menu. The user can select a
Ezio Melotti13925002011-03-16 11:05:33 +0200563 choice by either typing in the entry subwidget or selecting from the
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000564 listbox subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000565
Moshe Zadka22710822001-03-21 17:24:49 +0000566 Subwidget Class
567 --------- -----
568 entry Entry
569 arrow Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000570 slistbox ScrolledListBox
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000571 tick Button
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000572 cross Button : present if created with the fancy option"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000573
Martin v. Löwis46874282002-12-06 10:33:45 +0000574 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000575 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000576 TixWidget.__init__(self, master, 'tixComboBox',
577 ['editable', 'dropdown', 'fancy', 'options'],
578 cnf, kw)
579 self.subwidget_list['label'] = _dummyLabel(self, 'label')
580 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
581 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
582 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
583 'slistbox')
584 try:
585 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
586 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
587 except TypeError:
588 # unavailable when -fancy not specified
589 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000590
Neal Norwitz731a9862002-12-10 02:18:49 +0000591 # align
Raymond Hettingerff41c482003-04-06 09:01:11 +0000592
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000593 def add_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000594 self.tk.call(self._w, 'addhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000595
596 def append_history(self, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000597 self.tk.call(self._w, 'appendhistory', str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000598
599 def insert(self, index, str):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000600 self.tk.call(self._w, 'insert', index, str)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000601
602 def pick(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000603 self.tk.call(self._w, 'pick', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000604
605class Control(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000606 """Control - An entry field with value change arrows. The user can
607 adjust the value by pressing the two arrow buttons or by entering
608 the value directly into the entry. The new value will be checked
609 against the user-defined upper and lower limits.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000610
Moshe Zadka22710822001-03-21 17:24:49 +0000611 Subwidget Class
612 --------- -----
613 incr Button
614 decr Button
615 entry Entry
616 label Label"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000617
Martin v. Löwis46874282002-12-06 10:33:45 +0000618 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000619 def __init__ (self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000620 TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
621 self.subwidget_list['incr'] = _dummyButton(self, 'incr')
622 self.subwidget_list['decr'] = _dummyButton(self, 'decr')
623 self.subwidget_list['label'] = _dummyLabel(self, 'label')
624 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000625
626 def decrement(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000627 self.tk.call(self._w, 'decr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000628
629 def increment(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000630 self.tk.call(self._w, 'incr')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000631
632 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000633 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000634
635 def update(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000636 self.tk.call(self._w, 'update')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000637
638class DirList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000639 """DirList - displays a list view of a directory, its previous
640 directories and its sub-directories. The user can choose one of
641 the directories displayed in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000642
Moshe Zadka22710822001-03-21 17:24:49 +0000643 Subwidget Class
644 --------- -----
645 hlist HList
646 hsb Scrollbar
647 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000648
Martin v. Löwis46874282002-12-06 10:33:45 +0000649 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000650 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000651 TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
652 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
653 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
654 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000655
656 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000657 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000658
659class DirTree(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000660 """DirTree - Directory Listing in a hierarchical view.
661 Displays a tree view of a directory, its previous directories and its
662 sub-directories. The user can choose one of the directories displayed
663 in the list or change to another directory.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000664
Moshe Zadka22710822001-03-21 17:24:49 +0000665 Subwidget Class
666 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +0000667 hlist HList
668 hsb Scrollbar
669 vsb Scrollbar"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000670
Martin v. Löwis46874282002-12-06 10:33:45 +0000671 # FIXME: It should inherit -superclass tixScrolledHList
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000672 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000673 TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
674 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
675 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
676 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000677
678 def chdir(self, dir):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000679 self.tk.call(self._w, 'chdir', dir)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000680
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000681class DirSelectBox(TixWidget):
682 """DirSelectBox - Motif style file select box.
683 It is generally used for
684 the user to choose a file. FileSelectBox stores the files mostly
685 recently selected into a ComboBox widget so that they can be quickly
686 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000687
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000688 Subwidget Class
689 --------- -----
690 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000691 filter ComboBox
692 dirlist ScrolledListBox
693 filelist ScrolledListBox"""
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000694
695 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000696 TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
697 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
698 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000699
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000700class ExFileSelectBox(TixWidget):
701 """ExFileSelectBox - MS Windows style file select box.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300702 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000703
Moshe Zadka22710822001-03-21 17:24:49 +0000704 Subwidget Class
705 --------- -----
706 cancel Button
707 ok Button
708 hidden Checkbutton
709 types ComboBox
710 dir ComboBox
711 file ComboBox
712 dirlist ScrolledListBox
713 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000714
715 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000716 TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
717 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
718 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
719 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
720 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
721 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
722 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
723 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
724 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000725
726 def filter(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000727 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000728
729 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000730 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000731
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000732
733# Should inherit from a Dialog class
734class DirSelectDialog(TixWidget):
735 """The DirSelectDialog widget presents the directories in the file
736 system in a dialog window. The user can use this dialog window to
737 navigate through the file system to select the desired directory.
738
739 Subwidgets Class
740 ---------- -----
741 dirbox DirSelectDialog"""
742
Martin v. Löwis46874282002-12-06 10:33:45 +0000743 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000744 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000745 TixWidget.__init__(self, master, 'tixDirSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000746 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000747 self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
748 # cancel and ok buttons are missing
749
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000750 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000751 self.tk.call(self._w, 'popup')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000752
753 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000754 self.tk.call(self._w, 'popdown')
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000755
756
757# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000758class ExFileSelectDialog(TixWidget):
759 """ExFileSelectDialog - MS Windows style file select dialog.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300760 It provides a convenient method for the user to select files.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000761
Moshe Zadka22710822001-03-21 17:24:49 +0000762 Subwidgets Class
763 ---------- -----
764 fsbox ExFileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000765
Martin v. Löwis46874282002-12-06 10:33:45 +0000766 # FIXME: It should inherit -superclass tixDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000767 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000768 TixWidget.__init__(self, master, 'tixExFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000769 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000770 self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000771
772 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000773 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000774
775 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000776 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000777
778class FileSelectBox(TixWidget):
779 """ExFileSelectBox - Motif style file select box.
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000780 It is generally used for
781 the user to choose a file. FileSelectBox stores the files mostly
782 recently selected into a ComboBox widget so that they can be quickly
783 selected again.
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000784
Moshe Zadka22710822001-03-21 17:24:49 +0000785 Subwidget Class
786 --------- -----
787 selection ComboBox
Neal Norwitzf539bde2002-11-14 02:43:40 +0000788 filter ComboBox
789 dirlist ScrolledListBox
790 filelist ScrolledListBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000791
792 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000793 TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
794 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
795 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
796 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
797 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000798
Moshe Zadka22710822001-03-21 17:24:49 +0000799 def apply_filter(self): # name of subwidget is same as command
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000800 self.tk.call(self._w, 'filter')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000801
802 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000803 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000804
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000805# Should inherit from a Dialog class
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000806class FileSelectDialog(TixWidget):
807 """FileSelectDialog - Motif style file select dialog.
808
Moshe Zadka22710822001-03-21 17:24:49 +0000809 Subwidgets Class
810 ---------- -----
811 btns StdButtonBox
812 fsbox FileSelectBox"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000813
Martin v. Löwis46874282002-12-06 10:33:45 +0000814 # FIXME: It should inherit -superclass tixStdDialogShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000815 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000816 TixWidget.__init__(self, master, 'tixFileSelectDialog',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000817 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000818 self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
819 self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000820
821 def popup(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000822 self.tk.call(self._w, 'popup')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000823
824 def popdown(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000825 self.tk.call(self._w, 'popdown')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000826
827class FileEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000828 """FileEntry - Entry field with button that invokes a FileSelectDialog.
829 The user can type in the filename manually. Alternatively, the user can
830 press the button widget that sits next to the entry, which will bring
831 up a file selection dialog.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000832
Moshe Zadka22710822001-03-21 17:24:49 +0000833 Subwidgets Class
834 ---------- -----
835 button Button
836 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000837
Martin v. Löwis46874282002-12-06 10:33:45 +0000838 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000839 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000840 TixWidget.__init__(self, master, 'tixFileEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000841 ['dialogtype', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000842 self.subwidget_list['button'] = _dummyButton(self, 'button')
843 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000844
845 def invoke(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000846 self.tk.call(self._w, 'invoke')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000847
848 def file_dialog(self):
Martin v. Löwis46874282002-12-06 10:33:45 +0000849 # FIXME: return python object
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000850 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000851
Guilherme Polo1fff0082009-08-14 15:05:30 +0000852class HList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +0000853 """HList - Hierarchy display widget can be used to display any data
854 that have a hierarchical structure, for example, file system directory
855 trees. The list entries are indented and connected by branch lines
Ezio Melotti13925002011-03-16 11:05:33 +0200856 according to their places in the hierarchy.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000857
858 Subwidgets - None"""
859
860 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000861 TixWidget.__init__(self, master, 'tixHList',
Neal Norwitzf539bde2002-11-14 02:43:40 +0000862 ['columns', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000863
864 def add(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000865 return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000866
867 def add_child(self, parent=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000868 if not parent:
869 parent = ''
Raymond Hettingerff41c482003-04-06 09:01:11 +0000870 return self.tk.call(
871 self._w, 'addchild', parent, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000872
873 def anchor_set(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000874 self.tk.call(self._w, 'anchor', 'set', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000875
876 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000877 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000878
879 def column_width(self, col=0, width=None, chars=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000880 if not chars:
881 return self.tk.call(self._w, 'column', 'width', col, width)
882 else:
883 return self.tk.call(self._w, 'column', 'width', col,
Neal Norwitzf539bde2002-11-14 02:43:40 +0000884 '-char', chars)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000885
886 def delete_all(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000887 self.tk.call(self._w, 'delete', 'all')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000888
889 def delete_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000890 self.tk.call(self._w, 'delete', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000891
892 def delete_offsprings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000893 self.tk.call(self._w, 'delete', 'offsprings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000894
895 def delete_siblings(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000896 self.tk.call(self._w, 'delete', 'siblings', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000897
898 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000899 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000900
901 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000902 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000903
904 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000905 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000906
907 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000908 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000909
910 def header_create(self, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000911 self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000912
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000913 def header_configure(self, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000914 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200915 return self._getconfigure(self._w, 'header', 'configure', col)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000916 self.tk.call(self._w, 'header', 'configure', col,
917 *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_cget(self, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000920 return self.tk.call(self._w, 'header', 'cget', col, opt)
921
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000922 def header_exists(self, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000923 return self.tk.call(self._w, 'header', 'exists', col)
924
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000925 def header_delete(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000926 self.tk.call(self._w, 'header', 'delete', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000927
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000928 def header_size(self, col):
Moshe Zadka22710822001-03-21 17:24:49 +0000929 return self.tk.call(self._w, 'header', 'size', col)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000930
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000931 def hide_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000932 self.tk.call(self._w, 'hide', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000933
934 def indicator_create(self, entry, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +0000935 self.tk.call(
936 self._w, 'indicator', 'create', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000937
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000938 def indicator_configure(self, entry, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000939 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +0200940 return self._getconfigure(
941 self._w, 'indicator', 'configure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +0000942 self.tk.call(
943 self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000944
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000945 def indicator_cget(self, entry, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000946 return self.tk.call(self._w, 'indicator', 'cget', entry, opt)
947
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000948 def indicator_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000949 return self.tk.call (self._w, 'indicator', 'exists', entry)
950
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000951 def indicator_delete(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000952 self.tk.call(self._w, 'indicator', 'delete', entry)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000953
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000954 def indicator_size(self, entry):
Moshe Zadka22710822001-03-21 17:24:49 +0000955 return self.tk.call(self._w, 'indicator', 'size', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000956
957 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000958 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000959
Guilherme Polobcd03df2009-08-18 15:35:57 +0000960 def info_bbox(self, entry):
961 return self._getints(
962 self.tk.call(self._w, 'info', 'bbox', entry)) or None
963
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000964 def info_children(self, entry=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000965 c = self.tk.call(self._w, 'info', 'children', entry)
966 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000967
968 def info_data(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000969 return self.tk.call(self._w, 'info', 'data', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000970
Guilherme Polobcd03df2009-08-18 15:35:57 +0000971 def info_dragsite(self):
972 return self.tk.call(self._w, 'info', 'dragsite')
973
974 def info_dropsite(self):
975 return self.tk.call(self._w, 'info', 'dropsite')
976
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000977 def info_exists(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000978 return self.tk.call(self._w, 'info', 'exists', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000979
980 def info_hidden(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000981 return self.tk.call(self._w, 'info', 'hidden', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000982
983 def info_next(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000984 return self.tk.call(self._w, 'info', 'next', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000985
986 def info_parent(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000987 return self.tk.call(self._w, 'info', 'parent', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000988
989 def info_prev(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000990 return self.tk.call(self._w, 'info', 'prev', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000991
992 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000993 c = self.tk.call(self._w, 'info', 'selection')
994 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000995
Martin v. Löwis3e048482001-10-09 11:50:55 +0000996 def item_cget(self, entry, col, opt):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +0000997 return self.tk.call(self._w, 'item', 'cget', entry, col, opt)
998
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +0000999 def item_configure(self, entry, col, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001000 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001001 return self._getconfigure(self._w, 'item', 'configure', entry, col)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001002 self.tk.call(self._w, 'item', 'configure', entry, col,
1003 *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001004
1005 def item_create(self, entry, col, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001006 self.tk.call(
1007 self._w, 'item', 'create', entry, col, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001008
1009 def item_exists(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001010 return self.tk.call(self._w, 'item', 'exists', entry, col)
1011
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001012 def item_delete(self, entry, col):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001013 self.tk.call(self._w, 'item', 'delete', entry, col)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001014
Martin v. Löwis433fa692004-03-21 15:26:44 +00001015 def entrycget(self, entry, opt):
1016 return self.tk.call(self._w, 'entrycget', entry, opt)
1017
1018 def entryconfigure(self, entry, cnf={}, **kw):
1019 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001020 return self._getconfigure(self._w, 'entryconfigure', entry)
Martin v. Löwis433fa692004-03-21 15:26:44 +00001021 self.tk.call(self._w, 'entryconfigure', entry,
1022 *self._options(cnf, kw))
1023
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001024 def nearest(self, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001025 return self.tk.call(self._w, 'nearest', y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001026
1027 def see(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001028 self.tk.call(self._w, 'see', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001029
1030 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001031 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001032
1033 def selection_includes(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001034 return self.tk.call(self._w, 'selection', 'includes', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001035
1036 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001037 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001038
1039 def show_entry(self, entry):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001040 return self.tk.call(self._w, 'show', 'entry', entry)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001041
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001042class InputOnly(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001043 """InputOnly - Invisible widget. Unix only.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001044
1045 Subwidgets - None"""
1046
1047 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001048 TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001049
1050class LabelEntry(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001051 """LabelEntry - Entry field with label. Packages an entry widget
Martin Pantera90a4a92016-05-30 04:04:50 +00001052 and a label into one mega widget. It can be used to simplify the creation
1053 of ``entry-form'' type of interface.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001054
Moshe Zadka22710822001-03-21 17:24:49 +00001055 Subwidgets Class
1056 ---------- -----
1057 label Label
1058 entry Entry"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001059
1060 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001061 TixWidget.__init__(self, master, 'tixLabelEntry',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001062 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001063 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1064 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001065
1066class LabelFrame(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001067 """LabelFrame - Labelled Frame container. Packages a frame widget
1068 and a label into one mega widget. To create widgets inside a
1069 LabelFrame widget, one creates the new widgets relative to the
1070 frame subwidget and manage them inside the frame subwidget.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001071
Moshe Zadka22710822001-03-21 17:24:49 +00001072 Subwidgets Class
1073 ---------- -----
1074 label Label
1075 frame Frame"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001076
1077 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001078 TixWidget.__init__(self, master, 'tixLabelFrame',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001079 ['labelside','options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001080 self.subwidget_list['label'] = _dummyLabel(self, 'label')
1081 self.subwidget_list['frame'] = _dummyFrame(self, 'frame')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001082
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001083
1084class ListNoteBook(TixWidget):
1085 """A ListNoteBook widget is very similar to the TixNoteBook widget:
1086 it can be used to display many windows in a limited space using a
1087 notebook metaphor. The notebook is divided into a stack of pages
1088 (windows). At one time only one of these pages can be shown.
1089 The user can navigate through these pages by
1090 choosing the name of the desired page in the hlist subwidget."""
1091
1092 def __init__(self, master, cnf={}, **kw):
Neal Norwitzf539bde2002-11-14 02:43:40 +00001093 TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
1094 # Is this necessary? It's not an exposed subwidget in Tix.
1095 self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
1096 destroy_physically=0)
1097 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1098 self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001099
1100 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001101 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001102 self.subwidget_list[name] = TixSubWidget(self, name)
1103 return self.subwidget_list[name]
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001104
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001105 def page(self, name):
Tim Peters182b5ac2004-07-18 06:16:08 +00001106 return self.subwidget(name)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001107
1108 def pages(self):
Tim Peters182b5ac2004-07-18 06:16:08 +00001109 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001110 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Tim Peters182b5ac2004-07-18 06:16:08 +00001111 ret = []
1112 for x in names:
1113 ret.append(self.subwidget(x))
1114 return ret
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001115
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001116 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001117 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001118
1119class Meter(TixWidget):
1120 """The Meter widget can be used to show the progress of a background
1121 job which may take a long time to execute.
1122 """
1123
1124 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001125 TixWidget.__init__(self, master, 'tixMeter',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001126 ['options'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001127
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001128class NoteBook(TixWidget):
1129 """NoteBook - Multi-page container widget (tabbed notebook metaphor).
1130
Moshe Zadka22710822001-03-21 17:24:49 +00001131 Subwidgets Class
1132 ---------- -----
1133 nbframe NoteBookFrame
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001134 <pages> page widgets added dynamically with the add method"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001135
1136 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001137 TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
1138 self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001139 destroy_physically=0)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001140
1141 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001142 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001143 self.subwidget_list[name] = TixSubWidget(self, name)
1144 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001145
1146 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001147 self.tk.call(self._w, 'delete', name)
1148 self.subwidget_list[name].destroy()
1149 del self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001150
1151 def page(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001152 return self.subwidget(name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001153
1154 def pages(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001155 # Can't call subwidgets_all directly because we don't want .nbframe
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001156 names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001157 ret = []
1158 for x in names:
1159 ret.append(self.subwidget(x))
1160 return ret
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001161
Moshe Zadka22710822001-03-21 17:24:49 +00001162 def raise_page(self, name): # raise is a python keyword
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001163 self.tk.call(self._w, 'raise', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001164
1165 def raised(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001166 return self.tk.call(self._w, 'raised')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001167
1168class NoteBookFrame(TixWidget):
Martin v. Löwis46874282002-12-06 10:33:45 +00001169 # FIXME: This is dangerous to expose to be called on its own.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001170 pass
1171
1172class OptionMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001173 """OptionMenu - creates a menu button of options.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001174
Moshe Zadka22710822001-03-21 17:24:49 +00001175 Subwidget Class
1176 --------- -----
Neal Norwitzf539bde2002-11-14 02:43:40 +00001177 menubutton Menubutton
1178 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001179
1180 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001181 TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
1182 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1183 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001184
1185 def add_command(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001186 self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001187
1188 def add_separator(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001189 self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001190
1191 def delete(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001192 self.tk.call(self._w, 'delete', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001193
1194 def disable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001195 self.tk.call(self._w, 'disable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001196
1197 def enable(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001198 self.tk.call(self._w, 'enable', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001199
1200class PanedWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001201 """PanedWindow - Multi-pane container widget
1202 allows the user to interactively manipulate the sizes of several
1203 panes. The panes can be arranged either vertically or horizontally.The
1204 user changes the sizes of the panes by dragging the resize handle
1205 between two panes.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001206
Moshe Zadka22710822001-03-21 17:24:49 +00001207 Subwidgets Class
1208 ---------- -----
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001209 <panes> g/p widgets added dynamically with the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001210
1211 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001212 TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001213
Neal Norwitzf539bde2002-11-14 02:43:40 +00001214 # add delete forget panecget paneconfigure panes setsize
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001215 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001216 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001217 self.subwidget_list[name] = TixSubWidget(self, name,
Neal Norwitzf539bde2002-11-14 02:43:40 +00001218 check_intermediate=0)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001219 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001220
Neal Norwitzf539bde2002-11-14 02:43:40 +00001221 def delete(self, name):
1222 self.tk.call(self._w, 'delete', name)
1223 self.subwidget_list[name].destroy()
1224 del self.subwidget_list[name]
1225
1226 def forget(self, name):
1227 self.tk.call(self._w, 'forget', name)
1228
1229 def panecget(self, entry, opt):
1230 return self.tk.call(self._w, 'panecget', entry, opt)
1231
1232 def paneconfigure(self, entry, cnf={}, **kw):
1233 if cnf is None:
Serhiy Storchaka848972c2013-12-25 16:35:38 +02001234 return self._getconfigure(self._w, 'paneconfigure', entry)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001235 self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))
Neal Norwitzf539bde2002-11-14 02:43:40 +00001236
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001237 def panes(self):
Guilherme Polobcd03df2009-08-18 15:35:57 +00001238 names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
1239 return [self.subwidget(x) for x in names]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001240
1241class PopupMenu(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001242 """PopupMenu widget can be used as a replacement of the tk_popup command.
1243 The advantage of the Tix PopupMenu widget is it requires less application
1244 code to manipulate.
1245
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001246
Moshe Zadka22710822001-03-21 17:24:49 +00001247 Subwidgets Class
1248 ---------- -----
1249 menubutton Menubutton
1250 menu Menu"""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001251
Martin v. Löwis46874282002-12-06 10:33:45 +00001252 # FIXME: It should inherit -superclass tixShell
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001253 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001254 TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
1255 self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
1256 self.subwidget_list['menu'] = _dummyMenu(self, 'menu')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001257
1258 def bind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001259 self.tk.call(self._w, 'bind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001260
1261 def unbind_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001262 self.tk.call(self._w, 'unbind', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001263
1264 def post_widget(self, widget, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001265 self.tk.call(self._w, 'post', widget._w, x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001266
1267class ResizeHandle(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001268 """Internal widget to draw resize handles on Scrolled widgets."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001269 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001270 # There seems to be a Tix bug rejecting the configure method
1271 # Let's try making the flags -static
1272 flags = ['options', 'command', 'cursorfg', 'cursorbg',
1273 'handlesize', 'hintcolor', 'hintwidth',
1274 'x', 'y']
1275 # In fact, x y height width are configurable
1276 TixWidget.__init__(self, master, 'tixResizeHandle',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001277 flags, cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001278
1279 def attach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001280 self.tk.call(self._w, 'attachwidget', widget._w)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001281
Martin v. Löwis652e1912001-11-25 14:50:56 +00001282 def detach_widget(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001283 self.tk.call(self._w, 'detachwidget', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001284
1285 def hide(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001286 self.tk.call(self._w, 'hide', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001287
1288 def show(self, widget):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001289 self.tk.call(self._w, 'show', widget._w)
Martin v. Löwis652e1912001-11-25 14:50:56 +00001290
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001291class ScrolledHList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001292 """ScrolledHList - HList with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001293
Martin v. Löwis46874282002-12-06 10:33:45 +00001294 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001295 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001296 TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001297 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001298 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1299 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1300 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001301
1302class ScrolledListBox(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001303 """ScrolledListBox - Listbox with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001304
Martin v. Löwis46874282002-12-06 10:33:45 +00001305 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001306 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001307 TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
1308 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
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 ScrolledText(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001313 """ScrolledText - Text 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, 'tixScrolledText', ['options'], cnf, kw)
1318 self.subwidget_list['text'] = _dummyText(self, 'text')
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 ScrolledTList(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001323 """ScrolledTList - TList 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, 'tixScrolledTList', ['options'],
Neal Norwitzf539bde2002-11-14 02:43:40 +00001328 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001329 self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
1330 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1331 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001332
1333class ScrolledWindow(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001334 """ScrolledWindow - Window with automatic scrollbars."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001335
Martin v. Löwis46874282002-12-06 10:33:45 +00001336 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001337 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001338 TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
1339 self.subwidget_list['window'] = _dummyFrame(self, 'window')
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 Select(TixWidget):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001344 """Select - Container of button subwidgets. It can be used to provide
1345 radio-box or check-box style of selection options for the user.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001346
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001347 Subwidgets are buttons added dynamically using the add method."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001348
Martin v. Löwis46874282002-12-06 10:33:45 +00001349 # FIXME: It should inherit -superclass tixLabelWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001350 def __init__(self, master, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001351 TixWidget.__init__(self, master, 'tixSelect',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001352 ['allowzero', 'radio', 'orientation', 'labelside',
1353 'options'],
1354 cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001355 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001356
1357 def add(self, name, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001358 self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001359 self.subwidget_list[name] = _dummyButton(self, name)
1360 return self.subwidget_list[name]
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001361
1362 def invoke(self, name):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001363 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001364
Neal Norwitzf539bde2002-11-14 02:43:40 +00001365class Shell(TixWidget):
1366 """Toplevel window.
1367
1368 Subwidgets - None"""
1369
1370 def __init__ (self,master=None,cnf={}, **kw):
1371 TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)
1372
1373class DialogShell(TixWidget):
1374 """Toplevel window, with popup popdown and center methods.
1375 It tells the window manager that it is a dialog window and should be
1376 treated specially. The exact treatment depends on the treatment of
1377 the window manager.
1378
1379 Subwidgets - None"""
1380
Martin v. Löwis46874282002-12-06 10:33:45 +00001381 # FIXME: It should inherit from Shell
Neal Norwitzf539bde2002-11-14 02:43:40 +00001382 def __init__ (self,master=None,cnf={}, **kw):
1383 TixWidget.__init__(self, master,
1384 'tixDialogShell',
1385 ['options', 'title', 'mapped',
1386 'minheight', 'minwidth',
1387 'parent', 'transient'], cnf, kw)
1388
1389 def popdown(self):
1390 self.tk.call(self._w, 'popdown')
1391
1392 def popup(self):
1393 self.tk.call(self._w, 'popup')
1394
1395 def center(self):
1396 self.tk.call(self._w, 'center')
1397
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001398class StdButtonBox(TixWidget):
1399 """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """
1400
1401 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001402 TixWidget.__init__(self, master, 'tixStdButtonBox',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001403 ['orientation', 'options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001404 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1405 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1406 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1407 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001408
1409 def invoke(self, name):
Guido van Rossume014a132006-08-19 16:53:45 +00001410 if name in self.subwidget_list:
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001411 self.tk.call(self._w, 'invoke', name)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001412
Guilherme Polo1fff0082009-08-14 15:05:30 +00001413class TList(TixWidget, XView, YView):
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001414 """TList - Hierarchy display widget which can be
1415 used to display data in a tabular format. The list entries of a TList
1416 widget are similar to the entries in the Tk listbox widget. The main
1417 differences are (1) the TList widget can display the list entries in a
1418 two dimensional format and (2) you can use graphical images as well as
1419 multiple colors and fonts for the list entries.
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001420
1421 Subwidgets - None"""
1422
1423 def __init__ (self,master=None,cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001424 TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001425
1426 def active_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001427 self.tk.call(self._w, 'active', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001428
1429 def active_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001430 self.tk.call(self._w, 'active', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001431
1432 def anchor_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001433 self.tk.call(self._w, 'anchor', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001434
1435 def anchor_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001436 self.tk.call(self._w, 'anchor', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001437
1438 def delete(self, from_, to=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001439 self.tk.call(self._w, 'delete', from_, to)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001440
1441 def dragsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001442 self.tk.call(self._w, 'dragsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001443
1444 def dragsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001445 self.tk.call(self._w, 'dragsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001446
1447 def dropsite_set(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001448 self.tk.call(self._w, 'dropsite', 'set', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001449
1450 def dropsite_clear(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001451 self.tk.call(self._w, 'dropsite', 'clear')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001452
1453 def insert(self, index, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001454 self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001455
1456 def info_active(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001457 return self.tk.call(self._w, 'info', 'active')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001458
1459 def info_anchor(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001460 return self.tk.call(self._w, 'info', 'anchor')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001461
1462 def info_down(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001463 return self.tk.call(self._w, 'info', 'down', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001464
1465 def info_left(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001466 return self.tk.call(self._w, 'info', 'left', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001467
1468 def info_right(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001469 return self.tk.call(self._w, 'info', 'right', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001470
1471 def info_selection(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001472 c = self.tk.call(self._w, 'info', 'selection')
1473 return self.tk.splitlist(c)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001474
1475 def info_size(self):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001476 return self.tk.call(self._w, 'info', 'size')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001477
1478 def info_up(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001479 return self.tk.call(self._w, 'info', 'up', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001480
1481 def nearest(self, x, y):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001482 return self.tk.call(self._w, 'nearest', x, y)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001483
1484 def see(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001485 self.tk.call(self._w, 'see', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001486
1487 def selection_clear(self, cnf={}, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001488 self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001489
1490 def selection_includes(self, index):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001491 return self.tk.call(self._w, 'selection', 'includes', index)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001492
1493 def selection_set(self, first, last=None):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001494 self.tk.call(self._w, 'selection', 'set', first, last)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001495
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001496class Tree(TixWidget):
Ezio Melotti13925002011-03-16 11:05:33 +02001497 """Tree - The tixTree widget can be used to display hierarchical
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001498 data in a tree form. The user can adjust
1499 the view of the tree by opening or closing parts of the tree."""
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001500
Martin v. Löwis46874282002-12-06 10:33:45 +00001501 # FIXME: It should inherit -superclass tixScrolledWidget
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001502 def __init__(self, master=None, cnf={}, **kw):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001503 TixWidget.__init__(self, master, 'tixTree',
Neal Norwitzf539bde2002-11-14 02:43:40 +00001504 ['options'], cnf, kw)
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001505 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1506 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1507 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001508
1509 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001510 '''This command calls the setmode method for all the entries in this
1511 Tree widget: if an entry has no child entries, its mode is set to
1512 none. Otherwise, if the entry has any hidden child entries, its mode is
1513 set to open; otherwise its mode is set to close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001514 self.tk.call(self._w, 'autosetmode')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001515
1516 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001517 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001518 self.tk.call(self._w, 'close', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001519
1520 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001521 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001522 return self.tk.call(self._w, 'getmode', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001523
1524 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001525 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001526 self.tk.call(self._w, 'open', entrypath)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001527
1528 def setmode(self, entrypath, mode='none'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001529 '''This command is used to indicate whether the entry given by
1530 entryPath has children entries and whether the children are visible. mode
1531 must be one of open, close or none. If mode is set to open, a (+)
Ezio Melottie130a522011-10-19 10:58:56 +03001532 indicator is drawn next the entry. If mode is set to close, a (-)
1533 indicator is drawn next the entry. If mode is set to none, no
Martin v. Löwis46874282002-12-06 10:33:45 +00001534 indicators will be drawn for this entry. The default mode is none. The
1535 open mode indicates the entry has hidden children and this entry can be
1536 opened by the user. The close mode indicates that all the children of the
1537 entry are now visible and the entry can be closed by the user.'''
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001538 self.tk.call(self._w, 'setmode', entrypath, mode)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001539
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001540
1541# Could try subclassing Tree for CheckList - would need another arg to init
1542class CheckList(TixWidget):
1543 """The CheckList widget
1544 displays a list of items to be selected by the user. CheckList acts
1545 similarly to the Tk checkbutton or radiobutton widgets, except it is
1546 capable of handling many more items than checkbuttons or radiobuttons.
1547 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001548 # FIXME: It should inherit -superclass tixTree
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001549 def __init__(self, master=None, cnf={}, **kw):
1550 TixWidget.__init__(self, master, 'tixCheckList',
Guilherme Polobcd03df2009-08-18 15:35:57 +00001551 ['options', 'radio'], cnf, kw)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001552 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1553 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1554 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001555
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001556 def autosetmode(self):
Martin v. Löwis46874282002-12-06 10:33:45 +00001557 '''This command calls the setmode method for all the entries in this
1558 Tree widget: if an entry has no child entries, its mode is set to
1559 none. Otherwise, if the entry has any hidden child entries, its mode is
1560 set to open; otherwise its mode is set to close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001561 self.tk.call(self._w, 'autosetmode')
1562
1563 def close(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001564 '''Close the entry given by entryPath if its mode is close.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001565 self.tk.call(self._w, 'close', entrypath)
1566
1567 def getmode(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001568 '''Returns the current mode of the entry given by entryPath.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001569 return self.tk.call(self._w, 'getmode', entrypath)
1570
1571 def open(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001572 '''Open the entry given by entryPath if its mode is open.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001573 self.tk.call(self._w, 'open', entrypath)
1574
1575 def getselection(self, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001576 '''Returns a list of items whose status matches status. If status is
1577 not specified, the list of items in the "on" status will be returned.
1578 Mode can be on, off, default'''
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001579 return self.tk.splitlist(self.tk.call(self._w, 'getselection', mode))
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001580
1581 def getstatus(self, entrypath):
Martin v. Löwis46874282002-12-06 10:33:45 +00001582 '''Returns the current status of entryPath.'''
1583 return self.tk.call(self._w, 'getstatus', entrypath)
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001584
1585 def setstatus(self, entrypath, mode='on'):
Martin v. Löwis46874282002-12-06 10:33:45 +00001586 '''Sets the status of entryPath to be status. A bitmap will be
1587 displayed next to the entry its status is on, off or default.'''
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001588 self.tk.call(self._w, 'setstatus', entrypath, mode)
1589
1590
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001591###########################################################################
1592### The subclassing below is used to instantiate the subwidgets in each ###
1593### mega widget. This allows us to access their methods directly. ###
1594###########################################################################
1595
1596class _dummyButton(Button, TixSubWidget):
1597 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001598 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001599
1600class _dummyCheckbutton(Checkbutton, TixSubWidget):
1601 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001602 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001603
1604class _dummyEntry(Entry, TixSubWidget):
1605 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001606 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001607
1608class _dummyFrame(Frame, TixSubWidget):
1609 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001610 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001611
1612class _dummyLabel(Label, TixSubWidget):
1613 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001614 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001615
1616class _dummyListbox(Listbox, TixSubWidget):
1617 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001618 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001619
1620class _dummyMenu(Menu, TixSubWidget):
1621 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001622 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001623
1624class _dummyMenubutton(Menubutton, TixSubWidget):
1625 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001626 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001627
1628class _dummyScrollbar(Scrollbar, TixSubWidget):
1629 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001630 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001631
1632class _dummyText(Text, TixSubWidget):
1633 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001634 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001635
1636class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
1637 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001638 TixSubWidget.__init__(self, master, name, destroy_physically)
1639 self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
1640 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1641 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001642
1643class _dummyHList(HList, TixSubWidget):
1644 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001645 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001646
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001647class _dummyScrolledHList(ScrolledHList, TixSubWidget):
1648 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001649 TixSubWidget.__init__(self, master, name, destroy_physically)
1650 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1651 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1652 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001653
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001654class _dummyTList(TList, TixSubWidget):
1655 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001656 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001657
1658class _dummyComboBox(ComboBox, TixSubWidget):
1659 def __init__(self, master, name, destroy_physically=1):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001660 TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
1661 self.subwidget_list['label'] = _dummyLabel(self, 'label')
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001662 self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
1663 self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001664
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001665 self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001666 'slistbox')
1667 try:
1668 self.subwidget_list['tick'] = _dummyButton(self, 'tick')
1669 #cross Button : present if created with the fancy option
1670 self.subwidget_list['cross'] = _dummyButton(self, 'cross')
1671 except TypeError:
1672 # unavailable when -fancy not specified
1673 pass
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001674
1675class _dummyDirList(DirList, TixSubWidget):
1676 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001677 TixSubWidget.__init__(self, master, name, destroy_physically)
1678 self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
1679 self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
1680 self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001681
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001682class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
1683 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001684 TixSubWidget.__init__(self, master, name, destroy_physically)
1685 self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
1686 self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001687
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001688class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
1689 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001690 TixSubWidget.__init__(self, master, name, destroy_physically)
1691 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1692 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1693 self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
1694 self.subwidget_list['types'] = _dummyComboBox(self, 'types')
1695 self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
1696 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1697 self.subwidget_list['file'] = _dummyComboBox(self, 'file')
1698 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001699
1700class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
1701 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001702 TixSubWidget.__init__(self, master, name, destroy_physically)
1703 self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
1704 self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
1705 self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
1706 self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001707
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001708class _dummyFileComboBox(ComboBox, TixSubWidget):
1709 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001710 TixSubWidget.__init__(self, master, name, destroy_physically)
1711 self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001712
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001713class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
1714 def __init__(self, master, name, destroy_physically=1):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001715 TixSubWidget.__init__(self, master, name, destroy_physically)
1716 self.subwidget_list['ok'] = _dummyButton(self, 'ok')
1717 self.subwidget_list['apply'] = _dummyButton(self, 'apply')
1718 self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
1719 self.subwidget_list['help'] = _dummyButton(self, 'help')
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001720
1721class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
1722 def __init__(self, master, name, destroy_physically=0):
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001723 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001724
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001725class _dummyPanedWindow(PanedWindow, TixSubWidget):
1726 def __init__(self, master, name, destroy_physically=1):
Tim Peters182b5ac2004-07-18 06:16:08 +00001727 TixSubWidget.__init__(self, master, name, destroy_physically)
Martin v. Löwis01824bf2002-09-19 08:12:55 +00001728
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001729########################
1730### Utility Routines ###
1731########################
1732
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001733#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.
1734
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001735def OptionName(widget):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001736 '''Returns the qualified path name for the widget. Normally used to set
1737 default options for subwidgets. See tixwidgets.py'''
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001738 return widget.tk.call('tixOptionName', widget._w)
1739
1740# Called with a dictionary argument of the form
1741# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
1742# returns a string which can be used to configure the fsbox file types
1743# in an ExFileSelectBox. i.e.,
1744# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
1745def FileTypeList(dict):
1746 s = ''
1747 for type in dict.keys():
Martin v. Löwis0c0d56a2002-03-28 16:26:40 +00001748 s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
Martin v. Löwisb21cb5f2001-03-21 07:42:07 +00001749 return s
1750
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001751# Still to be done:
Martin v. Löwis46874282002-12-06 10:33:45 +00001752# tixIconView
Martin v. Löwisb7b32602001-11-02 23:48:20 +00001753class CObjView(TixWidget):
1754 """This file implements the Canvas Object View widget. This is a base
1755 class of IconView. It implements automatic placement/adjustment of the
1756 scrollbars according to the canvas objects inside the canvas subwidget.
1757 The scrollbars are adjusted so that the canvas is just large enough
1758 to see all the objects.
1759 """
Martin v. Löwis46874282002-12-06 10:33:45 +00001760 # FIXME: It should inherit -superclass tixScrolledWidget
1761 pass
1762
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001763
Guilherme Polo1fff0082009-08-14 15:05:30 +00001764class Grid(TixWidget, XView, YView):
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001765 '''The Tix Grid command creates a new window and makes it into a
1766 tixGrid widget. Additional options, may be specified on the command
1767 line or in the option database to configure aspects such as its cursor
1768 and relief.
1769
1770 A Grid widget displays its contents in a two dimensional grid of cells.
1771 Each cell may contain one Tix display item, which may be in text,
1772 graphics or other formats. See the DisplayStyle class for more information
1773 about Tix display items. Individual cells, or groups of cells, can be
1774 formatted with a wide range of attributes, such as its color, relief and
1775 border.
1776
1777 Subwidgets - None'''
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001778 # valid specific resources as of Tk 8.4
1779 # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
1780 # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
1781 # selectunit, topmargin,
1782 def __init__(self, master=None, cnf={}, **kw):
1783 static= []
1784 self.cnf= cnf
1785 TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001786
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001787 # valid options as of Tk 8.4
Guilherme Polobcd03df2009-08-18 15:35:57 +00001788 # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
1789 # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
1790 # selection, set, size, unset, xview, yview
1791 def anchor_clear(self):
1792 """Removes the selection anchor."""
1793 self.tk.call(self, 'anchor', 'clear')
1794
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795 def anchor_get(self):
1796 "Get the (x,y) coordinate of the current anchor cell"
1797 return self._getints(self.tk.call(self, 'anchor', 'get'))
1798
Guilherme Polobcd03df2009-08-18 15:35:57 +00001799 def anchor_set(self, x, y):
1800 """Set the selection anchor to the cell at (x, y)."""
1801 self.tk.call(self, 'anchor', 'set', x, y)
1802
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001803 def delete_row(self, from_, to=None):
1804 """Delete rows between from_ and to inclusive.
1805 If to is not provided, delete only row at from_"""
1806 if to is None:
1807 self.tk.call(self, 'delete', 'row', from_)
1808 else:
1809 self.tk.call(self, 'delete', 'row', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001810
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001811 def delete_column(self, from_, to=None):
1812 """Delete columns between from_ and to inclusive.
1813 If to is not provided, delete only column at from_"""
1814 if to is None:
1815 self.tk.call(self, 'delete', 'column', from_)
1816 else:
1817 self.tk.call(self, 'delete', 'column', from_, to)
Guilherme Polobcd03df2009-08-18 15:35:57 +00001818
1819 def edit_apply(self):
1820 """If any cell is being edited, de-highlight the cell and applies
1821 the changes."""
1822 self.tk.call(self, 'edit', 'apply')
1823
1824 def edit_set(self, x, y):
1825 """Highlights the cell at (x, y) for editing, if the -editnotify
1826 command returns True for this cell."""
1827 self.tk.call(self, 'edit', 'set', x, y)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001828
1829 def entrycget(self, x, y, option):
1830 "Get the option value for cell at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001831 if option and option[0] != '-':
1832 option = '-' + option
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001833 return self.tk.call(self, 'entrycget', x, y, option)
1834
Guilherme Polobcd03df2009-08-18 15:35:57 +00001835 def entryconfigure(self, x, y, cnf=None, **kw):
1836 return self._configure(('entryconfigure', x, y), cnf, kw)
1837
Neal Norwitzd8b5e3f2002-12-30 23:52:01 +00001838 # def format
1839 # def index
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001840
1841 def info_exists(self, x, y):
1842 "Return True if display item exists at (x,y)"
Guilherme Polobcd03df2009-08-18 15:35:57 +00001843 return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001844
1845 def info_bbox(self, x, y):
1846 # This seems to always return '', at least for 'text' displayitems
1847 return self.tk.call(self, 'info', 'bbox', x, y)
1848
Guilherme Polobcd03df2009-08-18 15:35:57 +00001849 def move_column(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001850 """Moves the range of columns from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001851 the distance indicated by OFFSET. For example, move_column(2, 4, 1)
1852 moves the columns 2,3,4 to columns 3,4,5."""
1853 self.tk.call(self, 'move', 'column', from_, to, offset)
1854
1855 def move_row(self, from_, to, offset):
Ezio Melottie130a522011-10-19 10:58:56 +03001856 """Moves the range of rows from position FROM through TO by
Guilherme Polobcd03df2009-08-18 15:35:57 +00001857 the distance indicated by OFFSET.
1858 For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
1859 self.tk.call(self, 'move', 'row', from_, to, offset)
1860
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001861 def nearest(self, x, y):
1862 "Return coordinate of cell nearest pixel coordinate (x,y)"
1863 return self._getints(self.tk.call(self, 'nearest', x, y))
1864
1865 # def selection adjust
1866 # def selection clear
1867 # def selection includes
1868 # def selection set
1869 # def selection toggle
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001870
1871 def set(self, x, y, itemtype=None, **kw):
1872 args= self._options(self.cnf, kw)
1873 if itemtype is not None:
1874 args= ('-itemtype', itemtype) + args
1875 self.tk.call(self, 'set', x, y, *args)
1876
Guilherme Polobcd03df2009-08-18 15:35:57 +00001877 def size_column(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001878 """Queries or sets the size of the column given by
1879 INDEX. INDEX may be any non-negative
1880 integer that gives the position of a given column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001881 INDEX can also be the string "default"; in this case, this command
1882 queries or sets the default size of all columns.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001883 When no option-value pair is given, this command returns a tuple
1884 containing the current size setting of the given column. When
1885 option-value pairs are given, the corresponding options of the
Guilherme Polobcd03df2009-08-18 15:35:57 +00001886 size setting of the given column are changed. Options may be one
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001887 of the follwing:
Guilherme Polobcd03df2009-08-18 15:35:57 +00001888 pad0 pixels
1889 Specifies the paddings to the left of a column.
1890 pad1 pixels
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001891 Specifies the paddings to the right of a column.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001892 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001893 Specifies the width of a column. Val may be:
1894 "auto" -- the width of the column is set to the
1895 width of the widest cell in the column;
1896 a valid Tk screen distance unit;
1897 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001898 (e.g. 3.4chars) that sets the width of the column to the
1899 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001900 return self.tk.splitlist(self.tk.call(self._w, 'size', 'column', index,
Guilherme Polobcd03df2009-08-18 15:35:57 +00001901 *self._options({}, kw)))
1902
1903 def size_row(self, index, **kw):
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001904 """Queries or sets the size of the row given by
1905 INDEX. INDEX may be any non-negative
1906 integer that gives the position of a given row .
Guilherme Polobcd03df2009-08-18 15:35:57 +00001907 INDEX can also be the string "default"; in this case, this command
1908 queries or sets the default size of all rows.
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001909 When no option-value pair is given, this command returns a list con-
1910 taining the current size setting of the given row . When option-value
Guilherme Polobcd03df2009-08-18 15:35:57 +00001911 pairs are given, the corresponding options of the size setting of the
1912 given row are changed. Options may be one of the follwing:
1913 pad0 pixels
1914 Specifies the paddings to the top of a row.
1915 pad1 pixels
Ezio Melottie130a522011-10-19 10:58:56 +03001916 Specifies the paddings to the bottom of a row.
Guilherme Polobcd03df2009-08-18 15:35:57 +00001917 size val
Terry Jan Reedyc30b7b12013-03-11 17:57:08 -04001918 Specifies the height of a row. Val may be:
1919 "auto" -- the height of the row is set to the
1920 height of the highest cell in the row;
1921 a valid Tk screen distance unit;
1922 or a real number following by the word chars
Guilherme Polobcd03df2009-08-18 15:35:57 +00001923 (e.g. 3.4chars) that sets the height of the row to the
1924 given number of characters."""
Serhiy Storchaka6bc87b42016-06-26 00:09:19 +03001925 return self.tk.splitlist(self.tk.call(
Guilherme Polobcd03df2009-08-18 15:35:57 +00001926 self, 'size', 'row', index, *self._options({}, kw)))
1927
1928 def unset(self, x, y):
1929 """Clears the cell at (x, y) by removing its display item."""
1930 self.tk.call(self._w, 'unset', x, y)
1931
Raymond Hettingerff41c482003-04-06 09:01:11 +00001932
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001933class ScrolledGrid(Grid):
Martin v. Löwis46874282002-12-06 10:33:45 +00001934 '''Scrolled Grid widgets'''
1935
1936 # FIXME: It should inherit -superclass tixScrolledWidget
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001937 def __init__(self, master=None, cnf={}, **kw):
1938 static= []
1939 self.cnf= cnf
1940 TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)