blob: 5bd7aa9d491b0646381bf69ad17821e7f404f962 [file] [log] [blame]
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001"""Wrapper functions for Tcl/Tk.
2
3Tkinter provides classes which allow the display, positioning and
4control of widgets. Toplevel widgets are Tk and Toplevel. Other
5widgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00006Checkbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox
Raymond Hettingerff41c482003-04-06 09:01:11 +00007LabelFrame and PanedWindow.
Martin v. Löwis2ec36272002-10-13 10:22:08 +00008
Raymond Hettingerff41c482003-04-06 09:01:11 +00009Properties of the widgets are specified with keyword arguments.
10Keyword arguments have the same name as the corresponding resource
Martin v. Löwis2ec36272002-10-13 10:22:08 +000011under Tk.
Guido van Rossum5917ecb2000-06-29 16:30:50 +000012
13Widgets are positioned with one of the geometry managers Place, Pack
14or Grid. These managers can be called with methods place, pack, grid
15available in every Widget.
16
Guido van Rossuma0adb922001-09-01 18:29:55 +000017Actions are bound to events by resources (e.g. keyword argument
18command) or with the method bind.
Guido van Rossum5917ecb2000-06-29 16:30:50 +000019
20Example (Hello, World):
21import Tkinter
22from Tkconstants import *
23tk = Tkinter.Tk()
24frame = Tkinter.Frame(tk, relief=RIDGE, borderwidth=2)
25frame.pack(fill=BOTH,expand=1)
26label = Tkinter.Label(frame, text="Hello, World")
27label.pack(fill=X, expand=1)
28button = Tkinter.Button(frame,text="Exit",command=tk.destroy)
29button.pack(side=BOTTOM)
30tk.mainloop()
31"""
Guido van Rossum2dcf5291994-07-06 09:23:20 +000032
Guido van Rossum37dcab11996-05-16 16:00:19 +000033__version__ = "$Revision$"
34
Guido van Rossumf8d579c1999-01-04 18:06:45 +000035import sys
36if sys.platform == "win32":
Fredrik Lundh06d28152000-08-09 18:03:12 +000037 import FixTk # Attempt to configure Tcl/Tk without requiring PATH
Guido van Rossumf8d579c1999-01-04 18:06:45 +000038import _tkinter # If this fails your Python may not be configured for Tk
Guido van Rossum95806091997-02-15 18:33:24 +000039tkinter = _tkinter # b/w compat for export
40TclError = _tkinter.TclError
Guido van Rossum7e9394a1995-03-17 16:21:33 +000041from types import *
Guido van Rossuma5773dd1995-09-07 19:22:00 +000042from Tkconstants import *
Guido van Rossumf0c891a1998-04-29 21:43:36 +000043try:
Fredrik Lundh06d28152000-08-09 18:03:12 +000044 import MacOS; _MacOS = MacOS; del MacOS
Guido van Rossumf0c891a1998-04-29 21:43:36 +000045except ImportError:
Fredrik Lundh06d28152000-08-09 18:03:12 +000046 _MacOS = None
Guido van Rossum18468821994-06-20 07:49:28 +000047
Martin v. Löwis8c8aa5d2002-11-26 21:39:48 +000048wantobjects = 1
Martin v. Löwisffad6332002-11-26 09:28:05 +000049
Eric S. Raymondfc170b12001-02-09 11:51:27 +000050TkVersion = float(_tkinter.TK_VERSION)
51TclVersion = float(_tkinter.TCL_VERSION)
Guido van Rossum18468821994-06-20 07:49:28 +000052
Guido van Rossumd6615ab1997-08-05 02:35:01 +000053READABLE = _tkinter.READABLE
54WRITABLE = _tkinter.WRITABLE
55EXCEPTION = _tkinter.EXCEPTION
Guido van Rossumf53c86c1997-08-14 14:15:54 +000056
57# These are not always defined, e.g. not on Win32 with Tk 8.0 :-(
58try: _tkinter.createfilehandler
59except AttributeError: _tkinter.createfilehandler = None
60try: _tkinter.deletefilehandler
61except AttributeError: _tkinter.deletefilehandler = None
Fredrik Lundh06d28152000-08-09 18:03:12 +000062
63
Guido van Rossum2dcf5291994-07-06 09:23:20 +000064def _flatten(tuple):
Fredrik Lundh06d28152000-08-09 18:03:12 +000065 """Internal function."""
66 res = ()
67 for item in tuple:
68 if type(item) in (TupleType, ListType):
69 res = res + _flatten(item)
70 elif item is not None:
71 res = res + (item,)
72 return res
Guido van Rossum2dcf5291994-07-06 09:23:20 +000073
Andrew M. Kuchlinge475e702000-06-18 18:45:50 +000074try: _flatten = _tkinter._flatten
75except AttributeError: pass
76
Guido van Rossum2dcf5291994-07-06 09:23:20 +000077def _cnfmerge(cnfs):
Fredrik Lundh06d28152000-08-09 18:03:12 +000078 """Internal function."""
79 if type(cnfs) is DictionaryType:
80 return cnfs
81 elif type(cnfs) in (NoneType, StringType):
82 return cnfs
83 else:
84 cnf = {}
85 for c in _flatten(cnfs):
86 try:
87 cnf.update(c)
88 except (AttributeError, TypeError), msg:
89 print "_cnfmerge: fallback due to:", msg
90 for k, v in c.items():
91 cnf[k] = v
92 return cnf
Guido van Rossum2dcf5291994-07-06 09:23:20 +000093
Andrew M. Kuchlinge475e702000-06-18 18:45:50 +000094try: _cnfmerge = _tkinter._cnfmerge
95except AttributeError: pass
96
Guido van Rossum2dcf5291994-07-06 09:23:20 +000097class Event:
Fredrik Lundh06d28152000-08-09 18:03:12 +000098 """Container for the properties of an event.
Guido van Rossum5917ecb2000-06-29 16:30:50 +000099
Fredrik Lundh06d28152000-08-09 18:03:12 +0000100 Instances of this type are generated if one of the following events occurs:
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000101
Fredrik Lundh06d28152000-08-09 18:03:12 +0000102 KeyPress, KeyRelease - for keyboard events
103 ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events
104 Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate,
105 Colormap, Gravity, Reparent, Property, Destroy, Activate,
106 Deactivate - for window events.
107
108 If a callback function for one of these events is registered
109 using bind, bind_all, bind_class, or tag_bind, the callback is
110 called with an Event as first argument. It will have the
111 following attributes (in braces are the event types for which
112 the attribute is valid):
113
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000114 serial - serial number of event
Fredrik Lundh06d28152000-08-09 18:03:12 +0000115 num - mouse button pressed (ButtonPress, ButtonRelease)
116 focus - whether the window has the focus (Enter, Leave)
117 height - height of the exposed window (Configure, Expose)
118 width - width of the exposed window (Configure, Expose)
119 keycode - keycode of the pressed key (KeyPress, KeyRelease)
120 state - state of the event as a number (ButtonPress, ButtonRelease,
121 Enter, KeyPress, KeyRelease,
122 Leave, Motion)
123 state - state as a string (Visibility)
124 time - when the event occurred
125 x - x-position of the mouse
126 y - y-position of the mouse
127 x_root - x-position of the mouse on the screen
128 (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
129 y_root - y-position of the mouse on the screen
130 (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
131 char - pressed character (KeyPress, KeyRelease)
132 send_event - see X/Windows documentation
Walter Dörwald966c2642005-11-09 17:12:43 +0000133 keysym - keysym of the event as a string (KeyPress, KeyRelease)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000134 keysym_num - keysym of the event as a number (KeyPress, KeyRelease)
135 type - type of the event as a number
136 widget - widget in which the event occurred
137 delta - delta of wheel movement (MouseWheel)
138 """
139 pass
Guido van Rossum2dcf5291994-07-06 09:23:20 +0000140
Guido van Rossumc4570481998-03-20 20:45:49 +0000141_support_default_root = 1
Guido van Rossumaec5dc91994-06-27 07:55:12 +0000142_default_root = None
143
Guido van Rossumc4570481998-03-20 20:45:49 +0000144def NoDefaultRoot():
Fredrik Lundh06d28152000-08-09 18:03:12 +0000145 """Inhibit setting of default root window.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000146
Fredrik Lundh06d28152000-08-09 18:03:12 +0000147 Call this function to inhibit that the first instance of
148 Tk is used for windows without an explicit parent window.
149 """
150 global _support_default_root
151 _support_default_root = 0
152 global _default_root
153 _default_root = None
154 del _default_root
Guido van Rossumc4570481998-03-20 20:45:49 +0000155
Guido van Rossum45853db1994-06-20 12:19:19 +0000156def _tkerror(err):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000157 """Internal function."""
158 pass
Guido van Rossum18468821994-06-20 07:49:28 +0000159
Guido van Rossum97aeca11994-07-07 13:12:12 +0000160def _exit(code='0'):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000161 """Internal function. Calling it will throw the exception SystemExit."""
162 raise SystemExit, code
Guido van Rossum97aeca11994-07-07 13:12:12 +0000163
Guido van Rossumaec5dc91994-06-27 07:55:12 +0000164_varnum = 0
165class Variable:
Guido van Rossum2cd0a652003-04-16 20:10:03 +0000166 """Class to define value holders for e.g. buttons.
167
168 Subclasses StringVar, IntVar, DoubleVar, BooleanVar are specializations
169 that constrain the type of the value returned from get()."""
Fredrik Lundh06d28152000-08-09 18:03:12 +0000170 _default = ""
171 def __init__(self, master=None):
172 """Construct a variable with an optional MASTER as master widget.
173 The variable is named PY_VAR_number in Tcl.
174 """
175 global _varnum
176 if not master:
177 master = _default_root
178 self._master = master
179 self._tk = master.tk
Walter Dörwald70a6b492004-02-12 17:35:32 +0000180 self._name = 'PY_VAR' + repr(_varnum)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000181 _varnum = _varnum + 1
182 self.set(self._default)
183 def __del__(self):
184 """Unset the variable in Tcl."""
185 self._tk.globalunsetvar(self._name)
186 def __str__(self):
187 """Return the name of the variable in Tcl."""
188 return self._name
189 def set(self, value):
190 """Set the variable to VALUE."""
191 return self._tk.globalsetvar(self._name, value)
Guido van Rossum2cd0a652003-04-16 20:10:03 +0000192 def get(self):
193 """Return value of variable."""
194 return self._tk.globalgetvar(self._name)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000195 def trace_variable(self, mode, callback):
196 """Define a trace callback for the variable.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000197
Fredrik Lundh06d28152000-08-09 18:03:12 +0000198 MODE is one of "r", "w", "u" for read, write, undefine.
199 CALLBACK must be a function which is called when
200 the variable is read, written or undefined.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000201
Fredrik Lundh06d28152000-08-09 18:03:12 +0000202 Return the name of the callback.
203 """
204 cbname = self._master._register(callback)
205 self._tk.call("trace", "variable", self._name, mode, cbname)
206 return cbname
207 trace = trace_variable
208 def trace_vdelete(self, mode, cbname):
209 """Delete the trace callback for a variable.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000210
Fredrik Lundh06d28152000-08-09 18:03:12 +0000211 MODE is one of "r", "w", "u" for read, write, undefine.
212 CBNAME is the name of the callback returned from trace_variable or trace.
213 """
214 self._tk.call("trace", "vdelete", self._name, mode, cbname)
215 self._master.deletecommand(cbname)
216 def trace_vinfo(self):
217 """Return all trace callback information."""
218 return map(self._tk.split, self._tk.splitlist(
219 self._tk.call("trace", "vinfo", self._name)))
Guido van Rossumaec5dc91994-06-27 07:55:12 +0000220
221class StringVar(Variable):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000222 """Value holder for strings variables."""
223 _default = ""
224 def __init__(self, master=None):
225 """Construct a string variable.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000226
Fredrik Lundh06d28152000-08-09 18:03:12 +0000227 MASTER can be given as master widget."""
228 Variable.__init__(self, master)
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000229
Fredrik Lundh06d28152000-08-09 18:03:12 +0000230 def get(self):
231 """Return value of variable as string."""
Martin v. Löwisbfe175c2003-04-16 19:42:51 +0000232 value = self._tk.globalgetvar(self._name)
233 if isinstance(value, basestring):
234 return value
235 return str(value)
Guido van Rossumaec5dc91994-06-27 07:55:12 +0000236
237class IntVar(Variable):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000238 """Value holder for integer variables."""
239 _default = 0
240 def __init__(self, master=None):
241 """Construct an integer variable.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000242
Fredrik Lundh06d28152000-08-09 18:03:12 +0000243 MASTER can be given as master widget."""
244 Variable.__init__(self, master)
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000245
Martin v. Löwis70c3dda2003-01-22 09:17:38 +0000246 def set(self, value):
247 """Set the variable to value, converting booleans to integers."""
248 if isinstance(value, bool):
249 value = int(value)
250 return Variable.set(self, value)
251
Fredrik Lundh06d28152000-08-09 18:03:12 +0000252 def get(self):
253 """Return the value of the variable as an integer."""
254 return getint(self._tk.globalgetvar(self._name))
Guido van Rossumaec5dc91994-06-27 07:55:12 +0000255
256class DoubleVar(Variable):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000257 """Value holder for float variables."""
258 _default = 0.0
259 def __init__(self, master=None):
260 """Construct a float variable.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000261
Fredrik Lundh06d28152000-08-09 18:03:12 +0000262 MASTER can be given as a master widget."""
263 Variable.__init__(self, master)
264
265 def get(self):
266 """Return the value of the variable as a float."""
267 return getdouble(self._tk.globalgetvar(self._name))
Guido van Rossumaec5dc91994-06-27 07:55:12 +0000268
269class BooleanVar(Variable):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000270 """Value holder for boolean variables."""
271 _default = "false"
272 def __init__(self, master=None):
273 """Construct a boolean variable.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000274
Fredrik Lundh06d28152000-08-09 18:03:12 +0000275 MASTER can be given as a master widget."""
276 Variable.__init__(self, master)
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000277
Fredrik Lundh06d28152000-08-09 18:03:12 +0000278 def get(self):
Martin v. Löwisbfe175c2003-04-16 19:42:51 +0000279 """Return the value of the variable as a bool."""
Fredrik Lundh06d28152000-08-09 18:03:12 +0000280 return self._tk.getboolean(self._tk.globalgetvar(self._name))
Guido van Rossumaec5dc91994-06-27 07:55:12 +0000281
Guido van Rossum35f67fb1995-08-04 03:50:29 +0000282def mainloop(n=0):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000283 """Run the main loop of Tcl."""
284 _default_root.tk.mainloop(n)
Guido van Rossum2dcf5291994-07-06 09:23:20 +0000285
Guido van Rossum0132f691998-04-30 17:50:36 +0000286getint = int
Guido van Rossum2dcf5291994-07-06 09:23:20 +0000287
Guido van Rossum0132f691998-04-30 17:50:36 +0000288getdouble = float
Guido van Rossum2dcf5291994-07-06 09:23:20 +0000289
290def getboolean(s):
Fredrik Lundh06d28152000-08-09 18:03:12 +0000291 """Convert true and false to integer values 1 and 0."""
292 return _default_root.tk.getboolean(s)
Guido van Rossum2dcf5291994-07-06 09:23:20 +0000293
Guido van Rossum368e06b1997-11-07 20:38:49 +0000294# Methods defined on both toplevel and interior widgets
Guido van Rossum18468821994-06-20 07:49:28 +0000295class Misc:
Fredrik Lundh06d28152000-08-09 18:03:12 +0000296 """Internal class.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000297
Fredrik Lundh06d28152000-08-09 18:03:12 +0000298 Base class which defines methods common for interior widgets."""
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000299
Fredrik Lundh06d28152000-08-09 18:03:12 +0000300 # XXX font command?
301 _tclCommands = None
302 def destroy(self):
303 """Internal function.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000304
Fredrik Lundh06d28152000-08-09 18:03:12 +0000305 Delete all Tcl commands created for
306 this widget in the Tcl interpreter."""
307 if self._tclCommands is not None:
308 for name in self._tclCommands:
309 #print '- Tkinter: deleted command', name
310 self.tk.deletecommand(name)
311 self._tclCommands = None
312 def deletecommand(self, name):
313 """Internal function.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000314
Fredrik Lundh06d28152000-08-09 18:03:12 +0000315 Delete the Tcl command provided in NAME."""
316 #print '- Tkinter: deleted command', name
317 self.tk.deletecommand(name)
318 try:
319 self._tclCommands.remove(name)
320 except ValueError:
321 pass
322 def tk_strictMotif(self, boolean=None):
323 """Set Tcl internal variable, whether the look and feel
324 should adhere to Motif.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000325
Fredrik Lundh06d28152000-08-09 18:03:12 +0000326 A parameter of 1 means adhere to Motif (e.g. no color
327 change if mouse passes over slider).
328 Returns the set value."""
329 return self.tk.getboolean(self.tk.call(
330 'set', 'tk_strictMotif', boolean))
331 def tk_bisque(self):
332 """Change the color scheme to light brown as used in Tk 3.6 and before."""
333 self.tk.call('tk_bisque')
334 def tk_setPalette(self, *args, **kw):
335 """Set a new color scheme for all widget elements.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000336
Fredrik Lundh06d28152000-08-09 18:03:12 +0000337 A single color as argument will cause that all colors of Tk
338 widget elements are derived from this.
339 Alternatively several keyword parameters and its associated
340 colors can be given. The following keywords are valid:
341 activeBackground, foreground, selectColor,
342 activeForeground, highlightBackground, selectBackground,
343 background, highlightColor, selectForeground,
344 disabledForeground, insertBackground, troughColor."""
345 self.tk.call(('tk_setPalette',)
346 + _flatten(args) + _flatten(kw.items()))
347 def tk_menuBar(self, *args):
348 """Do not use. Needed in Tk 3.6 and earlier."""
349 pass # obsolete since Tk 4.0
350 def wait_variable(self, name='PY_VAR'):
351 """Wait until the variable is modified.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000352
Fredrik Lundh06d28152000-08-09 18:03:12 +0000353 A parameter of type IntVar, StringVar, DoubleVar or
354 BooleanVar must be given."""
355 self.tk.call('tkwait', 'variable', name)
356 waitvar = wait_variable # XXX b/w compat
357 def wait_window(self, window=None):
358 """Wait until a WIDGET is destroyed.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000359
Fredrik Lundh06d28152000-08-09 18:03:12 +0000360 If no parameter is given self is used."""
Fred Drake132dce22000-12-12 23:11:42 +0000361 if window is None:
Fredrik Lundh06d28152000-08-09 18:03:12 +0000362 window = self
363 self.tk.call('tkwait', 'window', window._w)
364 def wait_visibility(self, window=None):
365 """Wait until the visibility of a WIDGET changes
366 (e.g. it appears).
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000367
Fredrik Lundh06d28152000-08-09 18:03:12 +0000368 If no parameter is given self is used."""
Fred Drake132dce22000-12-12 23:11:42 +0000369 if window is None:
Fredrik Lundh06d28152000-08-09 18:03:12 +0000370 window = self
371 self.tk.call('tkwait', 'visibility', window._w)
372 def setvar(self, name='PY_VAR', value='1'):
373 """Set Tcl variable NAME to VALUE."""
374 self.tk.setvar(name, value)
375 def getvar(self, name='PY_VAR'):
376 """Return value of Tcl variable NAME."""
377 return self.tk.getvar(name)
378 getint = int
379 getdouble = float
380 def getboolean(self, s):
Neal Norwitz6e5be222003-04-17 13:13:55 +0000381 """Return a boolean value for Tcl boolean values true and false given as parameter."""
Fredrik Lundh06d28152000-08-09 18:03:12 +0000382 return self.tk.getboolean(s)
383 def focus_set(self):
384 """Direct input focus to this widget.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000385
Fredrik Lundh06d28152000-08-09 18:03:12 +0000386 If the application currently does not have the focus
387 this widget will get the focus if the application gets
388 the focus through the window manager."""
389 self.tk.call('focus', self._w)
390 focus = focus_set # XXX b/w compat?
391 def focus_force(self):
392 """Direct input focus to this widget even if the
393 application does not have the focus. Use with
394 caution!"""
395 self.tk.call('focus', '-force', self._w)
396 def focus_get(self):
397 """Return the widget which has currently the focus in the
398 application.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000399
Fredrik Lundh06d28152000-08-09 18:03:12 +0000400 Use focus_displayof to allow working with several
401 displays. Return None if application does not have
402 the focus."""
403 name = self.tk.call('focus')
404 if name == 'none' or not name: return None
405 return self._nametowidget(name)
406 def focus_displayof(self):
407 """Return the widget which has currently the focus on the
408 display where this widget is located.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000409
Fredrik Lundh06d28152000-08-09 18:03:12 +0000410 Return None if the application does not have the focus."""
411 name = self.tk.call('focus', '-displayof', self._w)
412 if name == 'none' or not name: return None
413 return self._nametowidget(name)
414 def focus_lastfor(self):
415 """Return the widget which would have the focus if top level
416 for this widget gets the focus from the window manager."""
417 name = self.tk.call('focus', '-lastfor', self._w)
418 if name == 'none' or not name: return None
419 return self._nametowidget(name)
420 def tk_focusFollowsMouse(self):
421 """The widget under mouse will get automatically focus. Can not
422 be disabled easily."""
423 self.tk.call('tk_focusFollowsMouse')
424 def tk_focusNext(self):
425 """Return the next widget in the focus order which follows
426 widget which has currently the focus.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000427
Fredrik Lundh06d28152000-08-09 18:03:12 +0000428 The focus order first goes to the next child, then to
429 the children of the child recursively and then to the
430 next sibling which is higher in the stacking order. A
431 widget is omitted if it has the takefocus resource set
432 to 0."""
433 name = self.tk.call('tk_focusNext', self._w)
434 if not name: return None
435 return self._nametowidget(name)
436 def tk_focusPrev(self):
437 """Return previous widget in the focus order. See tk_focusNext for details."""
438 name = self.tk.call('tk_focusPrev', self._w)
439 if not name: return None
440 return self._nametowidget(name)
441 def after(self, ms, func=None, *args):
442 """Call function once after given time.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000443
Fredrik Lundh06d28152000-08-09 18:03:12 +0000444 MS specifies the time in milliseconds. FUNC gives the
445 function which shall be called. Additional parameters
446 are given as parameters to the function call. Return
447 identifier to cancel scheduling with after_cancel."""
448 if not func:
449 # I'd rather use time.sleep(ms*0.001)
450 self.tk.call('after', ms)
451 else:
Georg Brandl4696ffb2006-04-02 21:09:51 +0000452 def callit():
Fredrik Lundh06d28152000-08-09 18:03:12 +0000453 try:
Raymond Hettingerff41c482003-04-06 09:01:11 +0000454 func(*args)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000455 finally:
456 try:
Georg Brandl4696ffb2006-04-02 21:09:51 +0000457 self.deletecommand(name)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000458 except TclError:
459 pass
460 name = self._register(callit)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000461 return self.tk.call('after', ms, name)
462 def after_idle(self, func, *args):
463 """Call FUNC once if the Tcl main loop has no event to
464 process.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000465
Fredrik Lundh06d28152000-08-09 18:03:12 +0000466 Return an identifier to cancel the scheduling with
467 after_cancel."""
Raymond Hettingerff41c482003-04-06 09:01:11 +0000468 return self.after('idle', func, *args)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000469 def after_cancel(self, id):
470 """Cancel scheduling of function identified with ID.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000471
Fredrik Lundh06d28152000-08-09 18:03:12 +0000472 Identifier returned by after or after_idle must be
473 given as first parameter."""
Martin v. Löwis0f9e5252003-06-07 19:52:38 +0000474 try:
Neal Norwitz3c0f2c92003-07-01 21:12:47 +0000475 data = self.tk.call('after', 'info', id)
476 # In Tk 8.3, splitlist returns: (script, type)
477 # In Tk 8.4, splitlist may return (script, type) or (script,)
478 script = self.tk.splitlist(data)[0]
Martin v. Löwis0f9e5252003-06-07 19:52:38 +0000479 self.deletecommand(script)
480 except TclError:
481 pass
Fredrik Lundh06d28152000-08-09 18:03:12 +0000482 self.tk.call('after', 'cancel', id)
483 def bell(self, displayof=0):
484 """Ring a display's bell."""
485 self.tk.call(('bell',) + self._displayof(displayof))
486 # Clipboard handling:
487 def clipboard_clear(self, **kw):
488 """Clear the data in the Tk clipboard.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000489
Fredrik Lundh06d28152000-08-09 18:03:12 +0000490 A widget specified for the optional displayof keyword
491 argument specifies the target display."""
492 if not kw.has_key('displayof'): kw['displayof'] = self._w
493 self.tk.call(('clipboard', 'clear') + self._options(kw))
494 def clipboard_append(self, string, **kw):
495 """Append STRING to the Tk clipboard.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000496
Fredrik Lundh06d28152000-08-09 18:03:12 +0000497 A widget specified at the optional displayof keyword
498 argument specifies the target display. The clipboard
499 can be retrieved with selection_get."""
500 if not kw.has_key('displayof'): kw['displayof'] = self._w
501 self.tk.call(('clipboard', 'append') + self._options(kw)
502 + ('--', string))
503 # XXX grab current w/o window argument
504 def grab_current(self):
505 """Return widget which has currently the grab in this application
506 or None."""
507 name = self.tk.call('grab', 'current', self._w)
508 if not name: return None
509 return self._nametowidget(name)
510 def grab_release(self):
511 """Release grab for this widget if currently set."""
512 self.tk.call('grab', 'release', self._w)
513 def grab_set(self):
514 """Set grab for this widget.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000515
Fredrik Lundh06d28152000-08-09 18:03:12 +0000516 A grab directs all events to this and descendant
517 widgets in the application."""
518 self.tk.call('grab', 'set', self._w)
519 def grab_set_global(self):
520 """Set global grab for this widget.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000521
Fredrik Lundh06d28152000-08-09 18:03:12 +0000522 A global grab directs all events to this and
523 descendant widgets on the display. Use with caution -
524 other applications do not get events anymore."""
525 self.tk.call('grab', 'set', '-global', self._w)
526 def grab_status(self):
527 """Return None, "local" or "global" if this widget has
528 no, a local or a global grab."""
529 status = self.tk.call('grab', 'status', self._w)
530 if status == 'none': status = None
531 return status
532 def lower(self, belowThis=None):
533 """Lower this widget in the stacking order."""
534 self.tk.call('lower', self._w, belowThis)
535 def option_add(self, pattern, value, priority = None):
536 """Set a VALUE (second parameter) for an option
537 PATTERN (first parameter).
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000538
Fredrik Lundh06d28152000-08-09 18:03:12 +0000539 An optional third parameter gives the numeric priority
540 (defaults to 80)."""
541 self.tk.call('option', 'add', pattern, value, priority)
542 def option_clear(self):
543 """Clear the option database.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000544
Fredrik Lundh06d28152000-08-09 18:03:12 +0000545 It will be reloaded if option_add is called."""
546 self.tk.call('option', 'clear')
547 def option_get(self, name, className):
548 """Return the value for an option NAME for this widget
549 with CLASSNAME.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000550
Fredrik Lundh06d28152000-08-09 18:03:12 +0000551 Values with higher priority override lower values."""
552 return self.tk.call('option', 'get', self._w, name, className)
553 def option_readfile(self, fileName, priority = None):
554 """Read file FILENAME into the option database.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000555
Fredrik Lundh06d28152000-08-09 18:03:12 +0000556 An optional second parameter gives the numeric
557 priority."""
558 self.tk.call('option', 'readfile', fileName, priority)
559 def selection_clear(self, **kw):
560 """Clear the current X selection."""
561 if not kw.has_key('displayof'): kw['displayof'] = self._w
562 self.tk.call(('selection', 'clear') + self._options(kw))
563 def selection_get(self, **kw):
564 """Return the contents of the current X selection.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000565
Fredrik Lundh06d28152000-08-09 18:03:12 +0000566 A keyword parameter selection specifies the name of
567 the selection and defaults to PRIMARY. A keyword
568 parameter displayof specifies a widget on the display
569 to use."""
570 if not kw.has_key('displayof'): kw['displayof'] = self._w
571 return self.tk.call(('selection', 'get') + self._options(kw))
572 def selection_handle(self, command, **kw):
573 """Specify a function COMMAND to call if the X
574 selection owned by this widget is queried by another
575 application.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000576
Fredrik Lundh06d28152000-08-09 18:03:12 +0000577 This function must return the contents of the
578 selection. The function will be called with the
579 arguments OFFSET and LENGTH which allows the chunking
580 of very long selections. The following keyword
581 parameters can be provided:
582 selection - name of the selection (default PRIMARY),
583 type - type of the selection (e.g. STRING, FILE_NAME)."""
584 name = self._register(command)
585 self.tk.call(('selection', 'handle') + self._options(kw)
586 + (self._w, name))
587 def selection_own(self, **kw):
588 """Become owner of X selection.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000589
Fredrik Lundh06d28152000-08-09 18:03:12 +0000590 A keyword parameter selection specifies the name of
591 the selection (default PRIMARY)."""
592 self.tk.call(('selection', 'own') +
593 self._options(kw) + (self._w,))
594 def selection_own_get(self, **kw):
595 """Return owner of X selection.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000596
Fredrik Lundh06d28152000-08-09 18:03:12 +0000597 The following keyword parameter can
598 be provided:
599 selection - name of the selection (default PRIMARY),
600 type - type of the selection (e.g. STRING, FILE_NAME)."""
601 if not kw.has_key('displayof'): kw['displayof'] = self._w
602 name = self.tk.call(('selection', 'own') + self._options(kw))
603 if not name: return None
604 return self._nametowidget(name)
605 def send(self, interp, cmd, *args):
606 """Send Tcl command CMD to different interpreter INTERP to be executed."""
607 return self.tk.call(('send', interp, cmd) + args)
608 def lower(self, belowThis=None):
609 """Lower this widget in the stacking order."""
610 self.tk.call('lower', self._w, belowThis)
611 def tkraise(self, aboveThis=None):
612 """Raise this widget in the stacking order."""
613 self.tk.call('raise', self._w, aboveThis)
614 lift = tkraise
615 def colormodel(self, value=None):
616 """Useless. Not implemented in Tk."""
617 return self.tk.call('tk', 'colormodel', self._w, value)
618 def winfo_atom(self, name, displayof=0):
619 """Return integer which represents atom NAME."""
620 args = ('winfo', 'atom') + self._displayof(displayof) + (name,)
621 return getint(self.tk.call(args))
622 def winfo_atomname(self, id, displayof=0):
623 """Return name of atom with identifier ID."""
624 args = ('winfo', 'atomname') \
625 + self._displayof(displayof) + (id,)
626 return self.tk.call(args)
627 def winfo_cells(self):
628 """Return number of cells in the colormap for this widget."""
629 return getint(
630 self.tk.call('winfo', 'cells', self._w))
631 def winfo_children(self):
632 """Return a list of all widgets which are children of this widget."""
Martin v. Löwisf2041b82002-03-27 17:15:57 +0000633 result = []
634 for child in self.tk.splitlist(
635 self.tk.call('winfo', 'children', self._w)):
636 try:
637 # Tcl sometimes returns extra windows, e.g. for
638 # menus; those need to be skipped
639 result.append(self._nametowidget(child))
640 except KeyError:
641 pass
642 return result
643
Fredrik Lundh06d28152000-08-09 18:03:12 +0000644 def winfo_class(self):
645 """Return window class name of this widget."""
646 return self.tk.call('winfo', 'class', self._w)
647 def winfo_colormapfull(self):
648 """Return true if at the last color request the colormap was full."""
649 return self.tk.getboolean(
650 self.tk.call('winfo', 'colormapfull', self._w))
651 def winfo_containing(self, rootX, rootY, displayof=0):
652 """Return the widget which is at the root coordinates ROOTX, ROOTY."""
653 args = ('winfo', 'containing') \
654 + self._displayof(displayof) + (rootX, rootY)
655 name = self.tk.call(args)
656 if not name: return None
657 return self._nametowidget(name)
658 def winfo_depth(self):
659 """Return the number of bits per pixel."""
660 return getint(self.tk.call('winfo', 'depth', self._w))
661 def winfo_exists(self):
662 """Return true if this widget exists."""
663 return getint(
664 self.tk.call('winfo', 'exists', self._w))
665 def winfo_fpixels(self, number):
666 """Return the number of pixels for the given distance NUMBER
667 (e.g. "3c") as float."""
668 return getdouble(self.tk.call(
669 'winfo', 'fpixels', self._w, number))
670 def winfo_geometry(self):
671 """Return geometry string for this widget in the form "widthxheight+X+Y"."""
672 return self.tk.call('winfo', 'geometry', self._w)
673 def winfo_height(self):
674 """Return height of this widget."""
675 return getint(
676 self.tk.call('winfo', 'height', self._w))
677 def winfo_id(self):
678 """Return identifier ID for this widget."""
679 return self.tk.getint(
680 self.tk.call('winfo', 'id', self._w))
681 def winfo_interps(self, displayof=0):
682 """Return the name of all Tcl interpreters for this display."""
683 args = ('winfo', 'interps') + self._displayof(displayof)
684 return self.tk.splitlist(self.tk.call(args))
685 def winfo_ismapped(self):
686 """Return true if this widget is mapped."""
687 return getint(
688 self.tk.call('winfo', 'ismapped', self._w))
689 def winfo_manager(self):
690 """Return the window mananger name for this widget."""
691 return self.tk.call('winfo', 'manager', self._w)
692 def winfo_name(self):
693 """Return the name of this widget."""
694 return self.tk.call('winfo', 'name', self._w)
695 def winfo_parent(self):
696 """Return the name of the parent of this widget."""
697 return self.tk.call('winfo', 'parent', self._w)
698 def winfo_pathname(self, id, displayof=0):
699 """Return the pathname of the widget given by ID."""
700 args = ('winfo', 'pathname') \
701 + self._displayof(displayof) + (id,)
702 return self.tk.call(args)
703 def winfo_pixels(self, number):
704 """Rounded integer value of winfo_fpixels."""
705 return getint(
706 self.tk.call('winfo', 'pixels', self._w, number))
707 def winfo_pointerx(self):
708 """Return the x coordinate of the pointer on the root window."""
709 return getint(
710 self.tk.call('winfo', 'pointerx', self._w))
711 def winfo_pointerxy(self):
712 """Return a tuple of x and y coordinates of the pointer on the root window."""
713 return self._getints(
714 self.tk.call('winfo', 'pointerxy', self._w))
715 def winfo_pointery(self):
716 """Return the y coordinate of the pointer on the root window."""
717 return getint(
718 self.tk.call('winfo', 'pointery', self._w))
719 def winfo_reqheight(self):
720 """Return requested height of this widget."""
721 return getint(
722 self.tk.call('winfo', 'reqheight', self._w))
723 def winfo_reqwidth(self):
724 """Return requested width of this widget."""
725 return getint(
726 self.tk.call('winfo', 'reqwidth', self._w))
727 def winfo_rgb(self, color):
728 """Return tuple of decimal values for red, green, blue for
729 COLOR in this widget."""
730 return self._getints(
731 self.tk.call('winfo', 'rgb', self._w, color))
732 def winfo_rootx(self):
733 """Return x coordinate of upper left corner of this widget on the
734 root window."""
735 return getint(
736 self.tk.call('winfo', 'rootx', self._w))
737 def winfo_rooty(self):
738 """Return y coordinate of upper left corner of this widget on the
739 root window."""
740 return getint(
741 self.tk.call('winfo', 'rooty', self._w))
742 def winfo_screen(self):
743 """Return the screen name of this widget."""
744 return self.tk.call('winfo', 'screen', self._w)
745 def winfo_screencells(self):
746 """Return the number of the cells in the colormap of the screen
747 of this widget."""
748 return getint(
749 self.tk.call('winfo', 'screencells', self._w))
750 def winfo_screendepth(self):
751 """Return the number of bits per pixel of the root window of the
752 screen of this widget."""
753 return getint(
754 self.tk.call('winfo', 'screendepth', self._w))
755 def winfo_screenheight(self):
756 """Return the number of pixels of the height of the screen of this widget
757 in pixel."""
758 return getint(
759 self.tk.call('winfo', 'screenheight', self._w))
760 def winfo_screenmmheight(self):
761 """Return the number of pixels of the height of the screen of
762 this widget in mm."""
763 return getint(
764 self.tk.call('winfo', 'screenmmheight', self._w))
765 def winfo_screenmmwidth(self):
766 """Return the number of pixels of the width of the screen of
767 this widget in mm."""
768 return getint(
769 self.tk.call('winfo', 'screenmmwidth', self._w))
770 def winfo_screenvisual(self):
771 """Return one of the strings directcolor, grayscale, pseudocolor,
772 staticcolor, staticgray, or truecolor for the default
773 colormodel of this screen."""
774 return self.tk.call('winfo', 'screenvisual', self._w)
775 def winfo_screenwidth(self):
776 """Return the number of pixels of the width of the screen of
777 this widget in pixel."""
778 return getint(
779 self.tk.call('winfo', 'screenwidth', self._w))
780 def winfo_server(self):
781 """Return information of the X-Server of the screen of this widget in
782 the form "XmajorRminor vendor vendorVersion"."""
783 return self.tk.call('winfo', 'server', self._w)
784 def winfo_toplevel(self):
785 """Return the toplevel widget of this widget."""
786 return self._nametowidget(self.tk.call(
787 'winfo', 'toplevel', self._w))
788 def winfo_viewable(self):
789 """Return true if the widget and all its higher ancestors are mapped."""
790 return getint(
791 self.tk.call('winfo', 'viewable', self._w))
792 def winfo_visual(self):
793 """Return one of the strings directcolor, grayscale, pseudocolor,
794 staticcolor, staticgray, or truecolor for the
795 colormodel of this widget."""
796 return self.tk.call('winfo', 'visual', self._w)
797 def winfo_visualid(self):
798 """Return the X identifier for the visual for this widget."""
799 return self.tk.call('winfo', 'visualid', self._w)
800 def winfo_visualsavailable(self, includeids=0):
801 """Return a list of all visuals available for the screen
802 of this widget.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000803
Fredrik Lundh06d28152000-08-09 18:03:12 +0000804 Each item in the list consists of a visual name (see winfo_visual), a
805 depth and if INCLUDEIDS=1 is given also the X identifier."""
806 data = self.tk.split(
807 self.tk.call('winfo', 'visualsavailable', self._w,
808 includeids and 'includeids' or None))
Fredrik Lundh24037f72000-08-09 19:26:47 +0000809 if type(data) is StringType:
810 data = [self.tk.split(data)]
Fredrik Lundh06d28152000-08-09 18:03:12 +0000811 return map(self.__winfo_parseitem, data)
812 def __winfo_parseitem(self, t):
813 """Internal function."""
814 return t[:1] + tuple(map(self.__winfo_getint, t[1:]))
815 def __winfo_getint(self, x):
816 """Internal function."""
Eric S. Raymondfc170b12001-02-09 11:51:27 +0000817 return int(x, 0)
Fredrik Lundh06d28152000-08-09 18:03:12 +0000818 def winfo_vrootheight(self):
819 """Return the height of the virtual root window associated with this
820 widget in pixels. If there is no virtual root window return the
821 height of the screen."""
822 return getint(
823 self.tk.call('winfo', 'vrootheight', self._w))
824 def winfo_vrootwidth(self):
825 """Return the width of the virtual root window associated with this
826 widget in pixel. If there is no virtual root window return the
827 width of the screen."""
828 return getint(
829 self.tk.call('winfo', 'vrootwidth', self._w))
830 def winfo_vrootx(self):
831 """Return the x offset of the virtual root relative to the root
832 window of the screen of this widget."""
833 return getint(
834 self.tk.call('winfo', 'vrootx', self._w))
835 def winfo_vrooty(self):
836 """Return the y offset of the virtual root relative to the root
837 window of the screen of this widget."""
838 return getint(
839 self.tk.call('winfo', 'vrooty', self._w))
840 def winfo_width(self):
841 """Return the width of this widget."""
842 return getint(
843 self.tk.call('winfo', 'width', self._w))
844 def winfo_x(self):
845 """Return the x coordinate of the upper left corner of this widget
846 in the parent."""
847 return getint(
848 self.tk.call('winfo', 'x', self._w))
849 def winfo_y(self):
850 """Return the y coordinate of the upper left corner of this widget
851 in the parent."""
852 return getint(
853 self.tk.call('winfo', 'y', self._w))
854 def update(self):
855 """Enter event loop until all pending events have been processed by Tcl."""
856 self.tk.call('update')
857 def update_idletasks(self):
858 """Enter event loop until all idle callbacks have been called. This
859 will update the display of windows but not process events caused by
860 the user."""
861 self.tk.call('update', 'idletasks')
862 def bindtags(self, tagList=None):
863 """Set or get the list of bindtags for this widget.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000864
Fredrik Lundh06d28152000-08-09 18:03:12 +0000865 With no argument return the list of all bindtags associated with
866 this widget. With a list of strings as argument the bindtags are
867 set to this list. The bindtags determine in which order events are
868 processed (see bind)."""
869 if tagList is None:
870 return self.tk.splitlist(
871 self.tk.call('bindtags', self._w))
872 else:
873 self.tk.call('bindtags', self._w, tagList)
874 def _bind(self, what, sequence, func, add, needcleanup=1):
875 """Internal function."""
876 if type(func) is StringType:
877 self.tk.call(what + (sequence, func))
878 elif func:
879 funcid = self._register(func, self._substitute,
880 needcleanup)
881 cmd = ('%sif {"[%s %s]" == "break"} break\n'
882 %
883 (add and '+' or '',
Martin v. Löwisc8718c12001-08-09 16:57:33 +0000884 funcid, self._subst_format_str))
Fredrik Lundh06d28152000-08-09 18:03:12 +0000885 self.tk.call(what + (sequence, cmd))
886 return funcid
887 elif sequence:
888 return self.tk.call(what + (sequence,))
889 else:
890 return self.tk.splitlist(self.tk.call(what))
891 def bind(self, sequence=None, func=None, add=None):
892 """Bind to this widget at event SEQUENCE a call to function FUNC.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000893
Fredrik Lundh06d28152000-08-09 18:03:12 +0000894 SEQUENCE is a string of concatenated event
895 patterns. An event pattern is of the form
896 <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one
897 of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,
898 Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,
899 B3, Alt, Button4, B4, Double, Button5, B5 Triple,
900 Mod1, M1. TYPE is one of Activate, Enter, Map,
901 ButtonPress, Button, Expose, Motion, ButtonRelease
902 FocusIn, MouseWheel, Circulate, FocusOut, Property,
903 Colormap, Gravity Reparent, Configure, KeyPress, Key,
904 Unmap, Deactivate, KeyRelease Visibility, Destroy,
905 Leave and DETAIL is the button number for ButtonPress,
906 ButtonRelease and DETAIL is the Keysym for KeyPress and
907 KeyRelease. Examples are
908 <Control-Button-1> for pressing Control and mouse button 1 or
909 <Alt-A> for pressing A and the Alt key (KeyPress can be omitted).
910 An event pattern can also be a virtual event of the form
911 <<AString>> where AString can be arbitrary. This
912 event can be generated by event_generate.
913 If events are concatenated they must appear shortly
914 after each other.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000915
Fredrik Lundh06d28152000-08-09 18:03:12 +0000916 FUNC will be called if the event sequence occurs with an
917 instance of Event as argument. If the return value of FUNC is
918 "break" no further bound function is invoked.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000919
Fredrik Lundh06d28152000-08-09 18:03:12 +0000920 An additional boolean parameter ADD specifies whether FUNC will
921 be called additionally to the other bound function or whether
922 it will replace the previous function.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000923
Fredrik Lundh06d28152000-08-09 18:03:12 +0000924 Bind will return an identifier to allow deletion of the bound function with
925 unbind without memory leak.
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000926
Fredrik Lundh06d28152000-08-09 18:03:12 +0000927 If FUNC or SEQUENCE is omitted the bound function or list
928 of bound events are returned."""
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000929
Fredrik Lundh06d28152000-08-09 18:03:12 +0000930 return self._bind(('bind', self._w), sequence, func, add)
931 def unbind(self, sequence, funcid=None):
932 """Unbind for this widget for event SEQUENCE the
933 function identified with FUNCID."""
934 self.tk.call('bind', self._w, sequence, '')
935 if funcid:
936 self.deletecommand(funcid)
937 def bind_all(self, sequence=None, func=None, add=None):
938 """Bind to all widgets at an event SEQUENCE a call to function FUNC.
939 An additional boolean parameter ADD specifies whether FUNC will
940 be called additionally to the other bound function or whether
941 it will replace the previous function. See bind for the return value."""
942 return self._bind(('bind', 'all'), sequence, func, add, 0)
943 def unbind_all(self, sequence):
944 """Unbind for all widgets for event SEQUENCE all functions."""
945 self.tk.call('bind', 'all' , sequence, '')
946 def bind_class(self, className, sequence=None, func=None, add=None):
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000947
Fredrik Lundh06d28152000-08-09 18:03:12 +0000948 """Bind to widgets with bindtag CLASSNAME at event
949 SEQUENCE a call of function FUNC. An additional
950 boolean parameter ADD specifies whether FUNC will be
951 called additionally to the other bound function or
952 whether it will replace the previous function. See bind for
953 the return value."""
Guido van Rossum5917ecb2000-06-29 16:30:50 +0000954
Fredrik Lundh06d28152000-08-09 18:03:12 +0000955 return self._bind(('bind', className), sequence, func, add, 0)
956 def unbind_class(self, className, sequence):
957 """Unbind for a all widgets with bindtag CLASSNAME for event SEQUENCE
958 all functions."""
959 self.tk.call('bind', className , sequence, '')
960 def mainloop(self, n=0):
961 """Call the mainloop of Tk."""
962 self.tk.mainloop(n)
963 def quit(self):
964 """Quit the Tcl interpreter. All widgets will be destroyed."""
965 self.tk.quit()
966 def _getints(self, string):
967 """Internal function."""
968 if string:
969 return tuple(map(getint, self.tk.splitlist(string)))
970 def _getdoubles(self, string):
971 """Internal function."""
972 if string:
973 return tuple(map(getdouble, self.tk.splitlist(string)))
974 def _getboolean(self, string):
975 """Internal function."""
976 if string:
977 return self.tk.getboolean(string)
978 def _displayof(self, displayof):
979 """Internal function."""
980 if displayof:
981 return ('-displayof', displayof)
982 if displayof is None:
983 return ('-displayof', self._w)
984 return ()
985 def _options(self, cnf, kw = None):
986 """Internal function."""
987 if kw:
988 cnf = _cnfmerge((cnf, kw))
989 else:
990 cnf = _cnfmerge(cnf)
991 res = ()
992 for k, v in cnf.items():
993 if v is not None:
994 if k[-1] == '_': k = k[:-1]
995 if callable(v):
996 v = self._register(v)
997 res = res + ('-'+k, v)
998 return res
999 def nametowidget(self, name):
1000 """Return the Tkinter instance of a widget identified by
1001 its Tcl name NAME."""
1002 w = self
1003 if name[0] == '.':
1004 w = w._root()
1005 name = name[1:]
Fredrik Lundh06d28152000-08-09 18:03:12 +00001006 while name:
Eric S. Raymondfc170b12001-02-09 11:51:27 +00001007 i = name.find('.')
Fredrik Lundh06d28152000-08-09 18:03:12 +00001008 if i >= 0:
1009 name, tail = name[:i], name[i+1:]
1010 else:
1011 tail = ''
1012 w = w.children[name]
1013 name = tail
1014 return w
1015 _nametowidget = nametowidget
1016 def _register(self, func, subst=None, needcleanup=1):
1017 """Return a newly created Tcl function. If this
1018 function is called, the Python function FUNC will
1019 be executed. An optional function SUBST can
1020 be given which will be executed before FUNC."""
1021 f = CallWrapper(func, subst, self).__call__
Walter Dörwald70a6b492004-02-12 17:35:32 +00001022 name = repr(id(f))
Fredrik Lundh06d28152000-08-09 18:03:12 +00001023 try:
1024 func = func.im_func
1025 except AttributeError:
1026 pass
1027 try:
1028 name = name + func.__name__
1029 except AttributeError:
1030 pass
1031 self.tk.createcommand(name, f)
1032 if needcleanup:
1033 if self._tclCommands is None:
1034 self._tclCommands = []
1035 self._tclCommands.append(name)
1036 #print '+ Tkinter created command', name
1037 return name
1038 register = _register
1039 def _root(self):
1040 """Internal function."""
1041 w = self
1042 while w.master: w = w.master
1043 return w
1044 _subst_format = ('%#', '%b', '%f', '%h', '%k',
1045 '%s', '%t', '%w', '%x', '%y',
1046 '%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y', '%D')
Martin v. Löwisc8718c12001-08-09 16:57:33 +00001047 _subst_format_str = " ".join(_subst_format)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001048 def _substitute(self, *args):
1049 """Internal function."""
1050 if len(args) != len(self._subst_format): return args
1051 getboolean = self.tk.getboolean
Martin v. Löwis043bbc72003-03-29 09:47:21 +00001052
Fredrik Lundh06d28152000-08-09 18:03:12 +00001053 getint = int
Martin v. Löwis043bbc72003-03-29 09:47:21 +00001054 def getint_event(s):
1055 """Tk changed behavior in 8.4.2, returning "??" rather more often."""
1056 try:
1057 return int(s)
1058 except ValueError:
1059 return s
1060
Fredrik Lundh06d28152000-08-09 18:03:12 +00001061 nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y, D = args
1062 # Missing: (a, c, d, m, o, v, B, R)
1063 e = Event()
Martin v. Löwis043bbc72003-03-29 09:47:21 +00001064 # serial field: valid vor all events
1065 # number of button: ButtonPress and ButtonRelease events only
1066 # height field: Configure, ConfigureRequest, Create,
1067 # ResizeRequest, and Expose events only
1068 # keycode field: KeyPress and KeyRelease events only
1069 # time field: "valid for events that contain a time field"
1070 # width field: Configure, ConfigureRequest, Create, ResizeRequest,
1071 # and Expose events only
1072 # x field: "valid for events that contain a x field"
1073 # y field: "valid for events that contain a y field"
1074 # keysym as decimal: KeyPress and KeyRelease events only
1075 # x_root, y_root fields: ButtonPress, ButtonRelease, KeyPress,
1076 # KeyRelease,and Motion events
Fredrik Lundh06d28152000-08-09 18:03:12 +00001077 e.serial = getint(nsign)
Martin v. Löwis043bbc72003-03-29 09:47:21 +00001078 e.num = getint_event(b)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001079 try: e.focus = getboolean(f)
1080 except TclError: pass
Martin v. Löwis043bbc72003-03-29 09:47:21 +00001081 e.height = getint_event(h)
1082 e.keycode = getint_event(k)
1083 e.state = getint_event(s)
1084 e.time = getint_event(t)
1085 e.width = getint_event(w)
1086 e.x = getint_event(x)
1087 e.y = getint_event(y)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001088 e.char = A
1089 try: e.send_event = getboolean(E)
1090 except TclError: pass
1091 e.keysym = K
Martin v. Löwis043bbc72003-03-29 09:47:21 +00001092 e.keysym_num = getint_event(N)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001093 e.type = T
1094 try:
1095 e.widget = self._nametowidget(W)
1096 except KeyError:
1097 e.widget = W
Martin v. Löwis043bbc72003-03-29 09:47:21 +00001098 e.x_root = getint_event(X)
1099 e.y_root = getint_event(Y)
Fredrik Lundha249f162000-09-07 15:05:09 +00001100 try:
1101 e.delta = getint(D)
1102 except ValueError:
1103 e.delta = 0
Fredrik Lundh06d28152000-08-09 18:03:12 +00001104 return (e,)
1105 def _report_exception(self):
1106 """Internal function."""
1107 import sys
1108 exc, val, tb = sys.exc_type, sys.exc_value, sys.exc_traceback
1109 root = self._root()
1110 root.report_callback_exception(exc, val, tb)
Martin v. Löwis6ce13152002-10-10 14:36:13 +00001111 def _configure(self, cmd, cnf, kw):
1112 """Internal function."""
1113 if kw:
1114 cnf = _cnfmerge((cnf, kw))
1115 elif cnf:
1116 cnf = _cnfmerge(cnf)
1117 if cnf is None:
1118 cnf = {}
1119 for x in self.tk.split(
1120 self.tk.call(_flatten((self._w, cmd)))):
1121 cnf[x[0][1:]] = (x[0][1:],) + x[1:]
1122 return cnf
1123 if type(cnf) is StringType:
1124 x = self.tk.split(
1125 self.tk.call(_flatten((self._w, cmd, '-'+cnf))))
1126 return (x[0][1:],) + x[1:]
1127 self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
Fredrik Lundh06d28152000-08-09 18:03:12 +00001128 # These used to be defined in Widget:
1129 def configure(self, cnf=None, **kw):
1130 """Configure resources of a widget.
Barry Warsaw107e6231998-12-15 00:44:15 +00001131
Fredrik Lundh06d28152000-08-09 18:03:12 +00001132 The values for resources are specified as keyword
1133 arguments. To get an overview about
1134 the allowed keyword arguments call the method keys.
1135 """
Martin v. Löwis6ce13152002-10-10 14:36:13 +00001136 return self._configure('configure', cnf, kw)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001137 config = configure
1138 def cget(self, key):
1139 """Return the resource value for a KEY given as string."""
1140 return self.tk.call(self._w, 'cget', '-' + key)
1141 __getitem__ = cget
1142 def __setitem__(self, key, value):
1143 self.configure({key: value})
1144 def keys(self):
1145 """Return a list of all resource names of this widget."""
1146 return map(lambda x: x[0][1:],
1147 self.tk.split(self.tk.call(self._w, 'configure')))
1148 def __str__(self):
1149 """Return the window path name of this widget."""
1150 return self._w
1151 # Pack methods that apply to the master
1152 _noarg_ = ['_noarg_']
1153 def pack_propagate(self, flag=_noarg_):
1154 """Set or get the status for propagation of geometry information.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001155
Fredrik Lundh06d28152000-08-09 18:03:12 +00001156 A boolean argument specifies whether the geometry information
1157 of the slaves will determine the size of this widget. If no argument
1158 is given the current setting will be returned.
1159 """
1160 if flag is Misc._noarg_:
1161 return self._getboolean(self.tk.call(
1162 'pack', 'propagate', self._w))
1163 else:
1164 self.tk.call('pack', 'propagate', self._w, flag)
1165 propagate = pack_propagate
1166 def pack_slaves(self):
1167 """Return a list of all slaves of this widget
1168 in its packing order."""
1169 return map(self._nametowidget,
1170 self.tk.splitlist(
1171 self.tk.call('pack', 'slaves', self._w)))
1172 slaves = pack_slaves
1173 # Place method that applies to the master
1174 def place_slaves(self):
1175 """Return a list of all slaves of this widget
1176 in its packing order."""
1177 return map(self._nametowidget,
1178 self.tk.splitlist(
1179 self.tk.call(
1180 'place', 'slaves', self._w)))
1181 # Grid methods that apply to the master
1182 def grid_bbox(self, column=None, row=None, col2=None, row2=None):
1183 """Return a tuple of integer coordinates for the bounding
1184 box of this widget controlled by the geometry manager grid.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001185
Fredrik Lundh06d28152000-08-09 18:03:12 +00001186 If COLUMN, ROW is given the bounding box applies from
1187 the cell with row and column 0 to the specified
1188 cell. If COL2 and ROW2 are given the bounding box
1189 starts at that cell.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001190
Fredrik Lundh06d28152000-08-09 18:03:12 +00001191 The returned integers specify the offset of the upper left
1192 corner in the master widget and the width and height.
1193 """
1194 args = ('grid', 'bbox', self._w)
1195 if column is not None and row is not None:
1196 args = args + (column, row)
1197 if col2 is not None and row2 is not None:
1198 args = args + (col2, row2)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001199 return self._getints(self.tk.call(*args)) or None
Guido van Rossum18468821994-06-20 07:49:28 +00001200
Fredrik Lundh06d28152000-08-09 18:03:12 +00001201 bbox = grid_bbox
1202 def _grid_configure(self, command, index, cnf, kw):
1203 """Internal function."""
1204 if type(cnf) is StringType and not kw:
1205 if cnf[-1:] == '_':
1206 cnf = cnf[:-1]
1207 if cnf[:1] != '-':
1208 cnf = '-'+cnf
1209 options = (cnf,)
1210 else:
1211 options = self._options(cnf, kw)
1212 if not options:
1213 res = self.tk.call('grid',
1214 command, self._w, index)
1215 words = self.tk.splitlist(res)
1216 dict = {}
1217 for i in range(0, len(words), 2):
1218 key = words[i][1:]
1219 value = words[i+1]
1220 if not value:
1221 value = None
1222 elif '.' in value:
1223 value = getdouble(value)
1224 else:
1225 value = getint(value)
1226 dict[key] = value
1227 return dict
1228 res = self.tk.call(
1229 ('grid', command, self._w, index)
1230 + options)
1231 if len(options) == 1:
1232 if not res: return None
1233 # In Tk 7.5, -width can be a float
1234 if '.' in res: return getdouble(res)
1235 return getint(res)
1236 def grid_columnconfigure(self, index, cnf={}, **kw):
1237 """Configure column INDEX of a grid.
Guido van Rossum80f8be81997-12-02 19:51:39 +00001238
Fredrik Lundh06d28152000-08-09 18:03:12 +00001239 Valid resources are minsize (minimum size of the column),
1240 weight (how much does additional space propagate to this column)
1241 and pad (how much space to let additionally)."""
1242 return self._grid_configure('columnconfigure', index, cnf, kw)
1243 columnconfigure = grid_columnconfigure
Martin v. Löwisdc579092001-10-13 09:33:51 +00001244 def grid_location(self, x, y):
1245 """Return a tuple of column and row which identify the cell
1246 at which the pixel at position X and Y inside the master
1247 widget is located."""
1248 return self._getints(
1249 self.tk.call(
1250 'grid', 'location', self._w, x, y)) or None
Fredrik Lundh06d28152000-08-09 18:03:12 +00001251 def grid_propagate(self, flag=_noarg_):
1252 """Set or get the status for propagation of geometry information.
Guido van Rossum80f8be81997-12-02 19:51:39 +00001253
Fredrik Lundh06d28152000-08-09 18:03:12 +00001254 A boolean argument specifies whether the geometry information
1255 of the slaves will determine the size of this widget. If no argument
1256 is given, the current setting will be returned.
1257 """
1258 if flag is Misc._noarg_:
1259 return self._getboolean(self.tk.call(
1260 'grid', 'propagate', self._w))
1261 else:
1262 self.tk.call('grid', 'propagate', self._w, flag)
1263 def grid_rowconfigure(self, index, cnf={}, **kw):
1264 """Configure row INDEX of a grid.
Guido van Rossum80f8be81997-12-02 19:51:39 +00001265
Fredrik Lundh06d28152000-08-09 18:03:12 +00001266 Valid resources are minsize (minimum size of the row),
1267 weight (how much does additional space propagate to this row)
1268 and pad (how much space to let additionally)."""
1269 return self._grid_configure('rowconfigure', index, cnf, kw)
1270 rowconfigure = grid_rowconfigure
1271 def grid_size(self):
1272 """Return a tuple of the number of column and rows in the grid."""
1273 return self._getints(
1274 self.tk.call('grid', 'size', self._w)) or None
1275 size = grid_size
1276 def grid_slaves(self, row=None, column=None):
1277 """Return a list of all slaves of this widget
1278 in its packing order."""
1279 args = ()
1280 if row is not None:
1281 args = args + ('-row', row)
1282 if column is not None:
1283 args = args + ('-column', column)
1284 return map(self._nametowidget,
1285 self.tk.splitlist(self.tk.call(
1286 ('grid', 'slaves', self._w) + args)))
Guido van Rossum80f8be81997-12-02 19:51:39 +00001287
Fredrik Lundh06d28152000-08-09 18:03:12 +00001288 # Support for the "event" command, new in Tk 4.2.
1289 # By Case Roole.
Guido van Rossum80f8be81997-12-02 19:51:39 +00001290
Fredrik Lundh06d28152000-08-09 18:03:12 +00001291 def event_add(self, virtual, *sequences):
1292 """Bind a virtual event VIRTUAL (of the form <<Name>>)
1293 to an event SEQUENCE such that the virtual event is triggered
1294 whenever SEQUENCE occurs."""
1295 args = ('event', 'add', virtual) + sequences
1296 self.tk.call(args)
Guido van Rossumc2966511998-04-10 19:16:10 +00001297
Fredrik Lundh06d28152000-08-09 18:03:12 +00001298 def event_delete(self, virtual, *sequences):
1299 """Unbind a virtual event VIRTUAL from SEQUENCE."""
1300 args = ('event', 'delete', virtual) + sequences
1301 self.tk.call(args)
Guido van Rossumc2966511998-04-10 19:16:10 +00001302
Fredrik Lundh06d28152000-08-09 18:03:12 +00001303 def event_generate(self, sequence, **kw):
1304 """Generate an event SEQUENCE. Additional
1305 keyword arguments specify parameter of the event
1306 (e.g. x, y, rootx, rooty)."""
1307 args = ('event', 'generate', self._w, sequence)
1308 for k, v in kw.items():
1309 args = args + ('-%s' % k, str(v))
1310 self.tk.call(args)
1311
1312 def event_info(self, virtual=None):
1313 """Return a list of all virtual events or the information
1314 about the SEQUENCE bound to the virtual event VIRTUAL."""
1315 return self.tk.splitlist(
1316 self.tk.call('event', 'info', virtual))
1317
1318 # Image related commands
1319
1320 def image_names(self):
1321 """Return a list of all existing image names."""
1322 return self.tk.call('image', 'names')
1323
1324 def image_types(self):
1325 """Return a list of all available image types (e.g. phote bitmap)."""
1326 return self.tk.call('image', 'types')
Guido van Rossumc2966511998-04-10 19:16:10 +00001327
Guido van Rossum80f8be81997-12-02 19:51:39 +00001328
Guido van Rossuma5773dd1995-09-07 19:22:00 +00001329class CallWrapper:
Fredrik Lundh06d28152000-08-09 18:03:12 +00001330 """Internal class. Stores function to call when some user
1331 defined Tcl function is called e.g. after an event occurred."""
1332 def __init__(self, func, subst, widget):
1333 """Store FUNC, SUBST and WIDGET as members."""
1334 self.func = func
1335 self.subst = subst
1336 self.widget = widget
1337 def __call__(self, *args):
1338 """Apply first function SUBST to arguments, than FUNC."""
1339 try:
1340 if self.subst:
Raymond Hettingerff41c482003-04-06 09:01:11 +00001341 args = self.subst(*args)
1342 return self.func(*args)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001343 except SystemExit, msg:
1344 raise SystemExit, msg
1345 except:
1346 self.widget._report_exception()
Guido van Rossum18468821994-06-20 07:49:28 +00001347
Guido van Rossume365a591998-05-01 19:48:20 +00001348
Guido van Rossum18468821994-06-20 07:49:28 +00001349class Wm:
Fredrik Lundh06d28152000-08-09 18:03:12 +00001350 """Provides functions for the communication with the window manager."""
Raymond Hettingerff41c482003-04-06 09:01:11 +00001351
Fredrik Lundh06d28152000-08-09 18:03:12 +00001352 def wm_aspect(self,
1353 minNumer=None, minDenom=None,
1354 maxNumer=None, maxDenom=None):
1355 """Instruct the window manager to set the aspect ratio (width/height)
1356 of this widget to be between MINNUMER/MINDENOM and MAXNUMER/MAXDENOM. Return a tuple
1357 of the actual values if no argument is given."""
1358 return self._getints(
1359 self.tk.call('wm', 'aspect', self._w,
1360 minNumer, minDenom,
1361 maxNumer, maxDenom))
1362 aspect = wm_aspect
Raymond Hettingerff41c482003-04-06 09:01:11 +00001363
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001364 def wm_attributes(self, *args):
1365 """This subcommand returns or sets platform specific attributes
Raymond Hettingerff41c482003-04-06 09:01:11 +00001366
1367 The first form returns a list of the platform specific flags and
1368 their values. The second form returns the value for the specific
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001369 option. The third form sets one or more of the values. The values
1370 are as follows:
Raymond Hettingerff41c482003-04-06 09:01:11 +00001371
1372 On Windows, -disabled gets or sets whether the window is in a
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001373 disabled state. -toolwindow gets or sets the style of the window
Raymond Hettingerff41c482003-04-06 09:01:11 +00001374 to toolwindow (as defined in the MSDN). -topmost gets or sets
1375 whether this is a topmost window (displays above all other
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001376 windows).
Raymond Hettingerff41c482003-04-06 09:01:11 +00001377
1378 On Macintosh, XXXXX
1379
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001380 On Unix, there are currently no special attribute values.
1381 """
1382 args = ('wm', 'attributes', self._w) + args
1383 return self.tk.call(args)
1384 attributes=wm_attributes
Raymond Hettingerff41c482003-04-06 09:01:11 +00001385
Fredrik Lundh06d28152000-08-09 18:03:12 +00001386 def wm_client(self, name=None):
1387 """Store NAME in WM_CLIENT_MACHINE property of this widget. Return
1388 current value."""
1389 return self.tk.call('wm', 'client', self._w, name)
1390 client = wm_client
1391 def wm_colormapwindows(self, *wlist):
1392 """Store list of window names (WLIST) into WM_COLORMAPWINDOWS property
1393 of this widget. This list contains windows whose colormaps differ from their
1394 parents. Return current list of widgets if WLIST is empty."""
1395 if len(wlist) > 1:
1396 wlist = (wlist,) # Tk needs a list of windows here
1397 args = ('wm', 'colormapwindows', self._w) + wlist
1398 return map(self._nametowidget, self.tk.call(args))
1399 colormapwindows = wm_colormapwindows
1400 def wm_command(self, value=None):
1401 """Store VALUE in WM_COMMAND property. It is the command
1402 which shall be used to invoke the application. Return current
1403 command if VALUE is None."""
1404 return self.tk.call('wm', 'command', self._w, value)
1405 command = wm_command
1406 def wm_deiconify(self):
1407 """Deiconify this widget. If it was never mapped it will not be mapped.
1408 On Windows it will raise this widget and give it the focus."""
1409 return self.tk.call('wm', 'deiconify', self._w)
1410 deiconify = wm_deiconify
1411 def wm_focusmodel(self, model=None):
1412 """Set focus model to MODEL. "active" means that this widget will claim
1413 the focus itself, "passive" means that the window manager shall give
1414 the focus. Return current focus model if MODEL is None."""
1415 return self.tk.call('wm', 'focusmodel', self._w, model)
1416 focusmodel = wm_focusmodel
1417 def wm_frame(self):
1418 """Return identifier for decorative frame of this widget if present."""
1419 return self.tk.call('wm', 'frame', self._w)
1420 frame = wm_frame
1421 def wm_geometry(self, newGeometry=None):
1422 """Set geometry to NEWGEOMETRY of the form =widthxheight+x+y. Return
1423 current value if None is given."""
1424 return self.tk.call('wm', 'geometry', self._w, newGeometry)
1425 geometry = wm_geometry
1426 def wm_grid(self,
1427 baseWidth=None, baseHeight=None,
1428 widthInc=None, heightInc=None):
1429 """Instruct the window manager that this widget shall only be
1430 resized on grid boundaries. WIDTHINC and HEIGHTINC are the width and
1431 height of a grid unit in pixels. BASEWIDTH and BASEHEIGHT are the
1432 number of grid units requested in Tk_GeometryRequest."""
1433 return self._getints(self.tk.call(
1434 'wm', 'grid', self._w,
1435 baseWidth, baseHeight, widthInc, heightInc))
1436 grid = wm_grid
1437 def wm_group(self, pathName=None):
1438 """Set the group leader widgets for related widgets to PATHNAME. Return
1439 the group leader of this widget if None is given."""
1440 return self.tk.call('wm', 'group', self._w, pathName)
1441 group = wm_group
1442 def wm_iconbitmap(self, bitmap=None):
1443 """Set bitmap for the iconified widget to BITMAP. Return
1444 the bitmap if None is given."""
1445 return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
1446 iconbitmap = wm_iconbitmap
1447 def wm_iconify(self):
1448 """Display widget as icon."""
1449 return self.tk.call('wm', 'iconify', self._w)
1450 iconify = wm_iconify
1451 def wm_iconmask(self, bitmap=None):
1452 """Set mask for the icon bitmap of this widget. Return the
1453 mask if None is given."""
1454 return self.tk.call('wm', 'iconmask', self._w, bitmap)
1455 iconmask = wm_iconmask
1456 def wm_iconname(self, newName=None):
1457 """Set the name of the icon for this widget. Return the name if
1458 None is given."""
1459 return self.tk.call('wm', 'iconname', self._w, newName)
1460 iconname = wm_iconname
1461 def wm_iconposition(self, x=None, y=None):
1462 """Set the position of the icon of this widget to X and Y. Return
1463 a tuple of the current values of X and X if None is given."""
1464 return self._getints(self.tk.call(
1465 'wm', 'iconposition', self._w, x, y))
1466 iconposition = wm_iconposition
1467 def wm_iconwindow(self, pathName=None):
1468 """Set widget PATHNAME to be displayed instead of icon. Return the current
1469 value if None is given."""
1470 return self.tk.call('wm', 'iconwindow', self._w, pathName)
1471 iconwindow = wm_iconwindow
1472 def wm_maxsize(self, width=None, height=None):
1473 """Set max WIDTH and HEIGHT for this widget. If the window is gridded
1474 the values are given in grid units. Return the current values if None
1475 is given."""
1476 return self._getints(self.tk.call(
1477 'wm', 'maxsize', self._w, width, height))
1478 maxsize = wm_maxsize
1479 def wm_minsize(self, width=None, height=None):
1480 """Set min WIDTH and HEIGHT for this widget. If the window is gridded
1481 the values are given in grid units. Return the current values if None
1482 is given."""
1483 return self._getints(self.tk.call(
1484 'wm', 'minsize', self._w, width, height))
1485 minsize = wm_minsize
1486 def wm_overrideredirect(self, boolean=None):
1487 """Instruct the window manager to ignore this widget
1488 if BOOLEAN is given with 1. Return the current value if None
1489 is given."""
1490 return self._getboolean(self.tk.call(
1491 'wm', 'overrideredirect', self._w, boolean))
1492 overrideredirect = wm_overrideredirect
1493 def wm_positionfrom(self, who=None):
1494 """Instruct the window manager that the position of this widget shall
1495 be defined by the user if WHO is "user", and by its own policy if WHO is
1496 "program"."""
1497 return self.tk.call('wm', 'positionfrom', self._w, who)
1498 positionfrom = wm_positionfrom
1499 def wm_protocol(self, name=None, func=None):
1500 """Bind function FUNC to command NAME for this widget.
1501 Return the function bound to NAME if None is given. NAME could be
1502 e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW"."""
1503 if callable(func):
1504 command = self._register(func)
1505 else:
1506 command = func
1507 return self.tk.call(
1508 'wm', 'protocol', self._w, name, command)
1509 protocol = wm_protocol
1510 def wm_resizable(self, width=None, height=None):
1511 """Instruct the window manager whether this width can be resized
1512 in WIDTH or HEIGHT. Both values are boolean values."""
1513 return self.tk.call('wm', 'resizable', self._w, width, height)
1514 resizable = wm_resizable
1515 def wm_sizefrom(self, who=None):
1516 """Instruct the window manager that the size of this widget shall
1517 be defined by the user if WHO is "user", and by its own policy if WHO is
1518 "program"."""
1519 return self.tk.call('wm', 'sizefrom', self._w, who)
1520 sizefrom = wm_sizefrom
Fredrik Lundh289ad8f2000-08-09 19:11:59 +00001521 def wm_state(self, newstate=None):
1522 """Query or set the state of this widget as one of normal, icon,
1523 iconic (see wm_iconwindow), withdrawn, or zoomed (Windows only)."""
1524 return self.tk.call('wm', 'state', self._w, newstate)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001525 state = wm_state
1526 def wm_title(self, string=None):
1527 """Set the title of this widget."""
1528 return self.tk.call('wm', 'title', self._w, string)
1529 title = wm_title
1530 def wm_transient(self, master=None):
1531 """Instruct the window manager that this widget is transient
1532 with regard to widget MASTER."""
1533 return self.tk.call('wm', 'transient', self._w, master)
1534 transient = wm_transient
1535 def wm_withdraw(self):
1536 """Withdraw this widget from the screen such that it is unmapped
1537 and forgotten by the window manager. Re-draw it with wm_deiconify."""
1538 return self.tk.call('wm', 'withdraw', self._w)
1539 withdraw = wm_withdraw
Guido van Rossume365a591998-05-01 19:48:20 +00001540
Guido van Rossum18468821994-06-20 07:49:28 +00001541
1542class Tk(Misc, Wm):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001543 """Toplevel widget of Tk which represents mostly the main window
1544 of an appliation. It has an associated Tcl interpreter."""
1545 _w = '.'
Martin v. Löwis9441c072004-08-03 18:36:25 +00001546 def __init__(self, screenName=None, baseName=None, className='Tk',
1547 useTk=1, sync=0, use=None):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001548 """Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will
1549 be created. BASENAME will be used for the identification of the profile file (see
1550 readprofile).
1551 It is constructed from sys.argv[0] without extensions if None is given. CLASSNAME
1552 is the name of the widget class."""
Fredrik Lundh06d28152000-08-09 18:03:12 +00001553 self.master = None
1554 self.children = {}
David Aschere2b4b322004-02-18 05:59:53 +00001555 self._tkloaded = 0
1556 # to avoid recursions in the getattr code in case of failure, we
1557 # ensure that self.tk is always _something_.
Tim Peters182b5ac2004-07-18 06:16:08 +00001558 self.tk = None
Fredrik Lundh06d28152000-08-09 18:03:12 +00001559 if baseName is None:
1560 import sys, os
1561 baseName = os.path.basename(sys.argv[0])
1562 baseName, ext = os.path.splitext(baseName)
1563 if ext not in ('.py', '.pyc', '.pyo'):
1564 baseName = baseName + ext
David Aschere2b4b322004-02-18 05:59:53 +00001565 interactive = 0
Martin v. Löwis9441c072004-08-03 18:36:25 +00001566 self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
David Aschere2b4b322004-02-18 05:59:53 +00001567 if useTk:
1568 self._loadtk()
1569 self.readprofile(baseName, className)
1570 def loadtk(self):
1571 if not self._tkloaded:
1572 self.tk.loadtk()
1573 self._loadtk()
1574 def _loadtk(self):
1575 self._tkloaded = 1
1576 global _default_root
Jack Jansenbe92af02001-08-23 13:25:59 +00001577 if _MacOS and hasattr(_MacOS, 'SchedParams'):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001578 # Disable event scanning except for Command-Period
1579 _MacOS.SchedParams(1, 0)
1580 # Work around nasty MacTk bug
1581 # XXX Is this one still needed?
1582 self.update()
1583 # Version sanity checks
1584 tk_version = self.tk.getvar('tk_version')
1585 if tk_version != _tkinter.TK_VERSION:
1586 raise RuntimeError, \
1587 "tk.h version (%s) doesn't match libtk.a version (%s)" \
1588 % (_tkinter.TK_VERSION, tk_version)
Martin v. Löwis54895972003-05-24 11:37:15 +00001589 # Under unknown circumstances, tcl_version gets coerced to float
1590 tcl_version = str(self.tk.getvar('tcl_version'))
Fredrik Lundh06d28152000-08-09 18:03:12 +00001591 if tcl_version != _tkinter.TCL_VERSION:
1592 raise RuntimeError, \
1593 "tcl.h version (%s) doesn't match libtcl.a version (%s)" \
1594 % (_tkinter.TCL_VERSION, tcl_version)
1595 if TkVersion < 4.0:
1596 raise RuntimeError, \
1597 "Tk 4.0 or higher is required; found Tk %s" \
1598 % str(TkVersion)
Martin v. Löwis4afe1542005-03-01 08:09:28 +00001599 # Create and register the tkerror and exit commands
1600 # We need to inline parts of _register here, _ register
1601 # would register differently-named commands.
1602 if self._tclCommands is None:
1603 self._tclCommands = []
Fredrik Lundh06d28152000-08-09 18:03:12 +00001604 self.tk.createcommand('tkerror', _tkerror)
1605 self.tk.createcommand('exit', _exit)
Martin v. Löwis4afe1542005-03-01 08:09:28 +00001606 self._tclCommands.append('tkerror')
1607 self._tclCommands.append('exit')
Fredrik Lundh06d28152000-08-09 18:03:12 +00001608 if _support_default_root and not _default_root:
1609 _default_root = self
1610 self.protocol("WM_DELETE_WINDOW", self.destroy)
1611 def destroy(self):
1612 """Destroy this and all descendants widgets. This will
1613 end the application of this Tcl interpreter."""
1614 for c in self.children.values(): c.destroy()
1615 self.tk.call('destroy', self._w)
1616 Misc.destroy(self)
1617 global _default_root
1618 if _support_default_root and _default_root is self:
1619 _default_root = None
1620 def readprofile(self, baseName, className):
1621 """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into
1622 the Tcl Interpreter and calls execfile on BASENAME.py and CLASSNAME.py if
1623 such a file exists in the home directory."""
1624 import os
1625 if os.environ.has_key('HOME'): home = os.environ['HOME']
1626 else: home = os.curdir
1627 class_tcl = os.path.join(home, '.%s.tcl' % className)
1628 class_py = os.path.join(home, '.%s.py' % className)
1629 base_tcl = os.path.join(home, '.%s.tcl' % baseName)
1630 base_py = os.path.join(home, '.%s.py' % baseName)
1631 dir = {'self': self}
1632 exec 'from Tkinter import *' in dir
1633 if os.path.isfile(class_tcl):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001634 self.tk.call('source', class_tcl)
1635 if os.path.isfile(class_py):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001636 execfile(class_py, dir)
1637 if os.path.isfile(base_tcl):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001638 self.tk.call('source', base_tcl)
1639 if os.path.isfile(base_py):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001640 execfile(base_py, dir)
1641 def report_callback_exception(self, exc, val, tb):
1642 """Internal function. It reports exception on sys.stderr."""
1643 import traceback, sys
1644 sys.stderr.write("Exception in Tkinter callback\n")
1645 sys.last_type = exc
1646 sys.last_value = val
1647 sys.last_traceback = tb
1648 traceback.print_exception(exc, val, tb)
David Aschere2b4b322004-02-18 05:59:53 +00001649 def __getattr__(self, attr):
1650 "Delegate attribute access to the interpreter object"
1651 return getattr(self.tk, attr)
Guido van Rossum18468821994-06-20 07:49:28 +00001652
Guido van Rossum368e06b1997-11-07 20:38:49 +00001653# Ideally, the classes Pack, Place and Grid disappear, the
1654# pack/place/grid methods are defined on the Widget class, and
1655# everybody uses w.pack_whatever(...) instead of Pack.whatever(w,
1656# ...), with pack(), place() and grid() being short for
1657# pack_configure(), place_configure() and grid_columnconfigure(), and
1658# forget() being short for pack_forget(). As a practical matter, I'm
1659# afraid that there is too much code out there that may be using the
1660# Pack, Place or Grid class, so I leave them intact -- but only as
1661# backwards compatibility features. Also note that those methods that
1662# take a master as argument (e.g. pack_propagate) have been moved to
1663# the Misc class (which now incorporates all methods common between
1664# toplevel and interior widgets). Again, for compatibility, these are
1665# copied into the Pack, Place or Grid class.
1666
David Aschere2b4b322004-02-18 05:59:53 +00001667
1668def Tcl(screenName=None, baseName=None, className='Tk', useTk=0):
1669 return Tk(screenName, baseName, className, useTk)
1670
Guido van Rossum18468821994-06-20 07:49:28 +00001671class Pack:
Fredrik Lundh06d28152000-08-09 18:03:12 +00001672 """Geometry manager Pack.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001673
Fredrik Lundh06d28152000-08-09 18:03:12 +00001674 Base class to use the methods pack_* in every widget."""
1675 def pack_configure(self, cnf={}, **kw):
1676 """Pack a widget in the parent widget. Use as options:
1677 after=widget - pack it after you have packed widget
1678 anchor=NSEW (or subset) - position widget according to
1679 given direction
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001680 before=widget - pack it before you will pack widget
Martin v. Löwisbfe175c2003-04-16 19:42:51 +00001681 expand=bool - expand widget if parent size grows
Fredrik Lundh06d28152000-08-09 18:03:12 +00001682 fill=NONE or X or Y or BOTH - fill widget if widget grows
1683 in=master - use master to contain this widget
1684 ipadx=amount - add internal padding in x direction
1685 ipady=amount - add internal padding in y direction
1686 padx=amount - add padding in x direction
1687 pady=amount - add padding in y direction
1688 side=TOP or BOTTOM or LEFT or RIGHT - where to add this widget.
1689 """
1690 self.tk.call(
1691 ('pack', 'configure', self._w)
1692 + self._options(cnf, kw))
1693 pack = configure = config = pack_configure
1694 def pack_forget(self):
1695 """Unmap this widget and do not use it for the packing order."""
1696 self.tk.call('pack', 'forget', self._w)
1697 forget = pack_forget
1698 def pack_info(self):
1699 """Return information about the packing options
1700 for this widget."""
1701 words = self.tk.splitlist(
1702 self.tk.call('pack', 'info', self._w))
1703 dict = {}
1704 for i in range(0, len(words), 2):
1705 key = words[i][1:]
1706 value = words[i+1]
1707 if value[:1] == '.':
1708 value = self._nametowidget(value)
1709 dict[key] = value
1710 return dict
1711 info = pack_info
1712 propagate = pack_propagate = Misc.pack_propagate
1713 slaves = pack_slaves = Misc.pack_slaves
Guido van Rossum18468821994-06-20 07:49:28 +00001714
1715class Place:
Fredrik Lundh06d28152000-08-09 18:03:12 +00001716 """Geometry manager Place.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001717
Fredrik Lundh06d28152000-08-09 18:03:12 +00001718 Base class to use the methods place_* in every widget."""
1719 def place_configure(self, cnf={}, **kw):
1720 """Place a widget in the parent widget. Use as options:
1721 in=master - master relative to which the widget is placed.
1722 x=amount - locate anchor of this widget at position x of master
1723 y=amount - locate anchor of this widget at position y of master
1724 relx=amount - locate anchor of this widget between 0.0 and 1.0
1725 relative to width of master (1.0 is right edge)
1726 rely=amount - locate anchor of this widget between 0.0 and 1.0
1727 relative to height of master (1.0 is bottom edge)
1728 anchor=NSEW (or subset) - position anchor according to given direction
1729 width=amount - width of this widget in pixel
1730 height=amount - height of this widget in pixel
1731 relwidth=amount - width of this widget between 0.0 and 1.0
1732 relative to width of master (1.0 is the same width
1733 as the master)
1734 relheight=amount - height of this widget between 0.0 and 1.0
1735 relative to height of master (1.0 is the same
1736 height as the master)
1737 bordermode="inside" or "outside" - whether to take border width of master widget
1738 into account
1739 """
1740 for k in ['in_']:
1741 if kw.has_key(k):
1742 kw[k[:-1]] = kw[k]
1743 del kw[k]
1744 self.tk.call(
1745 ('place', 'configure', self._w)
1746 + self._options(cnf, kw))
1747 place = configure = config = place_configure
1748 def place_forget(self):
1749 """Unmap this widget."""
1750 self.tk.call('place', 'forget', self._w)
1751 forget = place_forget
1752 def place_info(self):
1753 """Return information about the placing options
1754 for this widget."""
1755 words = self.tk.splitlist(
1756 self.tk.call('place', 'info', self._w))
1757 dict = {}
1758 for i in range(0, len(words), 2):
1759 key = words[i][1:]
1760 value = words[i+1]
1761 if value[:1] == '.':
1762 value = self._nametowidget(value)
1763 dict[key] = value
1764 return dict
1765 info = place_info
1766 slaves = place_slaves = Misc.place_slaves
Guido van Rossum18468821994-06-20 07:49:28 +00001767
Guido van Rossum37dcab11996-05-16 16:00:19 +00001768class Grid:
Fredrik Lundh06d28152000-08-09 18:03:12 +00001769 """Geometry manager Grid.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001770
Fredrik Lundh06d28152000-08-09 18:03:12 +00001771 Base class to use the methods grid_* in every widget."""
1772 # Thanks to Masazumi Yoshikawa (yosikawa@isi.edu)
1773 def grid_configure(self, cnf={}, **kw):
1774 """Position a widget in the parent widget in a grid. Use as options:
1775 column=number - use cell identified with given column (starting with 0)
1776 columnspan=number - this widget will span several columns
1777 in=master - use master to contain this widget
1778 ipadx=amount - add internal padding in x direction
1779 ipady=amount - add internal padding in y direction
1780 padx=amount - add padding in x direction
1781 pady=amount - add padding in y direction
1782 row=number - use cell identified with given row (starting with 0)
1783 rowspan=number - this widget will span several rows
1784 sticky=NSEW - if cell is larger on which sides will this
1785 widget stick to the cell boundary
1786 """
1787 self.tk.call(
1788 ('grid', 'configure', self._w)
1789 + self._options(cnf, kw))
1790 grid = configure = config = grid_configure
1791 bbox = grid_bbox = Misc.grid_bbox
1792 columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure
1793 def grid_forget(self):
1794 """Unmap this widget."""
1795 self.tk.call('grid', 'forget', self._w)
1796 forget = grid_forget
1797 def grid_remove(self):
1798 """Unmap this widget but remember the grid options."""
1799 self.tk.call('grid', 'remove', self._w)
1800 def grid_info(self):
1801 """Return information about the options
1802 for positioning this widget in a grid."""
1803 words = self.tk.splitlist(
1804 self.tk.call('grid', 'info', self._w))
1805 dict = {}
1806 for i in range(0, len(words), 2):
1807 key = words[i][1:]
1808 value = words[i+1]
1809 if value[:1] == '.':
1810 value = self._nametowidget(value)
1811 dict[key] = value
1812 return dict
1813 info = grid_info
Martin v. Löwisdc579092001-10-13 09:33:51 +00001814 location = grid_location = Misc.grid_location
Fredrik Lundh06d28152000-08-09 18:03:12 +00001815 propagate = grid_propagate = Misc.grid_propagate
1816 rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure
1817 size = grid_size = Misc.grid_size
1818 slaves = grid_slaves = Misc.grid_slaves
Guido van Rossum37dcab11996-05-16 16:00:19 +00001819
Guido van Rossum368e06b1997-11-07 20:38:49 +00001820class BaseWidget(Misc):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001821 """Internal class."""
1822 def _setup(self, master, cnf):
1823 """Internal function. Sets up information about children."""
1824 if _support_default_root:
1825 global _default_root
1826 if not master:
1827 if not _default_root:
1828 _default_root = Tk()
1829 master = _default_root
1830 self.master = master
1831 self.tk = master.tk
1832 name = None
1833 if cnf.has_key('name'):
1834 name = cnf['name']
1835 del cnf['name']
1836 if not name:
Walter Dörwald70a6b492004-02-12 17:35:32 +00001837 name = repr(id(self))
Fredrik Lundh06d28152000-08-09 18:03:12 +00001838 self._name = name
1839 if master._w=='.':
1840 self._w = '.' + name
1841 else:
1842 self._w = master._w + '.' + name
1843 self.children = {}
1844 if self.master.children.has_key(self._name):
1845 self.master.children[self._name].destroy()
1846 self.master.children[self._name] = self
1847 def __init__(self, master, widgetName, cnf={}, kw={}, extra=()):
1848 """Construct a widget with the parent widget MASTER, a name WIDGETNAME
1849 and appropriate options."""
1850 if kw:
1851 cnf = _cnfmerge((cnf, kw))
1852 self.widgetName = widgetName
1853 BaseWidget._setup(self, master, cnf)
1854 classes = []
1855 for k in cnf.keys():
1856 if type(k) is ClassType:
1857 classes.append((k, cnf[k]))
1858 del cnf[k]
1859 self.tk.call(
1860 (widgetName, self._w) + extra + self._options(cnf))
1861 for k, v in classes:
1862 k.configure(self, v)
1863 def destroy(self):
1864 """Destroy this and all descendants widgets."""
1865 for c in self.children.values(): c.destroy()
1866 if self.master.children.has_key(self._name):
1867 del self.master.children[self._name]
1868 self.tk.call('destroy', self._w)
1869 Misc.destroy(self)
1870 def _do(self, name, args=()):
1871 # XXX Obsolete -- better use self.tk.call directly!
1872 return self.tk.call((self._w, name) + args)
Guido van Rossum18468821994-06-20 07:49:28 +00001873
Guido van Rossum368e06b1997-11-07 20:38:49 +00001874class Widget(BaseWidget, Pack, Place, Grid):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001875 """Internal class.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001876
Fredrik Lundh06d28152000-08-09 18:03:12 +00001877 Base class for a widget which can be positioned with the geometry managers
1878 Pack, Place or Grid."""
1879 pass
Guido van Rossum368e06b1997-11-07 20:38:49 +00001880
1881class Toplevel(BaseWidget, Wm):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001882 """Toplevel widget, e.g. for dialogs."""
1883 def __init__(self, master=None, cnf={}, **kw):
1884 """Construct a toplevel widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001885
Fredrik Lundh06d28152000-08-09 18:03:12 +00001886 Valid resource names: background, bd, bg, borderwidth, class,
1887 colormap, container, cursor, height, highlightbackground,
1888 highlightcolor, highlightthickness, menu, relief, screen, takefocus,
1889 use, visual, width."""
1890 if kw:
1891 cnf = _cnfmerge((cnf, kw))
1892 extra = ()
1893 for wmkey in ['screen', 'class_', 'class', 'visual',
1894 'colormap']:
1895 if cnf.has_key(wmkey):
1896 val = cnf[wmkey]
1897 # TBD: a hack needed because some keys
1898 # are not valid as keyword arguments
1899 if wmkey[-1] == '_': opt = '-'+wmkey[:-1]
1900 else: opt = '-'+wmkey
1901 extra = extra + (opt, val)
1902 del cnf[wmkey]
1903 BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
1904 root = self._root()
1905 self.iconname(root.iconname())
1906 self.title(root.title())
1907 self.protocol("WM_DELETE_WINDOW", self.destroy)
Guido van Rossum18468821994-06-20 07:49:28 +00001908
1909class Button(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001910 """Button widget."""
1911 def __init__(self, master=None, cnf={}, **kw):
1912 """Construct a button widget with the parent MASTER.
Raymond Hettingerff41c482003-04-06 09:01:11 +00001913
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001914 STANDARD OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00001915
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001916 activebackground, activeforeground, anchor,
1917 background, bitmap, borderwidth, cursor,
Raymond Hettingerff41c482003-04-06 09:01:11 +00001918 disabledforeground, font, foreground
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001919 highlightbackground, highlightcolor,
Raymond Hettingerff41c482003-04-06 09:01:11 +00001920 highlightthickness, image, justify,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001921 padx, pady, relief, repeatdelay,
Raymond Hettingerff41c482003-04-06 09:01:11 +00001922 repeatinterval, takefocus, text,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001923 textvariable, underline, wraplength
Raymond Hettingerff41c482003-04-06 09:01:11 +00001924
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001925 WIDGET-SPECIFIC OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00001926
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001927 command, compound, default, height,
1928 overrelief, state, width
1929 """
Fredrik Lundh06d28152000-08-09 18:03:12 +00001930 Widget.__init__(self, master, 'button', cnf, kw)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001931
Fredrik Lundh06d28152000-08-09 18:03:12 +00001932 def tkButtonEnter(self, *dummy):
1933 self.tk.call('tkButtonEnter', self._w)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001934
Fredrik Lundh06d28152000-08-09 18:03:12 +00001935 def tkButtonLeave(self, *dummy):
1936 self.tk.call('tkButtonLeave', self._w)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001937
Fredrik Lundh06d28152000-08-09 18:03:12 +00001938 def tkButtonDown(self, *dummy):
1939 self.tk.call('tkButtonDown', self._w)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001940
Fredrik Lundh06d28152000-08-09 18:03:12 +00001941 def tkButtonUp(self, *dummy):
1942 self.tk.call('tkButtonUp', self._w)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001943
Fredrik Lundh06d28152000-08-09 18:03:12 +00001944 def tkButtonInvoke(self, *dummy):
1945 self.tk.call('tkButtonInvoke', self._w)
Raymond Hettingerff41c482003-04-06 09:01:11 +00001946
Fredrik Lundh06d28152000-08-09 18:03:12 +00001947 def flash(self):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001948 """Flash the button.
1949
1950 This is accomplished by redisplaying
1951 the button several times, alternating between active and
1952 normal colors. At the end of the flash the button is left
1953 in the same normal/active state as when the command was
1954 invoked. This command is ignored if the button's state is
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001955 disabled.
1956 """
Fredrik Lundh06d28152000-08-09 18:03:12 +00001957 self.tk.call(self._w, 'flash')
Raymond Hettingerff41c482003-04-06 09:01:11 +00001958
Fredrik Lundh06d28152000-08-09 18:03:12 +00001959 def invoke(self):
Raymond Hettingerff41c482003-04-06 09:01:11 +00001960 """Invoke the command associated with the button.
1961
1962 The return value is the return value from the command,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00001963 or an empty string if there is no command associated with
1964 the button. This command is ignored if the button's state
1965 is disabled.
1966 """
Fredrik Lundh06d28152000-08-09 18:03:12 +00001967 return self.tk.call(self._w, 'invoke')
Guido van Rossum18468821994-06-20 07:49:28 +00001968
1969# Indices:
Guido van Rossum35f67fb1995-08-04 03:50:29 +00001970# XXX I don't like these -- take them away
Guido van Rossum18468821994-06-20 07:49:28 +00001971def AtEnd():
Fredrik Lundh06d28152000-08-09 18:03:12 +00001972 return 'end'
Guido van Rossum1e9e4001994-06-20 09:09:51 +00001973def AtInsert(*args):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001974 s = 'insert'
1975 for a in args:
1976 if a: s = s + (' ' + a)
1977 return s
Guido van Rossum18468821994-06-20 07:49:28 +00001978def AtSelFirst():
Fredrik Lundh06d28152000-08-09 18:03:12 +00001979 return 'sel.first'
Guido van Rossum18468821994-06-20 07:49:28 +00001980def AtSelLast():
Fredrik Lundh06d28152000-08-09 18:03:12 +00001981 return 'sel.last'
Guido van Rossum18468821994-06-20 07:49:28 +00001982def At(x, y=None):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001983 if y is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +00001984 return '@%r' % (x,)
Fredrik Lundh06d28152000-08-09 18:03:12 +00001985 else:
Walter Dörwald70a6b492004-02-12 17:35:32 +00001986 return '@%r,%r' % (x, y)
Guido van Rossum18468821994-06-20 07:49:28 +00001987
1988class Canvas(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00001989 """Canvas widget to display graphical elements like lines or text."""
1990 def __init__(self, master=None, cnf={}, **kw):
1991 """Construct a canvas widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00001992
Fredrik Lundh06d28152000-08-09 18:03:12 +00001993 Valid resource names: background, bd, bg, borderwidth, closeenough,
1994 confine, cursor, height, highlightbackground, highlightcolor,
1995 highlightthickness, insertbackground, insertborderwidth,
1996 insertofftime, insertontime, insertwidth, offset, relief,
1997 scrollregion, selectbackground, selectborderwidth, selectforeground,
1998 state, takefocus, width, xscrollcommand, xscrollincrement,
1999 yscrollcommand, yscrollincrement."""
2000 Widget.__init__(self, master, 'canvas', cnf, kw)
2001 def addtag(self, *args):
2002 """Internal function."""
2003 self.tk.call((self._w, 'addtag') + args)
2004 def addtag_above(self, newtag, tagOrId):
2005 """Add tag NEWTAG to all items above TAGORID."""
2006 self.addtag(newtag, 'above', tagOrId)
2007 def addtag_all(self, newtag):
2008 """Add tag NEWTAG to all items."""
2009 self.addtag(newtag, 'all')
2010 def addtag_below(self, newtag, tagOrId):
2011 """Add tag NEWTAG to all items below TAGORID."""
2012 self.addtag(newtag, 'below', tagOrId)
2013 def addtag_closest(self, newtag, x, y, halo=None, start=None):
2014 """Add tag NEWTAG to item which is closest to pixel at X, Y.
2015 If several match take the top-most.
2016 All items closer than HALO are considered overlapping (all are
2017 closests). If START is specified the next below this tag is taken."""
2018 self.addtag(newtag, 'closest', x, y, halo, start)
2019 def addtag_enclosed(self, newtag, x1, y1, x2, y2):
2020 """Add tag NEWTAG to all items in the rectangle defined
2021 by X1,Y1,X2,Y2."""
2022 self.addtag(newtag, 'enclosed', x1, y1, x2, y2)
2023 def addtag_overlapping(self, newtag, x1, y1, x2, y2):
2024 """Add tag NEWTAG to all items which overlap the rectangle
2025 defined by X1,Y1,X2,Y2."""
2026 self.addtag(newtag, 'overlapping', x1, y1, x2, y2)
2027 def addtag_withtag(self, newtag, tagOrId):
2028 """Add tag NEWTAG to all items with TAGORID."""
2029 self.addtag(newtag, 'withtag', tagOrId)
2030 def bbox(self, *args):
2031 """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
2032 which encloses all items with tags specified as arguments."""
2033 return self._getints(
2034 self.tk.call((self._w, 'bbox') + args)) or None
2035 def tag_unbind(self, tagOrId, sequence, funcid=None):
2036 """Unbind for all items with TAGORID for event SEQUENCE the
2037 function identified with FUNCID."""
2038 self.tk.call(self._w, 'bind', tagOrId, sequence, '')
2039 if funcid:
2040 self.deletecommand(funcid)
2041 def tag_bind(self, tagOrId, sequence=None, func=None, add=None):
2042 """Bind to all items with TAGORID at event SEQUENCE a call to function FUNC.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002043
Fredrik Lundh06d28152000-08-09 18:03:12 +00002044 An additional boolean parameter ADD specifies whether FUNC will be
2045 called additionally to the other bound function or whether it will
2046 replace the previous function. See bind for the return value."""
2047 return self._bind((self._w, 'bind', tagOrId),
2048 sequence, func, add)
2049 def canvasx(self, screenx, gridspacing=None):
2050 """Return the canvas x coordinate of pixel position SCREENX rounded
2051 to nearest multiple of GRIDSPACING units."""
2052 return getdouble(self.tk.call(
2053 self._w, 'canvasx', screenx, gridspacing))
2054 def canvasy(self, screeny, gridspacing=None):
2055 """Return the canvas y coordinate of pixel position SCREENY rounded
2056 to nearest multiple of GRIDSPACING units."""
2057 return getdouble(self.tk.call(
2058 self._w, 'canvasy', screeny, gridspacing))
2059 def coords(self, *args):
2060 """Return a list of coordinates for the item given in ARGS."""
2061 # XXX Should use _flatten on args
2062 return map(getdouble,
Guido van Rossum0bd54331998-05-19 21:18:13 +00002063 self.tk.splitlist(
Fredrik Lundh06d28152000-08-09 18:03:12 +00002064 self.tk.call((self._w, 'coords') + args)))
2065 def _create(self, itemType, args, kw): # Args: (val, val, ..., cnf={})
2066 """Internal function."""
2067 args = _flatten(args)
2068 cnf = args[-1]
2069 if type(cnf) in (DictionaryType, TupleType):
2070 args = args[:-1]
2071 else:
2072 cnf = {}
Raymond Hettingerff41c482003-04-06 09:01:11 +00002073 return getint(self.tk.call(
2074 self._w, 'create', itemType,
2075 *(args + self._options(cnf, kw))))
Fredrik Lundh06d28152000-08-09 18:03:12 +00002076 def create_arc(self, *args, **kw):
2077 """Create arc shaped region with coordinates x1,y1,x2,y2."""
2078 return self._create('arc', args, kw)
2079 def create_bitmap(self, *args, **kw):
2080 """Create bitmap with coordinates x1,y1."""
2081 return self._create('bitmap', args, kw)
2082 def create_image(self, *args, **kw):
2083 """Create image item with coordinates x1,y1."""
2084 return self._create('image', args, kw)
2085 def create_line(self, *args, **kw):
2086 """Create line with coordinates x1,y1,...,xn,yn."""
2087 return self._create('line', args, kw)
2088 def create_oval(self, *args, **kw):
2089 """Create oval with coordinates x1,y1,x2,y2."""
2090 return self._create('oval', args, kw)
2091 def create_polygon(self, *args, **kw):
2092 """Create polygon with coordinates x1,y1,...,xn,yn."""
2093 return self._create('polygon', args, kw)
2094 def create_rectangle(self, *args, **kw):
2095 """Create rectangle with coordinates x1,y1,x2,y2."""
2096 return self._create('rectangle', args, kw)
2097 def create_text(self, *args, **kw):
2098 """Create text with coordinates x1,y1."""
2099 return self._create('text', args, kw)
2100 def create_window(self, *args, **kw):
2101 """Create window with coordinates x1,y1,x2,y2."""
2102 return self._create('window', args, kw)
2103 def dchars(self, *args):
2104 """Delete characters of text items identified by tag or id in ARGS (possibly
2105 several times) from FIRST to LAST character (including)."""
2106 self.tk.call((self._w, 'dchars') + args)
2107 def delete(self, *args):
2108 """Delete items identified by all tag or ids contained in ARGS."""
2109 self.tk.call((self._w, 'delete') + args)
2110 def dtag(self, *args):
2111 """Delete tag or id given as last arguments in ARGS from items
2112 identified by first argument in ARGS."""
2113 self.tk.call((self._w, 'dtag') + args)
2114 def find(self, *args):
2115 """Internal function."""
2116 return self._getints(
2117 self.tk.call((self._w, 'find') + args)) or ()
2118 def find_above(self, tagOrId):
2119 """Return items above TAGORID."""
2120 return self.find('above', tagOrId)
2121 def find_all(self):
2122 """Return all items."""
2123 return self.find('all')
2124 def find_below(self, tagOrId):
2125 """Return all items below TAGORID."""
2126 return self.find('below', tagOrId)
2127 def find_closest(self, x, y, halo=None, start=None):
2128 """Return item which is closest to pixel at X, Y.
2129 If several match take the top-most.
2130 All items closer than HALO are considered overlapping (all are
2131 closests). If START is specified the next below this tag is taken."""
2132 return self.find('closest', x, y, halo, start)
2133 def find_enclosed(self, x1, y1, x2, y2):
2134 """Return all items in rectangle defined
2135 by X1,Y1,X2,Y2."""
2136 return self.find('enclosed', x1, y1, x2, y2)
2137 def find_overlapping(self, x1, y1, x2, y2):
2138 """Return all items which overlap the rectangle
2139 defined by X1,Y1,X2,Y2."""
2140 return self.find('overlapping', x1, y1, x2, y2)
2141 def find_withtag(self, tagOrId):
2142 """Return all items with TAGORID."""
2143 return self.find('withtag', tagOrId)
2144 def focus(self, *args):
2145 """Set focus to the first item specified in ARGS."""
2146 return self.tk.call((self._w, 'focus') + args)
2147 def gettags(self, *args):
2148 """Return tags associated with the first item specified in ARGS."""
2149 return self.tk.splitlist(
2150 self.tk.call((self._w, 'gettags') + args))
2151 def icursor(self, *args):
2152 """Set cursor at position POS in the item identified by TAGORID.
2153 In ARGS TAGORID must be first."""
2154 self.tk.call((self._w, 'icursor') + args)
2155 def index(self, *args):
2156 """Return position of cursor as integer in item specified in ARGS."""
2157 return getint(self.tk.call((self._w, 'index') + args))
2158 def insert(self, *args):
2159 """Insert TEXT in item TAGORID at position POS. ARGS must
2160 be TAGORID POS TEXT."""
2161 self.tk.call((self._w, 'insert') + args)
2162 def itemcget(self, tagOrId, option):
2163 """Return the resource value for an OPTION for item TAGORID."""
2164 return self.tk.call(
2165 (self._w, 'itemcget') + (tagOrId, '-'+option))
2166 def itemconfigure(self, tagOrId, cnf=None, **kw):
2167 """Configure resources of an item TAGORID.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002168
Fredrik Lundh06d28152000-08-09 18:03:12 +00002169 The values for resources are specified as keyword
2170 arguments. To get an overview about
2171 the allowed keyword arguments call the method without arguments.
2172 """
Martin v. Löwis6ce13152002-10-10 14:36:13 +00002173 return self._configure(('itemconfigure', tagOrId), cnf, kw)
Fredrik Lundh06d28152000-08-09 18:03:12 +00002174 itemconfig = itemconfigure
2175 # lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift,
2176 # so the preferred name for them is tag_lower, tag_raise
2177 # (similar to tag_bind, and similar to the Text widget);
2178 # unfortunately can't delete the old ones yet (maybe in 1.6)
2179 def tag_lower(self, *args):
2180 """Lower an item TAGORID given in ARGS
2181 (optional below another item)."""
2182 self.tk.call((self._w, 'lower') + args)
2183 lower = tag_lower
2184 def move(self, *args):
2185 """Move an item TAGORID given in ARGS."""
2186 self.tk.call((self._w, 'move') + args)
2187 def postscript(self, cnf={}, **kw):
2188 """Print the contents of the canvas to a postscript
2189 file. Valid options: colormap, colormode, file, fontmap,
2190 height, pageanchor, pageheight, pagewidth, pagex, pagey,
2191 rotate, witdh, x, y."""
2192 return self.tk.call((self._w, 'postscript') +
2193 self._options(cnf, kw))
2194 def tag_raise(self, *args):
2195 """Raise an item TAGORID given in ARGS
2196 (optional above another item)."""
2197 self.tk.call((self._w, 'raise') + args)
2198 lift = tkraise = tag_raise
2199 def scale(self, *args):
2200 """Scale item TAGORID with XORIGIN, YORIGIN, XSCALE, YSCALE."""
2201 self.tk.call((self._w, 'scale') + args)
2202 def scan_mark(self, x, y):
2203 """Remember the current X, Y coordinates."""
2204 self.tk.call(self._w, 'scan', 'mark', x, y)
Neal Norwitze931ed52003-01-10 23:24:32 +00002205 def scan_dragto(self, x, y, gain=10):
2206 """Adjust the view of the canvas to GAIN times the
Fredrik Lundh06d28152000-08-09 18:03:12 +00002207 difference between X and Y and the coordinates given in
2208 scan_mark."""
Neal Norwitze931ed52003-01-10 23:24:32 +00002209 self.tk.call(self._w, 'scan', 'dragto', x, y, gain)
Fredrik Lundh06d28152000-08-09 18:03:12 +00002210 def select_adjust(self, tagOrId, index):
2211 """Adjust the end of the selection near the cursor of an item TAGORID to index."""
2212 self.tk.call(self._w, 'select', 'adjust', tagOrId, index)
2213 def select_clear(self):
2214 """Clear the selection if it is in this widget."""
2215 self.tk.call(self._w, 'select', 'clear')
2216 def select_from(self, tagOrId, index):
2217 """Set the fixed end of a selection in item TAGORID to INDEX."""
2218 self.tk.call(self._w, 'select', 'from', tagOrId, index)
2219 def select_item(self):
2220 """Return the item which has the selection."""
Neal Norwitz58b63bf2002-07-23 02:52:58 +00002221 return self.tk.call(self._w, 'select', 'item') or None
Fredrik Lundh06d28152000-08-09 18:03:12 +00002222 def select_to(self, tagOrId, index):
2223 """Set the variable end of a selection in item TAGORID to INDEX."""
2224 self.tk.call(self._w, 'select', 'to', tagOrId, index)
2225 def type(self, tagOrId):
2226 """Return the type of the item TAGORID."""
2227 return self.tk.call(self._w, 'type', tagOrId) or None
2228 def xview(self, *args):
2229 """Query and change horizontal position of the view."""
2230 if not args:
2231 return self._getdoubles(self.tk.call(self._w, 'xview'))
2232 self.tk.call((self._w, 'xview') + args)
2233 def xview_moveto(self, fraction):
2234 """Adjusts the view in the window so that FRACTION of the
2235 total width of the canvas is off-screen to the left."""
2236 self.tk.call(self._w, 'xview', 'moveto', fraction)
2237 def xview_scroll(self, number, what):
2238 """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
2239 self.tk.call(self._w, 'xview', 'scroll', number, what)
2240 def yview(self, *args):
2241 """Query and change vertical position of the view."""
2242 if not args:
2243 return self._getdoubles(self.tk.call(self._w, 'yview'))
2244 self.tk.call((self._w, 'yview') + args)
2245 def yview_moveto(self, fraction):
2246 """Adjusts the view in the window so that FRACTION of the
2247 total height of the canvas is off-screen to the top."""
2248 self.tk.call(self._w, 'yview', 'moveto', fraction)
2249 def yview_scroll(self, number, what):
2250 """Shift the y-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
2251 self.tk.call(self._w, 'yview', 'scroll', number, what)
Guido van Rossum18468821994-06-20 07:49:28 +00002252
2253class Checkbutton(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002254 """Checkbutton widget which is either in on- or off-state."""
2255 def __init__(self, master=None, cnf={}, **kw):
2256 """Construct a checkbutton widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002257
Fredrik Lundh06d28152000-08-09 18:03:12 +00002258 Valid resource names: activebackground, activeforeground, anchor,
2259 background, bd, bg, bitmap, borderwidth, command, cursor,
2260 disabledforeground, fg, font, foreground, height,
2261 highlightbackground, highlightcolor, highlightthickness, image,
2262 indicatoron, justify, offvalue, onvalue, padx, pady, relief,
2263 selectcolor, selectimage, state, takefocus, text, textvariable,
2264 underline, variable, width, wraplength."""
2265 Widget.__init__(self, master, 'checkbutton', cnf, kw)
2266 def deselect(self):
2267 """Put the button in off-state."""
2268 self.tk.call(self._w, 'deselect')
2269 def flash(self):
2270 """Flash the button."""
2271 self.tk.call(self._w, 'flash')
2272 def invoke(self):
2273 """Toggle the button and invoke a command if given as resource."""
2274 return self.tk.call(self._w, 'invoke')
2275 def select(self):
2276 """Put the button in on-state."""
2277 self.tk.call(self._w, 'select')
2278 def toggle(self):
2279 """Toggle the button."""
2280 self.tk.call(self._w, 'toggle')
Guido van Rossum18468821994-06-20 07:49:28 +00002281
2282class Entry(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002283 """Entry widget which allows to display simple text."""
2284 def __init__(self, master=None, cnf={}, **kw):
2285 """Construct an entry widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002286
Fredrik Lundh06d28152000-08-09 18:03:12 +00002287 Valid resource names: background, bd, bg, borderwidth, cursor,
2288 exportselection, fg, font, foreground, highlightbackground,
2289 highlightcolor, highlightthickness, insertbackground,
2290 insertborderwidth, insertofftime, insertontime, insertwidth,
2291 invalidcommand, invcmd, justify, relief, selectbackground,
2292 selectborderwidth, selectforeground, show, state, takefocus,
2293 textvariable, validate, validatecommand, vcmd, width,
2294 xscrollcommand."""
2295 Widget.__init__(self, master, 'entry', cnf, kw)
2296 def delete(self, first, last=None):
2297 """Delete text from FIRST to LAST (not included)."""
2298 self.tk.call(self._w, 'delete', first, last)
2299 def get(self):
2300 """Return the text."""
2301 return self.tk.call(self._w, 'get')
2302 def icursor(self, index):
2303 """Insert cursor at INDEX."""
2304 self.tk.call(self._w, 'icursor', index)
2305 def index(self, index):
2306 """Return position of cursor."""
2307 return getint(self.tk.call(
2308 self._w, 'index', index))
2309 def insert(self, index, string):
2310 """Insert STRING at INDEX."""
2311 self.tk.call(self._w, 'insert', index, string)
2312 def scan_mark(self, x):
2313 """Remember the current X, Y coordinates."""
2314 self.tk.call(self._w, 'scan', 'mark', x)
2315 def scan_dragto(self, x):
2316 """Adjust the view of the canvas to 10 times the
2317 difference between X and Y and the coordinates given in
2318 scan_mark."""
2319 self.tk.call(self._w, 'scan', 'dragto', x)
2320 def selection_adjust(self, index):
2321 """Adjust the end of the selection near the cursor to INDEX."""
2322 self.tk.call(self._w, 'selection', 'adjust', index)
2323 select_adjust = selection_adjust
2324 def selection_clear(self):
2325 """Clear the selection if it is in this widget."""
2326 self.tk.call(self._w, 'selection', 'clear')
2327 select_clear = selection_clear
2328 def selection_from(self, index):
2329 """Set the fixed end of a selection to INDEX."""
2330 self.tk.call(self._w, 'selection', 'from', index)
2331 select_from = selection_from
2332 def selection_present(self):
2333 """Return whether the widget has the selection."""
2334 return self.tk.getboolean(
2335 self.tk.call(self._w, 'selection', 'present'))
2336 select_present = selection_present
2337 def selection_range(self, start, end):
2338 """Set the selection from START to END (not included)."""
2339 self.tk.call(self._w, 'selection', 'range', start, end)
2340 select_range = selection_range
2341 def selection_to(self, index):
2342 """Set the variable end of a selection to INDEX."""
2343 self.tk.call(self._w, 'selection', 'to', index)
2344 select_to = selection_to
2345 def xview(self, index):
2346 """Query and change horizontal position of the view."""
2347 self.tk.call(self._w, 'xview', index)
2348 def xview_moveto(self, fraction):
2349 """Adjust the view in the window so that FRACTION of the
2350 total width of the entry is off-screen to the left."""
2351 self.tk.call(self._w, 'xview', 'moveto', fraction)
2352 def xview_scroll(self, number, what):
2353 """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
2354 self.tk.call(self._w, 'xview', 'scroll', number, what)
Guido van Rossum18468821994-06-20 07:49:28 +00002355
2356class Frame(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002357 """Frame widget which may contain other widgets and can have a 3D border."""
2358 def __init__(self, master=None, cnf={}, **kw):
2359 """Construct a frame widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002360
Fredrik Lundh06d28152000-08-09 18:03:12 +00002361 Valid resource names: background, bd, bg, borderwidth, class,
2362 colormap, container, cursor, height, highlightbackground,
2363 highlightcolor, highlightthickness, relief, takefocus, visual, width."""
2364 cnf = _cnfmerge((cnf, kw))
2365 extra = ()
2366 if cnf.has_key('class_'):
2367 extra = ('-class', cnf['class_'])
2368 del cnf['class_']
2369 elif cnf.has_key('class'):
2370 extra = ('-class', cnf['class'])
2371 del cnf['class']
2372 Widget.__init__(self, master, 'frame', cnf, {}, extra)
Guido van Rossum18468821994-06-20 07:49:28 +00002373
2374class Label(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002375 """Label widget which can display text and bitmaps."""
2376 def __init__(self, master=None, cnf={}, **kw):
2377 """Construct a label widget with the parent MASTER.
Raymond Hettingerff41c482003-04-06 09:01:11 +00002378
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002379 STANDARD OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00002380
2381 activebackground, activeforeground, anchor,
2382 background, bitmap, borderwidth, cursor,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002383 disabledforeground, font, foreground,
Raymond Hettingerff41c482003-04-06 09:01:11 +00002384 highlightbackground, highlightcolor,
2385 highlightthickness, image, justify,
2386 padx, pady, relief, takefocus, text,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002387 textvariable, underline, wraplength
Raymond Hettingerff41c482003-04-06 09:01:11 +00002388
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002389 WIDGET-SPECIFIC OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00002390
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002391 height, state, width
Raymond Hettingerff41c482003-04-06 09:01:11 +00002392
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002393 """
Fredrik Lundh06d28152000-08-09 18:03:12 +00002394 Widget.__init__(self, master, 'label', cnf, kw)
Guido van Rossum761c5ab1995-07-14 15:29:10 +00002395
Guido van Rossum18468821994-06-20 07:49:28 +00002396class Listbox(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002397 """Listbox widget which can display a list of strings."""
2398 def __init__(self, master=None, cnf={}, **kw):
2399 """Construct a listbox widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002400
Fredrik Lundh06d28152000-08-09 18:03:12 +00002401 Valid resource names: background, bd, bg, borderwidth, cursor,
2402 exportselection, fg, font, foreground, height, highlightbackground,
2403 highlightcolor, highlightthickness, relief, selectbackground,
2404 selectborderwidth, selectforeground, selectmode, setgrid, takefocus,
2405 width, xscrollcommand, yscrollcommand, listvariable."""
2406 Widget.__init__(self, master, 'listbox', cnf, kw)
2407 def activate(self, index):
2408 """Activate item identified by INDEX."""
2409 self.tk.call(self._w, 'activate', index)
2410 def bbox(self, *args):
2411 """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
2412 which encloses the item identified by index in ARGS."""
2413 return self._getints(
2414 self.tk.call((self._w, 'bbox') + args)) or None
2415 def curselection(self):
2416 """Return list of indices of currently selected item."""
2417 # XXX Ought to apply self._getints()...
2418 return self.tk.splitlist(self.tk.call(
2419 self._w, 'curselection'))
2420 def delete(self, first, last=None):
2421 """Delete items from FIRST to LAST (not included)."""
2422 self.tk.call(self._w, 'delete', first, last)
2423 def get(self, first, last=None):
2424 """Get list of items from FIRST to LAST (not included)."""
2425 if last:
2426 return self.tk.splitlist(self.tk.call(
2427 self._w, 'get', first, last))
2428 else:
2429 return self.tk.call(self._w, 'get', first)
2430 def index(self, index):
2431 """Return index of item identified with INDEX."""
2432 i = self.tk.call(self._w, 'index', index)
2433 if i == 'none': return None
2434 return getint(i)
2435 def insert(self, index, *elements):
2436 """Insert ELEMENTS at INDEX."""
2437 self.tk.call((self._w, 'insert', index) + elements)
2438 def nearest(self, y):
2439 """Get index of item which is nearest to y coordinate Y."""
2440 return getint(self.tk.call(
2441 self._w, 'nearest', y))
2442 def scan_mark(self, x, y):
2443 """Remember the current X, Y coordinates."""
2444 self.tk.call(self._w, 'scan', 'mark', x, y)
2445 def scan_dragto(self, x, y):
2446 """Adjust the view of the listbox to 10 times the
2447 difference between X and Y and the coordinates given in
2448 scan_mark."""
2449 self.tk.call(self._w, 'scan', 'dragto', x, y)
2450 def see(self, index):
2451 """Scroll such that INDEX is visible."""
2452 self.tk.call(self._w, 'see', index)
2453 def selection_anchor(self, index):
2454 """Set the fixed end oft the selection to INDEX."""
2455 self.tk.call(self._w, 'selection', 'anchor', index)
2456 select_anchor = selection_anchor
2457 def selection_clear(self, first, last=None):
2458 """Clear the selection from FIRST to LAST (not included)."""
2459 self.tk.call(self._w,
2460 'selection', 'clear', first, last)
2461 select_clear = selection_clear
2462 def selection_includes(self, index):
2463 """Return 1 if INDEX is part of the selection."""
2464 return self.tk.getboolean(self.tk.call(
2465 self._w, 'selection', 'includes', index))
2466 select_includes = selection_includes
2467 def selection_set(self, first, last=None):
2468 """Set the selection from FIRST to LAST (not included) without
2469 changing the currently selected elements."""
2470 self.tk.call(self._w, 'selection', 'set', first, last)
2471 select_set = selection_set
2472 def size(self):
2473 """Return the number of elements in the listbox."""
2474 return getint(self.tk.call(self._w, 'size'))
2475 def xview(self, *what):
2476 """Query and change horizontal position of the view."""
2477 if not what:
2478 return self._getdoubles(self.tk.call(self._w, 'xview'))
2479 self.tk.call((self._w, 'xview') + what)
2480 def xview_moveto(self, fraction):
2481 """Adjust the view in the window so that FRACTION of the
2482 total width of the entry is off-screen to the left."""
2483 self.tk.call(self._w, 'xview', 'moveto', fraction)
2484 def xview_scroll(self, number, what):
2485 """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
2486 self.tk.call(self._w, 'xview', 'scroll', number, what)
2487 def yview(self, *what):
2488 """Query and change vertical position of the view."""
2489 if not what:
2490 return self._getdoubles(self.tk.call(self._w, 'yview'))
2491 self.tk.call((self._w, 'yview') + what)
2492 def yview_moveto(self, fraction):
2493 """Adjust the view in the window so that FRACTION of the
2494 total width of the entry is off-screen to the top."""
2495 self.tk.call(self._w, 'yview', 'moveto', fraction)
2496 def yview_scroll(self, number, what):
2497 """Shift the y-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
2498 self.tk.call(self._w, 'yview', 'scroll', number, what)
Guido van Rossum09f1ad82001-09-05 19:29:56 +00002499 def itemcget(self, index, option):
2500 """Return the resource value for an ITEM and an OPTION."""
2501 return self.tk.call(
2502 (self._w, 'itemcget') + (index, '-'+option))
Guido van Rossuma0adb922001-09-01 18:29:55 +00002503 def itemconfigure(self, index, cnf=None, **kw):
Guido van Rossum09f1ad82001-09-05 19:29:56 +00002504 """Configure resources of an ITEM.
Guido van Rossuma0adb922001-09-01 18:29:55 +00002505
2506 The values for resources are specified as keyword arguments.
2507 To get an overview about the allowed keyword arguments
2508 call the method without arguments.
2509 Valid resource names: background, bg, foreground, fg,
2510 selectbackground, selectforeground."""
Martin v. Löwis6ce13152002-10-10 14:36:13 +00002511 return self._configure(('itemconfigure', index), cnf, kw)
Guido van Rossuma0adb922001-09-01 18:29:55 +00002512 itemconfig = itemconfigure
Guido van Rossum18468821994-06-20 07:49:28 +00002513
2514class Menu(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002515 """Menu widget which allows to display menu bars, pull-down menus and pop-up menus."""
2516 def __init__(self, master=None, cnf={}, **kw):
2517 """Construct menu widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002518
Fredrik Lundh06d28152000-08-09 18:03:12 +00002519 Valid resource names: activebackground, activeborderwidth,
2520 activeforeground, background, bd, bg, borderwidth, cursor,
2521 disabledforeground, fg, font, foreground, postcommand, relief,
2522 selectcolor, takefocus, tearoff, tearoffcommand, title, type."""
2523 Widget.__init__(self, master, 'menu', cnf, kw)
2524 def tk_bindForTraversal(self):
2525 pass # obsolete since Tk 4.0
2526 def tk_mbPost(self):
2527 self.tk.call('tk_mbPost', self._w)
2528 def tk_mbUnpost(self):
2529 self.tk.call('tk_mbUnpost')
2530 def tk_traverseToMenu(self, char):
2531 self.tk.call('tk_traverseToMenu', self._w, char)
2532 def tk_traverseWithinMenu(self, char):
2533 self.tk.call('tk_traverseWithinMenu', self._w, char)
2534 def tk_getMenuButtons(self):
2535 return self.tk.call('tk_getMenuButtons', self._w)
2536 def tk_nextMenu(self, count):
2537 self.tk.call('tk_nextMenu', count)
2538 def tk_nextMenuEntry(self, count):
2539 self.tk.call('tk_nextMenuEntry', count)
2540 def tk_invokeMenu(self):
2541 self.tk.call('tk_invokeMenu', self._w)
2542 def tk_firstMenu(self):
2543 self.tk.call('tk_firstMenu', self._w)
2544 def tk_mbButtonDown(self):
2545 self.tk.call('tk_mbButtonDown', self._w)
2546 def tk_popup(self, x, y, entry=""):
2547 """Post the menu at position X,Y with entry ENTRY."""
2548 self.tk.call('tk_popup', self._w, x, y, entry)
2549 def activate(self, index):
2550 """Activate entry at INDEX."""
2551 self.tk.call(self._w, 'activate', index)
2552 def add(self, itemType, cnf={}, **kw):
2553 """Internal function."""
2554 self.tk.call((self._w, 'add', itemType) +
2555 self._options(cnf, kw))
2556 def add_cascade(self, cnf={}, **kw):
2557 """Add hierarchical menu item."""
2558 self.add('cascade', cnf or kw)
2559 def add_checkbutton(self, cnf={}, **kw):
2560 """Add checkbutton menu item."""
2561 self.add('checkbutton', cnf or kw)
2562 def add_command(self, cnf={}, **kw):
2563 """Add command menu item."""
2564 self.add('command', cnf or kw)
2565 def add_radiobutton(self, cnf={}, **kw):
2566 """Addd radio menu item."""
2567 self.add('radiobutton', cnf or kw)
2568 def add_separator(self, cnf={}, **kw):
2569 """Add separator."""
2570 self.add('separator', cnf or kw)
2571 def insert(self, index, itemType, cnf={}, **kw):
2572 """Internal function."""
2573 self.tk.call((self._w, 'insert', index, itemType) +
2574 self._options(cnf, kw))
2575 def insert_cascade(self, index, cnf={}, **kw):
2576 """Add hierarchical menu item at INDEX."""
2577 self.insert(index, 'cascade', cnf or kw)
2578 def insert_checkbutton(self, index, cnf={}, **kw):
2579 """Add checkbutton menu item at INDEX."""
2580 self.insert(index, 'checkbutton', cnf or kw)
2581 def insert_command(self, index, cnf={}, **kw):
2582 """Add command menu item at INDEX."""
2583 self.insert(index, 'command', cnf or kw)
2584 def insert_radiobutton(self, index, cnf={}, **kw):
2585 """Addd radio menu item at INDEX."""
2586 self.insert(index, 'radiobutton', cnf or kw)
2587 def insert_separator(self, index, cnf={}, **kw):
2588 """Add separator at INDEX."""
2589 self.insert(index, 'separator', cnf or kw)
2590 def delete(self, index1, index2=None):
2591 """Delete menu items between INDEX1 and INDEX2 (not included)."""
2592 self.tk.call(self._w, 'delete', index1, index2)
2593 def entrycget(self, index, option):
2594 """Return the resource value of an menu item for OPTION at INDEX."""
2595 return self.tk.call(self._w, 'entrycget', index, '-' + option)
2596 def entryconfigure(self, index, cnf=None, **kw):
2597 """Configure a menu item at INDEX."""
Martin v. Löwis6ce13152002-10-10 14:36:13 +00002598 return self._configure(('entryconfigure', index), cnf, kw)
Fredrik Lundh06d28152000-08-09 18:03:12 +00002599 entryconfig = entryconfigure
2600 def index(self, index):
2601 """Return the index of a menu item identified by INDEX."""
2602 i = self.tk.call(self._w, 'index', index)
2603 if i == 'none': return None
2604 return getint(i)
2605 def invoke(self, index):
2606 """Invoke a menu item identified by INDEX and execute
2607 the associated command."""
2608 return self.tk.call(self._w, 'invoke', index)
2609 def post(self, x, y):
2610 """Display a menu at position X,Y."""
2611 self.tk.call(self._w, 'post', x, y)
2612 def type(self, index):
2613 """Return the type of the menu item at INDEX."""
2614 return self.tk.call(self._w, 'type', index)
2615 def unpost(self):
2616 """Unmap a menu."""
2617 self.tk.call(self._w, 'unpost')
2618 def yposition(self, index):
2619 """Return the y-position of the topmost pixel of the menu item at INDEX."""
2620 return getint(self.tk.call(
2621 self._w, 'yposition', index))
Guido van Rossum18468821994-06-20 07:49:28 +00002622
2623class Menubutton(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002624 """Menubutton widget, obsolete since Tk8.0."""
2625 def __init__(self, master=None, cnf={}, **kw):
2626 Widget.__init__(self, master, 'menubutton', cnf, kw)
Guido van Rossum18468821994-06-20 07:49:28 +00002627
2628class Message(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002629 """Message widget to display multiline text. Obsolete since Label does it too."""
2630 def __init__(self, master=None, cnf={}, **kw):
2631 Widget.__init__(self, master, 'message', cnf, kw)
Guido van Rossum18468821994-06-20 07:49:28 +00002632
2633class Radiobutton(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002634 """Radiobutton widget which shows only one of several buttons in on-state."""
2635 def __init__(self, master=None, cnf={}, **kw):
2636 """Construct a radiobutton widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002637
Fredrik Lundh06d28152000-08-09 18:03:12 +00002638 Valid resource names: activebackground, activeforeground, anchor,
2639 background, bd, bg, bitmap, borderwidth, command, cursor,
2640 disabledforeground, fg, font, foreground, height,
2641 highlightbackground, highlightcolor, highlightthickness, image,
2642 indicatoron, justify, padx, pady, relief, selectcolor, selectimage,
2643 state, takefocus, text, textvariable, underline, value, variable,
2644 width, wraplength."""
2645 Widget.__init__(self, master, 'radiobutton', cnf, kw)
2646 def deselect(self):
2647 """Put the button in off-state."""
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002648
Fredrik Lundh06d28152000-08-09 18:03:12 +00002649 self.tk.call(self._w, 'deselect')
2650 def flash(self):
2651 """Flash the button."""
2652 self.tk.call(self._w, 'flash')
2653 def invoke(self):
2654 """Toggle the button and invoke a command if given as resource."""
2655 return self.tk.call(self._w, 'invoke')
2656 def select(self):
2657 """Put the button in on-state."""
2658 self.tk.call(self._w, 'select')
Guido van Rossum18468821994-06-20 07:49:28 +00002659
2660class Scale(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002661 """Scale widget which can display a numerical scale."""
2662 def __init__(self, master=None, cnf={}, **kw):
2663 """Construct a scale widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002664
Fredrik Lundh06d28152000-08-09 18:03:12 +00002665 Valid resource names: activebackground, background, bigincrement, bd,
2666 bg, borderwidth, command, cursor, digits, fg, font, foreground, from,
2667 highlightbackground, highlightcolor, highlightthickness, label,
2668 length, orient, relief, repeatdelay, repeatinterval, resolution,
2669 showvalue, sliderlength, sliderrelief, state, takefocus,
2670 tickinterval, to, troughcolor, variable, width."""
2671 Widget.__init__(self, master, 'scale', cnf, kw)
2672 def get(self):
2673 """Get the current value as integer or float."""
2674 value = self.tk.call(self._w, 'get')
2675 try:
2676 return getint(value)
2677 except ValueError:
2678 return getdouble(value)
2679 def set(self, value):
2680 """Set the value to VALUE."""
2681 self.tk.call(self._w, 'set', value)
2682 def coords(self, value=None):
2683 """Return a tuple (X,Y) of the point along the centerline of the
2684 trough that corresponds to VALUE or the current value if None is
2685 given."""
2686
2687 return self._getints(self.tk.call(self._w, 'coords', value))
2688 def identify(self, x, y):
2689 """Return where the point X,Y lies. Valid return values are "slider",
2690 "though1" and "though2"."""
2691 return self.tk.call(self._w, 'identify', x, y)
Guido van Rossum18468821994-06-20 07:49:28 +00002692
2693class Scrollbar(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002694 """Scrollbar widget which displays a slider at a certain position."""
2695 def __init__(self, master=None, cnf={}, **kw):
2696 """Construct a scrollbar widget with the parent MASTER.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002697
Fredrik Lundh06d28152000-08-09 18:03:12 +00002698 Valid resource names: activebackground, activerelief,
2699 background, bd, bg, borderwidth, command, cursor,
2700 elementborderwidth, highlightbackground,
2701 highlightcolor, highlightthickness, jump, orient,
2702 relief, repeatdelay, repeatinterval, takefocus,
2703 troughcolor, width."""
2704 Widget.__init__(self, master, 'scrollbar', cnf, kw)
2705 def activate(self, index):
2706 """Display the element at INDEX with activebackground and activerelief.
2707 INDEX can be "arrow1","slider" or "arrow2"."""
2708 self.tk.call(self._w, 'activate', index)
2709 def delta(self, deltax, deltay):
2710 """Return the fractional change of the scrollbar setting if it
2711 would be moved by DELTAX or DELTAY pixels."""
2712 return getdouble(
2713 self.tk.call(self._w, 'delta', deltax, deltay))
2714 def fraction(self, x, y):
2715 """Return the fractional value which corresponds to a slider
2716 position of X,Y."""
2717 return getdouble(self.tk.call(self._w, 'fraction', x, y))
2718 def identify(self, x, y):
2719 """Return the element under position X,Y as one of
2720 "arrow1","slider","arrow2" or ""."""
2721 return self.tk.call(self._w, 'identify', x, y)
2722 def get(self):
2723 """Return the current fractional values (upper and lower end)
2724 of the slider position."""
2725 return self._getdoubles(self.tk.call(self._w, 'get'))
2726 def set(self, *args):
2727 """Set the fractional values of the slider position (upper and
2728 lower ends as value between 0 and 1)."""
2729 self.tk.call((self._w, 'set') + args)
Raymond Hettingerff41c482003-04-06 09:01:11 +00002730
2731
2732
Guido van Rossum18468821994-06-20 07:49:28 +00002733class Text(Widget):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002734 """Text widget which can display text in various forms."""
Fredrik Lundh06d28152000-08-09 18:03:12 +00002735 def __init__(self, master=None, cnf={}, **kw):
2736 """Construct a text widget with the parent MASTER.
Raymond Hettingerff41c482003-04-06 09:01:11 +00002737
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002738 STANDARD OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00002739
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002740 background, borderwidth, cursor,
2741 exportselection, font, foreground,
2742 highlightbackground, highlightcolor,
2743 highlightthickness, insertbackground,
2744 insertborderwidth, insertofftime,
2745 insertontime, insertwidth, padx, pady,
Raymond Hettingerff41c482003-04-06 09:01:11 +00002746 relief, selectbackground,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002747 selectborderwidth, selectforeground,
Raymond Hettingerff41c482003-04-06 09:01:11 +00002748 setgrid, takefocus,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002749 xscrollcommand, yscrollcommand,
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002750
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002751 WIDGET-SPECIFIC OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00002752
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002753 autoseparators, height, maxundo,
Raymond Hettingerff41c482003-04-06 09:01:11 +00002754 spacing1, spacing2, spacing3,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002755 state, tabs, undo, width, wrap,
Raymond Hettingerff41c482003-04-06 09:01:11 +00002756
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002757 """
Fredrik Lundh06d28152000-08-09 18:03:12 +00002758 Widget.__init__(self, master, 'text', cnf, kw)
2759 def bbox(self, *args):
2760 """Return a tuple of (x,y,width,height) which gives the bounding
2761 box of the visible part of the character at the index in ARGS."""
2762 return self._getints(
2763 self.tk.call((self._w, 'bbox') + args)) or None
2764 def tk_textSelectTo(self, index):
2765 self.tk.call('tk_textSelectTo', self._w, index)
2766 def tk_textBackspace(self):
2767 self.tk.call('tk_textBackspace', self._w)
2768 def tk_textIndexCloser(self, a, b, c):
2769 self.tk.call('tk_textIndexCloser', self._w, a, b, c)
2770 def tk_textResetAnchor(self, index):
2771 self.tk.call('tk_textResetAnchor', self._w, index)
2772 def compare(self, index1, op, index2):
2773 """Return whether between index INDEX1 and index INDEX2 the
2774 relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=."""
2775 return self.tk.getboolean(self.tk.call(
2776 self._w, 'compare', index1, op, index2))
2777 def debug(self, boolean=None):
2778 """Turn on the internal consistency checks of the B-Tree inside the text
2779 widget according to BOOLEAN."""
2780 return self.tk.getboolean(self.tk.call(
2781 self._w, 'debug', boolean))
2782 def delete(self, index1, index2=None):
2783 """Delete the characters between INDEX1 and INDEX2 (not included)."""
2784 self.tk.call(self._w, 'delete', index1, index2)
2785 def dlineinfo(self, index):
2786 """Return tuple (x,y,width,height,baseline) giving the bounding box
2787 and baseline position of the visible part of the line containing
2788 the character at INDEX."""
2789 return self._getints(self.tk.call(self._w, 'dlineinfo', index))
Guido van Rossum256705b2002-04-23 13:29:43 +00002790 def dump(self, index1, index2=None, command=None, **kw):
2791 """Return the contents of the widget between index1 and index2.
Raymond Hettingerff41c482003-04-06 09:01:11 +00002792
Guido van Rossum256705b2002-04-23 13:29:43 +00002793 The type of contents returned in filtered based on the keyword
2794 parameters; if 'all', 'image', 'mark', 'tag', 'text', or 'window' are
2795 given and true, then the corresponding items are returned. The result
2796 is a list of triples of the form (key, value, index). If none of the
2797 keywords are true then 'all' is used by default.
Raymond Hettingerff41c482003-04-06 09:01:11 +00002798
Guido van Rossum256705b2002-04-23 13:29:43 +00002799 If the 'command' argument is given, it is called once for each element
2800 of the list of triples, with the values of each triple serving as the
2801 arguments to the function. In this case the list is not returned."""
2802 args = []
2803 func_name = None
2804 result = None
2805 if not command:
2806 # Never call the dump command without the -command flag, since the
2807 # output could involve Tcl quoting and would be a pain to parse
2808 # right. Instead just set the command to build a list of triples
2809 # as if we had done the parsing.
2810 result = []
2811 def append_triple(key, value, index, result=result):
2812 result.append((key, value, index))
2813 command = append_triple
2814 try:
2815 if not isinstance(command, str):
2816 func_name = command = self._register(command)
2817 args += ["-command", command]
2818 for key in kw:
2819 if kw[key]: args.append("-" + key)
2820 args.append(index1)
2821 if index2:
2822 args.append(index2)
2823 self.tk.call(self._w, "dump", *args)
2824 return result
2825 finally:
2826 if func_name:
2827 self.deletecommand(func_name)
Raymond Hettingerff41c482003-04-06 09:01:11 +00002828
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002829 ## new in tk8.4
2830 def edit(self, *args):
2831 """Internal method
Raymond Hettingerff41c482003-04-06 09:01:11 +00002832
2833 This method controls the undo mechanism and
2834 the modified flag. The exact behavior of the
2835 command depends on the option argument that
2836 follows the edit argument. The following forms
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002837 of the command are currently supported:
Raymond Hettingerff41c482003-04-06 09:01:11 +00002838
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002839 edit_modified, edit_redo, edit_reset, edit_separator
2840 and edit_undo
Raymond Hettingerff41c482003-04-06 09:01:11 +00002841
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002842 """
2843 return self._getints(
2844 self.tk.call((self._w, 'edit') + args)) or ()
2845
2846 def edit_modified(self, arg=None):
2847 """Get or Set the modified flag
Raymond Hettingerff41c482003-04-06 09:01:11 +00002848
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002849 If arg is not specified, returns the modified
Raymond Hettingerff41c482003-04-06 09:01:11 +00002850 flag of the widget. The insert, delete, edit undo and
2851 edit redo commands or the user can set or clear the
2852 modified flag. If boolean is specified, sets the
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002853 modified flag of the widget to arg.
2854 """
2855 return self.edit("modified", arg)
Raymond Hettingerff41c482003-04-06 09:01:11 +00002856
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002857 def edit_redo(self):
2858 """Redo the last undone edit
Raymond Hettingerff41c482003-04-06 09:01:11 +00002859
2860 When the undo option is true, reapplies the last
2861 undone edits provided no other edits were done since
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002862 then. Generates an error when the redo stack is empty.
2863 Does nothing when the undo option is false.
2864 """
2865 return self.edit("redo")
Raymond Hettingerff41c482003-04-06 09:01:11 +00002866
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002867 def edit_reset(self):
2868 """Clears the undo and redo stacks
2869 """
2870 return self.edit("reset")
Raymond Hettingerff41c482003-04-06 09:01:11 +00002871
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002872 def edit_separator(self):
Raymond Hettingerff41c482003-04-06 09:01:11 +00002873 """Inserts a separator (boundary) on the undo stack.
2874
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002875 Does nothing when the undo option is false
2876 """
2877 return self.edit("separator")
Raymond Hettingerff41c482003-04-06 09:01:11 +00002878
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002879 def edit_undo(self):
Raymond Hettingerff41c482003-04-06 09:01:11 +00002880 """Undoes the last edit action
2881
2882 If the undo option is true. An edit action is defined
2883 as all the insert and delete commands that are recorded
2884 on the undo stack in between two separators. Generates
2885 an error when the undo stack is empty. Does nothing
Martin v. Löwis2ec36272002-10-13 10:22:08 +00002886 when the undo option is false
2887 """
2888 return self.edit("undo")
Raymond Hettingerff41c482003-04-06 09:01:11 +00002889
Fredrik Lundh06d28152000-08-09 18:03:12 +00002890 def get(self, index1, index2=None):
2891 """Return the text from INDEX1 to INDEX2 (not included)."""
2892 return self.tk.call(self._w, 'get', index1, index2)
2893 # (Image commands are new in 8.0)
2894 def image_cget(self, index, option):
2895 """Return the value of OPTION of an embedded image at INDEX."""
2896 if option[:1] != "-":
2897 option = "-" + option
2898 if option[-1:] == "_":
2899 option = option[:-1]
2900 return self.tk.call(self._w, "image", "cget", index, option)
Martin v. Löwis6ce13152002-10-10 14:36:13 +00002901 def image_configure(self, index, cnf=None, **kw):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002902 """Configure an embedded image at INDEX."""
Martin v. Löwis6ce13152002-10-10 14:36:13 +00002903 return self._configure(('image', 'configure', index), cnf, kw)
Fredrik Lundh06d28152000-08-09 18:03:12 +00002904 def image_create(self, index, cnf={}, **kw):
2905 """Create an embedded image at INDEX."""
Raymond Hettingerff41c482003-04-06 09:01:11 +00002906 return self.tk.call(
2907 self._w, "image", "create", index,
2908 *self._options(cnf, kw))
Fredrik Lundh06d28152000-08-09 18:03:12 +00002909 def image_names(self):
2910 """Return all names of embedded images in this widget."""
2911 return self.tk.call(self._w, "image", "names")
2912 def index(self, index):
2913 """Return the index in the form line.char for INDEX."""
2914 return self.tk.call(self._w, 'index', index)
2915 def insert(self, index, chars, *args):
2916 """Insert CHARS before the characters at INDEX. An additional
2917 tag can be given in ARGS. Additional CHARS and tags can follow in ARGS."""
2918 self.tk.call((self._w, 'insert', index, chars) + args)
2919 def mark_gravity(self, markName, direction=None):
2920 """Change the gravity of a mark MARKNAME to DIRECTION (LEFT or RIGHT).
2921 Return the current value if None is given for DIRECTION."""
2922 return self.tk.call(
2923 (self._w, 'mark', 'gravity', markName, direction))
2924 def mark_names(self):
2925 """Return all mark names."""
2926 return self.tk.splitlist(self.tk.call(
2927 self._w, 'mark', 'names'))
2928 def mark_set(self, markName, index):
2929 """Set mark MARKNAME before the character at INDEX."""
2930 self.tk.call(self._w, 'mark', 'set', markName, index)
2931 def mark_unset(self, *markNames):
2932 """Delete all marks in MARKNAMES."""
2933 self.tk.call((self._w, 'mark', 'unset') + markNames)
2934 def mark_next(self, index):
2935 """Return the name of the next mark after INDEX."""
2936 return self.tk.call(self._w, 'mark', 'next', index) or None
2937 def mark_previous(self, index):
2938 """Return the name of the previous mark before INDEX."""
2939 return self.tk.call(self._w, 'mark', 'previous', index) or None
2940 def scan_mark(self, x, y):
2941 """Remember the current X, Y coordinates."""
2942 self.tk.call(self._w, 'scan', 'mark', x, y)
2943 def scan_dragto(self, x, y):
2944 """Adjust the view of the text to 10 times the
2945 difference between X and Y and the coordinates given in
2946 scan_mark."""
2947 self.tk.call(self._w, 'scan', 'dragto', x, y)
2948 def search(self, pattern, index, stopindex=None,
2949 forwards=None, backwards=None, exact=None,
2950 regexp=None, nocase=None, count=None):
2951 """Search PATTERN beginning from INDEX until STOPINDEX.
2952 Return the index of the first character of a match or an empty string."""
2953 args = [self._w, 'search']
2954 if forwards: args.append('-forwards')
2955 if backwards: args.append('-backwards')
2956 if exact: args.append('-exact')
2957 if regexp: args.append('-regexp')
2958 if nocase: args.append('-nocase')
2959 if count: args.append('-count'); args.append(count)
2960 if pattern[0] == '-': args.append('--')
2961 args.append(pattern)
2962 args.append(index)
2963 if stopindex: args.append(stopindex)
2964 return self.tk.call(tuple(args))
2965 def see(self, index):
2966 """Scroll such that the character at INDEX is visible."""
2967 self.tk.call(self._w, 'see', index)
2968 def tag_add(self, tagName, index1, *args):
2969 """Add tag TAGNAME to all characters between INDEX1 and index2 in ARGS.
2970 Additional pairs of indices may follow in ARGS."""
2971 self.tk.call(
2972 (self._w, 'tag', 'add', tagName, index1) + args)
2973 def tag_unbind(self, tagName, sequence, funcid=None):
2974 """Unbind for all characters with TAGNAME for event SEQUENCE the
2975 function identified with FUNCID."""
2976 self.tk.call(self._w, 'tag', 'bind', tagName, sequence, '')
2977 if funcid:
2978 self.deletecommand(funcid)
2979 def tag_bind(self, tagName, sequence, func, add=None):
2980 """Bind to all characters with TAGNAME at event SEQUENCE a call to function FUNC.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00002981
Fredrik Lundh06d28152000-08-09 18:03:12 +00002982 An additional boolean parameter ADD specifies whether FUNC will be
2983 called additionally to the other bound function or whether it will
2984 replace the previous function. See bind for the return value."""
2985 return self._bind((self._w, 'tag', 'bind', tagName),
2986 sequence, func, add)
2987 def tag_cget(self, tagName, option):
2988 """Return the value of OPTION for tag TAGNAME."""
2989 if option[:1] != '-':
2990 option = '-' + option
2991 if option[-1:] == '_':
2992 option = option[:-1]
2993 return self.tk.call(self._w, 'tag', 'cget', tagName, option)
Martin v. Löwis6ce13152002-10-10 14:36:13 +00002994 def tag_configure(self, tagName, cnf=None, **kw):
Fredrik Lundh06d28152000-08-09 18:03:12 +00002995 """Configure a tag TAGNAME."""
Martin v. Löwis6ce13152002-10-10 14:36:13 +00002996 return self._configure(('tag', 'configure', tagName), cnf, kw)
Fredrik Lundh06d28152000-08-09 18:03:12 +00002997 tag_config = tag_configure
2998 def tag_delete(self, *tagNames):
2999 """Delete all tags in TAGNAMES."""
3000 self.tk.call((self._w, 'tag', 'delete') + tagNames)
3001 def tag_lower(self, tagName, belowThis=None):
3002 """Change the priority of tag TAGNAME such that it is lower
3003 than the priority of BELOWTHIS."""
3004 self.tk.call(self._w, 'tag', 'lower', tagName, belowThis)
3005 def tag_names(self, index=None):
3006 """Return a list of all tag names."""
3007 return self.tk.splitlist(
3008 self.tk.call(self._w, 'tag', 'names', index))
3009 def tag_nextrange(self, tagName, index1, index2=None):
3010 """Return a list of start and end index for the first sequence of
3011 characters between INDEX1 and INDEX2 which all have tag TAGNAME.
3012 The text is searched forward from INDEX1."""
3013 return self.tk.splitlist(self.tk.call(
3014 self._w, 'tag', 'nextrange', tagName, index1, index2))
3015 def tag_prevrange(self, tagName, index1, index2=None):
3016 """Return a list of start and end index for the first sequence of
3017 characters between INDEX1 and INDEX2 which all have tag TAGNAME.
3018 The text is searched backwards from INDEX1."""
3019 return self.tk.splitlist(self.tk.call(
3020 self._w, 'tag', 'prevrange', tagName, index1, index2))
3021 def tag_raise(self, tagName, aboveThis=None):
3022 """Change the priority of tag TAGNAME such that it is higher
3023 than the priority of ABOVETHIS."""
3024 self.tk.call(
3025 self._w, 'tag', 'raise', tagName, aboveThis)
3026 def tag_ranges(self, tagName):
3027 """Return a list of ranges of text which have tag TAGNAME."""
3028 return self.tk.splitlist(self.tk.call(
3029 self._w, 'tag', 'ranges', tagName))
3030 def tag_remove(self, tagName, index1, index2=None):
3031 """Remove tag TAGNAME from all characters between INDEX1 and INDEX2."""
3032 self.tk.call(
3033 self._w, 'tag', 'remove', tagName, index1, index2)
3034 def window_cget(self, index, option):
3035 """Return the value of OPTION of an embedded window at INDEX."""
3036 if option[:1] != '-':
3037 option = '-' + option
3038 if option[-1:] == '_':
3039 option = option[:-1]
3040 return self.tk.call(self._w, 'window', 'cget', index, option)
Martin v. Löwis6ce13152002-10-10 14:36:13 +00003041 def window_configure(self, index, cnf=None, **kw):
Fredrik Lundh06d28152000-08-09 18:03:12 +00003042 """Configure an embedded window at INDEX."""
Martin v. Löwis6ce13152002-10-10 14:36:13 +00003043 return self._configure(('window', 'configure', index), cnf, kw)
Fredrik Lundh06d28152000-08-09 18:03:12 +00003044 window_config = window_configure
3045 def window_create(self, index, cnf={}, **kw):
3046 """Create a window at INDEX."""
3047 self.tk.call(
3048 (self._w, 'window', 'create', index)
3049 + self._options(cnf, kw))
3050 def window_names(self):
3051 """Return all names of embedded windows in this widget."""
3052 return self.tk.splitlist(
3053 self.tk.call(self._w, 'window', 'names'))
3054 def xview(self, *what):
3055 """Query and change horizontal position of the view."""
3056 if not what:
3057 return self._getdoubles(self.tk.call(self._w, 'xview'))
3058 self.tk.call((self._w, 'xview') + what)
Fredrik Lundh5bd2cd62000-08-09 18:29:51 +00003059 def xview_moveto(self, fraction):
3060 """Adjusts the view in the window so that FRACTION of the
3061 total width of the canvas is off-screen to the left."""
3062 self.tk.call(self._w, 'xview', 'moveto', fraction)
3063 def xview_scroll(self, number, what):
3064 """Shift the x-view according to NUMBER which is measured
3065 in "units" or "pages" (WHAT)."""
3066 self.tk.call(self._w, 'xview', 'scroll', number, what)
Fredrik Lundh8fffa202000-08-09 18:51:01 +00003067 def yview(self, *what):
Fredrik Lundh06d28152000-08-09 18:03:12 +00003068 """Query and change vertical position of the view."""
Fredrik Lundh8fffa202000-08-09 18:51:01 +00003069 if not what:
Fredrik Lundh06d28152000-08-09 18:03:12 +00003070 return self._getdoubles(self.tk.call(self._w, 'yview'))
Fredrik Lundh8fffa202000-08-09 18:51:01 +00003071 self.tk.call((self._w, 'yview') + what)
Fredrik Lundh5bd2cd62000-08-09 18:29:51 +00003072 def yview_moveto(self, fraction):
3073 """Adjusts the view in the window so that FRACTION of the
3074 total height of the canvas is off-screen to the top."""
3075 self.tk.call(self._w, 'yview', 'moveto', fraction)
3076 def yview_scroll(self, number, what):
3077 """Shift the y-view according to NUMBER which is measured
3078 in "units" or "pages" (WHAT)."""
3079 self.tk.call(self._w, 'yview', 'scroll', number, what)
Fredrik Lundh06d28152000-08-09 18:03:12 +00003080 def yview_pickplace(self, *what):
3081 """Obsolete function, use see."""
3082 self.tk.call((self._w, 'yview', '-pickplace') + what)
Guido van Rossum18468821994-06-20 07:49:28 +00003083
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003084
Guido van Rossum28574b51996-10-21 15:16:51 +00003085class _setit:
Fredrik Lundh06d28152000-08-09 18:03:12 +00003086 """Internal class. It wraps the command in the widget OptionMenu."""
3087 def __init__(self, var, value, callback=None):
3088 self.__value = value
3089 self.__var = var
3090 self.__callback = callback
3091 def __call__(self, *args):
3092 self.__var.set(self.__value)
3093 if self.__callback:
Raymond Hettingerff41c482003-04-06 09:01:11 +00003094 self.__callback(self.__value, *args)
Guido van Rossum28574b51996-10-21 15:16:51 +00003095
3096class OptionMenu(Menubutton):
Fredrik Lundh06d28152000-08-09 18:03:12 +00003097 """OptionMenu which allows the user to select a value from a menu."""
3098 def __init__(self, master, variable, value, *values, **kwargs):
3099 """Construct an optionmenu widget with the parent MASTER, with
3100 the resource textvariable set to VARIABLE, the initially selected
3101 value VALUE, the other menu values VALUES and an additional
3102 keyword argument command."""
3103 kw = {"borderwidth": 2, "textvariable": variable,
3104 "indicatoron": 1, "relief": RAISED, "anchor": "c",
3105 "highlightthickness": 2}
3106 Widget.__init__(self, master, "menubutton", kw)
3107 self.widgetName = 'tk_optionMenu'
3108 menu = self.__menu = Menu(self, name="menu", tearoff=0)
3109 self.menuname = menu._w
3110 # 'command' is the only supported keyword
3111 callback = kwargs.get('command')
3112 if kwargs.has_key('command'):
3113 del kwargs['command']
3114 if kwargs:
3115 raise TclError, 'unknown option -'+kwargs.keys()[0]
3116 menu.add_command(label=value,
3117 command=_setit(variable, value, callback))
3118 for v in values:
3119 menu.add_command(label=v,
3120 command=_setit(variable, v, callback))
3121 self["menu"] = menu
Guido van Rossum28574b51996-10-21 15:16:51 +00003122
Fredrik Lundh06d28152000-08-09 18:03:12 +00003123 def __getitem__(self, name):
3124 if name == 'menu':
3125 return self.__menu
3126 return Widget.__getitem__(self, name)
Guido van Rossum28574b51996-10-21 15:16:51 +00003127
Fredrik Lundh06d28152000-08-09 18:03:12 +00003128 def destroy(self):
3129 """Destroy this widget and the associated menu."""
3130 Menubutton.destroy(self)
3131 self.__menu = None
Guido van Rossumbf4d8f91995-09-01 20:35:37 +00003132
Guido van Rossum35f67fb1995-08-04 03:50:29 +00003133class Image:
Fredrik Lundh06d28152000-08-09 18:03:12 +00003134 """Base class for images."""
Martin v. Löwis0d8ce612000-09-08 16:28:30 +00003135 _last_id = 0
Fredrik Lundh06d28152000-08-09 18:03:12 +00003136 def __init__(self, imgtype, name=None, cnf={}, master=None, **kw):
3137 self.name = None
3138 if not master:
3139 master = _default_root
3140 if not master:
3141 raise RuntimeError, 'Too early to create image'
3142 self.tk = master.tk
3143 if not name:
Martin v. Löwis0d8ce612000-09-08 16:28:30 +00003144 Image._last_id += 1
Walter Dörwald70a6b492004-02-12 17:35:32 +00003145 name = "pyimage%r" % (Image._last_id,) # tk itself would use image<x>
Fredrik Lundh06d28152000-08-09 18:03:12 +00003146 # The following is needed for systems where id(x)
3147 # can return a negative number, such as Linux/m68k:
3148 if name[0] == '-': name = '_' + name[1:]
3149 if kw and cnf: cnf = _cnfmerge((cnf, kw))
3150 elif kw: cnf = kw
3151 options = ()
3152 for k, v in cnf.items():
3153 if callable(v):
3154 v = self._register(v)
3155 options = options + ('-'+k, v)
3156 self.tk.call(('image', 'create', imgtype, name,) + options)
3157 self.name = name
3158 def __str__(self): return self.name
3159 def __del__(self):
3160 if self.name:
3161 try:
3162 self.tk.call('image', 'delete', self.name)
3163 except TclError:
3164 # May happen if the root was destroyed
3165 pass
3166 def __setitem__(self, key, value):
3167 self.tk.call(self.name, 'configure', '-'+key, value)
3168 def __getitem__(self, key):
3169 return self.tk.call(self.name, 'configure', '-'+key)
3170 def configure(self, **kw):
3171 """Configure the image."""
3172 res = ()
3173 for k, v in _cnfmerge(kw).items():
3174 if v is not None:
3175 if k[-1] == '_': k = k[:-1]
3176 if callable(v):
3177 v = self._register(v)
3178 res = res + ('-'+k, v)
3179 self.tk.call((self.name, 'config') + res)
3180 config = configure
3181 def height(self):
3182 """Return the height of the image."""
3183 return getint(
3184 self.tk.call('image', 'height', self.name))
3185 def type(self):
3186 """Return the type of the imgage, e.g. "photo" or "bitmap"."""
3187 return self.tk.call('image', 'type', self.name)
3188 def width(self):
3189 """Return the width of the image."""
3190 return getint(
3191 self.tk.call('image', 'width', self.name))
Guido van Rossum35f67fb1995-08-04 03:50:29 +00003192
3193class PhotoImage(Image):
Fredrik Lundh06d28152000-08-09 18:03:12 +00003194 """Widget which can display colored images in GIF, PPM/PGM format."""
3195 def __init__(self, name=None, cnf={}, master=None, **kw):
3196 """Create an image with NAME.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00003197
Fredrik Lundh06d28152000-08-09 18:03:12 +00003198 Valid resource names: data, format, file, gamma, height, palette,
3199 width."""
Raymond Hettingerff41c482003-04-06 09:01:11 +00003200 Image.__init__(self, 'photo', name, cnf, master, **kw)
Fredrik Lundh06d28152000-08-09 18:03:12 +00003201 def blank(self):
3202 """Display a transparent image."""
3203 self.tk.call(self.name, 'blank')
3204 def cget(self, option):
3205 """Return the value of OPTION."""
3206 return self.tk.call(self.name, 'cget', '-' + option)
3207 # XXX config
3208 def __getitem__(self, key):
3209 return self.tk.call(self.name, 'cget', '-' + key)
3210 # XXX copy -from, -to, ...?
3211 def copy(self):
3212 """Return a new PhotoImage with the same image as this widget."""
3213 destImage = PhotoImage()
3214 self.tk.call(destImage, 'copy', self.name)
3215 return destImage
3216 def zoom(self,x,y=''):
3217 """Return a new PhotoImage with the same image as this widget
3218 but zoom it with X and Y."""
3219 destImage = PhotoImage()
3220 if y=='': y=x
3221 self.tk.call(destImage, 'copy', self.name, '-zoom',x,y)
3222 return destImage
3223 def subsample(self,x,y=''):
3224 """Return a new PhotoImage based on the same image as this widget
3225 but use only every Xth or Yth pixel."""
3226 destImage = PhotoImage()
3227 if y=='': y=x
3228 self.tk.call(destImage, 'copy', self.name, '-subsample',x,y)
3229 return destImage
3230 def get(self, x, y):
3231 """Return the color (red, green, blue) of the pixel at X,Y."""
3232 return self.tk.call(self.name, 'get', x, y)
3233 def put(self, data, to=None):
3234 """Put row formated colors to image starting from
3235 position TO, e.g. image.put("{red green} {blue yellow}", to=(4,6))"""
3236 args = (self.name, 'put', data)
3237 if to:
3238 if to[0] == '-to':
3239 to = to[1:]
3240 args = args + ('-to',) + tuple(to)
3241 self.tk.call(args)
3242 # XXX read
3243 def write(self, filename, format=None, from_coords=None):
3244 """Write image to file FILENAME in FORMAT starting from
3245 position FROM_COORDS."""
3246 args = (self.name, 'write', filename)
3247 if format:
3248 args = args + ('-format', format)
3249 if from_coords:
3250 args = args + ('-from',) + tuple(from_coords)
3251 self.tk.call(args)
Guido van Rossum35f67fb1995-08-04 03:50:29 +00003252
3253class BitmapImage(Image):
Fredrik Lundh06d28152000-08-09 18:03:12 +00003254 """Widget which can display a bitmap."""
3255 def __init__(self, name=None, cnf={}, master=None, **kw):
3256 """Create a bitmap with NAME.
Guido van Rossum5917ecb2000-06-29 16:30:50 +00003257
Fredrik Lundh06d28152000-08-09 18:03:12 +00003258 Valid resource names: background, data, file, foreground, maskdata, maskfile."""
Raymond Hettingerff41c482003-04-06 09:01:11 +00003259 Image.__init__(self, 'bitmap', name, cnf, master, **kw)
Guido van Rossum35f67fb1995-08-04 03:50:29 +00003260
3261def image_names(): return _default_root.tk.call('image', 'names')
3262def image_types(): return _default_root.tk.call('image', 'types')
3263
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003264
3265class Spinbox(Widget):
3266 """spinbox widget."""
3267 def __init__(self, master=None, cnf={}, **kw):
3268 """Construct a spinbox widget with the parent MASTER.
Raymond Hettingerff41c482003-04-06 09:01:11 +00003269
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003270 STANDARD OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00003271
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003272 activebackground, background, borderwidth,
3273 cursor, exportselection, font, foreground,
3274 highlightbackground, highlightcolor,
3275 highlightthickness, insertbackground,
3276 insertborderwidth, insertofftime,
Raymond Hettingerff41c482003-04-06 09:01:11 +00003277 insertontime, insertwidth, justify, relief,
3278 repeatdelay, repeatinterval,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003279 selectbackground, selectborderwidth
3280 selectforeground, takefocus, textvariable
3281 xscrollcommand.
Raymond Hettingerff41c482003-04-06 09:01:11 +00003282
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003283 WIDGET-SPECIFIC OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00003284
3285 buttonbackground, buttoncursor,
3286 buttondownrelief, buttonuprelief,
3287 command, disabledbackground,
3288 disabledforeground, format, from,
3289 invalidcommand, increment,
3290 readonlybackground, state, to,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003291 validate, validatecommand values,
3292 width, wrap,
3293 """
3294 Widget.__init__(self, master, 'spinbox', cnf, kw)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003295
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003296 def bbox(self, index):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003297 """Return a tuple of X1,Y1,X2,Y2 coordinates for a
3298 rectangle which encloses the character given by index.
3299
3300 The first two elements of the list give the x and y
3301 coordinates of the upper-left corner of the screen
3302 area covered by the character (in pixels relative
3303 to the widget) and the last two elements give the
3304 width and height of the character, in pixels. The
3305 bounding box may refer to a region outside the
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003306 visible area of the window.
3307 """
3308 return self.tk.call(self._w, 'bbox', index)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003309
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003310 def delete(self, first, last=None):
3311 """Delete one or more elements of the spinbox.
Raymond Hettingerff41c482003-04-06 09:01:11 +00003312
3313 First is the index of the first character to delete,
3314 and last is the index of the character just after
3315 the last one to delete. If last isn't specified it
3316 defaults to first+1, i.e. a single character is
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003317 deleted. This command returns an empty string.
3318 """
3319 return self.tk.call(self._w, 'delete', first, last)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003320
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003321 def get(self):
3322 """Returns the spinbox's string"""
3323 return self.tk.call(self._w, 'get')
Raymond Hettingerff41c482003-04-06 09:01:11 +00003324
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003325 def icursor(self, index):
3326 """Alter the position of the insertion cursor.
Raymond Hettingerff41c482003-04-06 09:01:11 +00003327
3328 The insertion cursor will be displayed just before
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003329 the character given by index. Returns an empty string
3330 """
3331 return self.tk.call(self._w, 'icursor', index)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003332
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003333 def identify(self, x, y):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003334 """Returns the name of the widget at position x, y
3335
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003336 Return value is one of: none, buttondown, buttonup, entry
3337 """
3338 return self.tk.call(self._w, 'identify', x, y)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003339
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003340 def index(self, index):
3341 """Returns the numerical index corresponding to index
3342 """
3343 return self.tk.call(self._w, 'index', index)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003344
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003345 def insert(self, index, s):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003346 """Insert string s at index
3347
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003348 Returns an empty string.
3349 """
3350 return self.tk.call(self._w, 'insert', index, s)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003351
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003352 def invoke(self, element):
3353 """Causes the specified element to be invoked
Raymond Hettingerff41c482003-04-06 09:01:11 +00003354
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003355 The element could be buttondown or buttonup
3356 triggering the action associated with it.
3357 """
3358 return self.tk.call(self._w, 'invoke', element)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003359
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003360 def scan(self, *args):
3361 """Internal function."""
3362 return self._getints(
3363 self.tk.call((self._w, 'scan') + args)) or ()
Raymond Hettingerff41c482003-04-06 09:01:11 +00003364
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003365 def scan_mark(self, x):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003366 """Records x and the current view in the spinbox window;
3367
3368 used in conjunction with later scan dragto commands.
3369 Typically this command is associated with a mouse button
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003370 press in the widget. It returns an empty string.
3371 """
3372 return self.scan("mark", x)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003373
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003374 def scan_dragto(self, x):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003375 """Compute the difference between the given x argument
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003376 and the x argument to the last scan mark command
Raymond Hettingerff41c482003-04-06 09:01:11 +00003377
3378 It then adjusts the view left or right by 10 times the
3379 difference in x-coordinates. This command is typically
3380 associated with mouse motion events in the widget, to
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003381 produce the effect of dragging the spinbox at high speed
3382 through the window. The return value is an empty string.
3383 """
3384 return self.scan("dragto", x)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003385
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003386 def selection(self, *args):
3387 """Internal function."""
3388 return self._getints(
3389 self.tk.call((self._w, 'selection') + args)) or ()
Raymond Hettingerff41c482003-04-06 09:01:11 +00003390
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003391 def selection_adjust(self, index):
3392 """Locate the end of the selection nearest to the character
Raymond Hettingerff41c482003-04-06 09:01:11 +00003393 given by index,
3394
3395 Then adjust that end of the selection to be at index
3396 (i.e including but not going beyond index). The other
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003397 end of the selection is made the anchor point for future
Raymond Hettingerff41c482003-04-06 09:01:11 +00003398 select to commands. If the selection isn't currently in
3399 the spinbox, then a new selection is created to include
3400 the characters between index and the most recent selection
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003401 anchor point, inclusive. Returns an empty string.
3402 """
3403 return self.selection("adjust", index)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003404
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003405 def selection_clear(self):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003406 """Clear the selection
3407
3408 If the selection isn't in this widget then the
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003409 command has no effect. Returns an empty string.
3410 """
3411 return self.selection("clear")
Raymond Hettingerff41c482003-04-06 09:01:11 +00003412
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003413 def selection_element(self, element=None):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003414 """Sets or gets the currently selected element.
3415
3416 If a spinbutton element is specified, it will be
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003417 displayed depressed
3418 """
3419 return self.selection("element", element)
3420
3421###########################################################################
3422
3423class LabelFrame(Widget):
3424 """labelframe widget."""
3425 def __init__(self, master=None, cnf={}, **kw):
3426 """Construct a labelframe widget with the parent MASTER.
Raymond Hettingerff41c482003-04-06 09:01:11 +00003427
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003428 STANDARD OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00003429
3430 borderwidth, cursor, font, foreground,
3431 highlightbackground, highlightcolor,
3432 highlightthickness, padx, pady, relief,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003433 takefocus, text
Raymond Hettingerff41c482003-04-06 09:01:11 +00003434
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003435 WIDGET-SPECIFIC OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00003436
3437 background, class, colormap, container,
3438 height, labelanchor, labelwidget,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003439 visual, width
3440 """
3441 Widget.__init__(self, master, 'labelframe', cnf, kw)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003442
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003443########################################################################
3444
3445class PanedWindow(Widget):
3446 """panedwindow widget."""
3447 def __init__(self, master=None, cnf={}, **kw):
3448 """Construct a panedwindow widget with the parent MASTER.
Raymond Hettingerff41c482003-04-06 09:01:11 +00003449
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003450 STANDARD OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00003451
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003452 background, borderwidth, cursor, height,
3453 orient, relief, width
Raymond Hettingerff41c482003-04-06 09:01:11 +00003454
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003455 WIDGET-SPECIFIC OPTIONS
Raymond Hettingerff41c482003-04-06 09:01:11 +00003456
3457 handlepad, handlesize, opaqueresize,
3458 sashcursor, sashpad, sashrelief,
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003459 sashwidth, showhandle,
3460 """
3461 Widget.__init__(self, master, 'panedwindow', cnf, kw)
3462
3463 def add(self, child, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003464 """Add a child widget to the panedwindow in a new pane.
3465
3466 The child argument is the name of the child widget
3467 followed by pairs of arguments that specify how to
3468 manage the windows. Options may have any of the values
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003469 accepted by the configure subcommand.
3470 """
3471 self.tk.call((self._w, 'add', child) + self._options(kw))
Raymond Hettingerff41c482003-04-06 09:01:11 +00003472
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003473 def remove(self, child):
3474 """Remove the pane containing child from the panedwindow
Raymond Hettingerff41c482003-04-06 09:01:11 +00003475
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003476 All geometry management options for child will be forgotten.
3477 """
3478 self.tk.call(self._w, 'forget', child)
3479 forget=remove
Raymond Hettingerff41c482003-04-06 09:01:11 +00003480
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003481 def identify(self, x, y):
3482 """Identify the panedwindow component at point x, y
Raymond Hettingerff41c482003-04-06 09:01:11 +00003483
3484 If the point is over a sash or a sash handle, the result
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003485 is a two element list containing the index of the sash or
Raymond Hettingerff41c482003-04-06 09:01:11 +00003486 handle, and a word indicating whether it is over a sash
3487 or a handle, such as {0 sash} or {2 handle}. If the point
3488 is over any other part of the panedwindow, the result is
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003489 an empty list.
3490 """
3491 return self.tk.call(self._w, 'identify', x, y)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003492
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003493 def proxy(self, *args):
3494 """Internal function."""
3495 return self._getints(
Raymond Hettingerff41c482003-04-06 09:01:11 +00003496 self.tk.call((self._w, 'proxy') + args)) or ()
3497
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003498 def proxy_coord(self):
3499 """Return the x and y pair of the most recent proxy location
3500 """
3501 return self.proxy("coord")
Raymond Hettingerff41c482003-04-06 09:01:11 +00003502
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003503 def proxy_forget(self):
3504 """Remove the proxy from the display.
3505 """
3506 return self.proxy("forget")
Raymond Hettingerff41c482003-04-06 09:01:11 +00003507
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003508 def proxy_place(self, x, y):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003509 """Place the proxy at the given x and y coordinates.
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003510 """
3511 return self.proxy("place", x, y)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003512
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003513 def sash(self, *args):
3514 """Internal function."""
3515 return self._getints(
3516 self.tk.call((self._w, 'sash') + args)) or ()
Raymond Hettingerff41c482003-04-06 09:01:11 +00003517
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003518 def sash_coord(self, index):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003519 """Return the current x and y pair for the sash given by index.
3520
3521 Index must be an integer between 0 and 1 less than the
3522 number of panes in the panedwindow. The coordinates given are
3523 those of the top left corner of the region containing the sash.
3524 pathName sash dragto index x y This command computes the
3525 difference between the given coordinates and the coordinates
3526 given to the last sash coord command for the given sash. It then
3527 moves that sash the computed difference. The return value is the
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003528 empty string.
3529 """
3530 return self.sash("coord", index)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003531
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003532 def sash_mark(self, index):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003533 """Records x and y for the sash given by index;
3534
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003535 Used in conjunction with later dragto commands to move the sash.
3536 """
3537 return self.sash("mark", index)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003538
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003539 def sash_place(self, index, x, y):
3540 """Place the sash given by index at the given coordinates
3541 """
3542 return self.sash("place", index, x, y)
Raymond Hettingerff41c482003-04-06 09:01:11 +00003543
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003544 def panecget(self, child, option):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003545 """Query a management option for window.
3546
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003547 Option may be any value allowed by the paneconfigure subcommand
3548 """
3549 return self.tk.call(
3550 (self._w, 'panecget') + (child, '-'+option))
Raymond Hettingerff41c482003-04-06 09:01:11 +00003551
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003552 def paneconfigure(self, tagOrId, cnf=None, **kw):
Raymond Hettingerff41c482003-04-06 09:01:11 +00003553 """Query or modify the management options for window.
3554
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003555 If no option is specified, returns a list describing all
Raymond Hettingerff41c482003-04-06 09:01:11 +00003556 of the available options for pathName. If option is
3557 specified with no value, then the command returns a list
3558 describing the one named option (this list will be identical
3559 to the corresponding sublist of the value returned if no
3560 option is specified). If one or more option-value pairs are
3561 specified, then the command modifies the given widget
3562 option(s) to have the given value(s); in this case the
3563 command returns an empty string. The following options
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003564 are supported:
Raymond Hettingerff41c482003-04-06 09:01:11 +00003565
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003566 after window
Raymond Hettingerff41c482003-04-06 09:01:11 +00003567 Insert the window after the window specified. window
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003568 should be the name of a window already managed by pathName.
3569 before window
Raymond Hettingerff41c482003-04-06 09:01:11 +00003570 Insert the window before the window specified. window
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003571 should be the name of a window already managed by pathName.
3572 height size
Raymond Hettingerff41c482003-04-06 09:01:11 +00003573 Specify a height for the window. The height will be the
3574 outer dimension of the window including its border, if
3575 any. If size is an empty string, or if -height is not
3576 specified, then the height requested internally by the
3577 window will be used initially; the height may later be
3578 adjusted by the movement of sashes in the panedwindow.
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003579 Size may be any value accepted by Tk_GetPixels.
3580 minsize n
Raymond Hettingerff41c482003-04-06 09:01:11 +00003581 Specifies that the size of the window cannot be made
3582 less than n. This constraint only affects the size of
3583 the widget in the paned dimension -- the x dimension
3584 for horizontal panedwindows, the y dimension for
3585 vertical panedwindows. May be any value accepted by
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003586 Tk_GetPixels.
3587 padx n
Raymond Hettingerff41c482003-04-06 09:01:11 +00003588 Specifies a non-negative value indicating how much
3589 extra space to leave on each side of the window in
3590 the X-direction. The value may have any of the forms
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003591 accepted by Tk_GetPixels.
3592 pady n
3593 Specifies a non-negative value indicating how much
Raymond Hettingerff41c482003-04-06 09:01:11 +00003594 extra space to leave on each side of the window in
3595 the Y-direction. The value may have any of the forms
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003596 accepted by Tk_GetPixels.
3597 sticky style
Raymond Hettingerff41c482003-04-06 09:01:11 +00003598 If a window's pane is larger than the requested
3599 dimensions of the window, this option may be used
3600 to position (or stretch) the window within its pane.
3601 Style is a string that contains zero or more of the
3602 characters n, s, e or w. The string can optionally
3603 contains spaces or commas, but they are ignored. Each
3604 letter refers to a side (north, south, east, or west)
3605 that the window will "stick" to. If both n and s
3606 (or e and w) are specified, the window will be
3607 stretched to fill the entire height (or width) of
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003608 its cavity.
3609 width size
Raymond Hettingerff41c482003-04-06 09:01:11 +00003610 Specify a width for the window. The width will be
3611 the outer dimension of the window including its
3612 border, if any. If size is an empty string, or
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003613 if -width is not specified, then the width requested
Raymond Hettingerff41c482003-04-06 09:01:11 +00003614 internally by the window will be used initially; the
3615 width may later be adjusted by the movement of sashes
3616 in the panedwindow. Size may be any value accepted by
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003617 Tk_GetPixels.
Raymond Hettingerff41c482003-04-06 09:01:11 +00003618
Martin v. Löwis2ec36272002-10-13 10:22:08 +00003619 """
3620 if cnf is None and not kw:
3621 cnf = {}
3622 for x in self.tk.split(
3623 self.tk.call(self._w,
3624 'paneconfigure', tagOrId)):
3625 cnf[x[0][1:]] = (x[0][1:],) + x[1:]
3626 return cnf
3627 if type(cnf) == StringType and not kw:
3628 x = self.tk.split(self.tk.call(
3629 self._w, 'paneconfigure', tagOrId, '-'+cnf))
3630 return (x[0][1:],) + x[1:]
3631 self.tk.call((self._w, 'paneconfigure', tagOrId) +
3632 self._options(cnf, kw))
3633 paneconfig = paneconfigure
3634
3635 def panes(self):
3636 """Returns an ordered list of the child panes."""
3637 return self.tk.call(self._w, 'panes')
3638
Guido van Rossumaec5dc91994-06-27 07:55:12 +00003639######################################################################
3640# Extensions:
3641
3642class Studbutton(Button):
Fredrik Lundh06d28152000-08-09 18:03:12 +00003643 def __init__(self, master=None, cnf={}, **kw):
3644 Widget.__init__(self, master, 'studbutton', cnf, kw)
3645 self.bind('<Any-Enter>', self.tkButtonEnter)
3646 self.bind('<Any-Leave>', self.tkButtonLeave)
3647 self.bind('<1>', self.tkButtonDown)
3648 self.bind('<ButtonRelease-1>', self.tkButtonUp)
Guido van Rossumaec5dc91994-06-27 07:55:12 +00003649
3650class Tributton(Button):
Fredrik Lundh06d28152000-08-09 18:03:12 +00003651 def __init__(self, master=None, cnf={}, **kw):
3652 Widget.__init__(self, master, 'tributton', cnf, kw)
3653 self.bind('<Any-Enter>', self.tkButtonEnter)
3654 self.bind('<Any-Leave>', self.tkButtonLeave)
3655 self.bind('<1>', self.tkButtonDown)
3656 self.bind('<ButtonRelease-1>', self.tkButtonUp)
3657 self['fg'] = self['bg']
3658 self['activebackground'] = self['bg']
Guido van Rossum37dcab11996-05-16 16:00:19 +00003659
Guido van Rossumc417ef81996-08-21 23:38:59 +00003660######################################################################
3661# Test:
3662
3663def _test():
Fredrik Lundh06d28152000-08-09 18:03:12 +00003664 root = Tk()
3665 text = "This is Tcl/Tk version %s" % TclVersion
3666 if TclVersion >= 8.1:
Fredrik Lundh8fffa202000-08-09 18:51:01 +00003667 try:
3668 text = text + unicode("\nThis should be a cedilla: \347",
3669 "iso-8859-1")
3670 except NameError:
3671 pass # no unicode support
Fredrik Lundh06d28152000-08-09 18:03:12 +00003672 label = Label(root, text=text)
3673 label.pack()
3674 test = Button(root, text="Click me!",
3675 command=lambda root=root: root.test.configure(
3676 text="[%s]" % root.test['text']))
3677 test.pack()
3678 root.test = test
3679 quit = Button(root, text="QUIT", command=root.destroy)
3680 quit.pack()
3681 # The following three commands are needed so the window pops
3682 # up on top on Windows...
3683 root.iconify()
3684 root.update()
3685 root.deiconify()
3686 root.mainloop()
Guido van Rossumc417ef81996-08-21 23:38:59 +00003687
3688if __name__ == '__main__':
Fredrik Lundh06d28152000-08-09 18:03:12 +00003689 _test()