python-2.5.2/win32/Lib/lib-tk/Tkinter.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 """Wrapper functions for Tcl/Tk.
       
     2 
       
     3 Tkinter provides classes which allow the display, positioning and
       
     4 control of widgets. Toplevel widgets are Tk and Toplevel. Other
       
     5 widgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,
       
     6 Checkbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox
       
     7 LabelFrame and PanedWindow.
       
     8 
       
     9 Properties of the widgets are specified with keyword arguments.
       
    10 Keyword arguments have the same name as the corresponding resource
       
    11 under Tk.
       
    12 
       
    13 Widgets are positioned with one of the geometry managers Place, Pack
       
    14 or Grid. These managers can be called with methods place, pack, grid
       
    15 available in every Widget.
       
    16 
       
    17 Actions are bound to events by resources (e.g. keyword argument
       
    18 command) or with the method bind.
       
    19 
       
    20 Example (Hello, World):
       
    21 import Tkinter
       
    22 from Tkconstants import *
       
    23 tk = Tkinter.Tk()
       
    24 frame = Tkinter.Frame(tk, relief=RIDGE, borderwidth=2)
       
    25 frame.pack(fill=BOTH,expand=1)
       
    26 label = Tkinter.Label(frame, text="Hello, World")
       
    27 label.pack(fill=X, expand=1)
       
    28 button = Tkinter.Button(frame,text="Exit",command=tk.destroy)
       
    29 button.pack(side=BOTTOM)
       
    30 tk.mainloop()
       
    31 """
       
    32 
       
    33 __version__ = "$Revision: 50704 $"
       
    34 
       
    35 import sys
       
    36 if sys.platform == "win32":
       
    37     import FixTk # Attempt to configure Tcl/Tk without requiring PATH
       
    38 import _tkinter # If this fails your Python may not be configured for Tk
       
    39 tkinter = _tkinter # b/w compat for export
       
    40 TclError = _tkinter.TclError
       
    41 from types import *
       
    42 from Tkconstants import *
       
    43 try:
       
    44     import MacOS; _MacOS = MacOS; del MacOS
       
    45 except ImportError:
       
    46     _MacOS = None
       
    47 
       
    48 wantobjects = 1
       
    49 
       
    50 TkVersion = float(_tkinter.TK_VERSION)
       
    51 TclVersion = float(_tkinter.TCL_VERSION)
       
    52 
       
    53 READABLE = _tkinter.READABLE
       
    54 WRITABLE = _tkinter.WRITABLE
       
    55 EXCEPTION = _tkinter.EXCEPTION
       
    56 
       
    57 # These are not always defined, e.g. not on Win32 with Tk 8.0 :-(
       
    58 try: _tkinter.createfilehandler
       
    59 except AttributeError: _tkinter.createfilehandler = None
       
    60 try: _tkinter.deletefilehandler
       
    61 except AttributeError: _tkinter.deletefilehandler = None
       
    62 
       
    63 
       
    64 def _flatten(tuple):
       
    65     """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
       
    73 
       
    74 try: _flatten = _tkinter._flatten
       
    75 except AttributeError: pass
       
    76 
       
    77 def _cnfmerge(cnfs):
       
    78     """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
       
    93 
       
    94 try: _cnfmerge = _tkinter._cnfmerge
       
    95 except AttributeError: pass
       
    96 
       
    97 class Event:
       
    98     """Container for the properties of an event.
       
    99 
       
   100     Instances of this type are generated if one of the following events occurs:
       
   101 
       
   102     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 
       
   114         serial - serial number of event
       
   115     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
       
   133     keysym - keysym of the event as a string (KeyPress, KeyRelease)
       
   134     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
       
   140 
       
   141 _support_default_root = 1
       
   142 _default_root = None
       
   143 
       
   144 def NoDefaultRoot():
       
   145     """Inhibit setting of default root window.
       
   146 
       
   147     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
       
   155 
       
   156 def _tkerror(err):
       
   157     """Internal function."""
       
   158     pass
       
   159 
       
   160 def _exit(code='0'):
       
   161     """Internal function. Calling it will throw the exception SystemExit."""
       
   162     raise SystemExit, code
       
   163 
       
   164 _varnum = 0
       
   165 class Variable:
       
   166     """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()."""
       
   170     _default = ""
       
   171     def __init__(self, master=None, value=None, name=None):
       
   172         """Construct a variable
       
   173 
       
   174         MASTER can be given as master widget.
       
   175         VALUE is an optional value (defaults to "")
       
   176         NAME is an optional Tcl name (defaults to PY_VARnum).
       
   177 
       
   178         If NAME matches an existing variable and VALUE is omitted
       
   179         then the existing value is retained.
       
   180         """
       
   181         global _varnum
       
   182         if not master:
       
   183             master = _default_root
       
   184         self._master = master
       
   185         self._tk = master.tk
       
   186         if name:
       
   187             self._name = name
       
   188         else:
       
   189             self._name = 'PY_VAR' + repr(_varnum)
       
   190             _varnum += 1
       
   191         if value != None:
       
   192             self.set(value)
       
   193         elif not self._tk.call("info", "exists", self._name):
       
   194             self.set(self._default)
       
   195     def __del__(self):
       
   196         """Unset the variable in Tcl."""
       
   197         self._tk.globalunsetvar(self._name)
       
   198     def __str__(self):
       
   199         """Return the name of the variable in Tcl."""
       
   200         return self._name
       
   201     def set(self, value):
       
   202         """Set the variable to VALUE."""
       
   203         return self._tk.globalsetvar(self._name, value)
       
   204     def get(self):
       
   205         """Return value of variable."""
       
   206         return self._tk.globalgetvar(self._name)
       
   207     def trace_variable(self, mode, callback):
       
   208         """Define a trace callback for the variable.
       
   209 
       
   210         MODE is one of "r", "w", "u" for read, write, undefine.
       
   211         CALLBACK must be a function which is called when
       
   212         the variable is read, written or undefined.
       
   213 
       
   214         Return the name of the callback.
       
   215         """
       
   216         cbname = self._master._register(callback)
       
   217         self._tk.call("trace", "variable", self._name, mode, cbname)
       
   218         return cbname
       
   219     trace = trace_variable
       
   220     def trace_vdelete(self, mode, cbname):
       
   221         """Delete the trace callback for a variable.
       
   222 
       
   223         MODE is one of "r", "w", "u" for read, write, undefine.
       
   224         CBNAME is the name of the callback returned from trace_variable or trace.
       
   225         """
       
   226         self._tk.call("trace", "vdelete", self._name, mode, cbname)
       
   227         self._master.deletecommand(cbname)
       
   228     def trace_vinfo(self):
       
   229         """Return all trace callback information."""
       
   230         return map(self._tk.split, self._tk.splitlist(
       
   231             self._tk.call("trace", "vinfo", self._name)))
       
   232     def __eq__(self, other):
       
   233         """Comparison for equality (==).
       
   234 
       
   235         Note: if the Variable's master matters to behavior
       
   236         also compare self._master == other._master
       
   237         """
       
   238         return self.__class__.__name__ == other.__class__.__name__ \
       
   239             and self._name == other._name
       
   240 
       
   241 class StringVar(Variable):
       
   242     """Value holder for strings variables."""
       
   243     _default = ""
       
   244     def __init__(self, master=None, value=None, name=None):
       
   245         """Construct a string variable.
       
   246 
       
   247         MASTER can be given as master widget.
       
   248         VALUE is an optional value (defaults to "")
       
   249         NAME is an optional Tcl name (defaults to PY_VARnum).
       
   250 
       
   251         If NAME matches an existing variable and VALUE is omitted
       
   252         then the existing value is retained.
       
   253         """
       
   254         Variable.__init__(self, master, value, name)
       
   255 
       
   256     def get(self):
       
   257         """Return value of variable as string."""
       
   258         value = self._tk.globalgetvar(self._name)
       
   259         if isinstance(value, basestring):
       
   260             return value
       
   261         return str(value)
       
   262 
       
   263 class IntVar(Variable):
       
   264     """Value holder for integer variables."""
       
   265     _default = 0
       
   266     def __init__(self, master=None, value=None, name=None):
       
   267         """Construct an integer variable.
       
   268 
       
   269         MASTER can be given as master widget.
       
   270         VALUE is an optional value (defaults to 0)
       
   271         NAME is an optional Tcl name (defaults to PY_VARnum).
       
   272 
       
   273         If NAME matches an existing variable and VALUE is omitted
       
   274         then the existing value is retained.
       
   275         """
       
   276         Variable.__init__(self, master, value, name)
       
   277 
       
   278     def set(self, value):
       
   279         """Set the variable to value, converting booleans to integers."""
       
   280         if isinstance(value, bool):
       
   281             value = int(value)
       
   282         return Variable.set(self, value)
       
   283 
       
   284     def get(self):
       
   285         """Return the value of the variable as an integer."""
       
   286         return getint(self._tk.globalgetvar(self._name))
       
   287 
       
   288 class DoubleVar(Variable):
       
   289     """Value holder for float variables."""
       
   290     _default = 0.0
       
   291     def __init__(self, master=None, value=None, name=None):
       
   292         """Construct a float variable.
       
   293 
       
   294         MASTER can be given as master widget.
       
   295         VALUE is an optional value (defaults to 0.0)
       
   296         NAME is an optional Tcl name (defaults to PY_VARnum).
       
   297 
       
   298         If NAME matches an existing variable and VALUE is omitted
       
   299         then the existing value is retained.
       
   300         """
       
   301         Variable.__init__(self, master, value, name)
       
   302 
       
   303     def get(self):
       
   304         """Return the value of the variable as a float."""
       
   305         return getdouble(self._tk.globalgetvar(self._name))
       
   306 
       
   307 class BooleanVar(Variable):
       
   308     """Value holder for boolean variables."""
       
   309     _default = False
       
   310     def __init__(self, master=None, value=None, name=None):
       
   311         """Construct a boolean variable.
       
   312 
       
   313         MASTER can be given as master widget.
       
   314         VALUE is an optional value (defaults to False)
       
   315         NAME is an optional Tcl name (defaults to PY_VARnum).
       
   316 
       
   317         If NAME matches an existing variable and VALUE is omitted
       
   318         then the existing value is retained.
       
   319         """
       
   320         Variable.__init__(self, master, value, name)
       
   321 
       
   322     def get(self):
       
   323         """Return the value of the variable as a bool."""
       
   324         return self._tk.getboolean(self._tk.globalgetvar(self._name))
       
   325 
       
   326 def mainloop(n=0):
       
   327     """Run the main loop of Tcl."""
       
   328     _default_root.tk.mainloop(n)
       
   329 
       
   330 getint = int
       
   331 
       
   332 getdouble = float
       
   333 
       
   334 def getboolean(s):
       
   335     """Convert true and false to integer values 1 and 0."""
       
   336     return _default_root.tk.getboolean(s)
       
   337 
       
   338 # Methods defined on both toplevel and interior widgets
       
   339 class Misc:
       
   340     """Internal class.
       
   341 
       
   342     Base class which defines methods common for interior widgets."""
       
   343 
       
   344     # XXX font command?
       
   345     _tclCommands = None
       
   346     def destroy(self):
       
   347         """Internal function.
       
   348 
       
   349         Delete all Tcl commands created for
       
   350         this widget in the Tcl interpreter."""
       
   351         if self._tclCommands is not None:
       
   352             for name in self._tclCommands:
       
   353                 #print '- Tkinter: deleted command', name
       
   354                 self.tk.deletecommand(name)
       
   355             self._tclCommands = None
       
   356     def deletecommand(self, name):
       
   357         """Internal function.
       
   358 
       
   359         Delete the Tcl command provided in NAME."""
       
   360         #print '- Tkinter: deleted command', name
       
   361         self.tk.deletecommand(name)
       
   362         try:
       
   363             self._tclCommands.remove(name)
       
   364         except ValueError:
       
   365             pass
       
   366     def tk_strictMotif(self, boolean=None):
       
   367         """Set Tcl internal variable, whether the look and feel
       
   368         should adhere to Motif.
       
   369 
       
   370         A parameter of 1 means adhere to Motif (e.g. no color
       
   371         change if mouse passes over slider).
       
   372         Returns the set value."""
       
   373         return self.tk.getboolean(self.tk.call(
       
   374             'set', 'tk_strictMotif', boolean))
       
   375     def tk_bisque(self):
       
   376         """Change the color scheme to light brown as used in Tk 3.6 and before."""
       
   377         self.tk.call('tk_bisque')
       
   378     def tk_setPalette(self, *args, **kw):
       
   379         """Set a new color scheme for all widget elements.
       
   380 
       
   381         A single color as argument will cause that all colors of Tk
       
   382         widget elements are derived from this.
       
   383         Alternatively several keyword parameters and its associated
       
   384         colors can be given. The following keywords are valid:
       
   385         activeBackground, foreground, selectColor,
       
   386         activeForeground, highlightBackground, selectBackground,
       
   387         background, highlightColor, selectForeground,
       
   388         disabledForeground, insertBackground, troughColor."""
       
   389         self.tk.call(('tk_setPalette',)
       
   390               + _flatten(args) + _flatten(kw.items()))
       
   391     def tk_menuBar(self, *args):
       
   392         """Do not use. Needed in Tk 3.6 and earlier."""
       
   393         pass # obsolete since Tk 4.0
       
   394     def wait_variable(self, name='PY_VAR'):
       
   395         """Wait until the variable is modified.
       
   396 
       
   397         A parameter of type IntVar, StringVar, DoubleVar or
       
   398         BooleanVar must be given."""
       
   399         self.tk.call('tkwait', 'variable', name)
       
   400     waitvar = wait_variable # XXX b/w compat
       
   401     def wait_window(self, window=None):
       
   402         """Wait until a WIDGET is destroyed.
       
   403 
       
   404         If no parameter is given self is used."""
       
   405         if window is None:
       
   406             window = self
       
   407         self.tk.call('tkwait', 'window', window._w)
       
   408     def wait_visibility(self, window=None):
       
   409         """Wait until the visibility of a WIDGET changes
       
   410         (e.g. it appears).
       
   411 
       
   412         If no parameter is given self is used."""
       
   413         if window is None:
       
   414             window = self
       
   415         self.tk.call('tkwait', 'visibility', window._w)
       
   416     def setvar(self, name='PY_VAR', value='1'):
       
   417         """Set Tcl variable NAME to VALUE."""
       
   418         self.tk.setvar(name, value)
       
   419     def getvar(self, name='PY_VAR'):
       
   420         """Return value of Tcl variable NAME."""
       
   421         return self.tk.getvar(name)
       
   422     getint = int
       
   423     getdouble = float
       
   424     def getboolean(self, s):
       
   425         """Return a boolean value for Tcl boolean values true and false given as parameter."""
       
   426         return self.tk.getboolean(s)
       
   427     def focus_set(self):
       
   428         """Direct input focus to this widget.
       
   429 
       
   430         If the application currently does not have the focus
       
   431         this widget will get the focus if the application gets
       
   432         the focus through the window manager."""
       
   433         self.tk.call('focus', self._w)
       
   434     focus = focus_set # XXX b/w compat?
       
   435     def focus_force(self):
       
   436         """Direct input focus to this widget even if the
       
   437         application does not have the focus. Use with
       
   438         caution!"""
       
   439         self.tk.call('focus', '-force', self._w)
       
   440     def focus_get(self):
       
   441         """Return the widget which has currently the focus in the
       
   442         application.
       
   443 
       
   444         Use focus_displayof to allow working with several
       
   445         displays. Return None if application does not have
       
   446         the focus."""
       
   447         name = self.tk.call('focus')
       
   448         if name == 'none' or not name: return None
       
   449         return self._nametowidget(name)
       
   450     def focus_displayof(self):
       
   451         """Return the widget which has currently the focus on the
       
   452         display where this widget is located.
       
   453 
       
   454         Return None if the application does not have the focus."""
       
   455         name = self.tk.call('focus', '-displayof', self._w)
       
   456         if name == 'none' or not name: return None
       
   457         return self._nametowidget(name)
       
   458     def focus_lastfor(self):
       
   459         """Return the widget which would have the focus if top level
       
   460         for this widget gets the focus from the window manager."""
       
   461         name = self.tk.call('focus', '-lastfor', self._w)
       
   462         if name == 'none' or not name: return None
       
   463         return self._nametowidget(name)
       
   464     def tk_focusFollowsMouse(self):
       
   465         """The widget under mouse will get automatically focus. Can not
       
   466         be disabled easily."""
       
   467         self.tk.call('tk_focusFollowsMouse')
       
   468     def tk_focusNext(self):
       
   469         """Return the next widget in the focus order which follows
       
   470         widget which has currently the focus.
       
   471 
       
   472         The focus order first goes to the next child, then to
       
   473         the children of the child recursively and then to the
       
   474         next sibling which is higher in the stacking order.  A
       
   475         widget is omitted if it has the takefocus resource set
       
   476         to 0."""
       
   477         name = self.tk.call('tk_focusNext', self._w)
       
   478         if not name: return None
       
   479         return self._nametowidget(name)
       
   480     def tk_focusPrev(self):
       
   481         """Return previous widget in the focus order. See tk_focusNext for details."""
       
   482         name = self.tk.call('tk_focusPrev', self._w)
       
   483         if not name: return None
       
   484         return self._nametowidget(name)
       
   485     def after(self, ms, func=None, *args):
       
   486         """Call function once after given time.
       
   487 
       
   488         MS specifies the time in milliseconds. FUNC gives the
       
   489         function which shall be called. Additional parameters
       
   490         are given as parameters to the function call.  Return
       
   491         identifier to cancel scheduling with after_cancel."""
       
   492         if not func:
       
   493             # I'd rather use time.sleep(ms*0.001)
       
   494             self.tk.call('after', ms)
       
   495         else:
       
   496             def callit():
       
   497                 try:
       
   498                     func(*args)
       
   499                 finally:
       
   500                     try:
       
   501                         self.deletecommand(name)
       
   502                     except TclError:
       
   503                         pass
       
   504             name = self._register(callit)
       
   505             return self.tk.call('after', ms, name)
       
   506     def after_idle(self, func, *args):
       
   507         """Call FUNC once if the Tcl main loop has no event to
       
   508         process.
       
   509 
       
   510         Return an identifier to cancel the scheduling with
       
   511         after_cancel."""
       
   512         return self.after('idle', func, *args)
       
   513     def after_cancel(self, id):
       
   514         """Cancel scheduling of function identified with ID.
       
   515 
       
   516         Identifier returned by after or after_idle must be
       
   517         given as first parameter."""
       
   518         try:
       
   519             data = self.tk.call('after', 'info', id)
       
   520             # In Tk 8.3, splitlist returns: (script, type)
       
   521             # In Tk 8.4, splitlist may return (script, type) or (script,)
       
   522             script = self.tk.splitlist(data)[0]
       
   523             self.deletecommand(script)
       
   524         except TclError:
       
   525             pass
       
   526         self.tk.call('after', 'cancel', id)
       
   527     def bell(self, displayof=0):
       
   528         """Ring a display's bell."""
       
   529         self.tk.call(('bell',) + self._displayof(displayof))
       
   530 
       
   531     # Clipboard handling:
       
   532     def clipboard_get(self, **kw):
       
   533         """Retrieve data from the clipboard on window's display.
       
   534 
       
   535         The window keyword defaults to the root window of the Tkinter
       
   536         application.
       
   537 
       
   538         The type keyword specifies the form in which the data is
       
   539         to be returned and should be an atom name such as STRING
       
   540         or FILE_NAME.  Type defaults to STRING.
       
   541 
       
   542         This command is equivalent to:
       
   543 
       
   544         selection_get(CLIPBOARD)
       
   545         """
       
   546         return self.tk.call(('clipboard', 'get') + self._options(kw))
       
   547 
       
   548     def clipboard_clear(self, **kw):
       
   549         """Clear the data in the Tk clipboard.
       
   550 
       
   551         A widget specified for the optional displayof keyword
       
   552         argument specifies the target display."""
       
   553         if not kw.has_key('displayof'): kw['displayof'] = self._w
       
   554         self.tk.call(('clipboard', 'clear') + self._options(kw))
       
   555     def clipboard_append(self, string, **kw):
       
   556         """Append STRING to the Tk clipboard.
       
   557 
       
   558         A widget specified at the optional displayof keyword
       
   559         argument specifies the target display. The clipboard
       
   560         can be retrieved with selection_get."""
       
   561         if not kw.has_key('displayof'): kw['displayof'] = self._w
       
   562         self.tk.call(('clipboard', 'append') + self._options(kw)
       
   563               + ('--', string))
       
   564     # XXX grab current w/o window argument
       
   565     def grab_current(self):
       
   566         """Return widget which has currently the grab in this application
       
   567         or None."""
       
   568         name = self.tk.call('grab', 'current', self._w)
       
   569         if not name: return None
       
   570         return self._nametowidget(name)
       
   571     def grab_release(self):
       
   572         """Release grab for this widget if currently set."""
       
   573         self.tk.call('grab', 'release', self._w)
       
   574     def grab_set(self):
       
   575         """Set grab for this widget.
       
   576 
       
   577         A grab directs all events to this and descendant
       
   578         widgets in the application."""
       
   579         self.tk.call('grab', 'set', self._w)
       
   580     def grab_set_global(self):
       
   581         """Set global grab for this widget.
       
   582 
       
   583         A global grab directs all events to this and
       
   584         descendant widgets on the display. Use with caution -
       
   585         other applications do not get events anymore."""
       
   586         self.tk.call('grab', 'set', '-global', self._w)
       
   587     def grab_status(self):
       
   588         """Return None, "local" or "global" if this widget has
       
   589         no, a local or a global grab."""
       
   590         status = self.tk.call('grab', 'status', self._w)
       
   591         if status == 'none': status = None
       
   592         return status
       
   593     def lower(self, belowThis=None):
       
   594         """Lower this widget in the stacking order."""
       
   595         self.tk.call('lower', self._w, belowThis)
       
   596     def option_add(self, pattern, value, priority = None):
       
   597         """Set a VALUE (second parameter) for an option
       
   598         PATTERN (first parameter).
       
   599 
       
   600         An optional third parameter gives the numeric priority
       
   601         (defaults to 80)."""
       
   602         self.tk.call('option', 'add', pattern, value, priority)
       
   603     def option_clear(self):
       
   604         """Clear the option database.
       
   605 
       
   606         It will be reloaded if option_add is called."""
       
   607         self.tk.call('option', 'clear')
       
   608     def option_get(self, name, className):
       
   609         """Return the value for an option NAME for this widget
       
   610         with CLASSNAME.
       
   611 
       
   612         Values with higher priority override lower values."""
       
   613         return self.tk.call('option', 'get', self._w, name, className)
       
   614     def option_readfile(self, fileName, priority = None):
       
   615         """Read file FILENAME into the option database.
       
   616 
       
   617         An optional second parameter gives the numeric
       
   618         priority."""
       
   619         self.tk.call('option', 'readfile', fileName, priority)
       
   620     def selection_clear(self, **kw):
       
   621         """Clear the current X selection."""
       
   622         if not kw.has_key('displayof'): kw['displayof'] = self._w
       
   623         self.tk.call(('selection', 'clear') + self._options(kw))
       
   624     def selection_get(self, **kw):
       
   625         """Return the contents of the current X selection.
       
   626 
       
   627         A keyword parameter selection specifies the name of
       
   628         the selection and defaults to PRIMARY.  A keyword
       
   629         parameter displayof specifies a widget on the display
       
   630         to use."""
       
   631         if not kw.has_key('displayof'): kw['displayof'] = self._w
       
   632         return self.tk.call(('selection', 'get') + self._options(kw))
       
   633     def selection_handle(self, command, **kw):
       
   634         """Specify a function COMMAND to call if the X
       
   635         selection owned by this widget is queried by another
       
   636         application.
       
   637 
       
   638         This function must return the contents of the
       
   639         selection. The function will be called with the
       
   640         arguments OFFSET and LENGTH which allows the chunking
       
   641         of very long selections. The following keyword
       
   642         parameters can be provided:
       
   643         selection - name of the selection (default PRIMARY),
       
   644         type - type of the selection (e.g. STRING, FILE_NAME)."""
       
   645         name = self._register(command)
       
   646         self.tk.call(('selection', 'handle') + self._options(kw)
       
   647               + (self._w, name))
       
   648     def selection_own(self, **kw):
       
   649         """Become owner of X selection.
       
   650 
       
   651         A keyword parameter selection specifies the name of
       
   652         the selection (default PRIMARY)."""
       
   653         self.tk.call(('selection', 'own') +
       
   654                  self._options(kw) + (self._w,))
       
   655     def selection_own_get(self, **kw):
       
   656         """Return owner of X selection.
       
   657 
       
   658         The following keyword parameter can
       
   659         be provided:
       
   660         selection - name of the selection (default PRIMARY),
       
   661         type - type of the selection (e.g. STRING, FILE_NAME)."""
       
   662         if not kw.has_key('displayof'): kw['displayof'] = self._w
       
   663         name = self.tk.call(('selection', 'own') + self._options(kw))
       
   664         if not name: return None
       
   665         return self._nametowidget(name)
       
   666     def send(self, interp, cmd, *args):
       
   667         """Send Tcl command CMD to different interpreter INTERP to be executed."""
       
   668         return self.tk.call(('send', interp, cmd) + args)
       
   669     def lower(self, belowThis=None):
       
   670         """Lower this widget in the stacking order."""
       
   671         self.tk.call('lower', self._w, belowThis)
       
   672     def tkraise(self, aboveThis=None):
       
   673         """Raise this widget in the stacking order."""
       
   674         self.tk.call('raise', self._w, aboveThis)
       
   675     lift = tkraise
       
   676     def colormodel(self, value=None):
       
   677         """Useless. Not implemented in Tk."""
       
   678         return self.tk.call('tk', 'colormodel', self._w, value)
       
   679     def winfo_atom(self, name, displayof=0):
       
   680         """Return integer which represents atom NAME."""
       
   681         args = ('winfo', 'atom') + self._displayof(displayof) + (name,)
       
   682         return getint(self.tk.call(args))
       
   683     def winfo_atomname(self, id, displayof=0):
       
   684         """Return name of atom with identifier ID."""
       
   685         args = ('winfo', 'atomname') \
       
   686                + self._displayof(displayof) + (id,)
       
   687         return self.tk.call(args)
       
   688     def winfo_cells(self):
       
   689         """Return number of cells in the colormap for this widget."""
       
   690         return getint(
       
   691             self.tk.call('winfo', 'cells', self._w))
       
   692     def winfo_children(self):
       
   693         """Return a list of all widgets which are children of this widget."""
       
   694         result = []
       
   695         for child in self.tk.splitlist(
       
   696             self.tk.call('winfo', 'children', self._w)):
       
   697             try:
       
   698                 # Tcl sometimes returns extra windows, e.g. for
       
   699                 # menus; those need to be skipped
       
   700                 result.append(self._nametowidget(child))
       
   701             except KeyError:
       
   702                 pass
       
   703         return result
       
   704 
       
   705     def winfo_class(self):
       
   706         """Return window class name of this widget."""
       
   707         return self.tk.call('winfo', 'class', self._w)
       
   708     def winfo_colormapfull(self):
       
   709         """Return true if at the last color request the colormap was full."""
       
   710         return self.tk.getboolean(
       
   711             self.tk.call('winfo', 'colormapfull', self._w))
       
   712     def winfo_containing(self, rootX, rootY, displayof=0):
       
   713         """Return the widget which is at the root coordinates ROOTX, ROOTY."""
       
   714         args = ('winfo', 'containing') \
       
   715                + self._displayof(displayof) + (rootX, rootY)
       
   716         name = self.tk.call(args)
       
   717         if not name: return None
       
   718         return self._nametowidget(name)
       
   719     def winfo_depth(self):
       
   720         """Return the number of bits per pixel."""
       
   721         return getint(self.tk.call('winfo', 'depth', self._w))
       
   722     def winfo_exists(self):
       
   723         """Return true if this widget exists."""
       
   724         return getint(
       
   725             self.tk.call('winfo', 'exists', self._w))
       
   726     def winfo_fpixels(self, number):
       
   727         """Return the number of pixels for the given distance NUMBER
       
   728         (e.g. "3c") as float."""
       
   729         return getdouble(self.tk.call(
       
   730             'winfo', 'fpixels', self._w, number))
       
   731     def winfo_geometry(self):
       
   732         """Return geometry string for this widget in the form "widthxheight+X+Y"."""
       
   733         return self.tk.call('winfo', 'geometry', self._w)
       
   734     def winfo_height(self):
       
   735         """Return height of this widget."""
       
   736         return getint(
       
   737             self.tk.call('winfo', 'height', self._w))
       
   738     def winfo_id(self):
       
   739         """Return identifier ID for this widget."""
       
   740         return self.tk.getint(
       
   741             self.tk.call('winfo', 'id', self._w))
       
   742     def winfo_interps(self, displayof=0):
       
   743         """Return the name of all Tcl interpreters for this display."""
       
   744         args = ('winfo', 'interps') + self._displayof(displayof)
       
   745         return self.tk.splitlist(self.tk.call(args))
       
   746     def winfo_ismapped(self):
       
   747         """Return true if this widget is mapped."""
       
   748         return getint(
       
   749             self.tk.call('winfo', 'ismapped', self._w))
       
   750     def winfo_manager(self):
       
   751         """Return the window mananger name for this widget."""
       
   752         return self.tk.call('winfo', 'manager', self._w)
       
   753     def winfo_name(self):
       
   754         """Return the name of this widget."""
       
   755         return self.tk.call('winfo', 'name', self._w)
       
   756     def winfo_parent(self):
       
   757         """Return the name of the parent of this widget."""
       
   758         return self.tk.call('winfo', 'parent', self._w)
       
   759     def winfo_pathname(self, id, displayof=0):
       
   760         """Return the pathname of the widget given by ID."""
       
   761         args = ('winfo', 'pathname') \
       
   762                + self._displayof(displayof) + (id,)
       
   763         return self.tk.call(args)
       
   764     def winfo_pixels(self, number):
       
   765         """Rounded integer value of winfo_fpixels."""
       
   766         return getint(
       
   767             self.tk.call('winfo', 'pixels', self._w, number))
       
   768     def winfo_pointerx(self):
       
   769         """Return the x coordinate of the pointer on the root window."""
       
   770         return getint(
       
   771             self.tk.call('winfo', 'pointerx', self._w))
       
   772     def winfo_pointerxy(self):
       
   773         """Return a tuple of x and y coordinates of the pointer on the root window."""
       
   774         return self._getints(
       
   775             self.tk.call('winfo', 'pointerxy', self._w))
       
   776     def winfo_pointery(self):
       
   777         """Return the y coordinate of the pointer on the root window."""
       
   778         return getint(
       
   779             self.tk.call('winfo', 'pointery', self._w))
       
   780     def winfo_reqheight(self):
       
   781         """Return requested height of this widget."""
       
   782         return getint(
       
   783             self.tk.call('winfo', 'reqheight', self._w))
       
   784     def winfo_reqwidth(self):
       
   785         """Return requested width of this widget."""
       
   786         return getint(
       
   787             self.tk.call('winfo', 'reqwidth', self._w))
       
   788     def winfo_rgb(self, color):
       
   789         """Return tuple of decimal values for red, green, blue for
       
   790         COLOR in this widget."""
       
   791         return self._getints(
       
   792             self.tk.call('winfo', 'rgb', self._w, color))
       
   793     def winfo_rootx(self):
       
   794         """Return x coordinate of upper left corner of this widget on the
       
   795         root window."""
       
   796         return getint(
       
   797             self.tk.call('winfo', 'rootx', self._w))
       
   798     def winfo_rooty(self):
       
   799         """Return y coordinate of upper left corner of this widget on the
       
   800         root window."""
       
   801         return getint(
       
   802             self.tk.call('winfo', 'rooty', self._w))
       
   803     def winfo_screen(self):
       
   804         """Return the screen name of this widget."""
       
   805         return self.tk.call('winfo', 'screen', self._w)
       
   806     def winfo_screencells(self):
       
   807         """Return the number of the cells in the colormap of the screen
       
   808         of this widget."""
       
   809         return getint(
       
   810             self.tk.call('winfo', 'screencells', self._w))
       
   811     def winfo_screendepth(self):
       
   812         """Return the number of bits per pixel of the root window of the
       
   813         screen of this widget."""
       
   814         return getint(
       
   815             self.tk.call('winfo', 'screendepth', self._w))
       
   816     def winfo_screenheight(self):
       
   817         """Return the number of pixels of the height of the screen of this widget
       
   818         in pixel."""
       
   819         return getint(
       
   820             self.tk.call('winfo', 'screenheight', self._w))
       
   821     def winfo_screenmmheight(self):
       
   822         """Return the number of pixels of the height of the screen of
       
   823         this widget in mm."""
       
   824         return getint(
       
   825             self.tk.call('winfo', 'screenmmheight', self._w))
       
   826     def winfo_screenmmwidth(self):
       
   827         """Return the number of pixels of the width of the screen of
       
   828         this widget in mm."""
       
   829         return getint(
       
   830             self.tk.call('winfo', 'screenmmwidth', self._w))
       
   831     def winfo_screenvisual(self):
       
   832         """Return one of the strings directcolor, grayscale, pseudocolor,
       
   833         staticcolor, staticgray, or truecolor for the default
       
   834         colormodel of this screen."""
       
   835         return self.tk.call('winfo', 'screenvisual', self._w)
       
   836     def winfo_screenwidth(self):
       
   837         """Return the number of pixels of the width of the screen of
       
   838         this widget in pixel."""
       
   839         return getint(
       
   840             self.tk.call('winfo', 'screenwidth', self._w))
       
   841     def winfo_server(self):
       
   842         """Return information of the X-Server of the screen of this widget in
       
   843         the form "XmajorRminor vendor vendorVersion"."""
       
   844         return self.tk.call('winfo', 'server', self._w)
       
   845     def winfo_toplevel(self):
       
   846         """Return the toplevel widget of this widget."""
       
   847         return self._nametowidget(self.tk.call(
       
   848             'winfo', 'toplevel', self._w))
       
   849     def winfo_viewable(self):
       
   850         """Return true if the widget and all its higher ancestors are mapped."""
       
   851         return getint(
       
   852             self.tk.call('winfo', 'viewable', self._w))
       
   853     def winfo_visual(self):
       
   854         """Return one of the strings directcolor, grayscale, pseudocolor,
       
   855         staticcolor, staticgray, or truecolor for the
       
   856         colormodel of this widget."""
       
   857         return self.tk.call('winfo', 'visual', self._w)
       
   858     def winfo_visualid(self):
       
   859         """Return the X identifier for the visual for this widget."""
       
   860         return self.tk.call('winfo', 'visualid', self._w)
       
   861     def winfo_visualsavailable(self, includeids=0):
       
   862         """Return a list of all visuals available for the screen
       
   863         of this widget.
       
   864 
       
   865         Each item in the list consists of a visual name (see winfo_visual), a
       
   866         depth and if INCLUDEIDS=1 is given also the X identifier."""
       
   867         data = self.tk.split(
       
   868             self.tk.call('winfo', 'visualsavailable', self._w,
       
   869                      includeids and 'includeids' or None))
       
   870         if type(data) is StringType:
       
   871             data = [self.tk.split(data)]
       
   872         return map(self.__winfo_parseitem, data)
       
   873     def __winfo_parseitem(self, t):
       
   874         """Internal function."""
       
   875         return t[:1] + tuple(map(self.__winfo_getint, t[1:]))
       
   876     def __winfo_getint(self, x):
       
   877         """Internal function."""
       
   878         return int(x, 0)
       
   879     def winfo_vrootheight(self):
       
   880         """Return the height of the virtual root window associated with this
       
   881         widget in pixels. If there is no virtual root window return the
       
   882         height of the screen."""
       
   883         return getint(
       
   884             self.tk.call('winfo', 'vrootheight', self._w))
       
   885     def winfo_vrootwidth(self):
       
   886         """Return the width of the virtual root window associated with this
       
   887         widget in pixel. If there is no virtual root window return the
       
   888         width of the screen."""
       
   889         return getint(
       
   890             self.tk.call('winfo', 'vrootwidth', self._w))
       
   891     def winfo_vrootx(self):
       
   892         """Return the x offset of the virtual root relative to the root
       
   893         window of the screen of this widget."""
       
   894         return getint(
       
   895             self.tk.call('winfo', 'vrootx', self._w))
       
   896     def winfo_vrooty(self):
       
   897         """Return the y offset of the virtual root relative to the root
       
   898         window of the screen of this widget."""
       
   899         return getint(
       
   900             self.tk.call('winfo', 'vrooty', self._w))
       
   901     def winfo_width(self):
       
   902         """Return the width of this widget."""
       
   903         return getint(
       
   904             self.tk.call('winfo', 'width', self._w))
       
   905     def winfo_x(self):
       
   906         """Return the x coordinate of the upper left corner of this widget
       
   907         in the parent."""
       
   908         return getint(
       
   909             self.tk.call('winfo', 'x', self._w))
       
   910     def winfo_y(self):
       
   911         """Return the y coordinate of the upper left corner of this widget
       
   912         in the parent."""
       
   913         return getint(
       
   914             self.tk.call('winfo', 'y', self._w))
       
   915     def update(self):
       
   916         """Enter event loop until all pending events have been processed by Tcl."""
       
   917         self.tk.call('update')
       
   918     def update_idletasks(self):
       
   919         """Enter event loop until all idle callbacks have been called. This
       
   920         will update the display of windows but not process events caused by
       
   921         the user."""
       
   922         self.tk.call('update', 'idletasks')
       
   923     def bindtags(self, tagList=None):
       
   924         """Set or get the list of bindtags for this widget.
       
   925 
       
   926         With no argument return the list of all bindtags associated with
       
   927         this widget. With a list of strings as argument the bindtags are
       
   928         set to this list. The bindtags determine in which order events are
       
   929         processed (see bind)."""
       
   930         if tagList is None:
       
   931             return self.tk.splitlist(
       
   932                 self.tk.call('bindtags', self._w))
       
   933         else:
       
   934             self.tk.call('bindtags', self._w, tagList)
       
   935     def _bind(self, what, sequence, func, add, needcleanup=1):
       
   936         """Internal function."""
       
   937         if type(func) is StringType:
       
   938             self.tk.call(what + (sequence, func))
       
   939         elif func:
       
   940             funcid = self._register(func, self._substitute,
       
   941                         needcleanup)
       
   942             cmd = ('%sif {"[%s %s]" == "break"} break\n'
       
   943                    %
       
   944                    (add and '+' or '',
       
   945                 funcid, self._subst_format_str))
       
   946             self.tk.call(what + (sequence, cmd))
       
   947             return funcid
       
   948         elif sequence:
       
   949             return self.tk.call(what + (sequence,))
       
   950         else:
       
   951             return self.tk.splitlist(self.tk.call(what))
       
   952     def bind(self, sequence=None, func=None, add=None):
       
   953         """Bind to this widget at event SEQUENCE a call to function FUNC.
       
   954 
       
   955         SEQUENCE is a string of concatenated event
       
   956         patterns. An event pattern is of the form
       
   957         <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one
       
   958         of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,
       
   959         Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,
       
   960         B3, Alt, Button4, B4, Double, Button5, B5 Triple,
       
   961         Mod1, M1. TYPE is one of Activate, Enter, Map,
       
   962         ButtonPress, Button, Expose, Motion, ButtonRelease
       
   963         FocusIn, MouseWheel, Circulate, FocusOut, Property,
       
   964         Colormap, Gravity Reparent, Configure, KeyPress, Key,
       
   965         Unmap, Deactivate, KeyRelease Visibility, Destroy,
       
   966         Leave and DETAIL is the button number for ButtonPress,
       
   967         ButtonRelease and DETAIL is the Keysym for KeyPress and
       
   968         KeyRelease. Examples are
       
   969         <Control-Button-1> for pressing Control and mouse button 1 or
       
   970         <Alt-A> for pressing A and the Alt key (KeyPress can be omitted).
       
   971         An event pattern can also be a virtual event of the form
       
   972         <<AString>> where AString can be arbitrary. This
       
   973         event can be generated by event_generate.
       
   974         If events are concatenated they must appear shortly
       
   975         after each other.
       
   976 
       
   977         FUNC will be called if the event sequence occurs with an
       
   978         instance of Event as argument. If the return value of FUNC is
       
   979         "break" no further bound function is invoked.
       
   980 
       
   981         An additional boolean parameter ADD specifies whether FUNC will
       
   982         be called additionally to the other bound function or whether
       
   983         it will replace the previous function.
       
   984 
       
   985         Bind will return an identifier to allow deletion of the bound function with
       
   986         unbind without memory leak.
       
   987 
       
   988         If FUNC or SEQUENCE is omitted the bound function or list
       
   989         of bound events are returned."""
       
   990 
       
   991         return self._bind(('bind', self._w), sequence, func, add)
       
   992     def unbind(self, sequence, funcid=None):
       
   993         """Unbind for this widget for event SEQUENCE  the
       
   994         function identified with FUNCID."""
       
   995         self.tk.call('bind', self._w, sequence, '')
       
   996         if funcid:
       
   997             self.deletecommand(funcid)
       
   998     def bind_all(self, sequence=None, func=None, add=None):
       
   999         """Bind to all widgets at an event SEQUENCE a call to function FUNC.
       
  1000         An additional boolean parameter ADD specifies whether FUNC will
       
  1001         be called additionally to the other bound function or whether
       
  1002         it will replace the previous function. See bind for the return value."""
       
  1003         return self._bind(('bind', 'all'), sequence, func, add, 0)
       
  1004     def unbind_all(self, sequence):
       
  1005         """Unbind for all widgets for event SEQUENCE all functions."""
       
  1006         self.tk.call('bind', 'all' , sequence, '')
       
  1007     def bind_class(self, className, sequence=None, func=None, add=None):
       
  1008 
       
  1009         """Bind to widgets with bindtag CLASSNAME at event
       
  1010         SEQUENCE a call of function FUNC. An additional
       
  1011         boolean parameter ADD specifies whether FUNC will be
       
  1012         called additionally to the other bound function or
       
  1013         whether it will replace the previous function. See bind for
       
  1014         the return value."""
       
  1015 
       
  1016         return self._bind(('bind', className), sequence, func, add, 0)
       
  1017     def unbind_class(self, className, sequence):
       
  1018         """Unbind for a all widgets with bindtag CLASSNAME for event SEQUENCE
       
  1019         all functions."""
       
  1020         self.tk.call('bind', className , sequence, '')
       
  1021     def mainloop(self, n=0):
       
  1022         """Call the mainloop of Tk."""
       
  1023         self.tk.mainloop(n)
       
  1024     def quit(self):
       
  1025         """Quit the Tcl interpreter. All widgets will be destroyed."""
       
  1026         self.tk.quit()
       
  1027     def _getints(self, string):
       
  1028         """Internal function."""
       
  1029         if string:
       
  1030             return tuple(map(getint, self.tk.splitlist(string)))
       
  1031     def _getdoubles(self, string):
       
  1032         """Internal function."""
       
  1033         if string:
       
  1034             return tuple(map(getdouble, self.tk.splitlist(string)))
       
  1035     def _getboolean(self, string):
       
  1036         """Internal function."""
       
  1037         if string:
       
  1038             return self.tk.getboolean(string)
       
  1039     def _displayof(self, displayof):
       
  1040         """Internal function."""
       
  1041         if displayof:
       
  1042             return ('-displayof', displayof)
       
  1043         if displayof is None:
       
  1044             return ('-displayof', self._w)
       
  1045         return ()
       
  1046     def _options(self, cnf, kw = None):
       
  1047         """Internal function."""
       
  1048         if kw:
       
  1049             cnf = _cnfmerge((cnf, kw))
       
  1050         else:
       
  1051             cnf = _cnfmerge(cnf)
       
  1052         res = ()
       
  1053         for k, v in cnf.items():
       
  1054             if v is not None:
       
  1055                 if k[-1] == '_': k = k[:-1]
       
  1056                 if callable(v):
       
  1057                     v = self._register(v)
       
  1058                 res = res + ('-'+k, v)
       
  1059         return res
       
  1060     def nametowidget(self, name):
       
  1061         """Return the Tkinter instance of a widget identified by
       
  1062         its Tcl name NAME."""
       
  1063         w = self
       
  1064         if name[0] == '.':
       
  1065             w = w._root()
       
  1066             name = name[1:]
       
  1067         while name:
       
  1068             i = name.find('.')
       
  1069             if i >= 0:
       
  1070                 name, tail = name[:i], name[i+1:]
       
  1071             else:
       
  1072                 tail = ''
       
  1073             w = w.children[name]
       
  1074             name = tail
       
  1075         return w
       
  1076     _nametowidget = nametowidget
       
  1077     def _register(self, func, subst=None, needcleanup=1):
       
  1078         """Return a newly created Tcl function. If this
       
  1079         function is called, the Python function FUNC will
       
  1080         be executed. An optional function SUBST can
       
  1081         be given which will be executed before FUNC."""
       
  1082         f = CallWrapper(func, subst, self).__call__
       
  1083         name = repr(id(f))
       
  1084         try:
       
  1085             func = func.im_func
       
  1086         except AttributeError:
       
  1087             pass
       
  1088         try:
       
  1089             name = name + func.__name__
       
  1090         except AttributeError:
       
  1091             pass
       
  1092         self.tk.createcommand(name, f)
       
  1093         if needcleanup:
       
  1094             if self._tclCommands is None:
       
  1095                 self._tclCommands = []
       
  1096             self._tclCommands.append(name)
       
  1097         #print '+ Tkinter created command', name
       
  1098         return name
       
  1099     register = _register
       
  1100     def _root(self):
       
  1101         """Internal function."""
       
  1102         w = self
       
  1103         while w.master: w = w.master
       
  1104         return w
       
  1105     _subst_format = ('%#', '%b', '%f', '%h', '%k',
       
  1106              '%s', '%t', '%w', '%x', '%y',
       
  1107              '%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y', '%D')
       
  1108     _subst_format_str = " ".join(_subst_format)
       
  1109     def _substitute(self, *args):
       
  1110         """Internal function."""
       
  1111         if len(args) != len(self._subst_format): return args
       
  1112         getboolean = self.tk.getboolean
       
  1113 
       
  1114         getint = int
       
  1115         def getint_event(s):
       
  1116             """Tk changed behavior in 8.4.2, returning "??" rather more often."""
       
  1117             try:
       
  1118                 return int(s)
       
  1119             except ValueError:
       
  1120                 return s
       
  1121 
       
  1122         nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y, D = args
       
  1123         # Missing: (a, c, d, m, o, v, B, R)
       
  1124         e = Event()
       
  1125         # serial field: valid vor all events
       
  1126         # number of button: ButtonPress and ButtonRelease events only
       
  1127         # height field: Configure, ConfigureRequest, Create,
       
  1128         # ResizeRequest, and Expose events only
       
  1129         # keycode field: KeyPress and KeyRelease events only
       
  1130         # time field: "valid for events that contain a time field"
       
  1131         # width field: Configure, ConfigureRequest, Create, ResizeRequest,
       
  1132         # and Expose events only
       
  1133         # x field: "valid for events that contain a x field"
       
  1134         # y field: "valid for events that contain a y field"
       
  1135         # keysym as decimal: KeyPress and KeyRelease events only
       
  1136         # x_root, y_root fields: ButtonPress, ButtonRelease, KeyPress,
       
  1137         # KeyRelease,and Motion events
       
  1138         e.serial = getint(nsign)
       
  1139         e.num = getint_event(b)
       
  1140         try: e.focus = getboolean(f)
       
  1141         except TclError: pass
       
  1142         e.height = getint_event(h)
       
  1143         e.keycode = getint_event(k)
       
  1144         e.state = getint_event(s)
       
  1145         e.time = getint_event(t)
       
  1146         e.width = getint_event(w)
       
  1147         e.x = getint_event(x)
       
  1148         e.y = getint_event(y)
       
  1149         e.char = A
       
  1150         try: e.send_event = getboolean(E)
       
  1151         except TclError: pass
       
  1152         e.keysym = K
       
  1153         e.keysym_num = getint_event(N)
       
  1154         e.type = T
       
  1155         try:
       
  1156             e.widget = self._nametowidget(W)
       
  1157         except KeyError:
       
  1158             e.widget = W
       
  1159         e.x_root = getint_event(X)
       
  1160         e.y_root = getint_event(Y)
       
  1161         try:
       
  1162             e.delta = getint(D)
       
  1163         except ValueError:
       
  1164             e.delta = 0
       
  1165         return (e,)
       
  1166     def _report_exception(self):
       
  1167         """Internal function."""
       
  1168         import sys
       
  1169         exc, val, tb = sys.exc_type, sys.exc_value, sys.exc_traceback
       
  1170         root = self._root()
       
  1171         root.report_callback_exception(exc, val, tb)
       
  1172     def _configure(self, cmd, cnf, kw):
       
  1173         """Internal function."""
       
  1174         if kw:
       
  1175             cnf = _cnfmerge((cnf, kw))
       
  1176         elif cnf:
       
  1177             cnf = _cnfmerge(cnf)
       
  1178         if cnf is None:
       
  1179             cnf = {}
       
  1180             for x in self.tk.split(
       
  1181                     self.tk.call(_flatten((self._w, cmd)))):
       
  1182                 cnf[x[0][1:]] = (x[0][1:],) + x[1:]
       
  1183             return cnf
       
  1184         if type(cnf) is StringType:
       
  1185             x = self.tk.split(
       
  1186                     self.tk.call(_flatten((self._w, cmd, '-'+cnf))))
       
  1187             return (x[0][1:],) + x[1:]
       
  1188         self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
       
  1189     # These used to be defined in Widget:
       
  1190     def configure(self, cnf=None, **kw):
       
  1191         """Configure resources of a widget.
       
  1192 
       
  1193         The values for resources are specified as keyword
       
  1194         arguments. To get an overview about
       
  1195         the allowed keyword arguments call the method keys.
       
  1196         """
       
  1197         return self._configure('configure', cnf, kw)
       
  1198     config = configure
       
  1199     def cget(self, key):
       
  1200         """Return the resource value for a KEY given as string."""
       
  1201         return self.tk.call(self._w, 'cget', '-' + key)
       
  1202     __getitem__ = cget
       
  1203     def __setitem__(self, key, value):
       
  1204         self.configure({key: value})
       
  1205     def keys(self):
       
  1206         """Return a list of all resource names of this widget."""
       
  1207         return map(lambda x: x[0][1:],
       
  1208                self.tk.split(self.tk.call(self._w, 'configure')))
       
  1209     def __str__(self):
       
  1210         """Return the window path name of this widget."""
       
  1211         return self._w
       
  1212     # Pack methods that apply to the master
       
  1213     _noarg_ = ['_noarg_']
       
  1214     def pack_propagate(self, flag=_noarg_):
       
  1215         """Set or get the status for propagation of geometry information.
       
  1216 
       
  1217         A boolean argument specifies whether the geometry information
       
  1218         of the slaves will determine the size of this widget. If no argument
       
  1219         is given the current setting will be returned.
       
  1220         """
       
  1221         if flag is Misc._noarg_:
       
  1222             return self._getboolean(self.tk.call(
       
  1223                 'pack', 'propagate', self._w))
       
  1224         else:
       
  1225             self.tk.call('pack', 'propagate', self._w, flag)
       
  1226     propagate = pack_propagate
       
  1227     def pack_slaves(self):
       
  1228         """Return a list of all slaves of this widget
       
  1229         in its packing order."""
       
  1230         return map(self._nametowidget,
       
  1231                self.tk.splitlist(
       
  1232                    self.tk.call('pack', 'slaves', self._w)))
       
  1233     slaves = pack_slaves
       
  1234     # Place method that applies to the master
       
  1235     def place_slaves(self):
       
  1236         """Return a list of all slaves of this widget
       
  1237         in its packing order."""
       
  1238         return map(self._nametowidget,
       
  1239                self.tk.splitlist(
       
  1240                    self.tk.call(
       
  1241                        'place', 'slaves', self._w)))
       
  1242     # Grid methods that apply to the master
       
  1243     def grid_bbox(self, column=None, row=None, col2=None, row2=None):
       
  1244         """Return a tuple of integer coordinates for the bounding
       
  1245         box of this widget controlled by the geometry manager grid.
       
  1246 
       
  1247         If COLUMN, ROW is given the bounding box applies from
       
  1248         the cell with row and column 0 to the specified
       
  1249         cell. If COL2 and ROW2 are given the bounding box
       
  1250         starts at that cell.
       
  1251 
       
  1252         The returned integers specify the offset of the upper left
       
  1253         corner in the master widget and the width and height.
       
  1254         """
       
  1255         args = ('grid', 'bbox', self._w)
       
  1256         if column is not None and row is not None:
       
  1257             args = args + (column, row)
       
  1258         if col2 is not None and row2 is not None:
       
  1259             args = args + (col2, row2)
       
  1260         return self._getints(self.tk.call(*args)) or None
       
  1261 
       
  1262     bbox = grid_bbox
       
  1263     def _grid_configure(self, command, index, cnf, kw):
       
  1264         """Internal function."""
       
  1265         if type(cnf) is StringType and not kw:
       
  1266             if cnf[-1:] == '_':
       
  1267                 cnf = cnf[:-1]
       
  1268             if cnf[:1] != '-':
       
  1269                 cnf = '-'+cnf
       
  1270             options = (cnf,)
       
  1271         else:
       
  1272             options = self._options(cnf, kw)
       
  1273         if not options:
       
  1274             res = self.tk.call('grid',
       
  1275                        command, self._w, index)
       
  1276             words = self.tk.splitlist(res)
       
  1277             dict = {}
       
  1278             for i in range(0, len(words), 2):
       
  1279                 key = words[i][1:]
       
  1280                 value = words[i+1]
       
  1281                 if not value:
       
  1282                     value = None
       
  1283                 elif '.' in value:
       
  1284                     value = getdouble(value)
       
  1285                 else:
       
  1286                     value = getint(value)
       
  1287                 dict[key] = value
       
  1288             return dict
       
  1289         res = self.tk.call(
       
  1290                   ('grid', command, self._w, index)
       
  1291                   + options)
       
  1292         if len(options) == 1:
       
  1293             if not res: return None
       
  1294             # In Tk 7.5, -width can be a float
       
  1295             if '.' in res: return getdouble(res)
       
  1296             return getint(res)
       
  1297     def grid_columnconfigure(self, index, cnf={}, **kw):
       
  1298         """Configure column INDEX of a grid.
       
  1299 
       
  1300         Valid resources are minsize (minimum size of the column),
       
  1301         weight (how much does additional space propagate to this column)
       
  1302         and pad (how much space to let additionally)."""
       
  1303         return self._grid_configure('columnconfigure', index, cnf, kw)
       
  1304     columnconfigure = grid_columnconfigure
       
  1305     def grid_location(self, x, y):
       
  1306         """Return a tuple of column and row which identify the cell
       
  1307         at which the pixel at position X and Y inside the master
       
  1308         widget is located."""
       
  1309         return self._getints(
       
  1310             self.tk.call(
       
  1311                 'grid', 'location', self._w, x, y)) or None
       
  1312     def grid_propagate(self, flag=_noarg_):
       
  1313         """Set or get the status for propagation of geometry information.
       
  1314 
       
  1315         A boolean argument specifies whether the geometry information
       
  1316         of the slaves will determine the size of this widget. If no argument
       
  1317         is given, the current setting will be returned.
       
  1318         """
       
  1319         if flag is Misc._noarg_:
       
  1320             return self._getboolean(self.tk.call(
       
  1321                 'grid', 'propagate', self._w))
       
  1322         else:
       
  1323             self.tk.call('grid', 'propagate', self._w, flag)
       
  1324     def grid_rowconfigure(self, index, cnf={}, **kw):
       
  1325         """Configure row INDEX of a grid.
       
  1326 
       
  1327         Valid resources are minsize (minimum size of the row),
       
  1328         weight (how much does additional space propagate to this row)
       
  1329         and pad (how much space to let additionally)."""
       
  1330         return self._grid_configure('rowconfigure', index, cnf, kw)
       
  1331     rowconfigure = grid_rowconfigure
       
  1332     def grid_size(self):
       
  1333         """Return a tuple of the number of column and rows in the grid."""
       
  1334         return self._getints(
       
  1335             self.tk.call('grid', 'size', self._w)) or None
       
  1336     size = grid_size
       
  1337     def grid_slaves(self, row=None, column=None):
       
  1338         """Return a list of all slaves of this widget
       
  1339         in its packing order."""
       
  1340         args = ()
       
  1341         if row is not None:
       
  1342             args = args + ('-row', row)
       
  1343         if column is not None:
       
  1344             args = args + ('-column', column)
       
  1345         return map(self._nametowidget,
       
  1346                self.tk.splitlist(self.tk.call(
       
  1347                    ('grid', 'slaves', self._w) + args)))
       
  1348 
       
  1349     # Support for the "event" command, new in Tk 4.2.
       
  1350     # By Case Roole.
       
  1351 
       
  1352     def event_add(self, virtual, *sequences):
       
  1353         """Bind a virtual event VIRTUAL (of the form <<Name>>)
       
  1354         to an event SEQUENCE such that the virtual event is triggered
       
  1355         whenever SEQUENCE occurs."""
       
  1356         args = ('event', 'add', virtual) + sequences
       
  1357         self.tk.call(args)
       
  1358 
       
  1359     def event_delete(self, virtual, *sequences):
       
  1360         """Unbind a virtual event VIRTUAL from SEQUENCE."""
       
  1361         args = ('event', 'delete', virtual) + sequences
       
  1362         self.tk.call(args)
       
  1363 
       
  1364     def event_generate(self, sequence, **kw):
       
  1365         """Generate an event SEQUENCE. Additional
       
  1366         keyword arguments specify parameter of the event
       
  1367         (e.g. x, y, rootx, rooty)."""
       
  1368         args = ('event', 'generate', self._w, sequence)
       
  1369         for k, v in kw.items():
       
  1370             args = args + ('-%s' % k, str(v))
       
  1371         self.tk.call(args)
       
  1372 
       
  1373     def event_info(self, virtual=None):
       
  1374         """Return a list of all virtual events or the information
       
  1375         about the SEQUENCE bound to the virtual event VIRTUAL."""
       
  1376         return self.tk.splitlist(
       
  1377             self.tk.call('event', 'info', virtual))
       
  1378 
       
  1379     # Image related commands
       
  1380 
       
  1381     def image_names(self):
       
  1382         """Return a list of all existing image names."""
       
  1383         return self.tk.call('image', 'names')
       
  1384 
       
  1385     def image_types(self):
       
  1386         """Return a list of all available image types (e.g. phote bitmap)."""
       
  1387         return self.tk.call('image', 'types')
       
  1388 
       
  1389 
       
  1390 class CallWrapper:
       
  1391     """Internal class. Stores function to call when some user
       
  1392     defined Tcl function is called e.g. after an event occurred."""
       
  1393     def __init__(self, func, subst, widget):
       
  1394         """Store FUNC, SUBST and WIDGET as members."""
       
  1395         self.func = func
       
  1396         self.subst = subst
       
  1397         self.widget = widget
       
  1398     def __call__(self, *args):
       
  1399         """Apply first function SUBST to arguments, than FUNC."""
       
  1400         try:
       
  1401             if self.subst:
       
  1402                 args = self.subst(*args)
       
  1403             return self.func(*args)
       
  1404         except SystemExit, msg:
       
  1405             raise SystemExit, msg
       
  1406         except:
       
  1407             self.widget._report_exception()
       
  1408 
       
  1409 
       
  1410 class Wm:
       
  1411     """Provides functions for the communication with the window manager."""
       
  1412 
       
  1413     def wm_aspect(self,
       
  1414               minNumer=None, minDenom=None,
       
  1415               maxNumer=None, maxDenom=None):
       
  1416         """Instruct the window manager to set the aspect ratio (width/height)
       
  1417         of this widget to be between MINNUMER/MINDENOM and MAXNUMER/MAXDENOM. Return a tuple
       
  1418         of the actual values if no argument is given."""
       
  1419         return self._getints(
       
  1420             self.tk.call('wm', 'aspect', self._w,
       
  1421                      minNumer, minDenom,
       
  1422                      maxNumer, maxDenom))
       
  1423     aspect = wm_aspect
       
  1424 
       
  1425     def wm_attributes(self, *args):
       
  1426         """This subcommand returns or sets platform specific attributes
       
  1427 
       
  1428         The first form returns a list of the platform specific flags and
       
  1429         their values. The second form returns the value for the specific
       
  1430         option. The third form sets one or more of the values. The values
       
  1431         are as follows:
       
  1432 
       
  1433         On Windows, -disabled gets or sets whether the window is in a
       
  1434         disabled state. -toolwindow gets or sets the style of the window
       
  1435         to toolwindow (as defined in the MSDN). -topmost gets or sets
       
  1436         whether this is a topmost window (displays above all other
       
  1437         windows).
       
  1438 
       
  1439         On Macintosh, XXXXX
       
  1440 
       
  1441         On Unix, there are currently no special attribute values.
       
  1442         """
       
  1443         args = ('wm', 'attributes', self._w) + args
       
  1444         return self.tk.call(args)
       
  1445     attributes=wm_attributes
       
  1446 
       
  1447     def wm_client(self, name=None):
       
  1448         """Store NAME in WM_CLIENT_MACHINE property of this widget. Return
       
  1449         current value."""
       
  1450         return self.tk.call('wm', 'client', self._w, name)
       
  1451     client = wm_client
       
  1452     def wm_colormapwindows(self, *wlist):
       
  1453         """Store list of window names (WLIST) into WM_COLORMAPWINDOWS property
       
  1454         of this widget. This list contains windows whose colormaps differ from their
       
  1455         parents. Return current list of widgets if WLIST is empty."""
       
  1456         if len(wlist) > 1:
       
  1457             wlist = (wlist,) # Tk needs a list of windows here
       
  1458         args = ('wm', 'colormapwindows', self._w) + wlist
       
  1459         return map(self._nametowidget, self.tk.call(args))
       
  1460     colormapwindows = wm_colormapwindows
       
  1461     def wm_command(self, value=None):
       
  1462         """Store VALUE in WM_COMMAND property. It is the command
       
  1463         which shall be used to invoke the application. Return current
       
  1464         command if VALUE is None."""
       
  1465         return self.tk.call('wm', 'command', self._w, value)
       
  1466     command = wm_command
       
  1467     def wm_deiconify(self):
       
  1468         """Deiconify this widget. If it was never mapped it will not be mapped.
       
  1469         On Windows it will raise this widget and give it the focus."""
       
  1470         return self.tk.call('wm', 'deiconify', self._w)
       
  1471     deiconify = wm_deiconify
       
  1472     def wm_focusmodel(self, model=None):
       
  1473         """Set focus model to MODEL. "active" means that this widget will claim
       
  1474         the focus itself, "passive" means that the window manager shall give
       
  1475         the focus. Return current focus model if MODEL is None."""
       
  1476         return self.tk.call('wm', 'focusmodel', self._w, model)
       
  1477     focusmodel = wm_focusmodel
       
  1478     def wm_frame(self):
       
  1479         """Return identifier for decorative frame of this widget if present."""
       
  1480         return self.tk.call('wm', 'frame', self._w)
       
  1481     frame = wm_frame
       
  1482     def wm_geometry(self, newGeometry=None):
       
  1483         """Set geometry to NEWGEOMETRY of the form =widthxheight+x+y. Return
       
  1484         current value if None is given."""
       
  1485         return self.tk.call('wm', 'geometry', self._w, newGeometry)
       
  1486     geometry = wm_geometry
       
  1487     def wm_grid(self,
       
  1488          baseWidth=None, baseHeight=None,
       
  1489          widthInc=None, heightInc=None):
       
  1490         """Instruct the window manager that this widget shall only be
       
  1491         resized on grid boundaries. WIDTHINC and HEIGHTINC are the width and
       
  1492         height of a grid unit in pixels. BASEWIDTH and BASEHEIGHT are the
       
  1493         number of grid units requested in Tk_GeometryRequest."""
       
  1494         return self._getints(self.tk.call(
       
  1495             'wm', 'grid', self._w,
       
  1496             baseWidth, baseHeight, widthInc, heightInc))
       
  1497     grid = wm_grid
       
  1498     def wm_group(self, pathName=None):
       
  1499         """Set the group leader widgets for related widgets to PATHNAME. Return
       
  1500         the group leader of this widget if None is given."""
       
  1501         return self.tk.call('wm', 'group', self._w, pathName)
       
  1502     group = wm_group
       
  1503     def wm_iconbitmap(self, bitmap=None, default=None):
       
  1504         """Set bitmap for the iconified widget to BITMAP. Return
       
  1505         the bitmap if None is given.
       
  1506 
       
  1507         Under Windows, the DEFAULT parameter can be used to set the icon
       
  1508         for the widget and any descendents that don't have an icon set
       
  1509         explicitly.  DEFAULT can be the relative path to a .ico file
       
  1510         (example: root.iconbitmap(default='myicon.ico') ).  See Tk
       
  1511         documentation for more information."""
       
  1512         if default:
       
  1513             return self.tk.call('wm', 'iconbitmap', self._w, '-default', default)
       
  1514         else:
       
  1515             return self.tk.call('wm', 'iconbitmap', self._w, bitmap)
       
  1516     iconbitmap = wm_iconbitmap
       
  1517     def wm_iconify(self):
       
  1518         """Display widget as icon."""
       
  1519         return self.tk.call('wm', 'iconify', self._w)
       
  1520     iconify = wm_iconify
       
  1521     def wm_iconmask(self, bitmap=None):
       
  1522         """Set mask for the icon bitmap of this widget. Return the
       
  1523         mask if None is given."""
       
  1524         return self.tk.call('wm', 'iconmask', self._w, bitmap)
       
  1525     iconmask = wm_iconmask
       
  1526     def wm_iconname(self, newName=None):
       
  1527         """Set the name of the icon for this widget. Return the name if
       
  1528         None is given."""
       
  1529         return self.tk.call('wm', 'iconname', self._w, newName)
       
  1530     iconname = wm_iconname
       
  1531     def wm_iconposition(self, x=None, y=None):
       
  1532         """Set the position of the icon of this widget to X and Y. Return
       
  1533         a tuple of the current values of X and X if None is given."""
       
  1534         return self._getints(self.tk.call(
       
  1535             'wm', 'iconposition', self._w, x, y))
       
  1536     iconposition = wm_iconposition
       
  1537     def wm_iconwindow(self, pathName=None):
       
  1538         """Set widget PATHNAME to be displayed instead of icon. Return the current
       
  1539         value if None is given."""
       
  1540         return self.tk.call('wm', 'iconwindow', self._w, pathName)
       
  1541     iconwindow = wm_iconwindow
       
  1542     def wm_maxsize(self, width=None, height=None):
       
  1543         """Set max WIDTH and HEIGHT for this widget. If the window is gridded
       
  1544         the values are given in grid units. Return the current values if None
       
  1545         is given."""
       
  1546         return self._getints(self.tk.call(
       
  1547             'wm', 'maxsize', self._w, width, height))
       
  1548     maxsize = wm_maxsize
       
  1549     def wm_minsize(self, width=None, height=None):
       
  1550         """Set min WIDTH and HEIGHT for this widget. If the window is gridded
       
  1551         the values are given in grid units. Return the current values if None
       
  1552         is given."""
       
  1553         return self._getints(self.tk.call(
       
  1554             'wm', 'minsize', self._w, width, height))
       
  1555     minsize = wm_minsize
       
  1556     def wm_overrideredirect(self, boolean=None):
       
  1557         """Instruct the window manager to ignore this widget
       
  1558         if BOOLEAN is given with 1. Return the current value if None
       
  1559         is given."""
       
  1560         return self._getboolean(self.tk.call(
       
  1561             'wm', 'overrideredirect', self._w, boolean))
       
  1562     overrideredirect = wm_overrideredirect
       
  1563     def wm_positionfrom(self, who=None):
       
  1564         """Instruct the window manager that the position of this widget shall
       
  1565         be defined by the user if WHO is "user", and by its own policy if WHO is
       
  1566         "program"."""
       
  1567         return self.tk.call('wm', 'positionfrom', self._w, who)
       
  1568     positionfrom = wm_positionfrom
       
  1569     def wm_protocol(self, name=None, func=None):
       
  1570         """Bind function FUNC to command NAME for this widget.
       
  1571         Return the function bound to NAME if None is given. NAME could be
       
  1572         e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW"."""
       
  1573         if callable(func):
       
  1574             command = self._register(func)
       
  1575         else:
       
  1576             command = func
       
  1577         return self.tk.call(
       
  1578             'wm', 'protocol', self._w, name, command)
       
  1579     protocol = wm_protocol
       
  1580     def wm_resizable(self, width=None, height=None):
       
  1581         """Instruct the window manager whether this width can be resized
       
  1582         in WIDTH or HEIGHT. Both values are boolean values."""
       
  1583         return self.tk.call('wm', 'resizable', self._w, width, height)
       
  1584     resizable = wm_resizable
       
  1585     def wm_sizefrom(self, who=None):
       
  1586         """Instruct the window manager that the size of this widget shall
       
  1587         be defined by the user if WHO is "user", and by its own policy if WHO is
       
  1588         "program"."""
       
  1589         return self.tk.call('wm', 'sizefrom', self._w, who)
       
  1590     sizefrom = wm_sizefrom
       
  1591     def wm_state(self, newstate=None):
       
  1592         """Query or set the state of this widget as one of normal, icon,
       
  1593         iconic (see wm_iconwindow), withdrawn, or zoomed (Windows only)."""
       
  1594         return self.tk.call('wm', 'state', self._w, newstate)
       
  1595     state = wm_state
       
  1596     def wm_title(self, string=None):
       
  1597         """Set the title of this widget."""
       
  1598         return self.tk.call('wm', 'title', self._w, string)
       
  1599     title = wm_title
       
  1600     def wm_transient(self, master=None):
       
  1601         """Instruct the window manager that this widget is transient
       
  1602         with regard to widget MASTER."""
       
  1603         return self.tk.call('wm', 'transient', self._w, master)
       
  1604     transient = wm_transient
       
  1605     def wm_withdraw(self):
       
  1606         """Withdraw this widget from the screen such that it is unmapped
       
  1607         and forgotten by the window manager. Re-draw it with wm_deiconify."""
       
  1608         return self.tk.call('wm', 'withdraw', self._w)
       
  1609     withdraw = wm_withdraw
       
  1610 
       
  1611 
       
  1612 class Tk(Misc, Wm):
       
  1613     """Toplevel widget of Tk which represents mostly the main window
       
  1614     of an appliation. It has an associated Tcl interpreter."""
       
  1615     _w = '.'
       
  1616     def __init__(self, screenName=None, baseName=None, className='Tk',
       
  1617                  useTk=1, sync=0, use=None):
       
  1618         """Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will
       
  1619         be created. BASENAME will be used for the identification of the profile file (see
       
  1620         readprofile).
       
  1621         It is constructed from sys.argv[0] without extensions if None is given. CLASSNAME
       
  1622         is the name of the widget class."""
       
  1623         self.master = None
       
  1624         self.children = {}
       
  1625         self._tkloaded = 0
       
  1626         # to avoid recursions in the getattr code in case of failure, we
       
  1627         # ensure that self.tk is always _something_.
       
  1628         self.tk = None
       
  1629         if baseName is None:
       
  1630             import sys, os
       
  1631             baseName = os.path.basename(sys.argv[0])
       
  1632             baseName, ext = os.path.splitext(baseName)
       
  1633             if ext not in ('.py', '.pyc', '.pyo'):
       
  1634                 baseName = baseName + ext
       
  1635         interactive = 0
       
  1636         self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
       
  1637         if useTk:
       
  1638             self._loadtk()
       
  1639         self.readprofile(baseName, className)
       
  1640     def loadtk(self):
       
  1641         if not self._tkloaded:
       
  1642             self.tk.loadtk()
       
  1643             self._loadtk()
       
  1644     def _loadtk(self):
       
  1645         self._tkloaded = 1
       
  1646         global _default_root
       
  1647         if _MacOS and hasattr(_MacOS, 'SchedParams'):
       
  1648             # Disable event scanning except for Command-Period
       
  1649             _MacOS.SchedParams(1, 0)
       
  1650             # Work around nasty MacTk bug
       
  1651             # XXX Is this one still needed?
       
  1652             self.update()
       
  1653         # Version sanity checks
       
  1654         tk_version = self.tk.getvar('tk_version')
       
  1655         if tk_version != _tkinter.TK_VERSION:
       
  1656             raise RuntimeError, \
       
  1657             "tk.h version (%s) doesn't match libtk.a version (%s)" \
       
  1658             % (_tkinter.TK_VERSION, tk_version)
       
  1659         # Under unknown circumstances, tcl_version gets coerced to float
       
  1660         tcl_version = str(self.tk.getvar('tcl_version'))
       
  1661         if tcl_version != _tkinter.TCL_VERSION:
       
  1662             raise RuntimeError, \
       
  1663             "tcl.h version (%s) doesn't match libtcl.a version (%s)" \
       
  1664             % (_tkinter.TCL_VERSION, tcl_version)
       
  1665         if TkVersion < 4.0:
       
  1666             raise RuntimeError, \
       
  1667             "Tk 4.0 or higher is required; found Tk %s" \
       
  1668             % str(TkVersion)
       
  1669         # Create and register the tkerror and exit commands
       
  1670         # We need to inline parts of _register here, _ register
       
  1671         # would register differently-named commands.
       
  1672         if self._tclCommands is None:
       
  1673             self._tclCommands = []
       
  1674         self.tk.createcommand('tkerror', _tkerror)
       
  1675         self.tk.createcommand('exit', _exit)
       
  1676         self._tclCommands.append('tkerror')
       
  1677         self._tclCommands.append('exit')
       
  1678         if _support_default_root and not _default_root:
       
  1679             _default_root = self
       
  1680         self.protocol("WM_DELETE_WINDOW", self.destroy)
       
  1681     def destroy(self):
       
  1682         """Destroy this and all descendants widgets. This will
       
  1683         end the application of this Tcl interpreter."""
       
  1684         for c in self.children.values(): c.destroy()
       
  1685         self.tk.call('destroy', self._w)
       
  1686         Misc.destroy(self)
       
  1687         global _default_root
       
  1688         if _support_default_root and _default_root is self:
       
  1689             _default_root = None
       
  1690     def readprofile(self, baseName, className):
       
  1691         """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into
       
  1692         the Tcl Interpreter and calls execfile on BASENAME.py and CLASSNAME.py if
       
  1693         such a file exists in the home directory."""
       
  1694         import os
       
  1695         if os.environ.has_key('HOME'): home = os.environ['HOME']
       
  1696         else: home = os.curdir
       
  1697         class_tcl = os.path.join(home, '.%s.tcl' % className)
       
  1698         class_py = os.path.join(home, '.%s.py' % className)
       
  1699         base_tcl = os.path.join(home, '.%s.tcl' % baseName)
       
  1700         base_py = os.path.join(home, '.%s.py' % baseName)
       
  1701         dir = {'self': self}
       
  1702         exec 'from Tkinter import *' in dir
       
  1703         if os.path.isfile(class_tcl):
       
  1704             self.tk.call('source', class_tcl)
       
  1705         if os.path.isfile(class_py):
       
  1706             execfile(class_py, dir)
       
  1707         if os.path.isfile(base_tcl):
       
  1708             self.tk.call('source', base_tcl)
       
  1709         if os.path.isfile(base_py):
       
  1710             execfile(base_py, dir)
       
  1711     def report_callback_exception(self, exc, val, tb):
       
  1712         """Internal function. It reports exception on sys.stderr."""
       
  1713         import traceback, sys
       
  1714         sys.stderr.write("Exception in Tkinter callback\n")
       
  1715         sys.last_type = exc
       
  1716         sys.last_value = val
       
  1717         sys.last_traceback = tb
       
  1718         traceback.print_exception(exc, val, tb)
       
  1719     def __getattr__(self, attr):
       
  1720         "Delegate attribute access to the interpreter object"
       
  1721         return getattr(self.tk, attr)
       
  1722 
       
  1723 # Ideally, the classes Pack, Place and Grid disappear, the
       
  1724 # pack/place/grid methods are defined on the Widget class, and
       
  1725 # everybody uses w.pack_whatever(...) instead of Pack.whatever(w,
       
  1726 # ...), with pack(), place() and grid() being short for
       
  1727 # pack_configure(), place_configure() and grid_columnconfigure(), and
       
  1728 # forget() being short for pack_forget().  As a practical matter, I'm
       
  1729 # afraid that there is too much code out there that may be using the
       
  1730 # Pack, Place or Grid class, so I leave them intact -- but only as
       
  1731 # backwards compatibility features.  Also note that those methods that
       
  1732 # take a master as argument (e.g. pack_propagate) have been moved to
       
  1733 # the Misc class (which now incorporates all methods common between
       
  1734 # toplevel and interior widgets).  Again, for compatibility, these are
       
  1735 # copied into the Pack, Place or Grid class.
       
  1736 
       
  1737 
       
  1738 def Tcl(screenName=None, baseName=None, className='Tk', useTk=0):
       
  1739     return Tk(screenName, baseName, className, useTk)
       
  1740 
       
  1741 class Pack:
       
  1742     """Geometry manager Pack.
       
  1743 
       
  1744     Base class to use the methods pack_* in every widget."""
       
  1745     def pack_configure(self, cnf={}, **kw):
       
  1746         """Pack a widget in the parent widget. Use as options:
       
  1747         after=widget - pack it after you have packed widget
       
  1748         anchor=NSEW (or subset) - position widget according to
       
  1749                                   given direction
       
  1750                 before=widget - pack it before you will pack widget
       
  1751         expand=bool - expand widget if parent size grows
       
  1752         fill=NONE or X or Y or BOTH - fill widget if widget grows
       
  1753         in=master - use master to contain this widget
       
  1754         ipadx=amount - add internal padding in x direction
       
  1755         ipady=amount - add internal padding in y direction
       
  1756         padx=amount - add padding in x direction
       
  1757         pady=amount - add padding in y direction
       
  1758         side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.
       
  1759         """
       
  1760         self.tk.call(
       
  1761               ('pack', 'configure', self._w)
       
  1762               + self._options(cnf, kw))
       
  1763     pack = configure = config = pack_configure
       
  1764     def pack_forget(self):
       
  1765         """Unmap this widget and do not use it for the packing order."""
       
  1766         self.tk.call('pack', 'forget', self._w)
       
  1767     forget = pack_forget
       
  1768     def pack_info(self):
       
  1769         """Return information about the packing options
       
  1770         for this widget."""
       
  1771         words = self.tk.splitlist(
       
  1772             self.tk.call('pack', 'info', self._w))
       
  1773         dict = {}
       
  1774         for i in range(0, len(words), 2):
       
  1775             key = words[i][1:]
       
  1776             value = words[i+1]
       
  1777             if value[:1] == '.':
       
  1778                 value = self._nametowidget(value)
       
  1779             dict[key] = value
       
  1780         return dict
       
  1781     info = pack_info
       
  1782     propagate = pack_propagate = Misc.pack_propagate
       
  1783     slaves = pack_slaves = Misc.pack_slaves
       
  1784 
       
  1785 class Place:
       
  1786     """Geometry manager Place.
       
  1787 
       
  1788     Base class to use the methods place_* in every widget."""
       
  1789     def place_configure(self, cnf={}, **kw):
       
  1790         """Place a widget in the parent widget. Use as options:
       
  1791         in=master - master relative to which the widget is placed.
       
  1792         x=amount - locate anchor of this widget at position x of master
       
  1793         y=amount - locate anchor of this widget at position y of master
       
  1794         relx=amount - locate anchor of this widget between 0.0 and 1.0
       
  1795                       relative to width of master (1.0 is right edge)
       
  1796             rely=amount - locate anchor of this widget between 0.0 and 1.0
       
  1797                       relative to height of master (1.0 is bottom edge)
       
  1798             anchor=NSEW (or subset) - position anchor according to given direction
       
  1799         width=amount - width of this widget in pixel
       
  1800         height=amount - height of this widget in pixel
       
  1801         relwidth=amount - width of this widget between 0.0 and 1.0
       
  1802                           relative to width of master (1.0 is the same width
       
  1803                   as the master)
       
  1804             relheight=amount - height of this widget between 0.0 and 1.0
       
  1805                            relative to height of master (1.0 is the same
       
  1806                    height as the master)
       
  1807             bordermode="inside" or "outside" - whether to take border width of master widget
       
  1808                                                into account
       
  1809             """
       
  1810         for k in ['in_']:
       
  1811             if kw.has_key(k):
       
  1812                 kw[k[:-1]] = kw[k]
       
  1813                 del kw[k]
       
  1814         self.tk.call(
       
  1815               ('place', 'configure', self._w)
       
  1816               + self._options(cnf, kw))
       
  1817     place = configure = config = place_configure
       
  1818     def place_forget(self):
       
  1819         """Unmap this widget."""
       
  1820         self.tk.call('place', 'forget', self._w)
       
  1821     forget = place_forget
       
  1822     def place_info(self):
       
  1823         """Return information about the placing options
       
  1824         for this widget."""
       
  1825         words = self.tk.splitlist(
       
  1826             self.tk.call('place', 'info', self._w))
       
  1827         dict = {}
       
  1828         for i in range(0, len(words), 2):
       
  1829             key = words[i][1:]
       
  1830             value = words[i+1]
       
  1831             if value[:1] == '.':
       
  1832                 value = self._nametowidget(value)
       
  1833             dict[key] = value
       
  1834         return dict
       
  1835     info = place_info
       
  1836     slaves = place_slaves = Misc.place_slaves
       
  1837 
       
  1838 class Grid:
       
  1839     """Geometry manager Grid.
       
  1840 
       
  1841     Base class to use the methods grid_* in every widget."""
       
  1842     # Thanks to Masazumi Yoshikawa (yosikawa@isi.edu)
       
  1843     def grid_configure(self, cnf={}, **kw):
       
  1844         """Position a widget in the parent widget in a grid. Use as options:
       
  1845         column=number - use cell identified with given column (starting with 0)
       
  1846         columnspan=number - this widget will span several columns
       
  1847         in=master - use master to contain this widget
       
  1848         ipadx=amount - add internal padding in x direction
       
  1849         ipady=amount - add internal padding in y direction
       
  1850         padx=amount - add padding in x direction
       
  1851         pady=amount - add padding in y direction
       
  1852         row=number - use cell identified with given row (starting with 0)
       
  1853         rowspan=number - this widget will span several rows
       
  1854         sticky=NSEW - if cell is larger on which sides will this
       
  1855                       widget stick to the cell boundary
       
  1856         """
       
  1857         self.tk.call(
       
  1858               ('grid', 'configure', self._w)
       
  1859               + self._options(cnf, kw))
       
  1860     grid = configure = config = grid_configure
       
  1861     bbox = grid_bbox = Misc.grid_bbox
       
  1862     columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure
       
  1863     def grid_forget(self):
       
  1864         """Unmap this widget."""
       
  1865         self.tk.call('grid', 'forget', self._w)
       
  1866     forget = grid_forget
       
  1867     def grid_remove(self):
       
  1868         """Unmap this widget but remember the grid options."""
       
  1869         self.tk.call('grid', 'remove', self._w)
       
  1870     def grid_info(self):
       
  1871         """Return information about the options
       
  1872         for positioning this widget in a grid."""
       
  1873         words = self.tk.splitlist(
       
  1874             self.tk.call('grid', 'info', self._w))
       
  1875         dict = {}
       
  1876         for i in range(0, len(words), 2):
       
  1877             key = words[i][1:]
       
  1878             value = words[i+1]
       
  1879             if value[:1] == '.':
       
  1880                 value = self._nametowidget(value)
       
  1881             dict[key] = value
       
  1882         return dict
       
  1883     info = grid_info
       
  1884     location = grid_location = Misc.grid_location
       
  1885     propagate = grid_propagate = Misc.grid_propagate
       
  1886     rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure
       
  1887     size = grid_size = Misc.grid_size
       
  1888     slaves = grid_slaves = Misc.grid_slaves
       
  1889 
       
  1890 class BaseWidget(Misc):
       
  1891     """Internal class."""
       
  1892     def _setup(self, master, cnf):
       
  1893         """Internal function. Sets up information about children."""
       
  1894         if _support_default_root:
       
  1895             global _default_root
       
  1896             if not master:
       
  1897                 if not _default_root:
       
  1898                     _default_root = Tk()
       
  1899                 master = _default_root
       
  1900         self.master = master
       
  1901         self.tk = master.tk
       
  1902         name = None
       
  1903         if cnf.has_key('name'):
       
  1904             name = cnf['name']
       
  1905             del cnf['name']
       
  1906         if not name:
       
  1907             name = repr(id(self))
       
  1908         self._name = name
       
  1909         if master._w=='.':
       
  1910             self._w = '.' + name
       
  1911         else:
       
  1912             self._w = master._w + '.' + name
       
  1913         self.children = {}
       
  1914         if self.master.children.has_key(self._name):
       
  1915             self.master.children[self._name].destroy()
       
  1916         self.master.children[self._name] = self
       
  1917     def __init__(self, master, widgetName, cnf={}, kw={}, extra=()):
       
  1918         """Construct a widget with the parent widget MASTER, a name WIDGETNAME
       
  1919         and appropriate options."""
       
  1920         if kw:
       
  1921             cnf = _cnfmerge((cnf, kw))
       
  1922         self.widgetName = widgetName
       
  1923         BaseWidget._setup(self, master, cnf)
       
  1924         classes = []
       
  1925         for k in cnf.keys():
       
  1926             if type(k) is ClassType:
       
  1927                 classes.append((k, cnf[k]))
       
  1928                 del cnf[k]
       
  1929         self.tk.call(
       
  1930             (widgetName, self._w) + extra + self._options(cnf))
       
  1931         for k, v in classes:
       
  1932             k.configure(self, v)
       
  1933     def destroy(self):
       
  1934         """Destroy this and all descendants widgets."""
       
  1935         for c in self.children.values(): c.destroy()
       
  1936         self.tk.call('destroy', self._w)
       
  1937         if self.master.children.has_key(self._name):
       
  1938             del self.master.children[self._name]
       
  1939         Misc.destroy(self)
       
  1940     def _do(self, name, args=()):
       
  1941         # XXX Obsolete -- better use self.tk.call directly!
       
  1942         return self.tk.call((self._w, name) + args)
       
  1943 
       
  1944 class Widget(BaseWidget, Pack, Place, Grid):
       
  1945     """Internal class.
       
  1946 
       
  1947     Base class for a widget which can be positioned with the geometry managers
       
  1948     Pack, Place or Grid."""
       
  1949     pass
       
  1950 
       
  1951 class Toplevel(BaseWidget, Wm):
       
  1952     """Toplevel widget, e.g. for dialogs."""
       
  1953     def __init__(self, master=None, cnf={}, **kw):
       
  1954         """Construct a toplevel widget with the parent MASTER.
       
  1955 
       
  1956         Valid resource names: background, bd, bg, borderwidth, class,
       
  1957         colormap, container, cursor, height, highlightbackground,
       
  1958         highlightcolor, highlightthickness, menu, relief, screen, takefocus,
       
  1959         use, visual, width."""
       
  1960         if kw:
       
  1961             cnf = _cnfmerge((cnf, kw))
       
  1962         extra = ()
       
  1963         for wmkey in ['screen', 'class_', 'class', 'visual',
       
  1964                   'colormap']:
       
  1965             if cnf.has_key(wmkey):
       
  1966                 val = cnf[wmkey]
       
  1967                 # TBD: a hack needed because some keys
       
  1968                 # are not valid as keyword arguments
       
  1969                 if wmkey[-1] == '_': opt = '-'+wmkey[:-1]
       
  1970                 else: opt = '-'+wmkey
       
  1971                 extra = extra + (opt, val)
       
  1972                 del cnf[wmkey]
       
  1973         BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
       
  1974         root = self._root()
       
  1975         self.iconname(root.iconname())
       
  1976         self.title(root.title())
       
  1977         self.protocol("WM_DELETE_WINDOW", self.destroy)
       
  1978 
       
  1979 class Button(Widget):
       
  1980     """Button widget."""
       
  1981     def __init__(self, master=None, cnf={}, **kw):
       
  1982         """Construct a button widget with the parent MASTER.
       
  1983 
       
  1984         STANDARD OPTIONS
       
  1985 
       
  1986             activebackground, activeforeground, anchor,
       
  1987             background, bitmap, borderwidth, cursor,
       
  1988             disabledforeground, font, foreground
       
  1989             highlightbackground, highlightcolor,
       
  1990             highlightthickness, image, justify,
       
  1991             padx, pady, relief, repeatdelay,
       
  1992             repeatinterval, takefocus, text,
       
  1993             textvariable, underline, wraplength
       
  1994 
       
  1995         WIDGET-SPECIFIC OPTIONS
       
  1996 
       
  1997             command, compound, default, height,
       
  1998             overrelief, state, width
       
  1999         """
       
  2000         Widget.__init__(self, master, 'button', cnf, kw)
       
  2001 
       
  2002     def tkButtonEnter(self, *dummy):
       
  2003         self.tk.call('tkButtonEnter', self._w)
       
  2004 
       
  2005     def tkButtonLeave(self, *dummy):
       
  2006         self.tk.call('tkButtonLeave', self._w)
       
  2007 
       
  2008     def tkButtonDown(self, *dummy):
       
  2009         self.tk.call('tkButtonDown', self._w)
       
  2010 
       
  2011     def tkButtonUp(self, *dummy):
       
  2012         self.tk.call('tkButtonUp', self._w)
       
  2013 
       
  2014     def tkButtonInvoke(self, *dummy):
       
  2015         self.tk.call('tkButtonInvoke', self._w)
       
  2016 
       
  2017     def flash(self):
       
  2018         """Flash the button.
       
  2019 
       
  2020         This is accomplished by redisplaying
       
  2021         the button several times, alternating between active and
       
  2022         normal colors. At the end of the flash the button is left
       
  2023         in the same normal/active state as when the command was
       
  2024         invoked. This command is ignored if the button's state is
       
  2025         disabled.
       
  2026         """
       
  2027         self.tk.call(self._w, 'flash')
       
  2028 
       
  2029     def invoke(self):
       
  2030         """Invoke the command associated with the button.
       
  2031 
       
  2032         The return value is the return value from the command,
       
  2033         or an empty string if there is no command associated with
       
  2034         the button. This command is ignored if the button's state
       
  2035         is disabled.
       
  2036         """
       
  2037         return self.tk.call(self._w, 'invoke')
       
  2038 
       
  2039 # Indices:
       
  2040 # XXX I don't like these -- take them away
       
  2041 def AtEnd():
       
  2042     return 'end'
       
  2043 def AtInsert(*args):
       
  2044     s = 'insert'
       
  2045     for a in args:
       
  2046         if a: s = s + (' ' + a)
       
  2047     return s
       
  2048 def AtSelFirst():
       
  2049     return 'sel.first'
       
  2050 def AtSelLast():
       
  2051     return 'sel.last'
       
  2052 def At(x, y=None):
       
  2053     if y is None:
       
  2054         return '@%r' % (x,)
       
  2055     else:
       
  2056         return '@%r,%r' % (x, y)
       
  2057 
       
  2058 class Canvas(Widget):
       
  2059     """Canvas widget to display graphical elements like lines or text."""
       
  2060     def __init__(self, master=None, cnf={}, **kw):
       
  2061         """Construct a canvas widget with the parent MASTER.
       
  2062 
       
  2063         Valid resource names: background, bd, bg, borderwidth, closeenough,
       
  2064         confine, cursor, height, highlightbackground, highlightcolor,
       
  2065         highlightthickness, insertbackground, insertborderwidth,
       
  2066         insertofftime, insertontime, insertwidth, offset, relief,
       
  2067         scrollregion, selectbackground, selectborderwidth, selectforeground,
       
  2068         state, takefocus, width, xscrollcommand, xscrollincrement,
       
  2069         yscrollcommand, yscrollincrement."""
       
  2070         Widget.__init__(self, master, 'canvas', cnf, kw)
       
  2071     def addtag(self, *args):
       
  2072         """Internal function."""
       
  2073         self.tk.call((self._w, 'addtag') + args)
       
  2074     def addtag_above(self, newtag, tagOrId):
       
  2075         """Add tag NEWTAG to all items above TAGORID."""
       
  2076         self.addtag(newtag, 'above', tagOrId)
       
  2077     def addtag_all(self, newtag):
       
  2078         """Add tag NEWTAG to all items."""
       
  2079         self.addtag(newtag, 'all')
       
  2080     def addtag_below(self, newtag, tagOrId):
       
  2081         """Add tag NEWTAG to all items below TAGORID."""
       
  2082         self.addtag(newtag, 'below', tagOrId)
       
  2083     def addtag_closest(self, newtag, x, y, halo=None, start=None):
       
  2084         """Add tag NEWTAG to item which is closest to pixel at X, Y.
       
  2085         If several match take the top-most.
       
  2086         All items closer than HALO are considered overlapping (all are
       
  2087         closests). If START is specified the next below this tag is taken."""
       
  2088         self.addtag(newtag, 'closest', x, y, halo, start)
       
  2089     def addtag_enclosed(self, newtag, x1, y1, x2, y2):
       
  2090         """Add tag NEWTAG to all items in the rectangle defined
       
  2091         by X1,Y1,X2,Y2."""
       
  2092         self.addtag(newtag, 'enclosed', x1, y1, x2, y2)
       
  2093     def addtag_overlapping(self, newtag, x1, y1, x2, y2):
       
  2094         """Add tag NEWTAG to all items which overlap the rectangle
       
  2095         defined by X1,Y1,X2,Y2."""
       
  2096         self.addtag(newtag, 'overlapping', x1, y1, x2, y2)
       
  2097     def addtag_withtag(self, newtag, tagOrId):
       
  2098         """Add tag NEWTAG to all items with TAGORID."""
       
  2099         self.addtag(newtag, 'withtag', tagOrId)
       
  2100     def bbox(self, *args):
       
  2101         """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
       
  2102         which encloses all items with tags specified as arguments."""
       
  2103         return self._getints(
       
  2104             self.tk.call((self._w, 'bbox') + args)) or None
       
  2105     def tag_unbind(self, tagOrId, sequence, funcid=None):
       
  2106         """Unbind for all items with TAGORID for event SEQUENCE  the
       
  2107         function identified with FUNCID."""
       
  2108         self.tk.call(self._w, 'bind', tagOrId, sequence, '')
       
  2109         if funcid:
       
  2110             self.deletecommand(funcid)
       
  2111     def tag_bind(self, tagOrId, sequence=None, func=None, add=None):
       
  2112         """Bind to all items with TAGORID at event SEQUENCE a call to function FUNC.
       
  2113 
       
  2114         An additional boolean parameter ADD specifies whether FUNC will be
       
  2115         called additionally to the other bound function or whether it will
       
  2116         replace the previous function. See bind for the return value."""
       
  2117         return self._bind((self._w, 'bind', tagOrId),
       
  2118                   sequence, func, add)
       
  2119     def canvasx(self, screenx, gridspacing=None):
       
  2120         """Return the canvas x coordinate of pixel position SCREENX rounded
       
  2121         to nearest multiple of GRIDSPACING units."""
       
  2122         return getdouble(self.tk.call(
       
  2123             self._w, 'canvasx', screenx, gridspacing))
       
  2124     def canvasy(self, screeny, gridspacing=None):
       
  2125         """Return the canvas y coordinate of pixel position SCREENY rounded
       
  2126         to nearest multiple of GRIDSPACING units."""
       
  2127         return getdouble(self.tk.call(
       
  2128             self._w, 'canvasy', screeny, gridspacing))
       
  2129     def coords(self, *args):
       
  2130         """Return a list of coordinates for the item given in ARGS."""
       
  2131         # XXX Should use _flatten on args
       
  2132         return map(getdouble,
       
  2133                            self.tk.splitlist(
       
  2134                    self.tk.call((self._w, 'coords') + args)))
       
  2135     def _create(self, itemType, args, kw): # Args: (val, val, ..., cnf={})
       
  2136         """Internal function."""
       
  2137         args = _flatten(args)
       
  2138         cnf = args[-1]
       
  2139         if type(cnf) in (DictionaryType, TupleType):
       
  2140             args = args[:-1]
       
  2141         else:
       
  2142             cnf = {}
       
  2143         return getint(self.tk.call(
       
  2144             self._w, 'create', itemType,
       
  2145             *(args + self._options(cnf, kw))))
       
  2146     def create_arc(self, *args, **kw):
       
  2147         """Create arc shaped region with coordinates x1,y1,x2,y2."""
       
  2148         return self._create('arc', args, kw)
       
  2149     def create_bitmap(self, *args, **kw):
       
  2150         """Create bitmap with coordinates x1,y1."""
       
  2151         return self._create('bitmap', args, kw)
       
  2152     def create_image(self, *args, **kw):
       
  2153         """Create image item with coordinates x1,y1."""
       
  2154         return self._create('image', args, kw)
       
  2155     def create_line(self, *args, **kw):
       
  2156         """Create line with coordinates x1,y1,...,xn,yn."""
       
  2157         return self._create('line', args, kw)
       
  2158     def create_oval(self, *args, **kw):
       
  2159         """Create oval with coordinates x1,y1,x2,y2."""
       
  2160         return self._create('oval', args, kw)
       
  2161     def create_polygon(self, *args, **kw):
       
  2162         """Create polygon with coordinates x1,y1,...,xn,yn."""
       
  2163         return self._create('polygon', args, kw)
       
  2164     def create_rectangle(self, *args, **kw):
       
  2165         """Create rectangle with coordinates x1,y1,x2,y2."""
       
  2166         return self._create('rectangle', args, kw)
       
  2167     def create_text(self, *args, **kw):
       
  2168         """Create text with coordinates x1,y1."""
       
  2169         return self._create('text', args, kw)
       
  2170     def create_window(self, *args, **kw):
       
  2171         """Create window with coordinates x1,y1,x2,y2."""
       
  2172         return self._create('window', args, kw)
       
  2173     def dchars(self, *args):
       
  2174         """Delete characters of text items identified by tag or id in ARGS (possibly
       
  2175         several times) from FIRST to LAST character (including)."""
       
  2176         self.tk.call((self._w, 'dchars') + args)
       
  2177     def delete(self, *args):
       
  2178         """Delete items identified by all tag or ids contained in ARGS."""
       
  2179         self.tk.call((self._w, 'delete') + args)
       
  2180     def dtag(self, *args):
       
  2181         """Delete tag or id given as last arguments in ARGS from items
       
  2182         identified by first argument in ARGS."""
       
  2183         self.tk.call((self._w, 'dtag') + args)
       
  2184     def find(self, *args):
       
  2185         """Internal function."""
       
  2186         return self._getints(
       
  2187             self.tk.call((self._w, 'find') + args)) or ()
       
  2188     def find_above(self, tagOrId):
       
  2189         """Return items above TAGORID."""
       
  2190         return self.find('above', tagOrId)
       
  2191     def find_all(self):
       
  2192         """Return all items."""
       
  2193         return self.find('all')
       
  2194     def find_below(self, tagOrId):
       
  2195         """Return all items below TAGORID."""
       
  2196         return self.find('below', tagOrId)
       
  2197     def find_closest(self, x, y, halo=None, start=None):
       
  2198         """Return item which is closest to pixel at X, Y.
       
  2199         If several match take the top-most.
       
  2200         All items closer than HALO are considered overlapping (all are
       
  2201         closests). If START is specified the next below this tag is taken."""
       
  2202         return self.find('closest', x, y, halo, start)
       
  2203     def find_enclosed(self, x1, y1, x2, y2):
       
  2204         """Return all items in rectangle defined
       
  2205         by X1,Y1,X2,Y2."""
       
  2206         return self.find('enclosed', x1, y1, x2, y2)
       
  2207     def find_overlapping(self, x1, y1, x2, y2):
       
  2208         """Return all items which overlap the rectangle
       
  2209         defined by X1,Y1,X2,Y2."""
       
  2210         return self.find('overlapping', x1, y1, x2, y2)
       
  2211     def find_withtag(self, tagOrId):
       
  2212         """Return all items with TAGORID."""
       
  2213         return self.find('withtag', tagOrId)
       
  2214     def focus(self, *args):
       
  2215         """Set focus to the first item specified in ARGS."""
       
  2216         return self.tk.call((self._w, 'focus') + args)
       
  2217     def gettags(self, *args):
       
  2218         """Return tags associated with the first item specified in ARGS."""
       
  2219         return self.tk.splitlist(
       
  2220             self.tk.call((self._w, 'gettags') + args))
       
  2221     def icursor(self, *args):
       
  2222         """Set cursor at position POS in the item identified by TAGORID.
       
  2223         In ARGS TAGORID must be first."""
       
  2224         self.tk.call((self._w, 'icursor') + args)
       
  2225     def index(self, *args):
       
  2226         """Return position of cursor as integer in item specified in ARGS."""
       
  2227         return getint(self.tk.call((self._w, 'index') + args))
       
  2228     def insert(self, *args):
       
  2229         """Insert TEXT in item TAGORID at position POS. ARGS must
       
  2230         be TAGORID POS TEXT."""
       
  2231         self.tk.call((self._w, 'insert') + args)
       
  2232     def itemcget(self, tagOrId, option):
       
  2233         """Return the resource value for an OPTION for item TAGORID."""
       
  2234         return self.tk.call(
       
  2235             (self._w, 'itemcget') + (tagOrId, '-'+option))
       
  2236     def itemconfigure(self, tagOrId, cnf=None, **kw):
       
  2237         """Configure resources of an item TAGORID.
       
  2238 
       
  2239         The values for resources are specified as keyword
       
  2240         arguments. To get an overview about
       
  2241         the allowed keyword arguments call the method without arguments.
       
  2242         """
       
  2243         return self._configure(('itemconfigure', tagOrId), cnf, kw)
       
  2244     itemconfig = itemconfigure
       
  2245     # lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift,
       
  2246     # so the preferred name for them is tag_lower, tag_raise
       
  2247     # (similar to tag_bind, and similar to the Text widget);
       
  2248     # unfortunately can't delete the old ones yet (maybe in 1.6)
       
  2249     def tag_lower(self, *args):
       
  2250         """Lower an item TAGORID given in ARGS
       
  2251         (optional below another item)."""
       
  2252         self.tk.call((self._w, 'lower') + args)
       
  2253     lower = tag_lower
       
  2254     def move(self, *args):
       
  2255         """Move an item TAGORID given in ARGS."""
       
  2256         self.tk.call((self._w, 'move') + args)
       
  2257     def postscript(self, cnf={}, **kw):
       
  2258         """Print the contents of the canvas to a postscript
       
  2259         file. Valid options: colormap, colormode, file, fontmap,
       
  2260         height, pageanchor, pageheight, pagewidth, pagex, pagey,
       
  2261         rotate, witdh, x, y."""
       
  2262         return self.tk.call((self._w, 'postscript') +
       
  2263                     self._options(cnf, kw))
       
  2264     def tag_raise(self, *args):
       
  2265         """Raise an item TAGORID given in ARGS
       
  2266         (optional above another item)."""
       
  2267         self.tk.call((self._w, 'raise') + args)
       
  2268     lift = tkraise = tag_raise
       
  2269     def scale(self, *args):
       
  2270         """Scale item TAGORID with XORIGIN, YORIGIN, XSCALE, YSCALE."""
       
  2271         self.tk.call((self._w, 'scale') + args)
       
  2272     def scan_mark(self, x, y):
       
  2273         """Remember the current X, Y coordinates."""
       
  2274         self.tk.call(self._w, 'scan', 'mark', x, y)
       
  2275     def scan_dragto(self, x, y, gain=10):
       
  2276         """Adjust the view of the canvas to GAIN times the
       
  2277         difference between X and Y and the coordinates given in
       
  2278         scan_mark."""
       
  2279         self.tk.call(self._w, 'scan', 'dragto', x, y, gain)
       
  2280     def select_adjust(self, tagOrId, index):
       
  2281         """Adjust the end of the selection near the cursor of an item TAGORID to index."""
       
  2282         self.tk.call(self._w, 'select', 'adjust', tagOrId, index)
       
  2283     def select_clear(self):
       
  2284         """Clear the selection if it is in this widget."""
       
  2285         self.tk.call(self._w, 'select', 'clear')
       
  2286     def select_from(self, tagOrId, index):
       
  2287         """Set the fixed end of a selection in item TAGORID to INDEX."""
       
  2288         self.tk.call(self._w, 'select', 'from', tagOrId, index)
       
  2289     def select_item(self):
       
  2290         """Return the item which has the selection."""
       
  2291         return self.tk.call(self._w, 'select', 'item') or None
       
  2292     def select_to(self, tagOrId, index):
       
  2293         """Set the variable end of a selection in item TAGORID to INDEX."""
       
  2294         self.tk.call(self._w, 'select', 'to', tagOrId, index)
       
  2295     def type(self, tagOrId):
       
  2296         """Return the type of the item TAGORID."""
       
  2297         return self.tk.call(self._w, 'type', tagOrId) or None
       
  2298     def xview(self, *args):
       
  2299         """Query and change horizontal position of the view."""
       
  2300         if not args:
       
  2301             return self._getdoubles(self.tk.call(self._w, 'xview'))
       
  2302         self.tk.call((self._w, 'xview') + args)
       
  2303     def xview_moveto(self, fraction):
       
  2304         """Adjusts the view in the window so that FRACTION of the
       
  2305         total width of the canvas is off-screen to the left."""
       
  2306         self.tk.call(self._w, 'xview', 'moveto', fraction)
       
  2307     def xview_scroll(self, number, what):
       
  2308         """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
       
  2309         self.tk.call(self._w, 'xview', 'scroll', number, what)
       
  2310     def yview(self, *args):
       
  2311         """Query and change vertical position of the view."""
       
  2312         if not args:
       
  2313             return self._getdoubles(self.tk.call(self._w, 'yview'))
       
  2314         self.tk.call((self._w, 'yview') + args)
       
  2315     def yview_moveto(self, fraction):
       
  2316         """Adjusts the view in the window so that FRACTION of the
       
  2317         total height of the canvas is off-screen to the top."""
       
  2318         self.tk.call(self._w, 'yview', 'moveto', fraction)
       
  2319     def yview_scroll(self, number, what):
       
  2320         """Shift the y-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
       
  2321         self.tk.call(self._w, 'yview', 'scroll', number, what)
       
  2322 
       
  2323 class Checkbutton(Widget):
       
  2324     """Checkbutton widget which is either in on- or off-state."""
       
  2325     def __init__(self, master=None, cnf={}, **kw):
       
  2326         """Construct a checkbutton widget with the parent MASTER.
       
  2327 
       
  2328         Valid resource names: activebackground, activeforeground, anchor,
       
  2329         background, bd, bg, bitmap, borderwidth, command, cursor,
       
  2330         disabledforeground, fg, font, foreground, height,
       
  2331         highlightbackground, highlightcolor, highlightthickness, image,
       
  2332         indicatoron, justify, offvalue, onvalue, padx, pady, relief,
       
  2333         selectcolor, selectimage, state, takefocus, text, textvariable,
       
  2334         underline, variable, width, wraplength."""
       
  2335         Widget.__init__(self, master, 'checkbutton', cnf, kw)
       
  2336     def deselect(self):
       
  2337         """Put the button in off-state."""
       
  2338         self.tk.call(self._w, 'deselect')
       
  2339     def flash(self):
       
  2340         """Flash the button."""
       
  2341         self.tk.call(self._w, 'flash')
       
  2342     def invoke(self):
       
  2343         """Toggle the button and invoke a command if given as resource."""
       
  2344         return self.tk.call(self._w, 'invoke')
       
  2345     def select(self):
       
  2346         """Put the button in on-state."""
       
  2347         self.tk.call(self._w, 'select')
       
  2348     def toggle(self):
       
  2349         """Toggle the button."""
       
  2350         self.tk.call(self._w, 'toggle')
       
  2351 
       
  2352 class Entry(Widget):
       
  2353     """Entry widget which allows to display simple text."""
       
  2354     def __init__(self, master=None, cnf={}, **kw):
       
  2355         """Construct an entry widget with the parent MASTER.
       
  2356 
       
  2357         Valid resource names: background, bd, bg, borderwidth, cursor,
       
  2358         exportselection, fg, font, foreground, highlightbackground,
       
  2359         highlightcolor, highlightthickness, insertbackground,
       
  2360         insertborderwidth, insertofftime, insertontime, insertwidth,
       
  2361         invalidcommand, invcmd, justify, relief, selectbackground,
       
  2362         selectborderwidth, selectforeground, show, state, takefocus,
       
  2363         textvariable, validate, validatecommand, vcmd, width,
       
  2364         xscrollcommand."""
       
  2365         Widget.__init__(self, master, 'entry', cnf, kw)
       
  2366     def delete(self, first, last=None):
       
  2367         """Delete text from FIRST to LAST (not included)."""
       
  2368         self.tk.call(self._w, 'delete', first, last)
       
  2369     def get(self):
       
  2370         """Return the text."""
       
  2371         return self.tk.call(self._w, 'get')
       
  2372     def icursor(self, index):
       
  2373         """Insert cursor at INDEX."""
       
  2374         self.tk.call(self._w, 'icursor', index)
       
  2375     def index(self, index):
       
  2376         """Return position of cursor."""
       
  2377         return getint(self.tk.call(
       
  2378             self._w, 'index', index))
       
  2379     def insert(self, index, string):
       
  2380         """Insert STRING at INDEX."""
       
  2381         self.tk.call(self._w, 'insert', index, string)
       
  2382     def scan_mark(self, x):
       
  2383         """Remember the current X, Y coordinates."""
       
  2384         self.tk.call(self._w, 'scan', 'mark', x)
       
  2385     def scan_dragto(self, x):
       
  2386         """Adjust the view of the canvas to 10 times the
       
  2387         difference between X and Y and the coordinates given in
       
  2388         scan_mark."""
       
  2389         self.tk.call(self._w, 'scan', 'dragto', x)
       
  2390     def selection_adjust(self, index):
       
  2391         """Adjust the end of the selection near the cursor to INDEX."""
       
  2392         self.tk.call(self._w, 'selection', 'adjust', index)
       
  2393     select_adjust = selection_adjust
       
  2394     def selection_clear(self):
       
  2395         """Clear the selection if it is in this widget."""
       
  2396         self.tk.call(self._w, 'selection', 'clear')
       
  2397     select_clear = selection_clear
       
  2398     def selection_from(self, index):
       
  2399         """Set the fixed end of a selection to INDEX."""
       
  2400         self.tk.call(self._w, 'selection', 'from', index)
       
  2401     select_from = selection_from
       
  2402     def selection_present(self):
       
  2403         """Return whether the widget has the selection."""
       
  2404         return self.tk.getboolean(
       
  2405             self.tk.call(self._w, 'selection', 'present'))
       
  2406     select_present = selection_present
       
  2407     def selection_range(self, start, end):
       
  2408         """Set the selection from START to END (not included)."""
       
  2409         self.tk.call(self._w, 'selection', 'range', start, end)
       
  2410     select_range = selection_range
       
  2411     def selection_to(self, index):
       
  2412         """Set the variable end of a selection to INDEX."""
       
  2413         self.tk.call(self._w, 'selection', 'to', index)
       
  2414     select_to = selection_to
       
  2415     def xview(self, index):
       
  2416         """Query and change horizontal position of the view."""
       
  2417         self.tk.call(self._w, 'xview', index)
       
  2418     def xview_moveto(self, fraction):
       
  2419         """Adjust the view in the window so that FRACTION of the
       
  2420         total width of the entry is off-screen to the left."""
       
  2421         self.tk.call(self._w, 'xview', 'moveto', fraction)
       
  2422     def xview_scroll(self, number, what):
       
  2423         """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
       
  2424         self.tk.call(self._w, 'xview', 'scroll', number, what)
       
  2425 
       
  2426 class Frame(Widget):
       
  2427     """Frame widget which may contain other widgets and can have a 3D border."""
       
  2428     def __init__(self, master=None, cnf={}, **kw):
       
  2429         """Construct a frame widget with the parent MASTER.
       
  2430 
       
  2431         Valid resource names: background, bd, bg, borderwidth, class,
       
  2432         colormap, container, cursor, height, highlightbackground,
       
  2433         highlightcolor, highlightthickness, relief, takefocus, visual, width."""
       
  2434         cnf = _cnfmerge((cnf, kw))
       
  2435         extra = ()
       
  2436         if cnf.has_key('class_'):
       
  2437             extra = ('-class', cnf['class_'])
       
  2438             del cnf['class_']
       
  2439         elif cnf.has_key('class'):
       
  2440             extra = ('-class', cnf['class'])
       
  2441             del cnf['class']
       
  2442         Widget.__init__(self, master, 'frame', cnf, {}, extra)
       
  2443 
       
  2444 class Label(Widget):
       
  2445     """Label widget which can display text and bitmaps."""
       
  2446     def __init__(self, master=None, cnf={}, **kw):
       
  2447         """Construct a label widget with the parent MASTER.
       
  2448 
       
  2449         STANDARD OPTIONS
       
  2450 
       
  2451             activebackground, activeforeground, anchor,
       
  2452             background, bitmap, borderwidth, cursor,
       
  2453             disabledforeground, font, foreground,
       
  2454             highlightbackground, highlightcolor,
       
  2455             highlightthickness, image, justify,
       
  2456             padx, pady, relief, takefocus, text,
       
  2457             textvariable, underline, wraplength
       
  2458 
       
  2459         WIDGET-SPECIFIC OPTIONS
       
  2460 
       
  2461             height, state, width
       
  2462 
       
  2463         """
       
  2464         Widget.__init__(self, master, 'label', cnf, kw)
       
  2465 
       
  2466 class Listbox(Widget):
       
  2467     """Listbox widget which can display a list of strings."""
       
  2468     def __init__(self, master=None, cnf={}, **kw):
       
  2469         """Construct a listbox widget with the parent MASTER.
       
  2470 
       
  2471         Valid resource names: background, bd, bg, borderwidth, cursor,
       
  2472         exportselection, fg, font, foreground, height, highlightbackground,
       
  2473         highlightcolor, highlightthickness, relief, selectbackground,
       
  2474         selectborderwidth, selectforeground, selectmode, setgrid, takefocus,
       
  2475         width, xscrollcommand, yscrollcommand, listvariable."""
       
  2476         Widget.__init__(self, master, 'listbox', cnf, kw)
       
  2477     def activate(self, index):
       
  2478         """Activate item identified by INDEX."""
       
  2479         self.tk.call(self._w, 'activate', index)
       
  2480     def bbox(self, *args):
       
  2481         """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
       
  2482         which encloses the item identified by index in ARGS."""
       
  2483         return self._getints(
       
  2484             self.tk.call((self._w, 'bbox') + args)) or None
       
  2485     def curselection(self):
       
  2486         """Return list of indices of currently selected item."""
       
  2487         # XXX Ought to apply self._getints()...
       
  2488         return self.tk.splitlist(self.tk.call(
       
  2489             self._w, 'curselection'))
       
  2490     def delete(self, first, last=None):
       
  2491         """Delete items from FIRST to LAST (not included)."""
       
  2492         self.tk.call(self._w, 'delete', first, last)
       
  2493     def get(self, first, last=None):
       
  2494         """Get list of items from FIRST to LAST (not included)."""
       
  2495         if last:
       
  2496             return self.tk.splitlist(self.tk.call(
       
  2497                 self._w, 'get', first, last))
       
  2498         else:
       
  2499             return self.tk.call(self._w, 'get', first)
       
  2500     def index(self, index):
       
  2501         """Return index of item identified with INDEX."""
       
  2502         i = self.tk.call(self._w, 'index', index)
       
  2503         if i == 'none': return None
       
  2504         return getint(i)
       
  2505     def insert(self, index, *elements):
       
  2506         """Insert ELEMENTS at INDEX."""
       
  2507         self.tk.call((self._w, 'insert', index) + elements)
       
  2508     def nearest(self, y):
       
  2509         """Get index of item which is nearest to y coordinate Y."""
       
  2510         return getint(self.tk.call(
       
  2511             self._w, 'nearest', y))
       
  2512     def scan_mark(self, x, y):
       
  2513         """Remember the current X, Y coordinates."""
       
  2514         self.tk.call(self._w, 'scan', 'mark', x, y)
       
  2515     def scan_dragto(self, x, y):
       
  2516         """Adjust the view of the listbox to 10 times the
       
  2517         difference between X and Y and the coordinates given in
       
  2518         scan_mark."""
       
  2519         self.tk.call(self._w, 'scan', 'dragto', x, y)
       
  2520     def see(self, index):
       
  2521         """Scroll such that INDEX is visible."""
       
  2522         self.tk.call(self._w, 'see', index)
       
  2523     def selection_anchor(self, index):
       
  2524         """Set the fixed end oft the selection to INDEX."""
       
  2525         self.tk.call(self._w, 'selection', 'anchor', index)
       
  2526     select_anchor = selection_anchor
       
  2527     def selection_clear(self, first, last=None):
       
  2528         """Clear the selection from FIRST to LAST (not included)."""
       
  2529         self.tk.call(self._w,
       
  2530                  'selection', 'clear', first, last)
       
  2531     select_clear = selection_clear
       
  2532     def selection_includes(self, index):
       
  2533         """Return 1 if INDEX is part of the selection."""
       
  2534         return self.tk.getboolean(self.tk.call(
       
  2535             self._w, 'selection', 'includes', index))
       
  2536     select_includes = selection_includes
       
  2537     def selection_set(self, first, last=None):
       
  2538         """Set the selection from FIRST to LAST (not included) without
       
  2539         changing the currently selected elements."""
       
  2540         self.tk.call(self._w, 'selection', 'set', first, last)
       
  2541     select_set = selection_set
       
  2542     def size(self):
       
  2543         """Return the number of elements in the listbox."""
       
  2544         return getint(self.tk.call(self._w, 'size'))
       
  2545     def xview(self, *what):
       
  2546         """Query and change horizontal position of the view."""
       
  2547         if not what:
       
  2548             return self._getdoubles(self.tk.call(self._w, 'xview'))
       
  2549         self.tk.call((self._w, 'xview') + what)
       
  2550     def xview_moveto(self, fraction):
       
  2551         """Adjust the view in the window so that FRACTION of the
       
  2552         total width of the entry is off-screen to the left."""
       
  2553         self.tk.call(self._w, 'xview', 'moveto', fraction)
       
  2554     def xview_scroll(self, number, what):
       
  2555         """Shift the x-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
       
  2556         self.tk.call(self._w, 'xview', 'scroll', number, what)
       
  2557     def yview(self, *what):
       
  2558         """Query and change vertical position of the view."""
       
  2559         if not what:
       
  2560             return self._getdoubles(self.tk.call(self._w, 'yview'))
       
  2561         self.tk.call((self._w, 'yview') + what)
       
  2562     def yview_moveto(self, fraction):
       
  2563         """Adjust the view in the window so that FRACTION of the
       
  2564         total width of the entry is off-screen to the top."""
       
  2565         self.tk.call(self._w, 'yview', 'moveto', fraction)
       
  2566     def yview_scroll(self, number, what):
       
  2567         """Shift the y-view according to NUMBER which is measured in "units" or "pages" (WHAT)."""
       
  2568         self.tk.call(self._w, 'yview', 'scroll', number, what)
       
  2569     def itemcget(self, index, option):
       
  2570         """Return the resource value for an ITEM and an OPTION."""
       
  2571         return self.tk.call(
       
  2572             (self._w, 'itemcget') + (index, '-'+option))
       
  2573     def itemconfigure(self, index, cnf=None, **kw):
       
  2574         """Configure resources of an ITEM.
       
  2575 
       
  2576         The values for resources are specified as keyword arguments.
       
  2577         To get an overview about the allowed keyword arguments
       
  2578         call the method without arguments.
       
  2579         Valid resource names: background, bg, foreground, fg,
       
  2580         selectbackground, selectforeground."""
       
  2581         return self._configure(('itemconfigure', index), cnf, kw)
       
  2582     itemconfig = itemconfigure
       
  2583 
       
  2584 class Menu(Widget):
       
  2585     """Menu widget which allows to display menu bars, pull-down menus and pop-up menus."""
       
  2586     def __init__(self, master=None, cnf={}, **kw):
       
  2587         """Construct menu widget with the parent MASTER.
       
  2588 
       
  2589         Valid resource names: activebackground, activeborderwidth,
       
  2590         activeforeground, background, bd, bg, borderwidth, cursor,
       
  2591         disabledforeground, fg, font, foreground, postcommand, relief,
       
  2592         selectcolor, takefocus, tearoff, tearoffcommand, title, type."""
       
  2593         Widget.__init__(self, master, 'menu', cnf, kw)
       
  2594     def tk_bindForTraversal(self):
       
  2595         pass # obsolete since Tk 4.0
       
  2596     def tk_mbPost(self):
       
  2597         self.tk.call('tk_mbPost', self._w)
       
  2598     def tk_mbUnpost(self):
       
  2599         self.tk.call('tk_mbUnpost')
       
  2600     def tk_traverseToMenu(self, char):
       
  2601         self.tk.call('tk_traverseToMenu', self._w, char)
       
  2602     def tk_traverseWithinMenu(self, char):
       
  2603         self.tk.call('tk_traverseWithinMenu', self._w, char)
       
  2604     def tk_getMenuButtons(self):
       
  2605         return self.tk.call('tk_getMenuButtons', self._w)
       
  2606     def tk_nextMenu(self, count):
       
  2607         self.tk.call('tk_nextMenu', count)
       
  2608     def tk_nextMenuEntry(self, count):
       
  2609         self.tk.call('tk_nextMenuEntry', count)
       
  2610     def tk_invokeMenu(self):
       
  2611         self.tk.call('tk_invokeMenu', self._w)
       
  2612     def tk_firstMenu(self):
       
  2613         self.tk.call('tk_firstMenu', self._w)
       
  2614     def tk_mbButtonDown(self):
       
  2615         self.tk.call('tk_mbButtonDown', self._w)
       
  2616     def tk_popup(self, x, y, entry=""):
       
  2617         """Post the menu at position X,Y with entry ENTRY."""
       
  2618         self.tk.call('tk_popup', self._w, x, y, entry)
       
  2619     def activate(self, index):
       
  2620         """Activate entry at INDEX."""
       
  2621         self.tk.call(self._w, 'activate', index)
       
  2622     def add(self, itemType, cnf={}, **kw):
       
  2623         """Internal function."""
       
  2624         self.tk.call((self._w, 'add', itemType) +
       
  2625                  self._options(cnf, kw))
       
  2626     def add_cascade(self, cnf={}, **kw):
       
  2627         """Add hierarchical menu item."""
       
  2628         self.add('cascade', cnf or kw)
       
  2629     def add_checkbutton(self, cnf={}, **kw):
       
  2630         """Add checkbutton menu item."""
       
  2631         self.add('checkbutton', cnf or kw)
       
  2632     def add_command(self, cnf={}, **kw):
       
  2633         """Add command menu item."""
       
  2634         self.add('command', cnf or kw)
       
  2635     def add_radiobutton(self, cnf={}, **kw):
       
  2636         """Addd radio menu item."""
       
  2637         self.add('radiobutton', cnf or kw)
       
  2638     def add_separator(self, cnf={}, **kw):
       
  2639         """Add separator."""
       
  2640         self.add('separator', cnf or kw)
       
  2641     def insert(self, index, itemType, cnf={}, **kw):
       
  2642         """Internal function."""
       
  2643         self.tk.call((self._w, 'insert', index, itemType) +
       
  2644                  self._options(cnf, kw))
       
  2645     def insert_cascade(self, index, cnf={}, **kw):
       
  2646         """Add hierarchical menu item at INDEX."""
       
  2647         self.insert(index, 'cascade', cnf or kw)
       
  2648     def insert_checkbutton(self, index, cnf={}, **kw):
       
  2649         """Add checkbutton menu item at INDEX."""
       
  2650         self.insert(index, 'checkbutton', cnf or kw)
       
  2651     def insert_command(self, index, cnf={}, **kw):
       
  2652         """Add command menu item at INDEX."""
       
  2653         self.insert(index, 'command', cnf or kw)
       
  2654     def insert_radiobutton(self, index, cnf={}, **kw):
       
  2655         """Addd radio menu item at INDEX."""
       
  2656         self.insert(index, 'radiobutton', cnf or kw)
       
  2657     def insert_separator(self, index, cnf={}, **kw):
       
  2658         """Add separator at INDEX."""
       
  2659         self.insert(index, 'separator', cnf or kw)
       
  2660     def delete(self, index1, index2=None):
       
  2661         """Delete menu items between INDEX1 and INDEX2 (not included)."""
       
  2662         self.tk.call(self._w, 'delete', index1, index2)
       
  2663     def entrycget(self, index, option):
       
  2664         """Return the resource value of an menu item for OPTION at INDEX."""
       
  2665         return self.tk.call(self._w, 'entrycget', index, '-' + option)
       
  2666     def entryconfigure(self, index, cnf=None, **kw):
       
  2667         """Configure a menu item at INDEX."""
       
  2668         return self._configure(('entryconfigure', index), cnf, kw)
       
  2669     entryconfig = entryconfigure
       
  2670     def index(self, index):
       
  2671         """Return the index of a menu item identified by INDEX."""
       
  2672         i = self.tk.call(self._w, 'index', index)
       
  2673         if i == 'none': return None
       
  2674         return getint(i)
       
  2675     def invoke(self, index):
       
  2676         """Invoke a menu item identified by INDEX and execute
       
  2677         the associated command."""
       
  2678         return self.tk.call(self._w, 'invoke', index)
       
  2679     def post(self, x, y):
       
  2680         """Display a menu at position X,Y."""
       
  2681         self.tk.call(self._w, 'post', x, y)
       
  2682     def type(self, index):
       
  2683         """Return the type of the menu item at INDEX."""
       
  2684         return self.tk.call(self._w, 'type', index)
       
  2685     def unpost(self):
       
  2686         """Unmap a menu."""
       
  2687         self.tk.call(self._w, 'unpost')
       
  2688     def yposition(self, index):
       
  2689         """Return the y-position of the topmost pixel of the menu item at INDEX."""
       
  2690         return getint(self.tk.call(
       
  2691             self._w, 'yposition', index))
       
  2692 
       
  2693 class Menubutton(Widget):
       
  2694     """Menubutton widget, obsolete since Tk8.0."""
       
  2695     def __init__(self, master=None, cnf={}, **kw):
       
  2696         Widget.__init__(self, master, 'menubutton', cnf, kw)
       
  2697 
       
  2698 class Message(Widget):
       
  2699     """Message widget to display multiline text. Obsolete since Label does it too."""
       
  2700     def __init__(self, master=None, cnf={}, **kw):
       
  2701         Widget.__init__(self, master, 'message', cnf, kw)
       
  2702 
       
  2703 class Radiobutton(Widget):
       
  2704     """Radiobutton widget which shows only one of several buttons in on-state."""
       
  2705     def __init__(self, master=None, cnf={}, **kw):
       
  2706         """Construct a radiobutton widget with the parent MASTER.
       
  2707 
       
  2708         Valid resource names: activebackground, activeforeground, anchor,
       
  2709         background, bd, bg, bitmap, borderwidth, command, cursor,
       
  2710         disabledforeground, fg, font, foreground, height,
       
  2711         highlightbackground, highlightcolor, highlightthickness, image,
       
  2712         indicatoron, justify, padx, pady, relief, selectcolor, selectimage,
       
  2713         state, takefocus, text, textvariable, underline, value, variable,
       
  2714         width, wraplength."""
       
  2715         Widget.__init__(self, master, 'radiobutton', cnf, kw)
       
  2716     def deselect(self):
       
  2717         """Put the button in off-state."""
       
  2718 
       
  2719         self.tk.call(self._w, 'deselect')
       
  2720     def flash(self):
       
  2721         """Flash the button."""
       
  2722         self.tk.call(self._w, 'flash')
       
  2723     def invoke(self):
       
  2724         """Toggle the button and invoke a command if given as resource."""
       
  2725         return self.tk.call(self._w, 'invoke')
       
  2726     def select(self):
       
  2727         """Put the button in on-state."""
       
  2728         self.tk.call(self._w, 'select')
       
  2729 
       
  2730 class Scale(Widget):
       
  2731     """Scale widget which can display a numerical scale."""
       
  2732     def __init__(self, master=None, cnf={}, **kw):
       
  2733         """Construct a scale widget with the parent MASTER.
       
  2734 
       
  2735         Valid resource names: activebackground, background, bigincrement, bd,
       
  2736         bg, borderwidth, command, cursor, digits, fg, font, foreground, from,
       
  2737         highlightbackground, highlightcolor, highlightthickness, label,
       
  2738         length, orient, relief, repeatdelay, repeatinterval, resolution,
       
  2739         showvalue, sliderlength, sliderrelief, state, takefocus,
       
  2740         tickinterval, to, troughcolor, variable, width."""
       
  2741         Widget.__init__(self, master, 'scale', cnf, kw)
       
  2742     def get(self):
       
  2743         """Get the current value as integer or float."""
       
  2744         value = self.tk.call(self._w, 'get')
       
  2745         try:
       
  2746             return getint(value)
       
  2747         except ValueError:
       
  2748             return getdouble(value)
       
  2749     def set(self, value):
       
  2750         """Set the value to VALUE."""
       
  2751         self.tk.call(self._w, 'set', value)
       
  2752     def coords(self, value=None):
       
  2753         """Return a tuple (X,Y) of the point along the centerline of the
       
  2754         trough that corresponds to VALUE or the current value if None is
       
  2755         given."""
       
  2756 
       
  2757         return self._getints(self.tk.call(self._w, 'coords', value))
       
  2758     def identify(self, x, y):
       
  2759         """Return where the point X,Y lies. Valid return values are "slider",
       
  2760         "though1" and "though2"."""
       
  2761         return self.tk.call(self._w, 'identify', x, y)
       
  2762 
       
  2763 class Scrollbar(Widget):
       
  2764     """Scrollbar widget which displays a slider at a certain position."""
       
  2765     def __init__(self, master=None, cnf={}, **kw):
       
  2766         """Construct a scrollbar widget with the parent MASTER.
       
  2767 
       
  2768         Valid resource names: activebackground, activerelief,
       
  2769         background, bd, bg, borderwidth, command, cursor,
       
  2770         elementborderwidth, highlightbackground,
       
  2771         highlightcolor, highlightthickness, jump, orient,
       
  2772         relief, repeatdelay, repeatinterval, takefocus,
       
  2773         troughcolor, width."""
       
  2774         Widget.__init__(self, master, 'scrollbar', cnf, kw)
       
  2775     def activate(self, index):
       
  2776         """Display the element at INDEX with activebackground and activerelief.
       
  2777         INDEX can be "arrow1","slider" or "arrow2"."""
       
  2778         self.tk.call(self._w, 'activate', index)
       
  2779     def delta(self, deltax, deltay):
       
  2780         """Return the fractional change of the scrollbar setting if it
       
  2781         would be moved by DELTAX or DELTAY pixels."""
       
  2782         return getdouble(
       
  2783             self.tk.call(self._w, 'delta', deltax, deltay))
       
  2784     def fraction(self, x, y):
       
  2785         """Return the fractional value which corresponds to a slider
       
  2786         position of X,Y."""
       
  2787         return getdouble(self.tk.call(self._w, 'fraction', x, y))
       
  2788     def identify(self, x, y):
       
  2789         """Return the element under position X,Y as one of
       
  2790         "arrow1","slider","arrow2" or ""."""
       
  2791         return self.tk.call(self._w, 'identify', x, y)
       
  2792     def get(self):
       
  2793         """Return the current fractional values (upper and lower end)
       
  2794         of the slider position."""
       
  2795         return self._getdoubles(self.tk.call(self._w, 'get'))
       
  2796     def set(self, *args):
       
  2797         """Set the fractional values of the slider position (upper and
       
  2798         lower ends as value between 0 and 1)."""
       
  2799         self.tk.call((self._w, 'set') + args)
       
  2800 
       
  2801 
       
  2802 
       
  2803 class Text(Widget):
       
  2804     """Text widget which can display text in various forms."""
       
  2805     def __init__(self, master=None, cnf={}, **kw):
       
  2806         """Construct a text widget with the parent MASTER.
       
  2807 
       
  2808         STANDARD OPTIONS
       
  2809 
       
  2810             background, borderwidth, cursor,
       
  2811             exportselection, font, foreground,
       
  2812             highlightbackground, highlightcolor,
       
  2813             highlightthickness, insertbackground,
       
  2814             insertborderwidth, insertofftime,
       
  2815             insertontime, insertwidth, padx, pady,
       
  2816             relief, selectbackground,
       
  2817             selectborderwidth, selectforeground,
       
  2818             setgrid, takefocus,
       
  2819             xscrollcommand, yscrollcommand,
       
  2820 
       
  2821         WIDGET-SPECIFIC OPTIONS
       
  2822 
       
  2823             autoseparators, height, maxundo,
       
  2824             spacing1, spacing2, spacing3,
       
  2825             state, tabs, undo, width, wrap,
       
  2826 
       
  2827         """
       
  2828         Widget.__init__(self, master, 'text', cnf, kw)
       
  2829     def bbox(self, *args):
       
  2830         """Return a tuple of (x,y,width,height) which gives the bounding
       
  2831         box of the visible part of the character at the index in ARGS."""
       
  2832         return self._getints(
       
  2833             self.tk.call((self._w, 'bbox') + args)) or None
       
  2834     def tk_textSelectTo(self, index):
       
  2835         self.tk.call('tk_textSelectTo', self._w, index)
       
  2836     def tk_textBackspace(self):
       
  2837         self.tk.call('tk_textBackspace', self._w)
       
  2838     def tk_textIndexCloser(self, a, b, c):
       
  2839         self.tk.call('tk_textIndexCloser', self._w, a, b, c)
       
  2840     def tk_textResetAnchor(self, index):
       
  2841         self.tk.call('tk_textResetAnchor', self._w, index)
       
  2842     def compare(self, index1, op, index2):
       
  2843         """Return whether between index INDEX1 and index INDEX2 the
       
  2844         relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=."""
       
  2845         return self.tk.getboolean(self.tk.call(
       
  2846             self._w, 'compare', index1, op, index2))
       
  2847     def debug(self, boolean=None):
       
  2848         """Turn on the internal consistency checks of the B-Tree inside the text
       
  2849         widget according to BOOLEAN."""
       
  2850         return self.tk.getboolean(self.tk.call(
       
  2851             self._w, 'debug', boolean))
       
  2852     def delete(self, index1, index2=None):
       
  2853         """Delete the characters between INDEX1 and INDEX2 (not included)."""
       
  2854         self.tk.call(self._w, 'delete', index1, index2)
       
  2855     def dlineinfo(self, index):
       
  2856         """Return tuple (x,y,width,height,baseline) giving the bounding box
       
  2857         and baseline position of the visible part of the line containing
       
  2858         the character at INDEX."""
       
  2859         return self._getints(self.tk.call(self._w, 'dlineinfo', index))
       
  2860     def dump(self, index1, index2=None, command=None, **kw):
       
  2861         """Return the contents of the widget between index1 and index2.
       
  2862 
       
  2863         The type of contents returned in filtered based on the keyword
       
  2864         parameters; if 'all', 'image', 'mark', 'tag', 'text', or 'window' are
       
  2865         given and true, then the corresponding items are returned. The result
       
  2866         is a list of triples of the form (key, value, index). If none of the
       
  2867         keywords are true then 'all' is used by default.
       
  2868 
       
  2869         If the 'command' argument is given, it is called once for each element
       
  2870         of the list of triples, with the values of each triple serving as the
       
  2871         arguments to the function. In this case the list is not returned."""
       
  2872         args = []
       
  2873         func_name = None
       
  2874         result = None
       
  2875         if not command:
       
  2876             # Never call the dump command without the -command flag, since the
       
  2877             # output could involve Tcl quoting and would be a pain to parse
       
  2878             # right. Instead just set the command to build a list of triples
       
  2879             # as if we had done the parsing.
       
  2880             result = []
       
  2881             def append_triple(key, value, index, result=result):
       
  2882                 result.append((key, value, index))
       
  2883             command = append_triple
       
  2884         try:
       
  2885             if not isinstance(command, str):
       
  2886                 func_name = command = self._register(command)
       
  2887             args += ["-command", command]
       
  2888             for key in kw:
       
  2889                 if kw[key]: args.append("-" + key)
       
  2890             args.append(index1)
       
  2891             if index2:
       
  2892                 args.append(index2)
       
  2893             self.tk.call(self._w, "dump", *args)
       
  2894             return result
       
  2895         finally:
       
  2896             if func_name:
       
  2897                 self.deletecommand(func_name)
       
  2898 
       
  2899     ## new in tk8.4
       
  2900     def edit(self, *args):
       
  2901         """Internal method
       
  2902 
       
  2903         This method controls the undo mechanism and
       
  2904         the modified flag. The exact behavior of the
       
  2905         command depends on the option argument that
       
  2906         follows the edit argument. The following forms
       
  2907         of the command are currently supported:
       
  2908 
       
  2909         edit_modified, edit_redo, edit_reset, edit_separator
       
  2910         and edit_undo
       
  2911 
       
  2912         """
       
  2913         return self._getints(
       
  2914             self.tk.call((self._w, 'edit') + args)) or ()
       
  2915 
       
  2916     def edit_modified(self, arg=None):
       
  2917         """Get or Set the modified flag
       
  2918 
       
  2919         If arg is not specified, returns the modified
       
  2920         flag of the widget. The insert, delete, edit undo and
       
  2921         edit redo commands or the user can set or clear the
       
  2922         modified flag. If boolean is specified, sets the
       
  2923         modified flag of the widget to arg.
       
  2924         """
       
  2925         return self.edit("modified", arg)
       
  2926 
       
  2927     def edit_redo(self):
       
  2928         """Redo the last undone edit
       
  2929 
       
  2930         When the undo option is true, reapplies the last
       
  2931         undone edits provided no other edits were done since
       
  2932         then. Generates an error when the redo stack is empty.
       
  2933         Does nothing when the undo option is false.
       
  2934         """
       
  2935         return self.edit("redo")
       
  2936 
       
  2937     def edit_reset(self):
       
  2938         """Clears the undo and redo stacks
       
  2939         """
       
  2940         return self.edit("reset")
       
  2941 
       
  2942     def edit_separator(self):
       
  2943         """Inserts a separator (boundary) on the undo stack.
       
  2944 
       
  2945         Does nothing when the undo option is false
       
  2946         """
       
  2947         return self.edit("separator")
       
  2948 
       
  2949     def edit_undo(self):
       
  2950         """Undoes the last edit action
       
  2951 
       
  2952         If the undo option is true. An edit action is defined
       
  2953         as all the insert and delete commands that are recorded
       
  2954         on the undo stack in between two separators. Generates
       
  2955         an error when the undo stack is empty. Does nothing
       
  2956         when the undo option is false
       
  2957         """
       
  2958         return self.edit("undo")
       
  2959 
       
  2960     def get(self, index1, index2=None):
       
  2961         """Return the text from INDEX1 to INDEX2 (not included)."""
       
  2962         return self.tk.call(self._w, 'get', index1, index2)
       
  2963     # (Image commands are new in 8.0)
       
  2964     def image_cget(self, index, option):
       
  2965         """Return the value of OPTION of an embedded image at INDEX."""
       
  2966         if option[:1] != "-":
       
  2967             option = "-" + option
       
  2968         if option[-1:] == "_":
       
  2969             option = option[:-1]
       
  2970         return self.tk.call(self._w, "image", "cget", index, option)
       
  2971     def image_configure(self, index, cnf=None, **kw):
       
  2972         """Configure an embedded image at INDEX."""
       
  2973         return self._configure(('image', 'configure', index), cnf, kw)
       
  2974     def image_create(self, index, cnf={}, **kw):
       
  2975         """Create an embedded image at INDEX."""
       
  2976         return self.tk.call(
       
  2977                  self._w, "image", "create", index,
       
  2978                  *self._options(cnf, kw))
       
  2979     def image_names(self):
       
  2980         """Return all names of embedded images in this widget."""
       
  2981         return self.tk.call(self._w, "image", "names")
       
  2982     def index(self, index):
       
  2983         """Return the index in the form line.char for INDEX."""
       
  2984         return self.tk.call(self._w, 'index', index)
       
  2985     def insert(self, index, chars, *args):
       
  2986         """Insert CHARS before the characters at INDEX. An additional
       
  2987         tag can be given in ARGS. Additional CHARS and tags can follow in ARGS."""
       
  2988         self.tk.call((self._w, 'insert', index, chars) + args)
       
  2989     def mark_gravity(self, markName, direction=None):
       
  2990         """Change the gravity of a mark MARKNAME to DIRECTION (LEFT or RIGHT).
       
  2991         Return the current value if None is given for DIRECTION."""
       
  2992         return self.tk.call(
       
  2993             (self._w, 'mark', 'gravity', markName, direction))
       
  2994     def mark_names(self):
       
  2995         """Return all mark names."""
       
  2996         return self.tk.splitlist(self.tk.call(
       
  2997             self._w, 'mark', 'names'))
       
  2998     def mark_set(self, markName, index):
       
  2999         """Set mark MARKNAME before the character at INDEX."""
       
  3000         self.tk.call(self._w, 'mark', 'set', markName, index)
       
  3001     def mark_unset(self, *markNames):
       
  3002         """Delete all marks in MARKNAMES."""
       
  3003         self.tk.call((self._w, 'mark', 'unset') + markNames)
       
  3004     def mark_next(self, index):
       
  3005         """Return the name of the next mark after INDEX."""
       
  3006         return self.tk.call(self._w, 'mark', 'next', index) or None
       
  3007     def mark_previous(self, index):
       
  3008         """Return the name of the previous mark before INDEX."""
       
  3009         return self.tk.call(self._w, 'mark', 'previous', index) or None
       
  3010     def scan_mark(self, x, y):
       
  3011         """Remember the current X, Y coordinates."""
       
  3012         self.tk.call(self._w, 'scan', 'mark', x, y)
       
  3013     def scan_dragto(self, x, y):
       
  3014         """Adjust the view of the text to 10 times the
       
  3015         difference between X and Y and the coordinates given in
       
  3016         scan_mark."""
       
  3017         self.tk.call(self._w, 'scan', 'dragto', x, y)
       
  3018     def search(self, pattern, index, stopindex=None,
       
  3019            forwards=None, backwards=None, exact=None,
       
  3020            regexp=None, nocase=None, count=None):
       
  3021         """Search PATTERN beginning from INDEX until STOPINDEX.
       
  3022         Return the index of the first character of a match or an empty string."""
       
  3023         args = [self._w, 'search']
       
  3024         if forwards: args.append('-forwards')
       
  3025         if backwards: args.append('-backwards')
       
  3026         if exact: args.append('-exact')
       
  3027         if regexp: args.append('-regexp')
       
  3028         if nocase: args.append('-nocase')
       
  3029         if count: args.append('-count'); args.append(count)
       
  3030         if pattern[0] == '-': args.append('--')
       
  3031         args.append(pattern)
       
  3032         args.append(index)
       
  3033         if stopindex: args.append(stopindex)
       
  3034         return self.tk.call(tuple(args))
       
  3035     def see(self, index):
       
  3036         """Scroll such that the character at INDEX is visible."""
       
  3037         self.tk.call(self._w, 'see', index)
       
  3038     def tag_add(self, tagName, index1, *args):
       
  3039         """Add tag TAGNAME to all characters between INDEX1 and index2 in ARGS.
       
  3040         Additional pairs of indices may follow in ARGS."""
       
  3041         self.tk.call(
       
  3042             (self._w, 'tag', 'add', tagName, index1) + args)
       
  3043     def tag_unbind(self, tagName, sequence, funcid=None):
       
  3044         """Unbind for all characters with TAGNAME for event SEQUENCE  the
       
  3045         function identified with FUNCID."""
       
  3046         self.tk.call(self._w, 'tag', 'bind', tagName, sequence, '')
       
  3047         if funcid:
       
  3048             self.deletecommand(funcid)
       
  3049     def tag_bind(self, tagName, sequence, func, add=None):
       
  3050         """Bind to all characters with TAGNAME at event SEQUENCE a call to function FUNC.
       
  3051 
       
  3052         An additional boolean parameter ADD specifies whether FUNC will be
       
  3053         called additionally to the other bound function or whether it will
       
  3054         replace the previous function. See bind for the return value."""
       
  3055         return self._bind((self._w, 'tag', 'bind', tagName),
       
  3056                   sequence, func, add)
       
  3057     def tag_cget(self, tagName, option):
       
  3058         """Return the value of OPTION for tag TAGNAME."""
       
  3059         if option[:1] != '-':
       
  3060             option = '-' + option
       
  3061         if option[-1:] == '_':
       
  3062             option = option[:-1]
       
  3063         return self.tk.call(self._w, 'tag', 'cget', tagName, option)
       
  3064     def tag_configure(self, tagName, cnf=None, **kw):
       
  3065         """Configure a tag TAGNAME."""
       
  3066         return self._configure(('tag', 'configure', tagName), cnf, kw)
       
  3067     tag_config = tag_configure
       
  3068     def tag_delete(self, *tagNames):
       
  3069         """Delete all tags in TAGNAMES."""
       
  3070         self.tk.call((self._w, 'tag', 'delete') + tagNames)
       
  3071     def tag_lower(self, tagName, belowThis=None):
       
  3072         """Change the priority of tag TAGNAME such that it is lower
       
  3073         than the priority of BELOWTHIS."""
       
  3074         self.tk.call(self._w, 'tag', 'lower', tagName, belowThis)
       
  3075     def tag_names(self, index=None):
       
  3076         """Return a list of all tag names."""
       
  3077         return self.tk.splitlist(
       
  3078             self.tk.call(self._w, 'tag', 'names', index))
       
  3079     def tag_nextrange(self, tagName, index1, index2=None):
       
  3080         """Return a list of start and end index for the first sequence of
       
  3081         characters between INDEX1 and INDEX2 which all have tag TAGNAME.
       
  3082         The text is searched forward from INDEX1."""
       
  3083         return self.tk.splitlist(self.tk.call(
       
  3084             self._w, 'tag', 'nextrange', tagName, index1, index2))
       
  3085     def tag_prevrange(self, tagName, index1, index2=None):
       
  3086         """Return a list of start and end index for the first sequence of
       
  3087         characters between INDEX1 and INDEX2 which all have tag TAGNAME.
       
  3088         The text is searched backwards from INDEX1."""
       
  3089         return self.tk.splitlist(self.tk.call(
       
  3090             self._w, 'tag', 'prevrange', tagName, index1, index2))
       
  3091     def tag_raise(self, tagName, aboveThis=None):
       
  3092         """Change the priority of tag TAGNAME such that it is higher
       
  3093         than the priority of ABOVETHIS."""
       
  3094         self.tk.call(
       
  3095             self._w, 'tag', 'raise', tagName, aboveThis)
       
  3096     def tag_ranges(self, tagName):
       
  3097         """Return a list of ranges of text which have tag TAGNAME."""
       
  3098         return self.tk.splitlist(self.tk.call(
       
  3099             self._w, 'tag', 'ranges', tagName))
       
  3100     def tag_remove(self, tagName, index1, index2=None):
       
  3101         """Remove tag TAGNAME from all characters between INDEX1 and INDEX2."""
       
  3102         self.tk.call(
       
  3103             self._w, 'tag', 'remove', tagName, index1, index2)
       
  3104     def window_cget(self, index, option):
       
  3105         """Return the value of OPTION of an embedded window at INDEX."""
       
  3106         if option[:1] != '-':
       
  3107             option = '-' + option
       
  3108         if option[-1:] == '_':
       
  3109             option = option[:-1]
       
  3110         return self.tk.call(self._w, 'window', 'cget', index, option)
       
  3111     def window_configure(self, index, cnf=None, **kw):
       
  3112         """Configure an embedded window at INDEX."""
       
  3113         return self._configure(('window', 'configure', index), cnf, kw)
       
  3114     window_config = window_configure
       
  3115     def window_create(self, index, cnf={}, **kw):
       
  3116         """Create a window at INDEX."""
       
  3117         self.tk.call(
       
  3118               (self._w, 'window', 'create', index)
       
  3119               + self._options(cnf, kw))
       
  3120     def window_names(self):
       
  3121         """Return all names of embedded windows in this widget."""
       
  3122         return self.tk.splitlist(
       
  3123             self.tk.call(self._w, 'window', 'names'))
       
  3124     def xview(self, *what):
       
  3125         """Query and change horizontal position of the view."""
       
  3126         if not what:
       
  3127             return self._getdoubles(self.tk.call(self._w, 'xview'))
       
  3128         self.tk.call((self._w, 'xview') + what)
       
  3129     def xview_moveto(self, fraction):
       
  3130         """Adjusts the view in the window so that FRACTION of the
       
  3131         total width of the canvas is off-screen to the left."""
       
  3132         self.tk.call(self._w, 'xview', 'moveto', fraction)
       
  3133     def xview_scroll(self, number, what):
       
  3134         """Shift the x-view according to NUMBER which is measured
       
  3135         in "units" or "pages" (WHAT)."""
       
  3136         self.tk.call(self._w, 'xview', 'scroll', number, what)
       
  3137     def yview(self, *what):
       
  3138         """Query and change vertical position of the view."""
       
  3139         if not what:
       
  3140             return self._getdoubles(self.tk.call(self._w, 'yview'))
       
  3141         self.tk.call((self._w, 'yview') + what)
       
  3142     def yview_moveto(self, fraction):
       
  3143         """Adjusts the view in the window so that FRACTION of the
       
  3144         total height of the canvas is off-screen to the top."""
       
  3145         self.tk.call(self._w, 'yview', 'moveto', fraction)
       
  3146     def yview_scroll(self, number, what):
       
  3147         """Shift the y-view according to NUMBER which is measured
       
  3148         in "units" or "pages" (WHAT)."""
       
  3149         self.tk.call(self._w, 'yview', 'scroll', number, what)
       
  3150     def yview_pickplace(self, *what):
       
  3151         """Obsolete function, use see."""
       
  3152         self.tk.call((self._w, 'yview', '-pickplace') + what)
       
  3153 
       
  3154 
       
  3155 class _setit:
       
  3156     """Internal class. It wraps the command in the widget OptionMenu."""
       
  3157     def __init__(self, var, value, callback=None):
       
  3158         self.__value = value
       
  3159         self.__var = var
       
  3160         self.__callback = callback
       
  3161     def __call__(self, *args):
       
  3162         self.__var.set(self.__value)
       
  3163         if self.__callback:
       
  3164             self.__callback(self.__value, *args)
       
  3165 
       
  3166 class OptionMenu(Menubutton):
       
  3167     """OptionMenu which allows the user to select a value from a menu."""
       
  3168     def __init__(self, master, variable, value, *values, **kwargs):
       
  3169         """Construct an optionmenu widget with the parent MASTER, with
       
  3170         the resource textvariable set to VARIABLE, the initially selected
       
  3171         value VALUE, the other menu values VALUES and an additional
       
  3172         keyword argument command."""
       
  3173         kw = {"borderwidth": 2, "textvariable": variable,
       
  3174               "indicatoron": 1, "relief": RAISED, "anchor": "c",
       
  3175               "highlightthickness": 2}
       
  3176         Widget.__init__(self, master, "menubutton", kw)
       
  3177         self.widgetName = 'tk_optionMenu'
       
  3178         menu = self.__menu = Menu(self, name="menu", tearoff=0)
       
  3179         self.menuname = menu._w
       
  3180         # 'command' is the only supported keyword
       
  3181         callback = kwargs.get('command')
       
  3182         if kwargs.has_key('command'):
       
  3183             del kwargs['command']
       
  3184         if kwargs:
       
  3185             raise TclError, 'unknown option -'+kwargs.keys()[0]
       
  3186         menu.add_command(label=value,
       
  3187                  command=_setit(variable, value, callback))
       
  3188         for v in values:
       
  3189             menu.add_command(label=v,
       
  3190                      command=_setit(variable, v, callback))
       
  3191         self["menu"] = menu
       
  3192 
       
  3193     def __getitem__(self, name):
       
  3194         if name == 'menu':
       
  3195             return self.__menu
       
  3196         return Widget.__getitem__(self, name)
       
  3197 
       
  3198     def destroy(self):
       
  3199         """Destroy this widget and the associated menu."""
       
  3200         Menubutton.destroy(self)
       
  3201         self.__menu = None
       
  3202 
       
  3203 class Image:
       
  3204     """Base class for images."""
       
  3205     _last_id = 0
       
  3206     def __init__(self, imgtype, name=None, cnf={}, master=None, **kw):
       
  3207         self.name = None
       
  3208         if not master:
       
  3209             master = _default_root
       
  3210             if not master:
       
  3211                 raise RuntimeError, 'Too early to create image'
       
  3212         self.tk = master.tk
       
  3213         if not name:
       
  3214             Image._last_id += 1
       
  3215             name = "pyimage%r" % (Image._last_id,) # tk itself would use image<x>
       
  3216             # The following is needed for systems where id(x)
       
  3217             # can return a negative number, such as Linux/m68k:
       
  3218             if name[0] == '-': name = '_' + name[1:]
       
  3219         if kw and cnf: cnf = _cnfmerge((cnf, kw))
       
  3220         elif kw: cnf = kw
       
  3221         options = ()
       
  3222         for k, v in cnf.items():
       
  3223             if callable(v):
       
  3224                 v = self._register(v)
       
  3225             options = options + ('-'+k, v)
       
  3226         self.tk.call(('image', 'create', imgtype, name,) + options)
       
  3227         self.name = name
       
  3228     def __str__(self): return self.name
       
  3229     def __del__(self):
       
  3230         if self.name:
       
  3231             try:
       
  3232                 self.tk.call('image', 'delete', self.name)
       
  3233             except TclError:
       
  3234                 # May happen if the root was destroyed
       
  3235                 pass
       
  3236     def __setitem__(self, key, value):
       
  3237         self.tk.call(self.name, 'configure', '-'+key, value)
       
  3238     def __getitem__(self, key):
       
  3239         return self.tk.call(self.name, 'configure', '-'+key)
       
  3240     def configure(self, **kw):
       
  3241         """Configure the image."""
       
  3242         res = ()
       
  3243         for k, v in _cnfmerge(kw).items():
       
  3244             if v is not None:
       
  3245                 if k[-1] == '_': k = k[:-1]
       
  3246                 if callable(v):
       
  3247                     v = self._register(v)
       
  3248                 res = res + ('-'+k, v)
       
  3249         self.tk.call((self.name, 'config') + res)
       
  3250     config = configure
       
  3251     def height(self):
       
  3252         """Return the height of the image."""
       
  3253         return getint(
       
  3254             self.tk.call('image', 'height', self.name))
       
  3255     def type(self):
       
  3256         """Return the type of the imgage, e.g. "photo" or "bitmap"."""
       
  3257         return self.tk.call('image', 'type', self.name)
       
  3258     def width(self):
       
  3259         """Return the width of the image."""
       
  3260         return getint(
       
  3261             self.tk.call('image', 'width', self.name))
       
  3262 
       
  3263 class PhotoImage(Image):
       
  3264     """Widget which can display colored images in GIF, PPM/PGM format."""
       
  3265     def __init__(self, name=None, cnf={}, master=None, **kw):
       
  3266         """Create an image with NAME.
       
  3267 
       
  3268         Valid resource names: data, format, file, gamma, height, palette,
       
  3269         width."""
       
  3270         Image.__init__(self, 'photo', name, cnf, master, **kw)
       
  3271     def blank(self):
       
  3272         """Display a transparent image."""
       
  3273         self.tk.call(self.name, 'blank')
       
  3274     def cget(self, option):
       
  3275         """Return the value of OPTION."""
       
  3276         return self.tk.call(self.name, 'cget', '-' + option)
       
  3277     # XXX config
       
  3278     def __getitem__(self, key):
       
  3279         return self.tk.call(self.name, 'cget', '-' + key)
       
  3280     # XXX copy -from, -to, ...?
       
  3281     def copy(self):
       
  3282         """Return a new PhotoImage with the same image as this widget."""
       
  3283         destImage = PhotoImage()
       
  3284         self.tk.call(destImage, 'copy', self.name)
       
  3285         return destImage
       
  3286     def zoom(self,x,y=''):
       
  3287         """Return a new PhotoImage with the same image as this widget
       
  3288         but zoom it with X and Y."""
       
  3289         destImage = PhotoImage()
       
  3290         if y=='': y=x
       
  3291         self.tk.call(destImage, 'copy', self.name, '-zoom',x,y)
       
  3292         return destImage
       
  3293     def subsample(self,x,y=''):
       
  3294         """Return a new PhotoImage based on the same image as this widget
       
  3295         but use only every Xth or Yth pixel."""
       
  3296         destImage = PhotoImage()
       
  3297         if y=='': y=x
       
  3298         self.tk.call(destImage, 'copy', self.name, '-subsample',x,y)
       
  3299         return destImage
       
  3300     def get(self, x, y):
       
  3301         """Return the color (red, green, blue) of the pixel at X,Y."""
       
  3302         return self.tk.call(self.name, 'get', x, y)
       
  3303     def put(self, data, to=None):
       
  3304         """Put row formated colors to image starting from
       
  3305         position TO, e.g. image.put("{red green} {blue yellow}", to=(4,6))"""
       
  3306         args = (self.name, 'put', data)
       
  3307         if to:
       
  3308             if to[0] == '-to':
       
  3309                 to = to[1:]
       
  3310             args = args + ('-to',) + tuple(to)
       
  3311         self.tk.call(args)
       
  3312     # XXX read
       
  3313     def write(self, filename, format=None, from_coords=None):
       
  3314         """Write image to file FILENAME in FORMAT starting from
       
  3315         position FROM_COORDS."""
       
  3316         args = (self.name, 'write', filename)
       
  3317         if format:
       
  3318             args = args + ('-format', format)
       
  3319         if from_coords:
       
  3320             args = args + ('-from',) + tuple(from_coords)
       
  3321         self.tk.call(args)
       
  3322 
       
  3323 class BitmapImage(Image):
       
  3324     """Widget which can display a bitmap."""
       
  3325     def __init__(self, name=None, cnf={}, master=None, **kw):
       
  3326         """Create a bitmap with NAME.
       
  3327 
       
  3328         Valid resource names: background, data, file, foreground, maskdata, maskfile."""
       
  3329         Image.__init__(self, 'bitmap', name, cnf, master, **kw)
       
  3330 
       
  3331 def image_names(): return _default_root.tk.call('image', 'names')
       
  3332 def image_types(): return _default_root.tk.call('image', 'types')
       
  3333 
       
  3334 
       
  3335 class Spinbox(Widget):
       
  3336     """spinbox widget."""
       
  3337     def __init__(self, master=None, cnf={}, **kw):
       
  3338         """Construct a spinbox widget with the parent MASTER.
       
  3339 
       
  3340         STANDARD OPTIONS
       
  3341 
       
  3342             activebackground, background, borderwidth,
       
  3343             cursor, exportselection, font, foreground,
       
  3344             highlightbackground, highlightcolor,
       
  3345             highlightthickness, insertbackground,
       
  3346             insertborderwidth, insertofftime,
       
  3347             insertontime, insertwidth, justify, relief,
       
  3348             repeatdelay, repeatinterval,
       
  3349             selectbackground, selectborderwidth
       
  3350             selectforeground, takefocus, textvariable
       
  3351             xscrollcommand.
       
  3352 
       
  3353         WIDGET-SPECIFIC OPTIONS
       
  3354 
       
  3355             buttonbackground, buttoncursor,
       
  3356             buttondownrelief, buttonuprelief,
       
  3357             command, disabledbackground,
       
  3358             disabledforeground, format, from,
       
  3359             invalidcommand, increment,
       
  3360             readonlybackground, state, to,
       
  3361             validate, validatecommand values,
       
  3362             width, wrap,
       
  3363         """
       
  3364         Widget.__init__(self, master, 'spinbox', cnf, kw)
       
  3365 
       
  3366     def bbox(self, index):
       
  3367         """Return a tuple of X1,Y1,X2,Y2 coordinates for a
       
  3368         rectangle which encloses the character given by index.
       
  3369 
       
  3370         The first two elements of the list give the x and y
       
  3371         coordinates of the upper-left corner of the screen
       
  3372         area covered by the character (in pixels relative
       
  3373         to the widget) and the last two elements give the
       
  3374         width and height of the character, in pixels. The
       
  3375         bounding box may refer to a region outside the
       
  3376         visible area of the window.
       
  3377         """
       
  3378         return self.tk.call(self._w, 'bbox', index)
       
  3379 
       
  3380     def delete(self, first, last=None):
       
  3381         """Delete one or more elements of the spinbox.
       
  3382 
       
  3383         First is the index of the first character to delete,
       
  3384         and last is the index of the character just after
       
  3385         the last one to delete. If last isn't specified it
       
  3386         defaults to first+1, i.e. a single character is
       
  3387         deleted.  This command returns an empty string.
       
  3388         """
       
  3389         return self.tk.call(self._w, 'delete', first, last)
       
  3390 
       
  3391     def get(self):
       
  3392         """Returns the spinbox's string"""
       
  3393         return self.tk.call(self._w, 'get')
       
  3394 
       
  3395     def icursor(self, index):
       
  3396         """Alter the position of the insertion cursor.
       
  3397 
       
  3398         The insertion cursor will be displayed just before
       
  3399         the character given by index. Returns an empty string
       
  3400         """
       
  3401         return self.tk.call(self._w, 'icursor', index)
       
  3402 
       
  3403     def identify(self, x, y):
       
  3404         """Returns the name of the widget at position x, y
       
  3405 
       
  3406         Return value is one of: none, buttondown, buttonup, entry
       
  3407         """
       
  3408         return self.tk.call(self._w, 'identify', x, y)
       
  3409 
       
  3410     def index(self, index):
       
  3411         """Returns the numerical index corresponding to index
       
  3412         """
       
  3413         return self.tk.call(self._w, 'index', index)
       
  3414 
       
  3415     def insert(self, index, s):
       
  3416         """Insert string s at index
       
  3417 
       
  3418          Returns an empty string.
       
  3419         """
       
  3420         return self.tk.call(self._w, 'insert', index, s)
       
  3421 
       
  3422     def invoke(self, element):
       
  3423         """Causes the specified element to be invoked
       
  3424 
       
  3425         The element could be buttondown or buttonup
       
  3426         triggering the action associated with it.
       
  3427         """
       
  3428         return self.tk.call(self._w, 'invoke', element)
       
  3429 
       
  3430     def scan(self, *args):
       
  3431         """Internal function."""
       
  3432         return self._getints(
       
  3433             self.tk.call((self._w, 'scan') + args)) or ()
       
  3434 
       
  3435     def scan_mark(self, x):
       
  3436         """Records x and the current view in the spinbox window;
       
  3437 
       
  3438         used in conjunction with later scan dragto commands.
       
  3439         Typically this command is associated with a mouse button
       
  3440         press in the widget. It returns an empty string.
       
  3441         """
       
  3442         return self.scan("mark", x)
       
  3443 
       
  3444     def scan_dragto(self, x):
       
  3445         """Compute the difference between the given x argument
       
  3446         and the x argument to the last scan mark command
       
  3447 
       
  3448         It then adjusts the view left or right by 10 times the
       
  3449         difference in x-coordinates. This command is typically
       
  3450         associated with mouse motion events in the widget, to
       
  3451         produce the effect of dragging the spinbox at high speed
       
  3452         through the window. The return value is an empty string.
       
  3453         """
       
  3454         return self.scan("dragto", x)
       
  3455 
       
  3456     def selection(self, *args):
       
  3457         """Internal function."""
       
  3458         return self._getints(
       
  3459             self.tk.call((self._w, 'selection') + args)) or ()
       
  3460 
       
  3461     def selection_adjust(self, index):
       
  3462         """Locate the end of the selection nearest to the character
       
  3463         given by index,
       
  3464 
       
  3465         Then adjust that end of the selection to be at index
       
  3466         (i.e including but not going beyond index). The other
       
  3467         end of the selection is made the anchor point for future
       
  3468         select to commands. If the selection isn't currently in
       
  3469         the spinbox, then a new selection is created to include
       
  3470         the characters between index and the most recent selection
       
  3471         anchor point, inclusive. Returns an empty string.
       
  3472         """
       
  3473         return self.selection("adjust", index)
       
  3474 
       
  3475     def selection_clear(self):
       
  3476         """Clear the selection
       
  3477 
       
  3478         If the selection isn't in this widget then the
       
  3479         command has no effect. Returns an empty string.
       
  3480         """
       
  3481         return self.selection("clear")
       
  3482 
       
  3483     def selection_element(self, element=None):
       
  3484         """Sets or gets the currently selected element.
       
  3485 
       
  3486         If a spinbutton element is specified, it will be
       
  3487         displayed depressed
       
  3488         """
       
  3489         return self.selection("element", element)
       
  3490 
       
  3491 ###########################################################################
       
  3492 
       
  3493 class LabelFrame(Widget):
       
  3494     """labelframe widget."""
       
  3495     def __init__(self, master=None, cnf={}, **kw):
       
  3496         """Construct a labelframe widget with the parent MASTER.
       
  3497 
       
  3498         STANDARD OPTIONS
       
  3499 
       
  3500             borderwidth, cursor, font, foreground,
       
  3501             highlightbackground, highlightcolor,
       
  3502             highlightthickness, padx, pady, relief,
       
  3503             takefocus, text
       
  3504 
       
  3505         WIDGET-SPECIFIC OPTIONS
       
  3506 
       
  3507             background, class, colormap, container,
       
  3508             height, labelanchor, labelwidget,
       
  3509             visual, width
       
  3510         """
       
  3511         Widget.__init__(self, master, 'labelframe', cnf, kw)
       
  3512 
       
  3513 ########################################################################
       
  3514 
       
  3515 class PanedWindow(Widget):
       
  3516     """panedwindow widget."""
       
  3517     def __init__(self, master=None, cnf={}, **kw):
       
  3518         """Construct a panedwindow widget with the parent MASTER.
       
  3519 
       
  3520         STANDARD OPTIONS
       
  3521 
       
  3522             background, borderwidth, cursor, height,
       
  3523             orient, relief, width
       
  3524 
       
  3525         WIDGET-SPECIFIC OPTIONS
       
  3526 
       
  3527             handlepad, handlesize, opaqueresize,
       
  3528             sashcursor, sashpad, sashrelief,
       
  3529             sashwidth, showhandle,
       
  3530         """
       
  3531         Widget.__init__(self, master, 'panedwindow', cnf, kw)
       
  3532 
       
  3533     def add(self, child, **kw):
       
  3534         """Add a child widget to the panedwindow in a new pane.
       
  3535 
       
  3536         The child argument is the name of the child widget
       
  3537         followed by pairs of arguments that specify how to
       
  3538         manage the windows. Options may have any of the values
       
  3539         accepted by the configure subcommand.
       
  3540         """
       
  3541         self.tk.call((self._w, 'add', child) + self._options(kw))
       
  3542 
       
  3543     def remove(self, child):
       
  3544         """Remove the pane containing child from the panedwindow
       
  3545 
       
  3546         All geometry management options for child will be forgotten.
       
  3547         """
       
  3548         self.tk.call(self._w, 'forget', child)
       
  3549     forget=remove
       
  3550 
       
  3551     def identify(self, x, y):
       
  3552         """Identify the panedwindow component at point x, y
       
  3553 
       
  3554         If the point is over a sash or a sash handle, the result
       
  3555         is a two element list containing the index of the sash or
       
  3556         handle, and a word indicating whether it is over a sash
       
  3557         or a handle, such as {0 sash} or {2 handle}. If the point
       
  3558         is over any other part of the panedwindow, the result is
       
  3559         an empty list.
       
  3560         """
       
  3561         return self.tk.call(self._w, 'identify', x, y)
       
  3562 
       
  3563     def proxy(self, *args):
       
  3564         """Internal function."""
       
  3565         return self._getints(
       
  3566             self.tk.call((self._w, 'proxy') + args)) or ()
       
  3567 
       
  3568     def proxy_coord(self):
       
  3569         """Return the x and y pair of the most recent proxy location
       
  3570         """
       
  3571         return self.proxy("coord")
       
  3572 
       
  3573     def proxy_forget(self):
       
  3574         """Remove the proxy from the display.
       
  3575         """
       
  3576         return self.proxy("forget")
       
  3577 
       
  3578     def proxy_place(self, x, y):
       
  3579         """Place the proxy at the given x and y coordinates.
       
  3580         """
       
  3581         return self.proxy("place", x, y)
       
  3582 
       
  3583     def sash(self, *args):
       
  3584         """Internal function."""
       
  3585         return self._getints(
       
  3586             self.tk.call((self._w, 'sash') + args)) or ()
       
  3587 
       
  3588     def sash_coord(self, index):
       
  3589         """Return the current x and y pair for the sash given by index.
       
  3590 
       
  3591         Index must be an integer between 0 and 1 less than the
       
  3592         number of panes in the panedwindow. The coordinates given are
       
  3593         those of the top left corner of the region containing the sash.
       
  3594         pathName sash dragto index x y This command computes the
       
  3595         difference between the given coordinates and the coordinates
       
  3596         given to the last sash coord command for the given sash. It then
       
  3597         moves that sash the computed difference. The return value is the
       
  3598         empty string.
       
  3599         """
       
  3600         return self.sash("coord", index)
       
  3601 
       
  3602     def sash_mark(self, index):
       
  3603         """Records x and y for the sash given by index;
       
  3604 
       
  3605         Used in conjunction with later dragto commands to move the sash.
       
  3606         """
       
  3607         return self.sash("mark", index)
       
  3608 
       
  3609     def sash_place(self, index, x, y):
       
  3610         """Place the sash given by index at the given coordinates
       
  3611         """
       
  3612         return self.sash("place", index, x, y)
       
  3613 
       
  3614     def panecget(self, child, option):
       
  3615         """Query a management option for window.
       
  3616 
       
  3617         Option may be any value allowed by the paneconfigure subcommand
       
  3618         """
       
  3619         return self.tk.call(
       
  3620             (self._w, 'panecget') + (child, '-'+option))
       
  3621 
       
  3622     def paneconfigure(self, tagOrId, cnf=None, **kw):
       
  3623         """Query or modify the management options for window.
       
  3624 
       
  3625         If no option is specified, returns a list describing all
       
  3626         of the available options for pathName.  If option is
       
  3627         specified with no value, then the command returns a list
       
  3628         describing the one named option (this list will be identical
       
  3629         to the corresponding sublist of the value returned if no
       
  3630         option is specified). If one or more option-value pairs are
       
  3631         specified, then the command modifies the given widget
       
  3632         option(s) to have the given value(s); in this case the
       
  3633         command returns an empty string. The following options
       
  3634         are supported:
       
  3635 
       
  3636         after window
       
  3637             Insert the window after the window specified. window
       
  3638             should be the name of a window already managed by pathName.
       
  3639         before window
       
  3640             Insert the window before the window specified. window
       
  3641             should be the name of a window already managed by pathName.
       
  3642         height size
       
  3643             Specify a height for the window. The height will be the
       
  3644             outer dimension of the window including its border, if
       
  3645             any. If size is an empty string, or if -height is not
       
  3646             specified, then the height requested internally by the
       
  3647             window will be used initially; the height may later be
       
  3648             adjusted by the movement of sashes in the panedwindow.
       
  3649             Size may be any value accepted by Tk_GetPixels.
       
  3650         minsize n
       
  3651             Specifies that the size of the window cannot be made
       
  3652             less than n. This constraint only affects the size of
       
  3653             the widget in the paned dimension -- the x dimension
       
  3654             for horizontal panedwindows, the y dimension for
       
  3655             vertical panedwindows. May be any value accepted by
       
  3656             Tk_GetPixels.
       
  3657         padx n
       
  3658             Specifies a non-negative value indicating how much
       
  3659             extra space to leave on each side of the window in
       
  3660             the X-direction. The value may have any of the forms
       
  3661             accepted by Tk_GetPixels.
       
  3662         pady n
       
  3663             Specifies a non-negative value indicating how much
       
  3664             extra space to leave on each side of the window in
       
  3665             the Y-direction. The value may have any of the forms
       
  3666             accepted by Tk_GetPixels.
       
  3667         sticky style
       
  3668             If a window's pane is larger than the requested
       
  3669             dimensions of the window, this option may be used
       
  3670             to position (or stretch) the window within its pane.
       
  3671             Style is a string that contains zero or more of the
       
  3672             characters n, s, e or w. The string can optionally
       
  3673             contains spaces or commas, but they are ignored. Each
       
  3674             letter refers to a side (north, south, east, or west)
       
  3675             that the window will "stick" to. If both n and s
       
  3676             (or e and w) are specified, the window will be
       
  3677             stretched to fill the entire height (or width) of
       
  3678             its cavity.
       
  3679         width size
       
  3680             Specify a width for the window. The width will be
       
  3681             the outer dimension of the window including its
       
  3682             border, if any. If size is an empty string, or
       
  3683             if -width is not specified, then the width requested
       
  3684             internally by the window will be used initially; the
       
  3685             width may later be adjusted by the movement of sashes
       
  3686             in the panedwindow. Size may be any value accepted by
       
  3687             Tk_GetPixels.
       
  3688 
       
  3689         """
       
  3690         if cnf is None and not kw:
       
  3691             cnf = {}
       
  3692             for x in self.tk.split(
       
  3693                 self.tk.call(self._w,
       
  3694                          'paneconfigure', tagOrId)):
       
  3695                 cnf[x[0][1:]] = (x[0][1:],) + x[1:]
       
  3696             return cnf
       
  3697         if type(cnf) == StringType and not kw:
       
  3698             x = self.tk.split(self.tk.call(
       
  3699                 self._w, 'paneconfigure', tagOrId, '-'+cnf))
       
  3700             return (x[0][1:],) + x[1:]
       
  3701         self.tk.call((self._w, 'paneconfigure', tagOrId) +
       
  3702                  self._options(cnf, kw))
       
  3703     paneconfig = paneconfigure
       
  3704 
       
  3705     def panes(self):
       
  3706         """Returns an ordered list of the child panes."""
       
  3707         return self.tk.call(self._w, 'panes')
       
  3708 
       
  3709 ######################################################################
       
  3710 # Extensions:
       
  3711 
       
  3712 class Studbutton(Button):
       
  3713     def __init__(self, master=None, cnf={}, **kw):
       
  3714         Widget.__init__(self, master, 'studbutton', cnf, kw)
       
  3715         self.bind('<Any-Enter>',       self.tkButtonEnter)
       
  3716         self.bind('<Any-Leave>',       self.tkButtonLeave)
       
  3717         self.bind('<1>',               self.tkButtonDown)
       
  3718         self.bind('<ButtonRelease-1>', self.tkButtonUp)
       
  3719 
       
  3720 class Tributton(Button):
       
  3721     def __init__(self, master=None, cnf={}, **kw):
       
  3722         Widget.__init__(self, master, 'tributton', cnf, kw)
       
  3723         self.bind('<Any-Enter>',       self.tkButtonEnter)
       
  3724         self.bind('<Any-Leave>',       self.tkButtonLeave)
       
  3725         self.bind('<1>',               self.tkButtonDown)
       
  3726         self.bind('<ButtonRelease-1>', self.tkButtonUp)
       
  3727         self['fg']               = self['bg']
       
  3728         self['activebackground'] = self['bg']
       
  3729 
       
  3730 ######################################################################
       
  3731 # Test:
       
  3732 
       
  3733 def _test():
       
  3734     root = Tk()
       
  3735     text = "This is Tcl/Tk version %s" % TclVersion
       
  3736     if TclVersion >= 8.1:
       
  3737         try:
       
  3738             text = text + unicode("\nThis should be a cedilla: \347",
       
  3739                                   "iso-8859-1")
       
  3740         except NameError:
       
  3741             pass # no unicode support
       
  3742     label = Label(root, text=text)
       
  3743     label.pack()
       
  3744     test = Button(root, text="Click me!",
       
  3745               command=lambda root=root: root.test.configure(
       
  3746                   text="[%s]" % root.test['text']))
       
  3747     test.pack()
       
  3748     root.test = test
       
  3749     quit = Button(root, text="QUIT", command=root.destroy)
       
  3750     quit.pack()
       
  3751     # The following three commands are needed so the window pops
       
  3752     # up on top on Windows...
       
  3753     root.iconify()
       
  3754     root.update()
       
  3755     root.deiconify()
       
  3756     root.mainloop()
       
  3757 
       
  3758 if __name__ == '__main__':
       
  3759     _test()