Current File : /home/mmdealscpanel/yummmdeals.com/tkinter.zip
PK�(�Z�$�͕͕__init__.pynu�[���"""Wrapper functions for Tcl/Tk.

Tkinter provides classes which allow the display, positioning and
control of widgets. Toplevel widgets are Tk and Toplevel. Other
widgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,
Checkbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox
LabelFrame and PanedWindow.

Properties of the widgets are specified with keyword arguments.
Keyword arguments have the same name as the corresponding resource
under Tk.

Widgets are positioned with one of the geometry managers Place, Pack
or Grid. These managers can be called with methods place, pack, grid
available in every Widget.

Actions are bound to events by resources (e.g. keyword argument
command) or with the method bind.

Example (Hello, World):
import tkinter
from tkinter.constants import *
tk = tkinter.Tk()
frame = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)
frame.pack(fill=BOTH,expand=1)
label = tkinter.Label(frame, text="Hello, World")
label.pack(fill=X, expand=1)
button = tkinter.Button(frame,text="Exit",command=tk.destroy)
button.pack(side=BOTTOM)
tk.mainloop()
"""

import enum
import sys

import _tkinter # If this fails your Python may not be configured for Tk
TclError = _tkinter.TclError
from tkinter.constants import *
import re


wantobjects = 1

TkVersion = float(_tkinter.TK_VERSION)
TclVersion = float(_tkinter.TCL_VERSION)

READABLE = _tkinter.READABLE
WRITABLE = _tkinter.WRITABLE
EXCEPTION = _tkinter.EXCEPTION


_magic_re = re.compile(r'([\\{}])')
_space_re = re.compile(r'([\s])', re.ASCII)


def _join(value):
    """Internal function."""
    return ' '.join(map(_stringify, value))


def _stringify(value):
    """Internal function."""
    if isinstance(value, (list, tuple)):
        if len(value) == 1:
            value = _stringify(value[0])
            if _magic_re.search(value):
                value = '{%s}' % value
        else:
            value = '{%s}' % _join(value)
    else:
        value = str(value)
        if not value:
            value = '{}'
        elif _magic_re.search(value):
            # add '\' before special characters and spaces
            value = _magic_re.sub(r'\\\1', value)
            value = value.replace('\n', r'\n')
            value = _space_re.sub(r'\\\1', value)
            if value[0] == '"':
                value = '\\' + value
        elif value[0] == '"' or _space_re.search(value):
            value = '{%s}' % value
    return value


def _flatten(seq):
    """Internal function."""
    res = ()
    for item in seq:
        if isinstance(item, (tuple, list)):
            res = res + _flatten(item)
        elif item is not None:
            res = res + (item,)
    return res


try: _flatten = _tkinter._flatten
except AttributeError: pass


def _cnfmerge(cnfs):
    """Internal function."""
    if isinstance(cnfs, dict):
        return cnfs
    elif isinstance(cnfs, (type(None), str)):
        return cnfs
    else:
        cnf = {}
        for c in _flatten(cnfs):
            try:
                cnf.update(c)
            except (AttributeError, TypeError) as msg:
                print("_cnfmerge: fallback due to:", msg)
                for k, v in c.items():
                    cnf[k] = v
        return cnf


try: _cnfmerge = _tkinter._cnfmerge
except AttributeError: pass


def _splitdict(tk, v, cut_minus=True, conv=None):
    """Return a properly formatted dict built from Tcl list pairs.

    If cut_minus is True, the supposed '-' prefix will be removed from
    keys. If conv is specified, it is used to convert values.

    Tcl list is expected to contain an even number of elements.
    """
    t = tk.splitlist(v)
    if len(t) % 2:
        raise RuntimeError('Tcl list representing a dict is expected '
                           'to contain an even number of elements')
    it = iter(t)
    dict = {}
    for key, value in zip(it, it):
        key = str(key)
        if cut_minus and key[0] == '-':
            key = key[1:]
        if conv:
            value = conv(value)
        dict[key] = value
    return dict


class EventType(str, enum.Enum):
    KeyPress = '2'
    Key = KeyPress
    KeyRelease = '3'
    ButtonPress = '4'
    Button = ButtonPress
    ButtonRelease = '5'
    Motion = '6'
    Enter = '7'
    Leave = '8'
    FocusIn = '9'
    FocusOut = '10'
    Keymap = '11'           # undocumented
    Expose = '12'
    GraphicsExpose = '13'   # undocumented
    NoExpose = '14'         # undocumented
    Visibility = '15'
    Create = '16'
    Destroy = '17'
    Unmap = '18'
    Map = '19'
    MapRequest = '20'
    Reparent = '21'
    Configure = '22'
    ConfigureRequest = '23'
    Gravity = '24'
    ResizeRequest = '25'
    Circulate = '26'
    CirculateRequest = '27'
    Property = '28'
    SelectionClear = '29'   # undocumented
    SelectionRequest = '30' # undocumented
    Selection = '31'        # undocumented
    Colormap = '32'
    ClientMessage = '33'    # undocumented
    Mapping = '34'          # undocumented
    VirtualEvent = '35'     # undocumented
    Activate = '36'
    Deactivate = '37'
    MouseWheel = '38'

    __str__ = str.__str__


class Event:
    """Container for the properties of an event.

    Instances of this type are generated if one of the following events occurs:

    KeyPress, KeyRelease - for keyboard events
    ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events
    Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate,
    Colormap, Gravity, Reparent, Property, Destroy, Activate,
    Deactivate - for window events.

    If a callback function for one of these events is registered
    using bind, bind_all, bind_class, or tag_bind, the callback is
    called with an Event as first argument. It will have the
    following attributes (in braces are the event types for which
    the attribute is valid):

        serial - serial number of event
    num - mouse button pressed (ButtonPress, ButtonRelease)
    focus - whether the window has the focus (Enter, Leave)
    height - height of the exposed window (Configure, Expose)
    width - width of the exposed window (Configure, Expose)
    keycode - keycode of the pressed key (KeyPress, KeyRelease)
    state - state of the event as a number (ButtonPress, ButtonRelease,
                            Enter, KeyPress, KeyRelease,
                            Leave, Motion)
    state - state as a string (Visibility)
    time - when the event occurred
    x - x-position of the mouse
    y - y-position of the mouse
    x_root - x-position of the mouse on the screen
             (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    y_root - y-position of the mouse on the screen
             (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    char - pressed character (KeyPress, KeyRelease)
    send_event - see X/Windows documentation
    keysym - keysym of the event as a string (KeyPress, KeyRelease)
    keysym_num - keysym of the event as a number (KeyPress, KeyRelease)
    type - type of the event as a number
    widget - widget in which the event occurred
    delta - delta of wheel movement (MouseWheel)
    """

    def __repr__(self):
        attrs = {k: v for k, v in self.__dict__.items() if v != '??'}
        if not self.char:
            del attrs['char']
        elif self.char != '??':
            attrs['char'] = repr(self.char)
        if not getattr(self, 'send_event', True):
            del attrs['send_event']
        if self.state == 0:
            del attrs['state']
        elif isinstance(self.state, int):
            state = self.state
            mods = ('Shift', 'Lock', 'Control',
                    'Mod1', 'Mod2', 'Mod3', 'Mod4', 'Mod5',
                    'Button1', 'Button2', 'Button3', 'Button4', 'Button5')
            s = []
            for i, n in enumerate(mods):
                if state & (1 << i):
                    s.append(n)
            state = state & ~((1<< len(mods)) - 1)
            if state or not s:
                s.append(hex(state))
            attrs['state'] = '|'.join(s)
        if self.delta == 0:
            del attrs['delta']
        # widget usually is known
        # serial and time are not very interesting
        # keysym_num duplicates keysym
        # x_root and y_root mostly duplicate x and y
        keys = ('send_event',
                'state', 'keysym', 'keycode', 'char',
                'num', 'delta', 'focus',
                'x', 'y', 'width', 'height')
        return '<%s event%s>' % (
            getattr(self.type, 'name', self.type),
            ''.join(' %s=%s' % (k, attrs[k]) for k in keys if k in attrs)
        )


_support_default_root = True
_default_root = None


def NoDefaultRoot():
    """Inhibit setting of default root window.

    Call this function to inhibit that the first instance of
    Tk is used for windows without an explicit parent window.
    """
    global _support_default_root, _default_root
    _support_default_root = False
    # Delete, so any use of _default_root will immediately raise an exception.
    # Rebind before deletion, so repeated calls will not fail.
    _default_root = None
    del _default_root


def _get_default_root(what=None):
    if not _support_default_root:
        raise RuntimeError("No master specified and tkinter is "
                           "configured to not support default root")
    if not _default_root:
        if what:
            raise RuntimeError(f"Too early to {what}: no default root window")
        root = Tk()
        assert _default_root is root
    return _default_root


def _tkerror(err):
    """Internal function."""
    pass


def _exit(code=0):
    """Internal function. Calling it will raise the exception SystemExit."""
    try:
        code = int(code)
    except ValueError:
        pass
    raise SystemExit(code)


_varnum = 0


class Variable:
    """Class to define value holders for e.g. buttons.

    Subclasses StringVar, IntVar, DoubleVar, BooleanVar are specializations
    that constrain the type of the value returned from get()."""
    _default = ""
    _tk = None
    _tclCommands = None

    def __init__(self, master=None, value=None, name=None):
        """Construct a variable

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to "")
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        """
        # check for type of NAME parameter to override weird error message
        # raised from Modules/_tkinter.c:SetVar like:
        # TypeError: setvar() takes exactly 3 arguments (2 given)
        if name is not None and not isinstance(name, str):
            raise TypeError("name must be a string")
        global _varnum
        if not master:
            master = _get_default_root('create variable')
        self._root = master._root()
        self._tk = master.tk
        if name:
            self._name = name
        else:
            self._name = 'PY_VAR' + repr(_varnum)
            _varnum += 1
        if value is not None:
            self.initialize(value)
        elif not self._tk.getboolean(self._tk.call("info", "exists", self._name)):
            self.initialize(self._default)

    def __del__(self):
        """Unset the variable in Tcl."""
        if self._tk is None:
            return
        if self._tk.getboolean(self._tk.call("info", "exists", self._name)):
            self._tk.globalunsetvar(self._name)
        if self._tclCommands is not None:
            for name in self._tclCommands:
                #print '- Tkinter: deleted command', name
                self._tk.deletecommand(name)
            self._tclCommands = None

    def __str__(self):
        """Return the name of the variable in Tcl."""
        return self._name

    def set(self, value):
        """Set the variable to VALUE."""
        return self._tk.globalsetvar(self._name, value)

    initialize = set

    def get(self):
        """Return value of variable."""
        return self._tk.globalgetvar(self._name)

    def _register(self, callback):
        f = CallWrapper(callback, None, self._root).__call__
        cbname = repr(id(f))
        try:
            callback = callback.__func__
        except AttributeError:
            pass
        try:
            cbname = cbname + callback.__name__
        except AttributeError:
            pass
        self._tk.createcommand(cbname, f)
        if self._tclCommands is None:
            self._tclCommands = []
        self._tclCommands.append(cbname)
        return cbname

    def trace_add(self, mode, callback):
        """Define a trace callback for the variable.

        Mode is one of "read", "write", "unset", or a list or tuple of
        such strings.
        Callback must be a function which is called when the variable is
        read, written or unset.

        Return the name of the callback.
        """
        cbname = self._register(callback)
        self._tk.call('trace', 'add', 'variable',
                      self._name, mode, (cbname,))
        return cbname

    def trace_remove(self, mode, cbname):
        """Delete the trace callback for a variable.

        Mode is one of "read", "write", "unset" or a list or tuple of
        such strings.  Must be same as were specified in trace_add().
        cbname is the name of the callback returned from trace_add().
        """
        self._tk.call('trace', 'remove', 'variable',
                      self._name, mode, cbname)
        for m, ca in self.trace_info():
            if self._tk.splitlist(ca)[0] == cbname:
                break
        else:
            self._tk.deletecommand(cbname)
            try:
                self._tclCommands.remove(cbname)
            except ValueError:
                pass

    def trace_info(self):
        """Return all trace callback information."""
        splitlist = self._tk.splitlist
        return [(splitlist(k), v) for k, v in map(splitlist,
            splitlist(self._tk.call('trace', 'info', 'variable', self._name)))]

    def trace_variable(self, mode, callback):
        """Define a trace callback for the variable.

        MODE is one of "r", "w", "u" for read, write, undefine.
        CALLBACK must be a function which is called when
        the variable is read, written or undefined.

        Return the name of the callback.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_add() instead.
        """
        # TODO: Add deprecation warning
        cbname = self._register(callback)
        self._tk.call("trace", "variable", self._name, mode, cbname)
        return cbname

    trace = trace_variable

    def trace_vdelete(self, mode, cbname):
        """Delete the trace callback for a variable.

        MODE is one of "r", "w", "u" for read, write, undefine.
        CBNAME is the name of the callback returned from trace_variable or trace.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_remove() instead.
        """
        # TODO: Add deprecation warning
        self._tk.call("trace", "vdelete", self._name, mode, cbname)
        cbname = self._tk.splitlist(cbname)[0]
        for m, ca in self.trace_info():
            if self._tk.splitlist(ca)[0] == cbname:
                break
        else:
            self._tk.deletecommand(cbname)
            try:
                self._tclCommands.remove(cbname)
            except ValueError:
                pass

    def trace_vinfo(self):
        """Return all trace callback information.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_info() instead.
        """
        # TODO: Add deprecation warning
        return [self._tk.splitlist(x) for x in self._tk.splitlist(
            self._tk.call("trace", "vinfo", self._name))]

    def __eq__(self, other):
        if not isinstance(other, Variable):
            return NotImplemented
        return (self._name == other._name
                and self.__class__.__name__ == other.__class__.__name__
                and self._tk == other._tk)


class StringVar(Variable):
    """Value holder for strings variables."""
    _default = ""

    def __init__(self, master=None, value=None, name=None):
        """Construct a string variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to "")
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        """
        Variable.__init__(self, master, value, name)

    def get(self):
        """Return value of variable as string."""
        value = self._tk.globalgetvar(self._name)
        if isinstance(value, str):
            return value
        return str(value)


class IntVar(Variable):
    """Value holder for integer variables."""
    _default = 0

    def __init__(self, master=None, value=None, name=None):
        """Construct an integer variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to 0)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        """
        Variable.__init__(self, master, value, name)

    def get(self):
        """Return the value of the variable as an integer."""
        value = self._tk.globalgetvar(self._name)
        try:
            return self._tk.getint(value)
        except (TypeError, TclError):
            return int(self._tk.getdouble(value))


class DoubleVar(Variable):
    """Value holder for float variables."""
    _default = 0.0

    def __init__(self, master=None, value=None, name=None):
        """Construct a float variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to 0.0)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        """
        Variable.__init__(self, master, value, name)

    def get(self):
        """Return the value of the variable as a float."""
        return self._tk.getdouble(self._tk.globalgetvar(self._name))


class BooleanVar(Variable):
    """Value holder for boolean variables."""
    _default = False

    def __init__(self, master=None, value=None, name=None):
        """Construct a boolean variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to False)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        """
        Variable.__init__(self, master, value, name)

    def set(self, value):
        """Set the variable to VALUE."""
        return self._tk.globalsetvar(self._name, self._tk.getboolean(value))

    initialize = set

    def get(self):
        """Return the value of the variable as a bool."""
        try:
            return self._tk.getboolean(self._tk.globalgetvar(self._name))
        except TclError:
            raise ValueError("invalid literal for getboolean()")


def mainloop(n=0):
    """Run the main loop of Tcl."""
    _get_default_root('run the main loop').tk.mainloop(n)


getint = int

getdouble = float


def getboolean(s):
    """Convert Tcl object to True or False."""
    try:
        return _get_default_root('use getboolean()').tk.getboolean(s)
    except TclError:
        raise ValueError("invalid literal for getboolean()")


# Methods defined on both toplevel and interior widgets

class Misc:
    """Internal class.

    Base class which defines methods common for interior widgets."""

    # used for generating child widget names
    _last_child_ids = None

    # XXX font command?
    _tclCommands = None

    def destroy(self):
        """Internal function.

        Delete all Tcl commands created for
        this widget in the Tcl interpreter."""
        if self._tclCommands is not None:
            for name in self._tclCommands:
                #print '- Tkinter: deleted command', name
                self.tk.deletecommand(name)
            self._tclCommands = None

    def deletecommand(self, name):
        """Internal function.

        Delete the Tcl command provided in NAME."""
        #print '- Tkinter: deleted command', name
        self.tk.deletecommand(name)
        try:
            self._tclCommands.remove(name)
        except ValueError:
            pass

    def tk_strictMotif(self, boolean=None):
        """Set Tcl internal variable, whether the look and feel
        should adhere to Motif.

        A parameter of 1 means adhere to Motif (e.g. no color
        change if mouse passes over slider).
        Returns the set value."""
        return self.tk.getboolean(self.tk.call(
            'set', 'tk_strictMotif', boolean))

    def tk_bisque(self):
        """Change the color scheme to light brown as used in Tk 3.6 and before."""
        self.tk.call('tk_bisque')

    def tk_setPalette(self, *args, **kw):
        """Set a new color scheme for all widget elements.

        A single color as argument will cause that all colors of Tk
        widget elements are derived from this.
        Alternatively several keyword parameters and its associated
        colors can be given. The following keywords are valid:
        activeBackground, foreground, selectColor,
        activeForeground, highlightBackground, selectBackground,
        background, highlightColor, selectForeground,
        disabledForeground, insertBackground, troughColor."""
        self.tk.call(('tk_setPalette',)
              + _flatten(args) + _flatten(list(kw.items())))

    def wait_variable(self, name='PY_VAR'):
        """Wait until the variable is modified.

        A parameter of type IntVar, StringVar, DoubleVar or
        BooleanVar must be given."""
        self.tk.call('tkwait', 'variable', name)
    waitvar = wait_variable # XXX b/w compat

    def wait_window(self, window=None):
        """Wait until a WIDGET is destroyed.

        If no parameter is given self is used."""
        if window is None:
            window = self
        self.tk.call('tkwait', 'window', window._w)

    def wait_visibility(self, window=None):
        """Wait until the visibility of a WIDGET changes
        (e.g. it appears).

        If no parameter is given self is used."""
        if window is None:
            window = self
        self.tk.call('tkwait', 'visibility', window._w)

    def setvar(self, name='PY_VAR', value='1'):
        """Set Tcl variable NAME to VALUE."""
        self.tk.setvar(name, value)

    def getvar(self, name='PY_VAR'):
        """Return value of Tcl variable NAME."""
        return self.tk.getvar(name)

    def getint(self, s):
        try:
            return self.tk.getint(s)
        except TclError as exc:
            raise ValueError(str(exc))

    def getdouble(self, s):
        try:
            return self.tk.getdouble(s)
        except TclError as exc:
            raise ValueError(str(exc))

    def getboolean(self, s):
        """Return a boolean value for Tcl boolean values true and false given as parameter."""
        try:
            return self.tk.getboolean(s)
        except TclError:
            raise ValueError("invalid literal for getboolean()")

    def focus_set(self):
        """Direct input focus to this widget.

        If the application currently does not have the focus
        this widget will get the focus if the application gets
        the focus through the window manager."""
        self.tk.call('focus', self._w)
    focus = focus_set # XXX b/w compat?

    def focus_force(self):
        """Direct input focus to this widget even if the
        application does not have the focus. Use with
        caution!"""
        self.tk.call('focus', '-force', self._w)

    def focus_get(self):
        """Return the widget which has currently the focus in the
        application.

        Use focus_displayof to allow working with several
        displays. Return None if application does not have
        the focus."""
        name = self.tk.call('focus')
        if name == 'none' or not name: return None
        return self._nametowidget(name)

    def focus_displayof(self):
        """Return the widget which has currently the focus on the
        display where this widget is located.

        Return None if the application does not have the focus."""
        name = self.tk.call('focus', '-displayof', self._w)
        if name == 'none' or not name: return None
        return self._nametowidget(name)

    def focus_lastfor(self):
        """Return the widget which would have the focus if top level
        for this widget gets the focus from the window manager."""
        name = self.tk.call('focus', '-lastfor', self._w)
        if name == 'none' or not name: return None
        return self._nametowidget(name)

    def tk_focusFollowsMouse(self):
        """The widget under mouse will get automatically focus. Can not
        be disabled easily."""
        self.tk.call('tk_focusFollowsMouse')

    def tk_focusNext(self):
        """Return the next widget in the focus order which follows
        widget which has currently the focus.

        The focus order first goes to the next child, then to
        the children of the child recursively and then to the
        next sibling which is higher in the stacking order.  A
        widget is omitted if it has the takefocus resource set
        to 0."""
        name = self.tk.call('tk_focusNext', self._w)
        if not name: return None
        return self._nametowidget(name)

    def tk_focusPrev(self):
        """Return previous widget in the focus order. See tk_focusNext for details."""
        name = self.tk.call('tk_focusPrev', self._w)
        if not name: return None
        return self._nametowidget(name)

    def after(self, ms, func=None, *args):
        """Call function once after given time.

        MS specifies the time in milliseconds. FUNC gives the
        function which shall be called. Additional parameters
        are given as parameters to the function call.  Return
        identifier to cancel scheduling with after_cancel."""
        if not func:
            # I'd rather use time.sleep(ms*0.001)
            self.tk.call('after', ms)
            return None
        else:
            def callit():
                try:
                    func(*args)
                finally:
                    try:
                        self.deletecommand(name)
                    except TclError:
                        pass
            callit.__name__ = func.__name__
            name = self._register(callit)
            return self.tk.call('after', ms, name)

    def after_idle(self, func, *args):
        """Call FUNC once if the Tcl main loop has no event to
        process.

        Return an identifier to cancel the scheduling with
        after_cancel."""
        return self.after('idle', func, *args)

    def after_cancel(self, id):
        """Cancel scheduling of function identified with ID.

        Identifier returned by after or after_idle must be
        given as first parameter.
        """
        if not id:
            raise ValueError('id must be a valid identifier returned from '
                             'after or after_idle')
        try:
            data = self.tk.call('after', 'info', id)
            script = self.tk.splitlist(data)[0]
            self.deletecommand(script)
        except TclError:
            pass
        self.tk.call('after', 'cancel', id)

    def bell(self, displayof=0):
        """Ring a display's bell."""
        self.tk.call(('bell',) + self._displayof(displayof))

    # Clipboard handling:
    def clipboard_get(self, **kw):
        """Retrieve data from the clipboard on window's display.

        The window keyword defaults to the root window of the Tkinter
        application.

        The type keyword specifies the form in which the data is
        to be returned and should be an atom name such as STRING
        or FILE_NAME.  Type defaults to STRING, except on X11, where the default
        is to try UTF8_STRING and fall back to STRING.

        This command is equivalent to:

        selection_get(CLIPBOARD)
        """
        if 'type' not in kw and self._windowingsystem == 'x11':
            try:
                kw['type'] = 'UTF8_STRING'
                return self.tk.call(('clipboard', 'get') + self._options(kw))
            except TclError:
                del kw['type']
        return self.tk.call(('clipboard', 'get') + self._options(kw))

    def clipboard_clear(self, **kw):
        """Clear the data in the Tk clipboard.

        A widget specified for the optional displayof keyword
        argument specifies the target display."""
        if 'displayof' not in kw: kw['displayof'] = self._w
        self.tk.call(('clipboard', 'clear') + self._options(kw))

    def clipboard_append(self, string, **kw):
        """Append STRING to the Tk clipboard.

        A widget specified at the optional displayof keyword
        argument specifies the target display. The clipboard
        can be retrieved with selection_get."""
        if 'displayof' not in kw: kw['displayof'] = self._w
        self.tk.call(('clipboard', 'append') + self._options(kw)
              + ('--', string))
    # XXX grab current w/o window argument

    def grab_current(self):
        """Return widget which has currently the grab in this application
        or None."""
        name = self.tk.call('grab', 'current', self._w)
        if not name: return None
        return self._nametowidget(name)

    def grab_release(self):
        """Release grab for this widget if currently set."""
        self.tk.call('grab', 'release', self._w)

    def grab_set(self):
        """Set grab for this widget.

        A grab directs all events to this and descendant
        widgets in the application."""
        self.tk.call('grab', 'set', self._w)

    def grab_set_global(self):
        """Set global grab for this widget.

        A global grab directs all events to this and
        descendant widgets on the display. Use with caution -
        other applications do not get events anymore."""
        self.tk.call('grab', 'set', '-global', self._w)

    def grab_status(self):
        """Return None, "local" or "global" if this widget has
        no, a local or a global grab."""
        status = self.tk.call('grab', 'status', self._w)
        if status == 'none': status = None
        return status

    def option_add(self, pattern, value, priority = None):
        """Set a VALUE (second parameter) for an option
        PATTERN (first parameter).

        An optional third parameter gives the numeric priority
        (defaults to 80)."""
        self.tk.call('option', 'add', pattern, value, priority)

    def option_clear(self):
        """Clear the option database.

        It will be reloaded if option_add is called."""
        self.tk.call('option', 'clear')

    def option_get(self, name, className):
        """Return the value for an option NAME for this widget
        with CLASSNAME.

        Values with higher priority override lower values."""
        return self.tk.call('option', 'get', self._w, name, className)

    def option_readfile(self, fileName, priority = None):
        """Read file FILENAME into the option database.

        An optional second parameter gives the numeric
        priority."""
        self.tk.call('option', 'readfile', fileName, priority)

    def selection_clear(self, **kw):
        """Clear the current X selection."""
        if 'displayof' not in kw: kw['displayof'] = self._w
        self.tk.call(('selection', 'clear') + self._options(kw))

    def selection_get(self, **kw):
        """Return the contents of the current X selection.

        A keyword parameter selection specifies the name of
        the selection and defaults to PRIMARY.  A keyword
        parameter displayof specifies a widget on the display
        to use. A keyword parameter type specifies the form of data to be
        fetched, defaulting to STRING except on X11, where UTF8_STRING is tried
        before STRING."""
        if 'displayof' not in kw: kw['displayof'] = self._w
        if 'type' not in kw and self._windowingsystem == 'x11':
            try:
                kw['type'] = 'UTF8_STRING'
                return self.tk.call(('selection', 'get') + self._options(kw))
            except TclError:
                del kw['type']
        return self.tk.call(('selection', 'get') + self._options(kw))

    def selection_handle(self, command, **kw):
        """Specify a function COMMAND to call if the X
        selection owned by this widget is queried by another
        application.

        This function must return the contents of the
        selection. The function will be called with the
        arguments OFFSET and LENGTH which allows the chunking
        of very long selections. The following keyword
        parameters can be provided:
        selection - name of the selection (default PRIMARY),
        type - type of the selection (e.g. STRING, FILE_NAME)."""
        name = self._register(command)
        self.tk.call(('selection', 'handle') + self._options(kw)
              + (self._w, name))

    def selection_own(self, **kw):
        """Become owner of X selection.

        A keyword parameter selection specifies the name of
        the selection (default PRIMARY)."""
        self.tk.call(('selection', 'own') +
                 self._options(kw) + (self._w,))

    def selection_own_get(self, **kw):
        """Return owner of X selection.

        The following keyword parameter can
        be provided:
        selection - name of the selection (default PRIMARY),
        type - type of the selection (e.g. STRING, FILE_NAME)."""
        if 'displayof' not in kw: kw['displayof'] = self._w
        name = self.tk.call(('selection', 'own') + self._options(kw))
        if not name: return None
        return self._nametowidget(name)

    def send(self, interp, cmd, *args):
        """Send Tcl command CMD to different interpreter INTERP to be executed."""
        return self.tk.call(('send', interp, cmd) + args)

    def lower(self, belowThis=None):
        """Lower this widget in the stacking order."""
        self.tk.call('lower', self._w, belowThis)

    def tkraise(self, aboveThis=None):
        """Raise this widget in the stacking order."""
        self.tk.call('raise', self._w, aboveThis)

    lift = tkraise

    def winfo_atom(self, name, displayof=0):
        """Return integer which represents atom NAME."""
        args = ('winfo', 'atom') + self._displayof(displayof) + (name,)
        return self.tk.getint(self.tk.call(args))

    def winfo_atomname(self, id, displayof=0):
        """Return name of atom with identifier ID."""
        args = ('winfo', 'atomname') \
               + self._displayof(displayof) + (id,)
        return self.tk.call(args)

    def winfo_cells(self):
        """Return number of cells in the colormap for this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'cells', self._w))

    def winfo_children(self):
        """Return a list of all widgets which are children of this widget."""
        result = []
        for child in self.tk.splitlist(
            self.tk.call('winfo', 'children', self._w)):
            try:
                # Tcl sometimes returns extra windows, e.g. for
                # menus; those need to be skipped
                result.append(self._nametowidget(child))
            except KeyError:
                pass
        return result

    def winfo_class(self):
        """Return window class name of this widget."""
        return self.tk.call('winfo', 'class', self._w)

    def winfo_colormapfull(self):
        """Return True if at the last color request the colormap was full."""
        return self.tk.getboolean(
            self.tk.call('winfo', 'colormapfull', self._w))

    def winfo_containing(self, rootX, rootY, displayof=0):
        """Return the widget which is at the root coordinates ROOTX, ROOTY."""
        args = ('winfo', 'containing') \
               + self._displayof(displayof) + (rootX, rootY)
        name = self.tk.call(args)
        if not name: return None
        return self._nametowidget(name)

    def winfo_depth(self):
        """Return the number of bits per pixel."""
        return self.tk.getint(self.tk.call('winfo', 'depth', self._w))

    def winfo_exists(self):
        """Return true if this widget exists."""
        return self.tk.getint(
            self.tk.call('winfo', 'exists', self._w))

    def winfo_fpixels(self, number):
        """Return the number of pixels for the given distance NUMBER
        (e.g. "3c") as float."""
        return self.tk.getdouble(self.tk.call(
            'winfo', 'fpixels', self._w, number))

    def winfo_geometry(self):
        """Return geometry string for this widget in the form "widthxheight+X+Y"."""
        return self.tk.call('winfo', 'geometry', self._w)

    def winfo_height(self):
        """Return height of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'height', self._w))

    def winfo_id(self):
        """Return identifier ID for this widget."""
        return int(self.tk.call('winfo', 'id', self._w), 0)

    def winfo_interps(self, displayof=0):
        """Return the name of all Tcl interpreters for this display."""
        args = ('winfo', 'interps') + self._displayof(displayof)
        return self.tk.splitlist(self.tk.call(args))

    def winfo_ismapped(self):
        """Return true if this widget is mapped."""
        return self.tk.getint(
            self.tk.call('winfo', 'ismapped', self._w))

    def winfo_manager(self):
        """Return the window manager name for this widget."""
        return self.tk.call('winfo', 'manager', self._w)

    def winfo_name(self):
        """Return the name of this widget."""
        return self.tk.call('winfo', 'name', self._w)

    def winfo_parent(self):
        """Return the name of the parent of this widget."""
        return self.tk.call('winfo', 'parent', self._w)

    def winfo_pathname(self, id, displayof=0):
        """Return the pathname of the widget given by ID."""
        args = ('winfo', 'pathname') \
               + self._displayof(displayof) + (id,)
        return self.tk.call(args)

    def winfo_pixels(self, number):
        """Rounded integer value of winfo_fpixels."""
        return self.tk.getint(
            self.tk.call('winfo', 'pixels', self._w, number))

    def winfo_pointerx(self):
        """Return the x coordinate of the pointer on the root window."""
        return self.tk.getint(
            self.tk.call('winfo', 'pointerx', self._w))

    def winfo_pointerxy(self):
        """Return a tuple of x and y coordinates of the pointer on the root window."""
        return self._getints(
            self.tk.call('winfo', 'pointerxy', self._w))

    def winfo_pointery(self):
        """Return the y coordinate of the pointer on the root window."""
        return self.tk.getint(
            self.tk.call('winfo', 'pointery', self._w))

    def winfo_reqheight(self):
        """Return requested height of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'reqheight', self._w))

    def winfo_reqwidth(self):
        """Return requested width of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'reqwidth', self._w))

    def winfo_rgb(self, color):
        """Return a tuple of integer RGB values in range(65536) for color in this widget."""
        return self._getints(
            self.tk.call('winfo', 'rgb', self._w, color))

    def winfo_rootx(self):
        """Return x coordinate of upper left corner of this widget on the
        root window."""
        return self.tk.getint(
            self.tk.call('winfo', 'rootx', self._w))

    def winfo_rooty(self):
        """Return y coordinate of upper left corner of this widget on the
        root window."""
        return self.tk.getint(
            self.tk.call('winfo', 'rooty', self._w))

    def winfo_screen(self):
        """Return the screen name of this widget."""
        return self.tk.call('winfo', 'screen', self._w)

    def winfo_screencells(self):
        """Return the number of the cells in the colormap of the screen
        of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'screencells', self._w))

    def winfo_screendepth(self):
        """Return the number of bits per pixel of the root window of the
        screen of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'screendepth', self._w))

    def winfo_screenheight(self):
        """Return the number of pixels of the height of the screen of this widget
        in pixel."""
        return self.tk.getint(
            self.tk.call('winfo', 'screenheight', self._w))

    def winfo_screenmmheight(self):
        """Return the number of pixels of the height of the screen of
        this widget in mm."""
        return self.tk.getint(
            self.tk.call('winfo', 'screenmmheight', self._w))

    def winfo_screenmmwidth(self):
        """Return the number of pixels of the width of the screen of
        this widget in mm."""
        return self.tk.getint(
            self.tk.call('winfo', 'screenmmwidth', self._w))

    def winfo_screenvisual(self):
        """Return one of the strings directcolor, grayscale, pseudocolor,
        staticcolor, staticgray, or truecolor for the default
        colormodel of this screen."""
        return self.tk.call('winfo', 'screenvisual', self._w)

    def winfo_screenwidth(self):
        """Return the number of pixels of the width of the screen of
        this widget in pixel."""
        return self.tk.getint(
            self.tk.call('winfo', 'screenwidth', self._w))

    def winfo_server(self):
        """Return information of the X-Server of the screen of this widget in
        the form "XmajorRminor vendor vendorVersion"."""
        return self.tk.call('winfo', 'server', self._w)

    def winfo_toplevel(self):
        """Return the toplevel widget of this widget."""
        return self._nametowidget(self.tk.call(
            'winfo', 'toplevel', self._w))

    def winfo_viewable(self):
        """Return true if the widget and all its higher ancestors are mapped."""
        return self.tk.getint(
            self.tk.call('winfo', 'viewable', self._w))

    def winfo_visual(self):
        """Return one of the strings directcolor, grayscale, pseudocolor,
        staticcolor, staticgray, or truecolor for the
        colormodel of this widget."""
        return self.tk.call('winfo', 'visual', self._w)

    def winfo_visualid(self):
        """Return the X identifier for the visual for this widget."""
        return self.tk.call('winfo', 'visualid', self._w)

    def winfo_visualsavailable(self, includeids=False):
        """Return a list of all visuals available for the screen
        of this widget.

        Each item in the list consists of a visual name (see winfo_visual), a
        depth and if includeids is true is given also the X identifier."""
        data = self.tk.call('winfo', 'visualsavailable', self._w,
                            'includeids' if includeids else None)
        data = [self.tk.splitlist(x) for x in self.tk.splitlist(data)]
        return [self.__winfo_parseitem(x) for x in data]

    def __winfo_parseitem(self, t):
        """Internal function."""
        return t[:1] + tuple(map(self.__winfo_getint, t[1:]))

    def __winfo_getint(self, x):
        """Internal function."""
        return int(x, 0)

    def winfo_vrootheight(self):
        """Return the height of the virtual root window associated with this
        widget in pixels. If there is no virtual root window return the
        height of the screen."""
        return self.tk.getint(
            self.tk.call('winfo', 'vrootheight', self._w))

    def winfo_vrootwidth(self):
        """Return the width of the virtual root window associated with this
        widget in pixel. If there is no virtual root window return the
        width of the screen."""
        return self.tk.getint(
            self.tk.call('winfo', 'vrootwidth', self._w))

    def winfo_vrootx(self):
        """Return the x offset of the virtual root relative to the root
        window of the screen of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'vrootx', self._w))

    def winfo_vrooty(self):
        """Return the y offset of the virtual root relative to the root
        window of the screen of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'vrooty', self._w))

    def winfo_width(self):
        """Return the width of this widget."""
        return self.tk.getint(
            self.tk.call('winfo', 'width', self._w))

    def winfo_x(self):
        """Return the x coordinate of the upper left corner of this widget
        in the parent."""
        return self.tk.getint(
            self.tk.call('winfo', 'x', self._w))

    def winfo_y(self):
        """Return the y coordinate of the upper left corner of this widget
        in the parent."""
        return self.tk.getint(
            self.tk.call('winfo', 'y', self._w))

    def update(self):
        """Enter event loop until all pending events have been processed by Tcl."""
        self.tk.call('update')

    def update_idletasks(self):
        """Enter event loop until all idle callbacks have been called. This
        will update the display of windows but not process events caused by
        the user."""
        self.tk.call('update', 'idletasks')

    def bindtags(self, tagList=None):
        """Set or get the list of bindtags for this widget.

        With no argument return the list of all bindtags associated with
        this widget. With a list of strings as argument the bindtags are
        set to this list. The bindtags determine in which order events are
        processed (see bind)."""
        if tagList is None:
            return self.tk.splitlist(
                self.tk.call('bindtags', self._w))
        else:
            self.tk.call('bindtags', self._w, tagList)

    def _bind(self, what, sequence, func, add, needcleanup=1):
        """Internal function."""
        if isinstance(func, str):
            self.tk.call(what + (sequence, func))
        elif func:
            funcid = self._register(func, self._substitute,
                        needcleanup)
            cmd = ('%sif {"[%s %s]" == "break"} break\n'
                   %
                   (add and '+' or '',
                funcid, self._subst_format_str))
            self.tk.call(what + (sequence, cmd))
            return funcid
        elif sequence:
            return self.tk.call(what + (sequence,))
        else:
            return self.tk.splitlist(self.tk.call(what))

    def bind(self, sequence=None, func=None, add=None):
        """Bind to this widget at event SEQUENCE a call to function FUNC.

        SEQUENCE is a string of concatenated event
        patterns. An event pattern is of the form
        <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one
        of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,
        Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,
        B3, Alt, Button4, B4, Double, Button5, B5 Triple,
        Mod1, M1. TYPE is one of Activate, Enter, Map,
        ButtonPress, Button, Expose, Motion, ButtonRelease
        FocusIn, MouseWheel, Circulate, FocusOut, Property,
        Colormap, Gravity Reparent, Configure, KeyPress, Key,
        Unmap, Deactivate, KeyRelease Visibility, Destroy,
        Leave and DETAIL is the button number for ButtonPress,
        ButtonRelease and DETAIL is the Keysym for KeyPress and
        KeyRelease. Examples are
        <Control-Button-1> for pressing Control and mouse button 1 or
        <Alt-A> for pressing A and the Alt key (KeyPress can be omitted).
        An event pattern can also be a virtual event of the form
        <<AString>> where AString can be arbitrary. This
        event can be generated by event_generate.
        If events are concatenated they must appear shortly
        after each other.

        FUNC will be called if the event sequence occurs with an
        instance of Event as argument. If the return value of FUNC is
        "break" no further bound function is invoked.

        An additional boolean parameter ADD specifies whether FUNC will
        be called additionally to the other bound function or whether
        it will replace the previous function.

        Bind will return an identifier to allow deletion of the bound function with
        unbind without memory leak.

        If FUNC or SEQUENCE is omitted the bound function or list
        of bound events are returned."""

        return self._bind(('bind', self._w), sequence, func, add)

    def unbind(self, sequence, funcid=None):
        """Unbind for this widget for event SEQUENCE  the
        function identified with FUNCID."""
        self.tk.call('bind', self._w, sequence, '')
        if funcid:
            self.deletecommand(funcid)

    def bind_all(self, sequence=None, func=None, add=None):
        """Bind to all widgets at an event SEQUENCE a call to function FUNC.
        An additional boolean parameter ADD specifies whether FUNC will
        be called additionally to the other bound function or whether
        it will replace the previous function. See bind for the return value."""
        return self._bind(('bind', 'all'), sequence, func, add, 0)

    def unbind_all(self, sequence):
        """Unbind for all widgets for event SEQUENCE all functions."""
        self.tk.call('bind', 'all' , sequence, '')

    def bind_class(self, className, sequence=None, func=None, add=None):
        """Bind to widgets with bindtag CLASSNAME at event
        SEQUENCE a call of function FUNC. An additional
        boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or
        whether it will replace the previous function. See bind for
        the return value."""

        return self._bind(('bind', className), sequence, func, add, 0)

    def unbind_class(self, className, sequence):
        """Unbind for all widgets with bindtag CLASSNAME for event SEQUENCE
        all functions."""
        self.tk.call('bind', className , sequence, '')

    def mainloop(self, n=0):
        """Call the mainloop of Tk."""
        self.tk.mainloop(n)

    def quit(self):
        """Quit the Tcl interpreter. All widgets will be destroyed."""
        self.tk.quit()

    def _getints(self, string):
        """Internal function."""
        if string:
            return tuple(map(self.tk.getint, self.tk.splitlist(string)))

    def _getdoubles(self, string):
        """Internal function."""
        if string:
            return tuple(map(self.tk.getdouble, self.tk.splitlist(string)))

    def _getboolean(self, string):
        """Internal function."""
        if string:
            return self.tk.getboolean(string)

    def _displayof(self, displayof):
        """Internal function."""
        if displayof:
            return ('-displayof', displayof)
        if displayof is None:
            return ('-displayof', self._w)
        return ()

    @property
    def _windowingsystem(self):
        """Internal function."""
        try:
            return self._root()._windowingsystem_cached
        except AttributeError:
            ws = self._root()._windowingsystem_cached = \
                        self.tk.call('tk', 'windowingsystem')
            return ws

    def _options(self, cnf, kw = None):
        """Internal function."""
        if kw:
            cnf = _cnfmerge((cnf, kw))
        else:
            cnf = _cnfmerge(cnf)
        res = ()
        for k, v in cnf.items():
            if v is not None:
                if k[-1] == '_': k = k[:-1]
                if callable(v):
                    v = self._register(v)
                elif isinstance(v, (tuple, list)):
                    nv = []
                    for item in v:
                        if isinstance(item, int):
                            nv.append(str(item))
                        elif isinstance(item, str):
                            nv.append(_stringify(item))
                        else:
                            break
                    else:
                        v = ' '.join(nv)
                res = res + ('-'+k, v)
        return res

    def nametowidget(self, name):
        """Return the Tkinter instance of a widget identified by
        its Tcl name NAME."""
        name = str(name).split('.')
        w = self

        if not name[0]:
            w = w._root()
            name = name[1:]

        for n in name:
            if not n:
                break
            w = w.children[n]

        return w

    _nametowidget = nametowidget

    def _register(self, func, subst=None, needcleanup=1):
        """Return a newly created Tcl function. If this
        function is called, the Python function FUNC will
        be executed. An optional function SUBST can
        be given which will be executed before FUNC."""
        f = CallWrapper(func, subst, self).__call__
        name = repr(id(f))
        try:
            func = func.__func__
        except AttributeError:
            pass
        try:
            name = name + func.__name__
        except AttributeError:
            pass
        self.tk.createcommand(name, f)
        if needcleanup:
            if self._tclCommands is None:
                self._tclCommands = []
            self._tclCommands.append(name)
        return name

    register = _register

    def _root(self):
        """Internal function."""
        w = self
        while w.master: w = w.master
        return w
    _subst_format = ('%#', '%b', '%f', '%h', '%k',
             '%s', '%t', '%w', '%x', '%y',
             '%A', '%E', '%K', '%N', '%W', '%T', '%X', '%Y', '%D')
    _subst_format_str = " ".join(_subst_format)

    def _substitute(self, *args):
        """Internal function."""
        if len(args) != len(self._subst_format): return args
        getboolean = self.tk.getboolean

        getint = self.tk.getint
        def getint_event(s):
            """Tk changed behavior in 8.4.2, returning "??" rather more often."""
            try:
                return getint(s)
            except (ValueError, TclError):
                return s

        nsign, b, f, h, k, s, t, w, x, y, A, E, K, N, W, T, X, Y, D = args
        # Missing: (a, c, d, m, o, v, B, R)
        e = Event()
        # serial field: valid for all events
        # number of button: ButtonPress and ButtonRelease events only
        # height field: Configure, ConfigureRequest, Create,
        # ResizeRequest, and Expose events only
        # keycode field: KeyPress and KeyRelease events only
        # time field: "valid for events that contain a time field"
        # width field: Configure, ConfigureRequest, Create, ResizeRequest,
        # and Expose events only
        # x field: "valid for events that contain an x field"
        # y field: "valid for events that contain a y field"
        # keysym as decimal: KeyPress and KeyRelease events only
        # x_root, y_root fields: ButtonPress, ButtonRelease, KeyPress,
        # KeyRelease, and Motion events
        e.serial = getint(nsign)
        e.num = getint_event(b)
        try: e.focus = getboolean(f)
        except TclError: pass
        e.height = getint_event(h)
        e.keycode = getint_event(k)
        e.state = getint_event(s)
        e.time = getint_event(t)
        e.width = getint_event(w)
        e.x = getint_event(x)
        e.y = getint_event(y)
        e.char = A
        try: e.send_event = getboolean(E)
        except TclError: pass
        e.keysym = K
        e.keysym_num = getint_event(N)
        try:
            e.type = EventType(T)
        except ValueError:
            e.type = T
        try:
            e.widget = self._nametowidget(W)
        except KeyError:
            e.widget = W
        e.x_root = getint_event(X)
        e.y_root = getint_event(Y)
        try:
            e.delta = getint(D)
        except (ValueError, TclError):
            e.delta = 0
        return (e,)

    def _report_exception(self):
        """Internal function."""
        exc, val, tb = sys.exc_info()
        root = self._root()
        root.report_callback_exception(exc, val, tb)

    def _getconfigure(self, *args):
        """Call Tcl configure command and return the result as a dict."""
        cnf = {}
        for x in self.tk.splitlist(self.tk.call(*args)):
            x = self.tk.splitlist(x)
            cnf[x[0][1:]] = (x[0][1:],) + x[1:]
        return cnf

    def _getconfigure1(self, *args):
        x = self.tk.splitlist(self.tk.call(*args))
        return (x[0][1:],) + x[1:]

    def _configure(self, cmd, cnf, kw):
        """Internal function."""
        if kw:
            cnf = _cnfmerge((cnf, kw))
        elif cnf:
            cnf = _cnfmerge(cnf)
        if cnf is None:
            return self._getconfigure(_flatten((self._w, cmd)))
        if isinstance(cnf, str):
            return self._getconfigure1(_flatten((self._w, cmd, '-'+cnf)))
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    # These used to be defined in Widget:

    def configure(self, cnf=None, **kw):
        """Configure resources of a widget.

        The values for resources are specified as keyword
        arguments. To get an overview about
        the allowed keyword arguments call the method keys.
        """
        return self._configure('configure', cnf, kw)

    config = configure

    def cget(self, key):
        """Return the resource value for a KEY given as string."""
        return self.tk.call(self._w, 'cget', '-' + key)

    __getitem__ = cget

    def __setitem__(self, key, value):
        self.configure({key: value})

    def keys(self):
        """Return a list of all resource names of this widget."""
        splitlist = self.tk.splitlist
        return [splitlist(x)[0][1:] for x in
                splitlist(self.tk.call(self._w, 'configure'))]

    def __str__(self):
        """Return the window path name of this widget."""
        return self._w

    def __repr__(self):
        return '<%s.%s object %s>' % (
            self.__class__.__module__, self.__class__.__qualname__, self._w)

    # Pack methods that apply to the master
    _noarg_ = ['_noarg_']

    def pack_propagate(self, flag=_noarg_):
        """Set or get the status for propagation of geometry information.

        A boolean argument specifies whether the geometry information
        of the slaves will determine the size of this widget. If no argument
        is given the current setting will be returned.
        """
        if flag is Misc._noarg_:
            return self._getboolean(self.tk.call(
                'pack', 'propagate', self._w))
        else:
            self.tk.call('pack', 'propagate', self._w, flag)

    propagate = pack_propagate

    def pack_slaves(self):
        """Return a list of all slaves of this widget
        in its packing order."""
        return [self._nametowidget(x) for x in
                self.tk.splitlist(
                   self.tk.call('pack', 'slaves', self._w))]

    slaves = pack_slaves

    # Place method that applies to the master
    def place_slaves(self):
        """Return a list of all slaves of this widget
        in its packing order."""
        return [self._nametowidget(x) for x in
                self.tk.splitlist(
                   self.tk.call(
                       'place', 'slaves', self._w))]

    # Grid methods that apply to the master

    def grid_anchor(self, anchor=None): # new in Tk 8.5
        """The anchor value controls how to place the grid within the
        master when no row/column has any weight.

        The default anchor is nw."""
        self.tk.call('grid', 'anchor', self._w, anchor)

    anchor = grid_anchor

    def grid_bbox(self, column=None, row=None, col2=None, row2=None):
        """Return a tuple of integer coordinates for the bounding
        box of this widget controlled by the geometry manager grid.

        If COLUMN, ROW is given the bounding box applies from
        the cell with row and column 0 to the specified
        cell. If COL2 and ROW2 are given the bounding box
        starts at that cell.

        The returned integers specify the offset of the upper left
        corner in the master widget and the width and height.
        """
        args = ('grid', 'bbox', self._w)
        if column is not None and row is not None:
            args = args + (column, row)
        if col2 is not None and row2 is not None:
            args = args + (col2, row2)
        return self._getints(self.tk.call(*args)) or None

    bbox = grid_bbox

    def _gridconvvalue(self, value):
        if isinstance(value, (str, _tkinter.Tcl_Obj)):
            try:
                svalue = str(value)
                if not svalue:
                    return None
                elif '.' in svalue:
                    return self.tk.getdouble(svalue)
                else:
                    return self.tk.getint(svalue)
            except (ValueError, TclError):
                pass
        return value

    def _grid_configure(self, command, index, cnf, kw):
        """Internal function."""
        if isinstance(cnf, str) and not kw:
            if cnf[-1:] == '_':
                cnf = cnf[:-1]
            if cnf[:1] != '-':
                cnf = '-'+cnf
            options = (cnf,)
        else:
            options = self._options(cnf, kw)
        if not options:
            return _splitdict(
                self.tk,
                self.tk.call('grid', command, self._w, index),
                conv=self._gridconvvalue)
        res = self.tk.call(
                  ('grid', command, self._w, index)
                  + options)
        if len(options) == 1:
            return self._gridconvvalue(res)

    def grid_columnconfigure(self, index, cnf={}, **kw):
        """Configure column INDEX of a grid.

        Valid resources are minsize (minimum size of the column),
        weight (how much does additional space propagate to this column)
        and pad (how much space to let additionally)."""
        return self._grid_configure('columnconfigure', index, cnf, kw)

    columnconfigure = grid_columnconfigure

    def grid_location(self, x, y):
        """Return a tuple of column and row which identify the cell
        at which the pixel at position X and Y inside the master
        widget is located."""
        return self._getints(
            self.tk.call(
                'grid', 'location', self._w, x, y)) or None

    def grid_propagate(self, flag=_noarg_):
        """Set or get the status for propagation of geometry information.

        A boolean argument specifies whether the geometry information
        of the slaves will determine the size of this widget. If no argument
        is given, the current setting will be returned.
        """
        if flag is Misc._noarg_:
            return self._getboolean(self.tk.call(
                'grid', 'propagate', self._w))
        else:
            self.tk.call('grid', 'propagate', self._w, flag)

    def grid_rowconfigure(self, index, cnf={}, **kw):
        """Configure row INDEX of a grid.

        Valid resources are minsize (minimum size of the row),
        weight (how much does additional space propagate to this row)
        and pad (how much space to let additionally)."""
        return self._grid_configure('rowconfigure', index, cnf, kw)

    rowconfigure = grid_rowconfigure

    def grid_size(self):
        """Return a tuple of the number of column and rows in the grid."""
        return self._getints(
            self.tk.call('grid', 'size', self._w)) or None

    size = grid_size

    def grid_slaves(self, row=None, column=None):
        """Return a list of all slaves of this widget
        in its packing order."""
        args = ()
        if row is not None:
            args = args + ('-row', row)
        if column is not None:
            args = args + ('-column', column)
        return [self._nametowidget(x) for x in
                self.tk.splitlist(self.tk.call(
                   ('grid', 'slaves', self._w) + args))]

    # Support for the "event" command, new in Tk 4.2.
    # By Case Roole.

    def event_add(self, virtual, *sequences):
        """Bind a virtual event VIRTUAL (of the form <<Name>>)
        to an event SEQUENCE such that the virtual event is triggered
        whenever SEQUENCE occurs."""
        args = ('event', 'add', virtual) + sequences
        self.tk.call(args)

    def event_delete(self, virtual, *sequences):
        """Unbind a virtual event VIRTUAL from SEQUENCE."""
        args = ('event', 'delete', virtual) + sequences
        self.tk.call(args)

    def event_generate(self, sequence, **kw):
        """Generate an event SEQUENCE. Additional
        keyword arguments specify parameter of the event
        (e.g. x, y, rootx, rooty)."""
        args = ('event', 'generate', self._w, sequence)
        for k, v in kw.items():
            args = args + ('-%s' % k, str(v))
        self.tk.call(args)

    def event_info(self, virtual=None):
        """Return a list of all virtual events or the information
        about the SEQUENCE bound to the virtual event VIRTUAL."""
        return self.tk.splitlist(
            self.tk.call('event', 'info', virtual))

    # Image related commands

    def image_names(self):
        """Return a list of all existing image names."""
        return self.tk.splitlist(self.tk.call('image', 'names'))

    def image_types(self):
        """Return a list of all available image types (e.g. photo bitmap)."""
        return self.tk.splitlist(self.tk.call('image', 'types'))


class CallWrapper:
    """Internal class. Stores function to call when some user
    defined Tcl function is called e.g. after an event occurred."""

    def __init__(self, func, subst, widget):
        """Store FUNC, SUBST and WIDGET as members."""
        self.func = func
        self.subst = subst
        self.widget = widget

    def __call__(self, *args):
        """Apply first function SUBST to arguments, than FUNC."""
        try:
            if self.subst:
                args = self.subst(*args)
            return self.func(*args)
        except SystemExit:
            raise
        except:
            self.widget._report_exception()


class XView:
    """Mix-in class for querying and changing the horizontal position
    of a widget's window."""

    def xview(self, *args):
        """Query and change the horizontal position of the view."""
        res = self.tk.call(self._w, 'xview', *args)
        if not args:
            return self._getdoubles(res)

    def xview_moveto(self, fraction):
        """Adjusts the view in the window so that FRACTION of the
        total width of the canvas is off-screen to the left."""
        self.tk.call(self._w, 'xview', 'moveto', fraction)

    def xview_scroll(self, number, what):
        """Shift the x-view according to NUMBER which is measured in "units"
        or "pages" (WHAT)."""
        self.tk.call(self._w, 'xview', 'scroll', number, what)


class YView:
    """Mix-in class for querying and changing the vertical position
    of a widget's window."""

    def yview(self, *args):
        """Query and change the vertical position of the view."""
        res = self.tk.call(self._w, 'yview', *args)
        if not args:
            return self._getdoubles(res)

    def yview_moveto(self, fraction):
        """Adjusts the view in the window so that FRACTION of the
        total height of the canvas is off-screen to the top."""
        self.tk.call(self._w, 'yview', 'moveto', fraction)

    def yview_scroll(self, number, what):
        """Shift the y-view according to NUMBER which is measured in
        "units" or "pages" (WHAT)."""
        self.tk.call(self._w, 'yview', 'scroll', number, what)


class Wm:
    """Provides functions for the communication with the window manager."""

    def wm_aspect(self,
              minNumer=None, minDenom=None,
              maxNumer=None, maxDenom=None):
        """Instruct the window manager to set the aspect ratio (width/height)
        of this widget to be between MINNUMER/MINDENOM and MAXNUMER/MAXDENOM. Return a tuple
        of the actual values if no argument is given."""
        return self._getints(
            self.tk.call('wm', 'aspect', self._w,
                     minNumer, minDenom,
                     maxNumer, maxDenom))

    aspect = wm_aspect

    def wm_attributes(self, *args):
        """This subcommand returns or sets platform specific attributes

        The first form returns a list of the platform specific flags and
        their values. The second form returns the value for the specific
        option. The third form sets one or more of the values. The values
        are as follows:

        On Windows, -disabled gets or sets whether the window is in a
        disabled state. -toolwindow gets or sets the style of the window
        to toolwindow (as defined in the MSDN). -topmost gets or sets
        whether this is a topmost window (displays above all other
        windows).

        On Macintosh, XXXXX

        On Unix, there are currently no special attribute values.
        """
        args = ('wm', 'attributes', self._w) + args
        return self.tk.call(args)

    attributes = wm_attributes

    def wm_client(self, name=None):
        """Store NAME in WM_CLIENT_MACHINE property of this widget. Return
        current value."""
        return self.tk.call('wm', 'client', self._w, name)

    client = wm_client

    def wm_colormapwindows(self, *wlist):
        """Store list of window names (WLIST) into WM_COLORMAPWINDOWS property
        of this widget. This list contains windows whose colormaps differ from their
        parents. Return current list of widgets if WLIST is empty."""
        if len(wlist) > 1:
            wlist = (wlist,) # Tk needs a list of windows here
        args = ('wm', 'colormapwindows', self._w) + wlist
        if wlist:
            self.tk.call(args)
        else:
            return [self._nametowidget(x)
                    for x in self.tk.splitlist(self.tk.call(args))]

    colormapwindows = wm_colormapwindows

    def wm_command(self, value=None):
        """Store VALUE in WM_COMMAND property. It is the command
        which shall be used to invoke the application. Return current
        command if VALUE is None."""
        return self.tk.call('wm', 'command', self._w, value)

    command = wm_command

    def wm_deiconify(self):
        """Deiconify this widget. If it was never mapped it will not be mapped.
        On Windows it will raise this widget and give it the focus."""
        return self.tk.call('wm', 'deiconify', self._w)

    deiconify = wm_deiconify

    def wm_focusmodel(self, model=None):
        """Set focus model to MODEL. "active" means that this widget will claim
        the focus itself, "passive" means that the window manager shall give
        the focus. Return current focus model if MODEL is None."""
        return self.tk.call('wm', 'focusmodel', self._w, model)

    focusmodel = wm_focusmodel

    def wm_forget(self, window): # new in Tk 8.5
        """The window will be unmapped from the screen and will no longer
        be managed by wm. toplevel windows will be treated like frame
        windows once they are no longer managed by wm, however, the menu
        option configuration will be remembered and the menus will return
        once the widget is managed again."""
        self.tk.call('wm', 'forget', window)

    forget = wm_forget

    def wm_frame(self):
        """Return identifier for decorative frame of this widget if present."""
        return self.tk.call('wm', 'frame', self._w)

    frame = wm_frame

    def wm_geometry(self, newGeometry=None):
        """Set geometry to NEWGEOMETRY of the form =widthxheight+x+y. Return
        current value if None is given."""
        return self.tk.call('wm', 'geometry', self._w, newGeometry)

    geometry = wm_geometry

    def wm_grid(self,
         baseWidth=None, baseHeight=None,
         widthInc=None, heightInc=None):
        """Instruct the window manager that this widget shall only be
        resized on grid boundaries. WIDTHINC and HEIGHTINC are the width and
        height of a grid unit in pixels. BASEWIDTH and BASEHEIGHT are the
        number of grid units requested in Tk_GeometryRequest."""
        return self._getints(self.tk.call(
            'wm', 'grid', self._w,
            baseWidth, baseHeight, widthInc, heightInc))

    grid = wm_grid

    def wm_group(self, pathName=None):
        """Set the group leader widgets for related widgets to PATHNAME. Return
        the group leader of this widget if None is given."""
        return self.tk.call('wm', 'group', self._w, pathName)

    group = wm_group

    def wm_iconbitmap(self, bitmap=None, default=None):
        """Set bitmap for the iconified widget to BITMAP. Return
        the bitmap if None is given.

        Under Windows, the DEFAULT parameter can be used to set the icon
        for the widget and any descendents that don't have an icon set
        explicitly.  DEFAULT can be the relative path to a .ico file
        (example: root.iconbitmap(default='myicon.ico') ).  See Tk
        documentation for more information."""
        if default:
            return self.tk.call('wm', 'iconbitmap', self._w, '-default', default)
        else:
            return self.tk.call('wm', 'iconbitmap', self._w, bitmap)

    iconbitmap = wm_iconbitmap

    def wm_iconify(self):
        """Display widget as icon."""
        return self.tk.call('wm', 'iconify', self._w)

    iconify = wm_iconify

    def wm_iconmask(self, bitmap=None):
        """Set mask for the icon bitmap of this widget. Return the
        mask if None is given."""
        return self.tk.call('wm', 'iconmask', self._w, bitmap)

    iconmask = wm_iconmask

    def wm_iconname(self, newName=None):
        """Set the name of the icon for this widget. Return the name if
        None is given."""
        return self.tk.call('wm', 'iconname', self._w, newName)

    iconname = wm_iconname

    def wm_iconphoto(self, default=False, *args): # new in Tk 8.5
        """Sets the titlebar icon for this window based on the named photo
        images passed through args. If default is True, this is applied to
        all future created toplevels as well.

        The data in the images is taken as a snapshot at the time of
        invocation. If the images are later changed, this is not reflected
        to the titlebar icons. Multiple images are accepted to allow
        different images sizes to be provided. The window manager may scale
        provided icons to an appropriate size.

        On Windows, the images are packed into a Windows icon structure.
        This will override an icon specified to wm_iconbitmap, and vice
        versa.

        On X, the images are arranged into the _NET_WM_ICON X property,
        which most modern window managers support. An icon specified by
        wm_iconbitmap may exist simultaneously.

        On Macintosh, this currently does nothing."""
        if default:
            self.tk.call('wm', 'iconphoto', self._w, "-default", *args)
        else:
            self.tk.call('wm', 'iconphoto', self._w, *args)

    iconphoto = wm_iconphoto

    def wm_iconposition(self, x=None, y=None):
        """Set the position of the icon of this widget to X and Y. Return
        a tuple of the current values of X and X if None is given."""
        return self._getints(self.tk.call(
            'wm', 'iconposition', self._w, x, y))

    iconposition = wm_iconposition

    def wm_iconwindow(self, pathName=None):
        """Set widget PATHNAME to be displayed instead of icon. Return the current
        value if None is given."""
        return self.tk.call('wm', 'iconwindow', self._w, pathName)

    iconwindow = wm_iconwindow

    def wm_manage(self, widget): # new in Tk 8.5
        """The widget specified will become a stand alone top-level window.
        The window will be decorated with the window managers title bar,
        etc."""
        self.tk.call('wm', 'manage', widget)

    manage = wm_manage

    def wm_maxsize(self, width=None, height=None):
        """Set max WIDTH and HEIGHT for this widget. If the window is gridded
        the values are given in grid units. Return the current values if None
        is given."""
        return self._getints(self.tk.call(
            'wm', 'maxsize', self._w, width, height))

    maxsize = wm_maxsize

    def wm_minsize(self, width=None, height=None):
        """Set min WIDTH and HEIGHT for this widget. If the window is gridded
        the values are given in grid units. Return the current values if None
        is given."""
        return self._getints(self.tk.call(
            'wm', 'minsize', self._w, width, height))

    minsize = wm_minsize

    def wm_overrideredirect(self, boolean=None):
        """Instruct the window manager to ignore this widget
        if BOOLEAN is given with 1. Return the current value if None
        is given."""
        return self._getboolean(self.tk.call(
            'wm', 'overrideredirect', self._w, boolean))

    overrideredirect = wm_overrideredirect

    def wm_positionfrom(self, who=None):
        """Instruct the window manager that the position of this widget shall
        be defined by the user if WHO is "user", and by its own policy if WHO is
        "program"."""
        return self.tk.call('wm', 'positionfrom', self._w, who)

    positionfrom = wm_positionfrom

    def wm_protocol(self, name=None, func=None):
        """Bind function FUNC to command NAME for this widget.
        Return the function bound to NAME if None is given. NAME could be
        e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW"."""
        if callable(func):
            command = self._register(func)
        else:
            command = func
        return self.tk.call(
            'wm', 'protocol', self._w, name, command)

    protocol = wm_protocol

    def wm_resizable(self, width=None, height=None):
        """Instruct the window manager whether this width can be resized
        in WIDTH or HEIGHT. Both values are boolean values."""
        return self.tk.call('wm', 'resizable', self._w, width, height)

    resizable = wm_resizable

    def wm_sizefrom(self, who=None):
        """Instruct the window manager that the size of this widget shall
        be defined by the user if WHO is "user", and by its own policy if WHO is
        "program"."""
        return self.tk.call('wm', 'sizefrom', self._w, who)

    sizefrom = wm_sizefrom

    def wm_state(self, newstate=None):
        """Query or set the state of this widget as one of normal, icon,
        iconic (see wm_iconwindow), withdrawn, or zoomed (Windows only)."""
        return self.tk.call('wm', 'state', self._w, newstate)

    state = wm_state

    def wm_title(self, string=None):
        """Set the title of this widget."""
        return self.tk.call('wm', 'title', self._w, string)

    title = wm_title

    def wm_transient(self, master=None):
        """Instruct the window manager that this widget is transient
        with regard to widget MASTER."""
        return self.tk.call('wm', 'transient', self._w, master)

    transient = wm_transient

    def wm_withdraw(self):
        """Withdraw this widget from the screen such that it is unmapped
        and forgotten by the window manager. Re-draw it with wm_deiconify."""
        return self.tk.call('wm', 'withdraw', self._w)

    withdraw = wm_withdraw


class Tk(Misc, Wm):
    """Toplevel widget of Tk which represents mostly the main window
    of an application. It has an associated Tcl interpreter."""
    _w = '.'

    def __init__(self, screenName=None, baseName=None, className='Tk',
                 useTk=1, sync=0, use=None):
        """Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will
        be created. BASENAME will be used for the identification of the profile file (see
        readprofile).
        It is constructed from sys.argv[0] without extensions if None is given. CLASSNAME
        is the name of the widget class."""
        self.master = None
        self.children = {}
        self._tkloaded = False
        # to avoid recursions in the getattr code in case of failure, we
        # ensure that self.tk is always _something_.
        self.tk = None
        if baseName is None:
            import os
            baseName = os.path.basename(sys.argv[0])
            baseName, ext = os.path.splitext(baseName)
            if ext not in ('.py', '.pyc'):
                baseName = baseName + ext
        interactive = 0
        self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
        if useTk:
            self._loadtk()
        if not sys.flags.ignore_environment:
            # Issue #16248: Honor the -E flag to avoid code injection.
            self.readprofile(baseName, className)

    def loadtk(self):
        if not self._tkloaded:
            self.tk.loadtk()
            self._loadtk()

    def _loadtk(self):
        self._tkloaded = True
        global _default_root
        # Version sanity checks
        tk_version = self.tk.getvar('tk_version')
        if tk_version != _tkinter.TK_VERSION:
            raise RuntimeError("tk.h version (%s) doesn't match libtk.a version (%s)"
                               % (_tkinter.TK_VERSION, tk_version))
        # Under unknown circumstances, tcl_version gets coerced to float
        tcl_version = str(self.tk.getvar('tcl_version'))
        if tcl_version != _tkinter.TCL_VERSION:
            raise RuntimeError("tcl.h version (%s) doesn't match libtcl.a version (%s)" \
                               % (_tkinter.TCL_VERSION, tcl_version))
        # Create and register the tkerror and exit commands
        # We need to inline parts of _register here, _ register
        # would register differently-named commands.
        if self._tclCommands is None:
            self._tclCommands = []
        self.tk.createcommand('tkerror', _tkerror)
        self.tk.createcommand('exit', _exit)
        self._tclCommands.append('tkerror')
        self._tclCommands.append('exit')
        if _support_default_root and not _default_root:
            _default_root = self
        self.protocol("WM_DELETE_WINDOW", self.destroy)

    def destroy(self):
        """Destroy this and all descendants widgets. This will
        end the application of this Tcl interpreter."""
        for c in list(self.children.values()): c.destroy()
        self.tk.call('destroy', self._w)
        Misc.destroy(self)
        global _default_root
        if _support_default_root and _default_root is self:
            _default_root = None

    def readprofile(self, baseName, className):
        """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into
        the Tcl Interpreter and calls exec on the contents of BASENAME.py and
        CLASSNAME.py if such a file exists in the home directory."""
        import os
        if 'HOME' in os.environ: home = os.environ['HOME']
        else: home = os.curdir
        class_tcl = os.path.join(home, '.%s.tcl' % className)
        class_py = os.path.join(home, '.%s.py' % className)
        base_tcl = os.path.join(home, '.%s.tcl' % baseName)
        base_py = os.path.join(home, '.%s.py' % baseName)
        dir = {'self': self}
        exec('from tkinter import *', dir)
        if os.path.isfile(class_tcl):
            self.tk.call('source', class_tcl)
        if os.path.isfile(class_py):
            exec(open(class_py).read(), dir)
        if os.path.isfile(base_tcl):
            self.tk.call('source', base_tcl)
        if os.path.isfile(base_py):
            exec(open(base_py).read(), dir)

    def report_callback_exception(self, exc, val, tb):
        """Report callback exception on sys.stderr.

        Applications may want to override this internal function, and
        should when sys.stderr is None."""
        import traceback
        print("Exception in Tkinter callback", file=sys.stderr)
        sys.last_type = exc
        sys.last_value = val
        sys.last_traceback = tb
        traceback.print_exception(exc, val, tb)

    def __getattr__(self, attr):
        "Delegate attribute access to the interpreter object"
        return getattr(self.tk, attr)

# Ideally, the classes Pack, Place and Grid disappear, the
# pack/place/grid methods are defined on the Widget class, and
# everybody uses w.pack_whatever(...) instead of Pack.whatever(w,
# ...), with pack(), place() and grid() being short for
# pack_configure(), place_configure() and grid_columnconfigure(), and
# forget() being short for pack_forget().  As a practical matter, I'm
# afraid that there is too much code out there that may be using the
# Pack, Place or Grid class, so I leave them intact -- but only as
# backwards compatibility features.  Also note that those methods that
# take a master as argument (e.g. pack_propagate) have been moved to
# the Misc class (which now incorporates all methods common between
# toplevel and interior widgets).  Again, for compatibility, these are
# copied into the Pack, Place or Grid class.


def Tcl(screenName=None, baseName=None, className='Tk', useTk=0):
    return Tk(screenName, baseName, className, useTk)


class Pack:
    """Geometry manager Pack.

    Base class to use the methods pack_* in every widget."""

    def pack_configure(self, cnf={}, **kw):
        """Pack a widget in the parent widget. Use as options:
        after=widget - pack it after you have packed widget
        anchor=NSEW (or subset) - position widget according to
                                  given direction
        before=widget - pack it before you will pack widget
        expand=bool - expand widget if parent size grows
        fill=NONE or X or Y or BOTH - fill widget if widget grows
        in=master - use master to contain this widget
        in_=master - see 'in' option description
        ipadx=amount - add internal padding in x direction
        ipady=amount - add internal padding in y direction
        padx=amount - add padding in x direction
        pady=amount - add padding in y direction
        side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.
        """
        self.tk.call(
              ('pack', 'configure', self._w)
              + self._options(cnf, kw))

    pack = configure = config = pack_configure

    def pack_forget(self):
        """Unmap this widget and do not use it for the packing order."""
        self.tk.call('pack', 'forget', self._w)

    forget = pack_forget

    def pack_info(self):
        """Return information about the packing options
        for this widget."""
        d = _splitdict(self.tk, self.tk.call('pack', 'info', self._w))
        if 'in' in d:
            d['in'] = self.nametowidget(d['in'])
        return d

    info = pack_info
    propagate = pack_propagate = Misc.pack_propagate
    slaves = pack_slaves = Misc.pack_slaves


class Place:
    """Geometry manager Place.

    Base class to use the methods place_* in every widget."""

    def place_configure(self, cnf={}, **kw):
        """Place a widget in the parent widget. Use as options:
        in=master - master relative to which the widget is placed
        in_=master - see 'in' option description
        x=amount - locate anchor of this widget at position x of master
        y=amount - locate anchor of this widget at position y of master
        relx=amount - locate anchor of this widget between 0.0 and 1.0
                      relative to width of master (1.0 is right edge)
        rely=amount - locate anchor of this widget between 0.0 and 1.0
                      relative to height of master (1.0 is bottom edge)
        anchor=NSEW (or subset) - position anchor according to given direction
        width=amount - width of this widget in pixel
        height=amount - height of this widget in pixel
        relwidth=amount - width of this widget between 0.0 and 1.0
                          relative to width of master (1.0 is the same width
                          as the master)
        relheight=amount - height of this widget between 0.0 and 1.0
                           relative to height of master (1.0 is the same
                           height as the master)
        bordermode="inside" or "outside" - whether to take border width of
                                           master widget into account
        """
        self.tk.call(
              ('place', 'configure', self._w)
              + self._options(cnf, kw))

    place = configure = config = place_configure

    def place_forget(self):
        """Unmap this widget."""
        self.tk.call('place', 'forget', self._w)

    forget = place_forget

    def place_info(self):
        """Return information about the placing options
        for this widget."""
        d = _splitdict(self.tk, self.tk.call('place', 'info', self._w))
        if 'in' in d:
            d['in'] = self.nametowidget(d['in'])
        return d

    info = place_info
    slaves = place_slaves = Misc.place_slaves


class Grid:
    """Geometry manager Grid.

    Base class to use the methods grid_* in every widget."""
    # Thanks to Masazumi Yoshikawa (yosikawa@isi.edu)

    def grid_configure(self, cnf={}, **kw):
        """Position a widget in the parent widget in a grid. Use as options:
        column=number - use cell identified with given column (starting with 0)
        columnspan=number - this widget will span several columns
        in=master - use master to contain this widget
        in_=master - see 'in' option description
        ipadx=amount - add internal padding in x direction
        ipady=amount - add internal padding in y direction
        padx=amount - add padding in x direction
        pady=amount - add padding in y direction
        row=number - use cell identified with given row (starting with 0)
        rowspan=number - this widget will span several rows
        sticky=NSEW - if cell is larger on which sides will this
                      widget stick to the cell boundary
        """
        self.tk.call(
              ('grid', 'configure', self._w)
              + self._options(cnf, kw))

    grid = configure = config = grid_configure
    bbox = grid_bbox = Misc.grid_bbox
    columnconfigure = grid_columnconfigure = Misc.grid_columnconfigure

    def grid_forget(self):
        """Unmap this widget."""
        self.tk.call('grid', 'forget', self._w)

    forget = grid_forget

    def grid_remove(self):
        """Unmap this widget but remember the grid options."""
        self.tk.call('grid', 'remove', self._w)

    def grid_info(self):
        """Return information about the options
        for positioning this widget in a grid."""
        d = _splitdict(self.tk, self.tk.call('grid', 'info', self._w))
        if 'in' in d:
            d['in'] = self.nametowidget(d['in'])
        return d

    info = grid_info
    location = grid_location = Misc.grid_location
    propagate = grid_propagate = Misc.grid_propagate
    rowconfigure = grid_rowconfigure = Misc.grid_rowconfigure
    size = grid_size = Misc.grid_size
    slaves = grid_slaves = Misc.grid_slaves


class BaseWidget(Misc):
    """Internal class."""

    def _setup(self, master, cnf):
        """Internal function. Sets up information about children."""
        if not master:
            master = _get_default_root()
        self.master = master
        self.tk = master.tk
        name = None
        if 'name' in cnf:
            name = cnf['name']
            del cnf['name']
        if not name:
            name = self.__class__.__name__.lower()
            if master._last_child_ids is None:
                master._last_child_ids = {}
            count = master._last_child_ids.get(name, 0) + 1
            master._last_child_ids[name] = count
            if count == 1:
                name = '!%s' % (name,)
            else:
                name = '!%s%d' % (name, count)
        self._name = name
        if master._w=='.':
            self._w = '.' + name
        else:
            self._w = master._w + '.' + name
        self.children = {}
        if self._name in self.master.children:
            self.master.children[self._name].destroy()
        self.master.children[self._name] = self

    def __init__(self, master, widgetName, cnf={}, kw={}, extra=()):
        """Construct a widget with the parent widget MASTER, a name WIDGETNAME
        and appropriate options."""
        if kw:
            cnf = _cnfmerge((cnf, kw))
        self.widgetName = widgetName
        BaseWidget._setup(self, master, cnf)
        if self._tclCommands is None:
            self._tclCommands = []
        classes = [(k, v) for k, v in cnf.items() if isinstance(k, type)]
        for k, v in classes:
            del cnf[k]
        self.tk.call(
            (widgetName, self._w) + extra + self._options(cnf))
        for k, v in classes:
            k.configure(self, v)

    def destroy(self):
        """Destroy this and all descendants widgets."""
        for c in list(self.children.values()): c.destroy()
        self.tk.call('destroy', self._w)
        if self._name in self.master.children:
            del self.master.children[self._name]
        Misc.destroy(self)

    def _do(self, name, args=()):
        # XXX Obsolete -- better use self.tk.call directly!
        return self.tk.call((self._w, name) + args)


class Widget(BaseWidget, Pack, Place, Grid):
    """Internal class.

    Base class for a widget which can be positioned with the geometry managers
    Pack, Place or Grid."""
    pass


class Toplevel(BaseWidget, Wm):
    """Toplevel widget, e.g. for dialogs."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a toplevel widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, class,
        colormap, container, cursor, height, highlightbackground,
        highlightcolor, highlightthickness, menu, relief, screen, takefocus,
        use, visual, width."""
        if kw:
            cnf = _cnfmerge((cnf, kw))
        extra = ()
        for wmkey in ['screen', 'class_', 'class', 'visual',
                  'colormap']:
            if wmkey in cnf:
                val = cnf[wmkey]
                # TBD: a hack needed because some keys
                # are not valid as keyword arguments
                if wmkey[-1] == '_': opt = '-'+wmkey[:-1]
                else: opt = '-'+wmkey
                extra = extra + (opt, val)
                del cnf[wmkey]
        BaseWidget.__init__(self, master, 'toplevel', cnf, {}, extra)
        root = self._root()
        self.iconname(root.iconname())
        self.title(root.title())
        self.protocol("WM_DELETE_WINDOW", self.destroy)


class Button(Widget):
    """Button widget."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a button widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, activeforeground, anchor,
            background, bitmap, borderwidth, cursor,
            disabledforeground, font, foreground
            highlightbackground, highlightcolor,
            highlightthickness, image, justify,
            padx, pady, relief, repeatdelay,
            repeatinterval, takefocus, text,
            textvariable, underline, wraplength

        WIDGET-SPECIFIC OPTIONS

            command, compound, default, height,
            overrelief, state, width
        """
        Widget.__init__(self, master, 'button', cnf, kw)

    def flash(self):
        """Flash the button.

        This is accomplished by redisplaying
        the button several times, alternating between active and
        normal colors. At the end of the flash the button is left
        in the same normal/active state as when the command was
        invoked. This command is ignored if the button's state is
        disabled.
        """
        self.tk.call(self._w, 'flash')

    def invoke(self):
        """Invoke the command associated with the button.

        The return value is the return value from the command,
        or an empty string if there is no command associated with
        the button. This command is ignored if the button's state
        is disabled.
        """
        return self.tk.call(self._w, 'invoke')


class Canvas(Widget, XView, YView):
    """Canvas widget to display graphical elements like lines or text."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a canvas widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, closeenough,
        confine, cursor, height, highlightbackground, highlightcolor,
        highlightthickness, insertbackground, insertborderwidth,
        insertofftime, insertontime, insertwidth, offset, relief,
        scrollregion, selectbackground, selectborderwidth, selectforeground,
        state, takefocus, width, xscrollcommand, xscrollincrement,
        yscrollcommand, yscrollincrement."""
        Widget.__init__(self, master, 'canvas', cnf, kw)

    def addtag(self, *args):
        """Internal function."""
        self.tk.call((self._w, 'addtag') + args)

    def addtag_above(self, newtag, tagOrId):
        """Add tag NEWTAG to all items above TAGORID."""
        self.addtag(newtag, 'above', tagOrId)

    def addtag_all(self, newtag):
        """Add tag NEWTAG to all items."""
        self.addtag(newtag, 'all')

    def addtag_below(self, newtag, tagOrId):
        """Add tag NEWTAG to all items below TAGORID."""
        self.addtag(newtag, 'below', tagOrId)

    def addtag_closest(self, newtag, x, y, halo=None, start=None):
        """Add tag NEWTAG to item which is closest to pixel at X, Y.
        If several match take the top-most.
        All items closer than HALO are considered overlapping (all are
        closests). If START is specified the next below this tag is taken."""
        self.addtag(newtag, 'closest', x, y, halo, start)

    def addtag_enclosed(self, newtag, x1, y1, x2, y2):
        """Add tag NEWTAG to all items in the rectangle defined
        by X1,Y1,X2,Y2."""
        self.addtag(newtag, 'enclosed', x1, y1, x2, y2)

    def addtag_overlapping(self, newtag, x1, y1, x2, y2):
        """Add tag NEWTAG to all items which overlap the rectangle
        defined by X1,Y1,X2,Y2."""
        self.addtag(newtag, 'overlapping', x1, y1, x2, y2)

    def addtag_withtag(self, newtag, tagOrId):
        """Add tag NEWTAG to all items with TAGORID."""
        self.addtag(newtag, 'withtag', tagOrId)

    def bbox(self, *args):
        """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
        which encloses all items with tags specified as arguments."""
        return self._getints(
            self.tk.call((self._w, 'bbox') + args)) or None

    def tag_unbind(self, tagOrId, sequence, funcid=None):
        """Unbind for all items with TAGORID for event SEQUENCE  the
        function identified with FUNCID."""
        self.tk.call(self._w, 'bind', tagOrId, sequence, '')
        if funcid:
            self.deletecommand(funcid)

    def tag_bind(self, tagOrId, sequence=None, func=None, add=None):
        """Bind to all items with TAGORID at event SEQUENCE a call to function FUNC.

        An additional boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or whether it will
        replace the previous function. See bind for the return value."""
        return self._bind((self._w, 'bind', tagOrId),
                  sequence, func, add)

    def canvasx(self, screenx, gridspacing=None):
        """Return the canvas x coordinate of pixel position SCREENX rounded
        to nearest multiple of GRIDSPACING units."""
        return self.tk.getdouble(self.tk.call(
            self._w, 'canvasx', screenx, gridspacing))

    def canvasy(self, screeny, gridspacing=None):
        """Return the canvas y coordinate of pixel position SCREENY rounded
        to nearest multiple of GRIDSPACING units."""
        return self.tk.getdouble(self.tk.call(
            self._w, 'canvasy', screeny, gridspacing))

    def coords(self, *args):
        """Return a list of coordinates for the item given in ARGS."""
        # XXX Should use _flatten on args
        return [self.tk.getdouble(x) for x in
                           self.tk.splitlist(
                   self.tk.call((self._w, 'coords') + args))]

    def _create(self, itemType, args, kw): # Args: (val, val, ..., cnf={})
        """Internal function."""
        args = _flatten(args)
        cnf = args[-1]
        if isinstance(cnf, (dict, tuple)):
            args = args[:-1]
        else:
            cnf = {}
        return self.tk.getint(self.tk.call(
            self._w, 'create', itemType,
            *(args + self._options(cnf, kw))))

    def create_arc(self, *args, **kw):
        """Create arc shaped region with coordinates x1,y1,x2,y2."""
        return self._create('arc', args, kw)

    def create_bitmap(self, *args, **kw):
        """Create bitmap with coordinates x1,y1."""
        return self._create('bitmap', args, kw)

    def create_image(self, *args, **kw):
        """Create image item with coordinates x1,y1."""
        return self._create('image', args, kw)

    def create_line(self, *args, **kw):
        """Create line with coordinates x1,y1,...,xn,yn."""
        return self._create('line', args, kw)

    def create_oval(self, *args, **kw):
        """Create oval with coordinates x1,y1,x2,y2."""
        return self._create('oval', args, kw)

    def create_polygon(self, *args, **kw):
        """Create polygon with coordinates x1,y1,...,xn,yn."""
        return self._create('polygon', args, kw)

    def create_rectangle(self, *args, **kw):
        """Create rectangle with coordinates x1,y1,x2,y2."""
        return self._create('rectangle', args, kw)

    def create_text(self, *args, **kw):
        """Create text with coordinates x1,y1."""
        return self._create('text', args, kw)

    def create_window(self, *args, **kw):
        """Create window with coordinates x1,y1,x2,y2."""
        return self._create('window', args, kw)

    def dchars(self, *args):
        """Delete characters of text items identified by tag or id in ARGS (possibly
        several times) from FIRST to LAST character (including)."""
        self.tk.call((self._w, 'dchars') + args)

    def delete(self, *args):
        """Delete items identified by all tag or ids contained in ARGS."""
        self.tk.call((self._w, 'delete') + args)

    def dtag(self, *args):
        """Delete tag or id given as last arguments in ARGS from items
        identified by first argument in ARGS."""
        self.tk.call((self._w, 'dtag') + args)

    def find(self, *args):
        """Internal function."""
        return self._getints(
            self.tk.call((self._w, 'find') + args)) or ()

    def find_above(self, tagOrId):
        """Return items above TAGORID."""
        return self.find('above', tagOrId)

    def find_all(self):
        """Return all items."""
        return self.find('all')

    def find_below(self, tagOrId):
        """Return all items below TAGORID."""
        return self.find('below', tagOrId)

    def find_closest(self, x, y, halo=None, start=None):
        """Return item which is closest to pixel at X, Y.
        If several match take the top-most.
        All items closer than HALO are considered overlapping (all are
        closest). If START is specified the next below this tag is taken."""
        return self.find('closest', x, y, halo, start)

    def find_enclosed(self, x1, y1, x2, y2):
        """Return all items in rectangle defined
        by X1,Y1,X2,Y2."""
        return self.find('enclosed', x1, y1, x2, y2)

    def find_overlapping(self, x1, y1, x2, y2):
        """Return all items which overlap the rectangle
        defined by X1,Y1,X2,Y2."""
        return self.find('overlapping', x1, y1, x2, y2)

    def find_withtag(self, tagOrId):
        """Return all items with TAGORID."""
        return self.find('withtag', tagOrId)

    def focus(self, *args):
        """Set focus to the first item specified in ARGS."""
        return self.tk.call((self._w, 'focus') + args)

    def gettags(self, *args):
        """Return tags associated with the first item specified in ARGS."""
        return self.tk.splitlist(
            self.tk.call((self._w, 'gettags') + args))

    def icursor(self, *args):
        """Set cursor at position POS in the item identified by TAGORID.
        In ARGS TAGORID must be first."""
        self.tk.call((self._w, 'icursor') + args)

    def index(self, *args):
        """Return position of cursor as integer in item specified in ARGS."""
        return self.tk.getint(self.tk.call((self._w, 'index') + args))

    def insert(self, *args):
        """Insert TEXT in item TAGORID at position POS. ARGS must
        be TAGORID POS TEXT."""
        self.tk.call((self._w, 'insert') + args)

    def itemcget(self, tagOrId, option):
        """Return the resource value for an OPTION for item TAGORID."""
        return self.tk.call(
            (self._w, 'itemcget') + (tagOrId, '-'+option))

    def itemconfigure(self, tagOrId, cnf=None, **kw):
        """Configure resources of an item TAGORID.

        The values for resources are specified as keyword
        arguments. To get an overview about
        the allowed keyword arguments call the method without arguments.
        """
        return self._configure(('itemconfigure', tagOrId), cnf, kw)

    itemconfig = itemconfigure

    # lower, tkraise/lift hide Misc.lower, Misc.tkraise/lift,
    # so the preferred name for them is tag_lower, tag_raise
    # (similar to tag_bind, and similar to the Text widget);
    # unfortunately can't delete the old ones yet (maybe in 1.6)
    def tag_lower(self, *args):
        """Lower an item TAGORID given in ARGS
        (optional below another item)."""
        self.tk.call((self._w, 'lower') + args)

    lower = tag_lower

    def move(self, *args):
        """Move an item TAGORID given in ARGS."""
        self.tk.call((self._w, 'move') + args)

    def moveto(self, tagOrId, x='', y=''):
        """Move the items given by TAGORID in the canvas coordinate
        space so that the first coordinate pair of the bottommost
        item with tag TAGORID is located at position (X,Y).
        X and Y may be the empty string, in which case the
        corresponding coordinate will be unchanged. All items matching
        TAGORID remain in the same positions relative to each other."""
        self.tk.call(self._w, 'moveto', tagOrId, x, y)

    def postscript(self, cnf={}, **kw):
        """Print the contents of the canvas to a postscript
        file. Valid options: colormap, colormode, file, fontmap,
        height, pageanchor, pageheight, pagewidth, pagex, pagey,
        rotate, width, x, y."""
        return self.tk.call((self._w, 'postscript') +
                    self._options(cnf, kw))

    def tag_raise(self, *args):
        """Raise an item TAGORID given in ARGS
        (optional above another item)."""
        self.tk.call((self._w, 'raise') + args)

    lift = tkraise = tag_raise

    def scale(self, *args):
        """Scale item TAGORID with XORIGIN, YORIGIN, XSCALE, YSCALE."""
        self.tk.call((self._w, 'scale') + args)

    def scan_mark(self, x, y):
        """Remember the current X, Y coordinates."""
        self.tk.call(self._w, 'scan', 'mark', x, y)

    def scan_dragto(self, x, y, gain=10):
        """Adjust the view of the canvas to GAIN times the
        difference between X and Y and the coordinates given in
        scan_mark."""
        self.tk.call(self._w, 'scan', 'dragto', x, y, gain)

    def select_adjust(self, tagOrId, index):
        """Adjust the end of the selection near the cursor of an item TAGORID to index."""
        self.tk.call(self._w, 'select', 'adjust', tagOrId, index)

    def select_clear(self):
        """Clear the selection if it is in this widget."""
        self.tk.call(self._w, 'select', 'clear')

    def select_from(self, tagOrId, index):
        """Set the fixed end of a selection in item TAGORID to INDEX."""
        self.tk.call(self._w, 'select', 'from', tagOrId, index)

    def select_item(self):
        """Return the item which has the selection."""
        return self.tk.call(self._w, 'select', 'item') or None

    def select_to(self, tagOrId, index):
        """Set the variable end of a selection in item TAGORID to INDEX."""
        self.tk.call(self._w, 'select', 'to', tagOrId, index)

    def type(self, tagOrId):
        """Return the type of the item TAGORID."""
        return self.tk.call(self._w, 'type', tagOrId) or None


class Checkbutton(Widget):
    """Checkbutton widget which is either in on- or off-state."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a checkbutton widget with the parent MASTER.

        Valid resource names: activebackground, activeforeground, anchor,
        background, bd, bg, bitmap, borderwidth, command, cursor,
        disabledforeground, fg, font, foreground, height,
        highlightbackground, highlightcolor, highlightthickness, image,
        indicatoron, justify, offvalue, onvalue, padx, pady, relief,
        selectcolor, selectimage, state, takefocus, text, textvariable,
        underline, variable, width, wraplength."""
        Widget.__init__(self, master, 'checkbutton', cnf, kw)

    def deselect(self):
        """Put the button in off-state."""
        self.tk.call(self._w, 'deselect')

    def flash(self):
        """Flash the button."""
        self.tk.call(self._w, 'flash')

    def invoke(self):
        """Toggle the button and invoke a command if given as resource."""
        return self.tk.call(self._w, 'invoke')

    def select(self):
        """Put the button in on-state."""
        self.tk.call(self._w, 'select')

    def toggle(self):
        """Toggle the button."""
        self.tk.call(self._w, 'toggle')


class Entry(Widget, XView):
    """Entry widget which allows displaying simple text."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct an entry widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, cursor,
        exportselection, fg, font, foreground, highlightbackground,
        highlightcolor, highlightthickness, insertbackground,
        insertborderwidth, insertofftime, insertontime, insertwidth,
        invalidcommand, invcmd, justify, relief, selectbackground,
        selectborderwidth, selectforeground, show, state, takefocus,
        textvariable, validate, validatecommand, vcmd, width,
        xscrollcommand."""
        Widget.__init__(self, master, 'entry', cnf, kw)

    def delete(self, first, last=None):
        """Delete text from FIRST to LAST (not included)."""
        self.tk.call(self._w, 'delete', first, last)

    def get(self):
        """Return the text."""
        return self.tk.call(self._w, 'get')

    def icursor(self, index):
        """Insert cursor at INDEX."""
        self.tk.call(self._w, 'icursor', index)

    def index(self, index):
        """Return position of cursor."""
        return self.tk.getint(self.tk.call(
            self._w, 'index', index))

    def insert(self, index, string):
        """Insert STRING at INDEX."""
        self.tk.call(self._w, 'insert', index, string)

    def scan_mark(self, x):
        """Remember the current X, Y coordinates."""
        self.tk.call(self._w, 'scan', 'mark', x)

    def scan_dragto(self, x):
        """Adjust the view of the canvas to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark."""
        self.tk.call(self._w, 'scan', 'dragto', x)

    def selection_adjust(self, index):
        """Adjust the end of the selection near the cursor to INDEX."""
        self.tk.call(self._w, 'selection', 'adjust', index)

    select_adjust = selection_adjust

    def selection_clear(self):
        """Clear the selection if it is in this widget."""
        self.tk.call(self._w, 'selection', 'clear')

    select_clear = selection_clear

    def selection_from(self, index):
        """Set the fixed end of a selection to INDEX."""
        self.tk.call(self._w, 'selection', 'from', index)

    select_from = selection_from

    def selection_present(self):
        """Return True if there are characters selected in the entry, False
        otherwise."""
        return self.tk.getboolean(
            self.tk.call(self._w, 'selection', 'present'))

    select_present = selection_present

    def selection_range(self, start, end):
        """Set the selection from START to END (not included)."""
        self.tk.call(self._w, 'selection', 'range', start, end)

    select_range = selection_range

    def selection_to(self, index):
        """Set the variable end of a selection to INDEX."""
        self.tk.call(self._w, 'selection', 'to', index)

    select_to = selection_to


class Frame(Widget):
    """Frame widget which may contain other widgets and can have a 3D border."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a frame widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, class,
        colormap, container, cursor, height, highlightbackground,
        highlightcolor, highlightthickness, relief, takefocus, visual, width."""
        cnf = _cnfmerge((cnf, kw))
        extra = ()
        if 'class_' in cnf:
            extra = ('-class', cnf['class_'])
            del cnf['class_']
        elif 'class' in cnf:
            extra = ('-class', cnf['class'])
            del cnf['class']
        Widget.__init__(self, master, 'frame', cnf, {}, extra)


class Label(Widget):
    """Label widget which can display text and bitmaps."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a label widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, activeforeground, anchor,
            background, bitmap, borderwidth, cursor,
            disabledforeground, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, image, justify,
            padx, pady, relief, takefocus, text,
            textvariable, underline, wraplength

        WIDGET-SPECIFIC OPTIONS

            height, state, width

        """
        Widget.__init__(self, master, 'label', cnf, kw)


class Listbox(Widget, XView, YView):
    """Listbox widget which can display a list of strings."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a listbox widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, cursor,
        exportselection, fg, font, foreground, height, highlightbackground,
        highlightcolor, highlightthickness, relief, selectbackground,
        selectborderwidth, selectforeground, selectmode, setgrid, takefocus,
        width, xscrollcommand, yscrollcommand, listvariable."""
        Widget.__init__(self, master, 'listbox', cnf, kw)

    def activate(self, index):
        """Activate item identified by INDEX."""
        self.tk.call(self._w, 'activate', index)

    def bbox(self, index):
        """Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
        which encloses the item identified by the given index."""
        return self._getints(self.tk.call(self._w, 'bbox', index)) or None

    def curselection(self):
        """Return the indices of currently selected item."""
        return self._getints(self.tk.call(self._w, 'curselection')) or ()

    def delete(self, first, last=None):
        """Delete items from FIRST to LAST (included)."""
        self.tk.call(self._w, 'delete', first, last)

    def get(self, first, last=None):
        """Get list of items from FIRST to LAST (included)."""
        if last is not None:
            return self.tk.splitlist(self.tk.call(
                self._w, 'get', first, last))
        else:
            return self.tk.call(self._w, 'get', first)

    def index(self, index):
        """Return index of item identified with INDEX."""
        i = self.tk.call(self._w, 'index', index)
        if i == 'none': return None
        return self.tk.getint(i)

    def insert(self, index, *elements):
        """Insert ELEMENTS at INDEX."""
        self.tk.call((self._w, 'insert', index) + elements)

    def nearest(self, y):
        """Get index of item which is nearest to y coordinate Y."""
        return self.tk.getint(self.tk.call(
            self._w, 'nearest', y))

    def scan_mark(self, x, y):
        """Remember the current X, Y coordinates."""
        self.tk.call(self._w, 'scan', 'mark', x, y)

    def scan_dragto(self, x, y):
        """Adjust the view of the listbox to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark."""
        self.tk.call(self._w, 'scan', 'dragto', x, y)

    def see(self, index):
        """Scroll such that INDEX is visible."""
        self.tk.call(self._w, 'see', index)

    def selection_anchor(self, index):
        """Set the fixed end oft the selection to INDEX."""
        self.tk.call(self._w, 'selection', 'anchor', index)

    select_anchor = selection_anchor

    def selection_clear(self, first, last=None):
        """Clear the selection from FIRST to LAST (included)."""
        self.tk.call(self._w,
                 'selection', 'clear', first, last)

    select_clear = selection_clear

    def selection_includes(self, index):
        """Return True if INDEX is part of the selection."""
        return self.tk.getboolean(self.tk.call(
            self._w, 'selection', 'includes', index))

    select_includes = selection_includes

    def selection_set(self, first, last=None):
        """Set the selection from FIRST to LAST (included) without
        changing the currently selected elements."""
        self.tk.call(self._w, 'selection', 'set', first, last)

    select_set = selection_set

    def size(self):
        """Return the number of elements in the listbox."""
        return self.tk.getint(self.tk.call(self._w, 'size'))

    def itemcget(self, index, option):
        """Return the resource value for an ITEM and an OPTION."""
        return self.tk.call(
            (self._w, 'itemcget') + (index, '-'+option))

    def itemconfigure(self, index, cnf=None, **kw):
        """Configure resources of an ITEM.

        The values for resources are specified as keyword arguments.
        To get an overview about the allowed keyword arguments
        call the method without arguments.
        Valid resource names: background, bg, foreground, fg,
        selectbackground, selectforeground."""
        return self._configure(('itemconfigure', index), cnf, kw)

    itemconfig = itemconfigure


class Menu(Widget):
    """Menu widget which allows displaying menu bars, pull-down menus and pop-up menus."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct menu widget with the parent MASTER.

        Valid resource names: activebackground, activeborderwidth,
        activeforeground, background, bd, bg, borderwidth, cursor,
        disabledforeground, fg, font, foreground, postcommand, relief,
        selectcolor, takefocus, tearoff, tearoffcommand, title, type."""
        Widget.__init__(self, master, 'menu', cnf, kw)

    def tk_popup(self, x, y, entry=""):
        """Post the menu at position X,Y with entry ENTRY."""
        self.tk.call('tk_popup', self._w, x, y, entry)

    def activate(self, index):
        """Activate entry at INDEX."""
        self.tk.call(self._w, 'activate', index)

    def add(self, itemType, cnf={}, **kw):
        """Internal function."""
        self.tk.call((self._w, 'add', itemType) +
                 self._options(cnf, kw))

    def add_cascade(self, cnf={}, **kw):
        """Add hierarchical menu item."""
        self.add('cascade', cnf or kw)

    def add_checkbutton(self, cnf={}, **kw):
        """Add checkbutton menu item."""
        self.add('checkbutton', cnf or kw)

    def add_command(self, cnf={}, **kw):
        """Add command menu item."""
        self.add('command', cnf or kw)

    def add_radiobutton(self, cnf={}, **kw):
        """Addd radio menu item."""
        self.add('radiobutton', cnf or kw)

    def add_separator(self, cnf={}, **kw):
        """Add separator."""
        self.add('separator', cnf or kw)

    def insert(self, index, itemType, cnf={}, **kw):
        """Internal function."""
        self.tk.call((self._w, 'insert', index, itemType) +
                 self._options(cnf, kw))

    def insert_cascade(self, index, cnf={}, **kw):
        """Add hierarchical menu item at INDEX."""
        self.insert(index, 'cascade', cnf or kw)

    def insert_checkbutton(self, index, cnf={}, **kw):
        """Add checkbutton menu item at INDEX."""
        self.insert(index, 'checkbutton', cnf or kw)

    def insert_command(self, index, cnf={}, **kw):
        """Add command menu item at INDEX."""
        self.insert(index, 'command', cnf or kw)

    def insert_radiobutton(self, index, cnf={}, **kw):
        """Addd radio menu item at INDEX."""
        self.insert(index, 'radiobutton', cnf or kw)

    def insert_separator(self, index, cnf={}, **kw):
        """Add separator at INDEX."""
        self.insert(index, 'separator', cnf or kw)

    def delete(self, index1, index2=None):
        """Delete menu items between INDEX1 and INDEX2 (included)."""
        if index2 is None:
            index2 = index1

        num_index1, num_index2 = self.index(index1), self.index(index2)
        if (num_index1 is None) or (num_index2 is None):
            num_index1, num_index2 = 0, -1

        for i in range(num_index1, num_index2 + 1):
            if 'command' in self.entryconfig(i):
                c = str(self.entrycget(i, 'command'))
                if c:
                    self.deletecommand(c)
        self.tk.call(self._w, 'delete', index1, index2)

    def entrycget(self, index, option):
        """Return the resource value of a menu item for OPTION at INDEX."""
        return self.tk.call(self._w, 'entrycget', index, '-' + option)

    def entryconfigure(self, index, cnf=None, **kw):
        """Configure a menu item at INDEX."""
        return self._configure(('entryconfigure', index), cnf, kw)

    entryconfig = entryconfigure

    def index(self, index):
        """Return the index of a menu item identified by INDEX."""
        i = self.tk.call(self._w, 'index', index)
        if i == 'none': return None
        return self.tk.getint(i)

    def invoke(self, index):
        """Invoke a menu item identified by INDEX and execute
        the associated command."""
        return self.tk.call(self._w, 'invoke', index)

    def post(self, x, y):
        """Display a menu at position X,Y."""
        self.tk.call(self._w, 'post', x, y)

    def type(self, index):
        """Return the type of the menu item at INDEX."""
        return self.tk.call(self._w, 'type', index)

    def unpost(self):
        """Unmap a menu."""
        self.tk.call(self._w, 'unpost')

    def xposition(self, index): # new in Tk 8.5
        """Return the x-position of the leftmost pixel of the menu item
        at INDEX."""
        return self.tk.getint(self.tk.call(self._w, 'xposition', index))

    def yposition(self, index):
        """Return the y-position of the topmost pixel of the menu item at INDEX."""
        return self.tk.getint(self.tk.call(
            self._w, 'yposition', index))


class Menubutton(Widget):
    """Menubutton widget, obsolete since Tk8.0."""

    def __init__(self, master=None, cnf={}, **kw):
        Widget.__init__(self, master, 'menubutton', cnf, kw)


class Message(Widget):
    """Message widget to display multiline text. Obsolete since Label does it too."""

    def __init__(self, master=None, cnf={}, **kw):
        Widget.__init__(self, master, 'message', cnf, kw)


class Radiobutton(Widget):
    """Radiobutton widget which shows only one of several buttons in on-state."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a radiobutton widget with the parent MASTER.

        Valid resource names: activebackground, activeforeground, anchor,
        background, bd, bg, bitmap, borderwidth, command, cursor,
        disabledforeground, fg, font, foreground, height,
        highlightbackground, highlightcolor, highlightthickness, image,
        indicatoron, justify, padx, pady, relief, selectcolor, selectimage,
        state, takefocus, text, textvariable, underline, value, variable,
        width, wraplength."""
        Widget.__init__(self, master, 'radiobutton', cnf, kw)

    def deselect(self):
        """Put the button in off-state."""

        self.tk.call(self._w, 'deselect')

    def flash(self):
        """Flash the button."""
        self.tk.call(self._w, 'flash')

    def invoke(self):
        """Toggle the button and invoke a command if given as resource."""
        return self.tk.call(self._w, 'invoke')

    def select(self):
        """Put the button in on-state."""
        self.tk.call(self._w, 'select')


class Scale(Widget):
    """Scale widget which can display a numerical scale."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a scale widget with the parent MASTER.

        Valid resource names: activebackground, background, bigincrement, bd,
        bg, borderwidth, command, cursor, digits, fg, font, foreground, from,
        highlightbackground, highlightcolor, highlightthickness, label,
        length, orient, relief, repeatdelay, repeatinterval, resolution,
        showvalue, sliderlength, sliderrelief, state, takefocus,
        tickinterval, to, troughcolor, variable, width."""
        Widget.__init__(self, master, 'scale', cnf, kw)

    def get(self):
        """Get the current value as integer or float."""
        value = self.tk.call(self._w, 'get')
        try:
            return self.tk.getint(value)
        except (ValueError, TypeError, TclError):
            return self.tk.getdouble(value)

    def set(self, value):
        """Set the value to VALUE."""
        self.tk.call(self._w, 'set', value)

    def coords(self, value=None):
        """Return a tuple (X,Y) of the point along the centerline of the
        trough that corresponds to VALUE or the current value if None is
        given."""

        return self._getints(self.tk.call(self._w, 'coords', value))

    def identify(self, x, y):
        """Return where the point X,Y lies. Valid return values are "slider",
        "though1" and "though2"."""
        return self.tk.call(self._w, 'identify', x, y)


class Scrollbar(Widget):
    """Scrollbar widget which displays a slider at a certain position."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a scrollbar widget with the parent MASTER.

        Valid resource names: activebackground, activerelief,
        background, bd, bg, borderwidth, command, cursor,
        elementborderwidth, highlightbackground,
        highlightcolor, highlightthickness, jump, orient,
        relief, repeatdelay, repeatinterval, takefocus,
        troughcolor, width."""
        Widget.__init__(self, master, 'scrollbar', cnf, kw)

    def activate(self, index=None):
        """Marks the element indicated by index as active.
        The only index values understood by this method are "arrow1",
        "slider", or "arrow2".  If any other value is specified then no
        element of the scrollbar will be active.  If index is not specified,
        the method returns the name of the element that is currently active,
        or None if no element is active."""
        return self.tk.call(self._w, 'activate', index) or None

    def delta(self, deltax, deltay):
        """Return the fractional change of the scrollbar setting if it
        would be moved by DELTAX or DELTAY pixels."""
        return self.tk.getdouble(
            self.tk.call(self._w, 'delta', deltax, deltay))

    def fraction(self, x, y):
        """Return the fractional value which corresponds to a slider
        position of X,Y."""
        return self.tk.getdouble(self.tk.call(self._w, 'fraction', x, y))

    def identify(self, x, y):
        """Return the element under position X,Y as one of
        "arrow1","slider","arrow2" or ""."""
        return self.tk.call(self._w, 'identify', x, y)

    def get(self):
        """Return the current fractional values (upper and lower end)
        of the slider position."""
        return self._getdoubles(self.tk.call(self._w, 'get'))

    def set(self, first, last):
        """Set the fractional values of the slider position (upper and
        lower ends as value between 0 and 1)."""
        self.tk.call(self._w, 'set', first, last)


class Text(Widget, XView, YView):
    """Text widget which can display text in various forms."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a text widget with the parent MASTER.

        STANDARD OPTIONS

            background, borderwidth, cursor,
            exportselection, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, insertbackground,
            insertborderwidth, insertofftime,
            insertontime, insertwidth, padx, pady,
            relief, selectbackground,
            selectborderwidth, selectforeground,
            setgrid, takefocus,
            xscrollcommand, yscrollcommand,

        WIDGET-SPECIFIC OPTIONS

            autoseparators, height, maxundo,
            spacing1, spacing2, spacing3,
            state, tabs, undo, width, wrap,

        """
        Widget.__init__(self, master, 'text', cnf, kw)

    def bbox(self, index):
        """Return a tuple of (x,y,width,height) which gives the bounding
        box of the visible part of the character at the given index."""
        return self._getints(
                self.tk.call(self._w, 'bbox', index)) or None

    def compare(self, index1, op, index2):
        """Return whether between index INDEX1 and index INDEX2 the
        relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=."""
        return self.tk.getboolean(self.tk.call(
            self._w, 'compare', index1, op, index2))

    def count(self, index1, index2, *args): # new in Tk 8.5
        """Counts the number of relevant things between the two indices.
        If index1 is after index2, the result will be a negative number
        (and this holds for each of the possible options).

        The actual items which are counted depends on the options given by
        args. The result is a list of integers, one for the result of each
        counting option given. Valid counting options are "chars",
        "displaychars", "displayindices", "displaylines", "indices",
        "lines", "xpixels" and "ypixels". There is an additional possible
        option "update", which if given then all subsequent options ensure
        that any possible out of date information is recalculated."""
        args = ['-%s' % arg for arg in args if not arg.startswith('-')]
        args += [index1, index2]
        res = self.tk.call(self._w, 'count', *args) or None
        if res is not None and len(args) <= 3:
            return (res, )
        else:
            return res

    def debug(self, boolean=None):
        """Turn on the internal consistency checks of the B-Tree inside the text
        widget according to BOOLEAN."""
        if boolean is None:
            return self.tk.getboolean(self.tk.call(self._w, 'debug'))
        self.tk.call(self._w, 'debug', boolean)

    def delete(self, index1, index2=None):
        """Delete the characters between INDEX1 and INDEX2 (not included)."""
        self.tk.call(self._w, 'delete', index1, index2)

    def dlineinfo(self, index):
        """Return tuple (x,y,width,height,baseline) giving the bounding box
        and baseline position of the visible part of the line containing
        the character at INDEX."""
        return self._getints(self.tk.call(self._w, 'dlineinfo', index))

    def dump(self, index1, index2=None, command=None, **kw):
        """Return the contents of the widget between index1 and index2.

        The type of contents returned in filtered based on the keyword
        parameters; if 'all', 'image', 'mark', 'tag', 'text', or 'window' are
        given and true, then the corresponding items are returned. The result
        is a list of triples of the form (key, value, index). If none of the
        keywords are true then 'all' is used by default.

        If the 'command' argument is given, it is called once for each element
        of the list of triples, with the values of each triple serving as the
        arguments to the function. In this case the list is not returned."""
        args = []
        func_name = None
        result = None
        if not command:
            # Never call the dump command without the -command flag, since the
            # output could involve Tcl quoting and would be a pain to parse
            # right. Instead just set the command to build a list of triples
            # as if we had done the parsing.
            result = []
            def append_triple(key, value, index, result=result):
                result.append((key, value, index))
            command = append_triple
        try:
            if not isinstance(command, str):
                func_name = command = self._register(command)
            args += ["-command", command]
            for key in kw:
                if kw[key]: args.append("-" + key)
            args.append(index1)
            if index2:
                args.append(index2)
            self.tk.call(self._w, "dump", *args)
            return result
        finally:
            if func_name:
                self.deletecommand(func_name)

    ## new in tk8.4
    def edit(self, *args):
        """Internal method

        This method controls the undo mechanism and
        the modified flag. The exact behavior of the
        command depends on the option argument that
        follows the edit argument. The following forms
        of the command are currently supported:

        edit_modified, edit_redo, edit_reset, edit_separator
        and edit_undo

        """
        return self.tk.call(self._w, 'edit', *args)

    def edit_modified(self, arg=None):
        """Get or Set the modified flag

        If arg is not specified, returns the modified
        flag of the widget. The insert, delete, edit undo and
        edit redo commands or the user can set or clear the
        modified flag. If boolean is specified, sets the
        modified flag of the widget to arg.
        """
        return self.edit("modified", arg)

    def edit_redo(self):
        """Redo the last undone edit

        When the undo option is true, reapplies the last
        undone edits provided no other edits were done since
        then. Generates an error when the redo stack is empty.
        Does nothing when the undo option is false.
        """
        return self.edit("redo")

    def edit_reset(self):
        """Clears the undo and redo stacks
        """
        return self.edit("reset")

    def edit_separator(self):
        """Inserts a separator (boundary) on the undo stack.

        Does nothing when the undo option is false
        """
        return self.edit("separator")

    def edit_undo(self):
        """Undoes the last edit action

        If the undo option is true. An edit action is defined
        as all the insert and delete commands that are recorded
        on the undo stack in between two separators. Generates
        an error when the undo stack is empty. Does nothing
        when the undo option is false
        """
        return self.edit("undo")

    def get(self, index1, index2=None):
        """Return the text from INDEX1 to INDEX2 (not included)."""
        return self.tk.call(self._w, 'get', index1, index2)
    # (Image commands are new in 8.0)

    def image_cget(self, index, option):
        """Return the value of OPTION of an embedded image at INDEX."""
        if option[:1] != "-":
            option = "-" + option
        if option[-1:] == "_":
            option = option[:-1]
        return self.tk.call(self._w, "image", "cget", index, option)

    def image_configure(self, index, cnf=None, **kw):
        """Configure an embedded image at INDEX."""
        return self._configure(('image', 'configure', index), cnf, kw)

    def image_create(self, index, cnf={}, **kw):
        """Create an embedded image at INDEX."""
        return self.tk.call(
                 self._w, "image", "create", index,
                 *self._options(cnf, kw))

    def image_names(self):
        """Return all names of embedded images in this widget."""
        return self.tk.call(self._w, "image", "names")

    def index(self, index):
        """Return the index in the form line.char for INDEX."""
        return str(self.tk.call(self._w, 'index', index))

    def insert(self, index, chars, *args):
        """Insert CHARS before the characters at INDEX. An additional
        tag can be given in ARGS. Additional CHARS and tags can follow in ARGS."""
        self.tk.call((self._w, 'insert', index, chars) + args)

    def mark_gravity(self, markName, direction=None):
        """Change the gravity of a mark MARKNAME to DIRECTION (LEFT or RIGHT).
        Return the current value if None is given for DIRECTION."""
        return self.tk.call(
            (self._w, 'mark', 'gravity', markName, direction))

    def mark_names(self):
        """Return all mark names."""
        return self.tk.splitlist(self.tk.call(
            self._w, 'mark', 'names'))

    def mark_set(self, markName, index):
        """Set mark MARKNAME before the character at INDEX."""
        self.tk.call(self._w, 'mark', 'set', markName, index)

    def mark_unset(self, *markNames):
        """Delete all marks in MARKNAMES."""
        self.tk.call((self._w, 'mark', 'unset') + markNames)

    def mark_next(self, index):
        """Return the name of the next mark after INDEX."""
        return self.tk.call(self._w, 'mark', 'next', index) or None

    def mark_previous(self, index):
        """Return the name of the previous mark before INDEX."""
        return self.tk.call(self._w, 'mark', 'previous', index) or None

    def peer_create(self, newPathName, cnf={}, **kw): # new in Tk 8.5
        """Creates a peer text widget with the given newPathName, and any
        optional standard configuration options. By default the peer will
        have the same start and end line as the parent widget, but
        these can be overridden with the standard configuration options."""
        self.tk.call(self._w, 'peer', 'create', newPathName,
            *self._options(cnf, kw))

    def peer_names(self): # new in Tk 8.5
        """Returns a list of peers of this widget (this does not include
        the widget itself)."""
        return self.tk.splitlist(self.tk.call(self._w, 'peer', 'names'))

    def replace(self, index1, index2, chars, *args): # new in Tk 8.5
        """Replaces the range of characters between index1 and index2 with
        the given characters and tags specified by args.

        See the method insert for some more information about args, and the
        method delete for information about the indices."""
        self.tk.call(self._w, 'replace', index1, index2, chars, *args)

    def scan_mark(self, x, y):
        """Remember the current X, Y coordinates."""
        self.tk.call(self._w, 'scan', 'mark', x, y)

    def scan_dragto(self, x, y):
        """Adjust the view of the text to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark."""
        self.tk.call(self._w, 'scan', 'dragto', x, y)

    def search(self, pattern, index, stopindex=None,
           forwards=None, backwards=None, exact=None,
           regexp=None, nocase=None, count=None, elide=None):
        """Search PATTERN beginning from INDEX until STOPINDEX.
        Return the index of the first character of a match or an
        empty string."""
        args = [self._w, 'search']
        if forwards: args.append('-forwards')
        if backwards: args.append('-backwards')
        if exact: args.append('-exact')
        if regexp: args.append('-regexp')
        if nocase: args.append('-nocase')
        if elide: args.append('-elide')
        if count: args.append('-count'); args.append(count)
        if pattern and pattern[0] == '-': args.append('--')
        args.append(pattern)
        args.append(index)
        if stopindex: args.append(stopindex)
        return str(self.tk.call(tuple(args)))

    def see(self, index):
        """Scroll such that the character at INDEX is visible."""
        self.tk.call(self._w, 'see', index)

    def tag_add(self, tagName, index1, *args):
        """Add tag TAGNAME to all characters between INDEX1 and index2 in ARGS.
        Additional pairs of indices may follow in ARGS."""
        self.tk.call(
            (self._w, 'tag', 'add', tagName, index1) + args)

    def tag_unbind(self, tagName, sequence, funcid=None):
        """Unbind for all characters with TAGNAME for event SEQUENCE  the
        function identified with FUNCID."""
        self.tk.call(self._w, 'tag', 'bind', tagName, sequence, '')
        if funcid:
            self.deletecommand(funcid)

    def tag_bind(self, tagName, sequence, func, add=None):
        """Bind to all characters with TAGNAME at event SEQUENCE a call to function FUNC.

        An additional boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or whether it will
        replace the previous function. See bind for the return value."""
        return self._bind((self._w, 'tag', 'bind', tagName),
                  sequence, func, add)

    def tag_cget(self, tagName, option):
        """Return the value of OPTION for tag TAGNAME."""
        if option[:1] != '-':
            option = '-' + option
        if option[-1:] == '_':
            option = option[:-1]
        return self.tk.call(self._w, 'tag', 'cget', tagName, option)

    def tag_configure(self, tagName, cnf=None, **kw):
        """Configure a tag TAGNAME."""
        return self._configure(('tag', 'configure', tagName), cnf, kw)

    tag_config = tag_configure

    def tag_delete(self, *tagNames):
        """Delete all tags in TAGNAMES."""
        self.tk.call((self._w, 'tag', 'delete') + tagNames)

    def tag_lower(self, tagName, belowThis=None):
        """Change the priority of tag TAGNAME such that it is lower
        than the priority of BELOWTHIS."""
        self.tk.call(self._w, 'tag', 'lower', tagName, belowThis)

    def tag_names(self, index=None):
        """Return a list of all tag names."""
        return self.tk.splitlist(
            self.tk.call(self._w, 'tag', 'names', index))

    def tag_nextrange(self, tagName, index1, index2=None):
        """Return a list of start and end index for the first sequence of
        characters between INDEX1 and INDEX2 which all have tag TAGNAME.
        The text is searched forward from INDEX1."""
        return self.tk.splitlist(self.tk.call(
            self._w, 'tag', 'nextrange', tagName, index1, index2))

    def tag_prevrange(self, tagName, index1, index2=None):
        """Return a list of start and end index for the first sequence of
        characters between INDEX1 and INDEX2 which all have tag TAGNAME.
        The text is searched backwards from INDEX1."""
        return self.tk.splitlist(self.tk.call(
            self._w, 'tag', 'prevrange', tagName, index1, index2))

    def tag_raise(self, tagName, aboveThis=None):
        """Change the priority of tag TAGNAME such that it is higher
        than the priority of ABOVETHIS."""
        self.tk.call(
            self._w, 'tag', 'raise', tagName, aboveThis)

    def tag_ranges(self, tagName):
        """Return a list of ranges of text which have tag TAGNAME."""
        return self.tk.splitlist(self.tk.call(
            self._w, 'tag', 'ranges', tagName))

    def tag_remove(self, tagName, index1, index2=None):
        """Remove tag TAGNAME from all characters between INDEX1 and INDEX2."""
        self.tk.call(
            self._w, 'tag', 'remove', tagName, index1, index2)

    def window_cget(self, index, option):
        """Return the value of OPTION of an embedded window at INDEX."""
        if option[:1] != '-':
            option = '-' + option
        if option[-1:] == '_':
            option = option[:-1]
        return self.tk.call(self._w, 'window', 'cget', index, option)

    def window_configure(self, index, cnf=None, **kw):
        """Configure an embedded window at INDEX."""
        return self._configure(('window', 'configure', index), cnf, kw)

    window_config = window_configure

    def window_create(self, index, cnf={}, **kw):
        """Create a window at INDEX."""
        self.tk.call(
              (self._w, 'window', 'create', index)
              + self._options(cnf, kw))

    def window_names(self):
        """Return all names of embedded windows in this widget."""
        return self.tk.splitlist(
            self.tk.call(self._w, 'window', 'names'))

    def yview_pickplace(self, *what):
        """Obsolete function, use see."""
        self.tk.call((self._w, 'yview', '-pickplace') + what)


class _setit:
    """Internal class. It wraps the command in the widget OptionMenu."""

    def __init__(self, var, value, callback=None):
        self.__value = value
        self.__var = var
        self.__callback = callback

    def __call__(self, *args):
        self.__var.set(self.__value)
        if self.__callback:
            self.__callback(self.__value, *args)


class OptionMenu(Menubutton):
    """OptionMenu which allows the user to select a value from a menu."""

    def __init__(self, master, variable, value, *values, **kwargs):
        """Construct an optionmenu widget with the parent MASTER, with
        the resource textvariable set to VARIABLE, the initially selected
        value VALUE, the other menu values VALUES and an additional
        keyword argument command."""
        kw = {"borderwidth": 2, "textvariable": variable,
              "indicatoron": 1, "relief": RAISED, "anchor": "c",
              "highlightthickness": 2}
        Widget.__init__(self, master, "menubutton", kw)
        self.widgetName = 'tk_optionMenu'
        menu = self.__menu = Menu(self, name="menu", tearoff=0)
        self.menuname = menu._w
        # 'command' is the only supported keyword
        callback = kwargs.get('command')
        if 'command' in kwargs:
            del kwargs['command']
        if kwargs:
            raise TclError('unknown option -'+next(iter(kwargs)))
        menu.add_command(label=value,
                 command=_setit(variable, value, callback))
        for v in values:
            menu.add_command(label=v,
                     command=_setit(variable, v, callback))
        self["menu"] = menu

    def __getitem__(self, name):
        if name == 'menu':
            return self.__menu
        return Widget.__getitem__(self, name)

    def destroy(self):
        """Destroy this widget and the associated menu."""
        Menubutton.destroy(self)
        self.__menu = None


class Image:
    """Base class for images."""
    _last_id = 0

    def __init__(self, imgtype, name=None, cnf={}, master=None, **kw):
        self.name = None
        if not master:
            master = _get_default_root('create image')
        self.tk = getattr(master, 'tk', master)
        if not name:
            Image._last_id += 1
            name = "pyimage%r" % (Image._last_id,) # tk itself would use image<x>
        if kw and cnf: cnf = _cnfmerge((cnf, kw))
        elif kw: cnf = kw
        options = ()
        for k, v in cnf.items():
            if callable(v):
                v = self._register(v)
            options = options + ('-'+k, v)
        self.tk.call(('image', 'create', imgtype, name,) + options)
        self.name = name

    def __str__(self): return self.name

    def __del__(self):
        if self.name:
            try:
                self.tk.call('image', 'delete', self.name)
            except TclError:
                # May happen if the root was destroyed
                pass

    def __setitem__(self, key, value):
        self.tk.call(self.name, 'configure', '-'+key, value)

    def __getitem__(self, key):
        return self.tk.call(self.name, 'configure', '-'+key)

    def configure(self, **kw):
        """Configure the image."""
        res = ()
        for k, v in _cnfmerge(kw).items():
            if v is not None:
                if k[-1] == '_': k = k[:-1]
                if callable(v):
                    v = self._register(v)
                res = res + ('-'+k, v)
        self.tk.call((self.name, 'config') + res)

    config = configure

    def height(self):
        """Return the height of the image."""
        return self.tk.getint(
            self.tk.call('image', 'height', self.name))

    def type(self):
        """Return the type of the image, e.g. "photo" or "bitmap"."""
        return self.tk.call('image', 'type', self.name)

    def width(self):
        """Return the width of the image."""
        return self.tk.getint(
            self.tk.call('image', 'width', self.name))


class PhotoImage(Image):
    """Widget which can display images in PGM, PPM, GIF, PNG format."""

    def __init__(self, name=None, cnf={}, master=None, **kw):
        """Create an image with NAME.

        Valid resource names: data, format, file, gamma, height, palette,
        width."""
        Image.__init__(self, 'photo', name, cnf, master, **kw)

    def blank(self):
        """Display a transparent image."""
        self.tk.call(self.name, 'blank')

    def cget(self, option):
        """Return the value of OPTION."""
        return self.tk.call(self.name, 'cget', '-' + option)
    # XXX config

    def __getitem__(self, key):
        return self.tk.call(self.name, 'cget', '-' + key)
    # XXX copy -from, -to, ...?

    def copy(self):
        """Return a new PhotoImage with the same image as this widget."""
        destImage = PhotoImage(master=self.tk)
        self.tk.call(destImage, 'copy', self.name)
        return destImage

    def zoom(self, x, y=''):
        """Return a new PhotoImage with the same image as this widget
        but zoom it with a factor of x in the X direction and y in the Y
        direction.  If y is not given, the default value is the same as x.
        """
        destImage = PhotoImage(master=self.tk)
        if y=='': y=x
        self.tk.call(destImage, 'copy', self.name, '-zoom',x,y)
        return destImage

    def subsample(self, x, y=''):
        """Return a new PhotoImage based on the same image as this widget
        but use only every Xth or Yth pixel.  If y is not given, the
        default value is the same as x.
        """
        destImage = PhotoImage(master=self.tk)
        if y=='': y=x
        self.tk.call(destImage, 'copy', self.name, '-subsample',x,y)
        return destImage

    def get(self, x, y):
        """Return the color (red, green, blue) of the pixel at X,Y."""
        return self.tk.call(self.name, 'get', x, y)

    def put(self, data, to=None):
        """Put row formatted colors to image starting from
        position TO, e.g. image.put("{red green} {blue yellow}", to=(4,6))"""
        args = (self.name, 'put', data)
        if to:
            if to[0] == '-to':
                to = to[1:]
            args = args + ('-to',) + tuple(to)
        self.tk.call(args)
    # XXX read

    def write(self, filename, format=None, from_coords=None):
        """Write image to file FILENAME in FORMAT starting from
        position FROM_COORDS."""
        args = (self.name, 'write', filename)
        if format:
            args = args + ('-format', format)
        if from_coords:
            args = args + ('-from',) + tuple(from_coords)
        self.tk.call(args)

    def transparency_get(self, x, y):
        """Return True if the pixel at x,y is transparent."""
        return self.tk.getboolean(self.tk.call(
            self.name, 'transparency', 'get', x, y))

    def transparency_set(self, x, y, boolean):
        """Set the transparency of the pixel at x,y."""
        self.tk.call(self.name, 'transparency', 'set', x, y, boolean)


class BitmapImage(Image):
    """Widget which can display images in XBM format."""

    def __init__(self, name=None, cnf={}, master=None, **kw):
        """Create a bitmap with NAME.

        Valid resource names: background, data, file, foreground, maskdata, maskfile."""
        Image.__init__(self, 'bitmap', name, cnf, master, **kw)


def image_names():
    tk = _get_default_root('use image_names()').tk
    return tk.splitlist(tk.call('image', 'names'))


def image_types():
    tk = _get_default_root('use image_types()').tk
    return tk.splitlist(tk.call('image', 'types'))


class Spinbox(Widget, XView):
    """spinbox widget."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a spinbox widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, background, borderwidth,
            cursor, exportselection, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, insertbackground,
            insertborderwidth, insertofftime,
            insertontime, insertwidth, justify, relief,
            repeatdelay, repeatinterval,
            selectbackground, selectborderwidth
            selectforeground, takefocus, textvariable
            xscrollcommand.

        WIDGET-SPECIFIC OPTIONS

            buttonbackground, buttoncursor,
            buttondownrelief, buttonuprelief,
            command, disabledbackground,
            disabledforeground, format, from,
            invalidcommand, increment,
            readonlybackground, state, to,
            validate, validatecommand values,
            width, wrap,
        """
        Widget.__init__(self, master, 'spinbox', cnf, kw)

    def bbox(self, index):
        """Return a tuple of X1,Y1,X2,Y2 coordinates for a
        rectangle which encloses the character given by index.

        The first two elements of the list give the x and y
        coordinates of the upper-left corner of the screen
        area covered by the character (in pixels relative
        to the widget) and the last two elements give the
        width and height of the character, in pixels. The
        bounding box may refer to a region outside the
        visible area of the window.
        """
        return self._getints(self.tk.call(self._w, 'bbox', index)) or None

    def delete(self, first, last=None):
        """Delete one or more elements of the spinbox.

        First is the index of the first character to delete,
        and last is the index of the character just after
        the last one to delete. If last isn't specified it
        defaults to first+1, i.e. a single character is
        deleted.  This command returns an empty string.
        """
        return self.tk.call(self._w, 'delete', first, last)

    def get(self):
        """Returns the spinbox's string"""
        return self.tk.call(self._w, 'get')

    def icursor(self, index):
        """Alter the position of the insertion cursor.

        The insertion cursor will be displayed just before
        the character given by index. Returns an empty string
        """
        return self.tk.call(self._w, 'icursor', index)

    def identify(self, x, y):
        """Returns the name of the widget at position x, y

        Return value is one of: none, buttondown, buttonup, entry
        """
        return self.tk.call(self._w, 'identify', x, y)

    def index(self, index):
        """Returns the numerical index corresponding to index
        """
        return self.tk.call(self._w, 'index', index)

    def insert(self, index, s):
        """Insert string s at index

         Returns an empty string.
        """
        return self.tk.call(self._w, 'insert', index, s)

    def invoke(self, element):
        """Causes the specified element to be invoked

        The element could be buttondown or buttonup
        triggering the action associated with it.
        """
        return self.tk.call(self._w, 'invoke', element)

    def scan(self, *args):
        """Internal function."""
        return self._getints(
            self.tk.call((self._w, 'scan') + args)) or ()

    def scan_mark(self, x):
        """Records x and the current view in the spinbox window;

        used in conjunction with later scan dragto commands.
        Typically this command is associated with a mouse button
        press in the widget. It returns an empty string.
        """
        return self.scan("mark", x)

    def scan_dragto(self, x):
        """Compute the difference between the given x argument
        and the x argument to the last scan mark command

        It then adjusts the view left or right by 10 times the
        difference in x-coordinates. This command is typically
        associated with mouse motion events in the widget, to
        produce the effect of dragging the spinbox at high speed
        through the window. The return value is an empty string.
        """
        return self.scan("dragto", x)

    def selection(self, *args):
        """Internal function."""
        return self._getints(
            self.tk.call((self._w, 'selection') + args)) or ()

    def selection_adjust(self, index):
        """Locate the end of the selection nearest to the character
        given by index,

        Then adjust that end of the selection to be at index
        (i.e including but not going beyond index). The other
        end of the selection is made the anchor point for future
        select to commands. If the selection isn't currently in
        the spinbox, then a new selection is created to include
        the characters between index and the most recent selection
        anchor point, inclusive.
        """
        return self.selection("adjust", index)

    def selection_clear(self):
        """Clear the selection

        If the selection isn't in this widget then the
        command has no effect.
        """
        return self.selection("clear")

    def selection_element(self, element=None):
        """Sets or gets the currently selected element.

        If a spinbutton element is specified, it will be
        displayed depressed.
        """
        return self.tk.call(self._w, 'selection', 'element', element)

    def selection_from(self, index):
        """Set the fixed end of a selection to INDEX."""
        self.selection('from', index)

    def selection_present(self):
        """Return True if there are characters selected in the spinbox, False
        otherwise."""
        return self.tk.getboolean(
            self.tk.call(self._w, 'selection', 'present'))

    def selection_range(self, start, end):
        """Set the selection from START to END (not included)."""
        self.selection('range', start, end)

    def selection_to(self, index):
        """Set the variable end of a selection to INDEX."""
        self.selection('to', index)

###########################################################################


class LabelFrame(Widget):
    """labelframe widget."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a labelframe widget with the parent MASTER.

        STANDARD OPTIONS

            borderwidth, cursor, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, padx, pady, relief,
            takefocus, text

        WIDGET-SPECIFIC OPTIONS

            background, class, colormap, container,
            height, labelanchor, labelwidget,
            visual, width
        """
        Widget.__init__(self, master, 'labelframe', cnf, kw)

########################################################################


class PanedWindow(Widget):
    """panedwindow widget."""

    def __init__(self, master=None, cnf={}, **kw):
        """Construct a panedwindow widget with the parent MASTER.

        STANDARD OPTIONS

            background, borderwidth, cursor, height,
            orient, relief, width

        WIDGET-SPECIFIC OPTIONS

            handlepad, handlesize, opaqueresize,
            sashcursor, sashpad, sashrelief,
            sashwidth, showhandle,
        """
        Widget.__init__(self, master, 'panedwindow', cnf, kw)

    def add(self, child, **kw):
        """Add a child widget to the panedwindow in a new pane.

        The child argument is the name of the child widget
        followed by pairs of arguments that specify how to
        manage the windows. The possible options and values
        are the ones accepted by the paneconfigure method.
        """
        self.tk.call((self._w, 'add', child) + self._options(kw))

    def remove(self, child):
        """Remove the pane containing child from the panedwindow

        All geometry management options for child will be forgotten.
        """
        self.tk.call(self._w, 'forget', child)

    forget = remove

    def identify(self, x, y):
        """Identify the panedwindow component at point x, y

        If the point is over a sash or a sash handle, the result
        is a two element list containing the index of the sash or
        handle, and a word indicating whether it is over a sash
        or a handle, such as {0 sash} or {2 handle}. If the point
        is over any other part of the panedwindow, the result is
        an empty list.
        """
        return self.tk.call(self._w, 'identify', x, y)

    def proxy(self, *args):
        """Internal function."""
        return self._getints(
            self.tk.call((self._w, 'proxy') + args)) or ()

    def proxy_coord(self):
        """Return the x and y pair of the most recent proxy location
        """
        return self.proxy("coord")

    def proxy_forget(self):
        """Remove the proxy from the display.
        """
        return self.proxy("forget")

    def proxy_place(self, x, y):
        """Place the proxy at the given x and y coordinates.
        """
        return self.proxy("place", x, y)

    def sash(self, *args):
        """Internal function."""
        return self._getints(
            self.tk.call((self._w, 'sash') + args)) or ()

    def sash_coord(self, index):
        """Return the current x and y pair for the sash given by index.

        Index must be an integer between 0 and 1 less than the
        number of panes in the panedwindow. The coordinates given are
        those of the top left corner of the region containing the sash.
        pathName sash dragto index x y This command computes the
        difference between the given coordinates and the coordinates
        given to the last sash coord command for the given sash. It then
        moves that sash the computed difference. The return value is the
        empty string.
        """
        return self.sash("coord", index)

    def sash_mark(self, index):
        """Records x and y for the sash given by index;

        Used in conjunction with later dragto commands to move the sash.
        """
        return self.sash("mark", index)

    def sash_place(self, index, x, y):
        """Place the sash given by index at the given coordinates
        """
        return self.sash("place", index, x, y)

    def panecget(self, child, option):
        """Query a management option for window.

        Option may be any value allowed by the paneconfigure subcommand
        """
        return self.tk.call(
            (self._w, 'panecget') + (child, '-'+option))

    def paneconfigure(self, tagOrId, cnf=None, **kw):
        """Query or modify the management options for window.

        If no option is specified, returns a list describing all
        of the available options for pathName.  If option is
        specified with no value, then the command returns a list
        describing the one named option (this list will be identical
        to the corresponding sublist of the value returned if no
        option is specified). If one or more option-value pairs are
        specified, then the command modifies the given widget
        option(s) to have the given value(s); in this case the
        command returns an empty string. The following options
        are supported:

        after window
            Insert the window after the window specified. window
            should be the name of a window already managed by pathName.
        before window
            Insert the window before the window specified. window
            should be the name of a window already managed by pathName.
        height size
            Specify a height for the window. The height will be the
            outer dimension of the window including its border, if
            any. If size is an empty string, or if -height is not
            specified, then the height requested internally by the
            window will be used initially; the height may later be
            adjusted by the movement of sashes in the panedwindow.
            Size may be any value accepted by Tk_GetPixels.
        minsize n
            Specifies that the size of the window cannot be made
            less than n. This constraint only affects the size of
            the widget in the paned dimension -- the x dimension
            for horizontal panedwindows, the y dimension for
            vertical panedwindows. May be any value accepted by
            Tk_GetPixels.
        padx n
            Specifies a non-negative value indicating how much
            extra space to leave on each side of the window in
            the X-direction. The value may have any of the forms
            accepted by Tk_GetPixels.
        pady n
            Specifies a non-negative value indicating how much
            extra space to leave on each side of the window in
            the Y-direction. The value may have any of the forms
            accepted by Tk_GetPixels.
        sticky style
            If a window's pane is larger than the requested
            dimensions of the window, this option may be used
            to position (or stretch) the window within its pane.
            Style is a string that contains zero or more of the
            characters n, s, e or w. The string can optionally
            contains spaces or commas, but they are ignored. Each
            letter refers to a side (north, south, east, or west)
            that the window will "stick" to. If both n and s
            (or e and w) are specified, the window will be
            stretched to fill the entire height (or width) of
            its cavity.
        width size
            Specify a width for the window. The width will be
            the outer dimension of the window including its
            border, if any. If size is an empty string, or
            if -width is not specified, then the width requested
            internally by the window will be used initially; the
            width may later be adjusted by the movement of sashes
            in the panedwindow. Size may be any value accepted by
            Tk_GetPixels.

        """
        if cnf is None and not kw:
            return self._getconfigure(self._w, 'paneconfigure', tagOrId)
        if isinstance(cnf, str) and not kw:
            return self._getconfigure1(
                self._w, 'paneconfigure', tagOrId, '-'+cnf)
        self.tk.call((self._w, 'paneconfigure', tagOrId) +
                 self._options(cnf, kw))

    paneconfig = paneconfigure

    def panes(self):
        """Returns an ordered list of the child panes."""
        return self.tk.splitlist(self.tk.call(self._w, 'panes'))

# Test:


def _test():
    root = Tk()
    text = "This is Tcl/Tk version %s" % TclVersion
    text += "\nThis should be a cedilla: \xe7"
    label = Label(root, text=text)
    label.pack()
    test = Button(root, text="Click me!",
              command=lambda root=root: root.test.configure(
                  text="[%s]" % root.test['text']))
    test.pack()
    root.test = test
    quit = Button(root, text="QUIT", command=root.destroy)
    quit.pack()
    # The following three commands are needed so the window pops
    # up on top on Windows...
    root.iconify()
    root.update()
    root.deiconify()
    root.mainloop()


if __name__ == '__main__':
    _test()
PK�(�Za� `A
A
colorchooser.pynu�[���# tk common color chooser dialogue
#
# this module provides an interface to the native color dialogue
# available in Tk 4.2 and newer.
#
# written by Fredrik Lundh, May 1997
#
# fixed initialcolor handling in August 1998
#


from tkinter.commondialog import Dialog


class Chooser(Dialog):
    """Create a dialog for the tk_chooseColor command.

    Args:
        master: The master widget for this dialog.  If not provided,
            defaults to options['parent'] (if defined).
        options: Dictionary of options for the tk_chooseColor call.
            initialcolor: Specifies the selected color when the
                dialog is first displayed.  This can be a tk color
                string or a 3-tuple of ints in the range (0, 255)
                for an RGB triplet.
            parent: The parent window of the color dialog.  The
                color dialog is displayed on top of this.
            title: A string for the title of the dialog box.
    """

    command = "tk_chooseColor"

    def _fixoptions(self):
        """Ensure initialcolor is a tk color string.

        Convert initialcolor from a RGB triplet to a color string.
        """
        try:
            color = self.options["initialcolor"]
            if isinstance(color, tuple):
                # Assume an RGB triplet.
                self.options["initialcolor"] = "#%02x%02x%02x" % color
        except KeyError:
            pass

    def _fixresult(self, widget, result):
        """Adjust result returned from call to tk_chooseColor.

        Return both an RGB tuple of ints in the range (0, 255) and the
        tk color string in the form #rrggbb.
        """
        # Result can be many things: an empty tuple, an empty string, or
        # a _tkinter.Tcl_Obj, so this somewhat weird check handles that.
        if not result or not str(result):
            return None, None  # canceled

        # To simplify application code, the color chooser returns
        # an RGB tuple together with the Tk color string.
        r, g, b = widget.winfo_rgb(result)
        return (r//256, g//256, b//256), str(result)


#
# convenience stuff

def askcolor(color=None, **options):
    """Display dialog window for selection of a color.

    Convenience wrapper for the Chooser class.  Displays the color
    chooser dialog with color as the initial value.
    """

    if color:
        options = options.copy()
        options["initialcolor"] = color

    return Chooser(**options).show()


# --------------------------------------------------------------------
# test stuff

if __name__ == "__main__":
    print("color", askcolor())
PK�(�Z_	Y�-,-,tix.pynu�[���# Tix.py -- Tix widget wrappers.
#
#       For Tix, see http://tix.sourceforge.net
#
#       - Sudhir Shenoy (sshenoy@gol.com), Dec. 1995.
#         based on an idea of Jean-Marc Lugrin (lugrin@ms.com)
#
# NOTE: In order to minimize changes to Tkinter.py, some of the code here
#       (TixWidget.__init__) has been taken from Tkinter (Widget.__init__)
#       and will break if there are major changes in Tkinter.
#
# The Tix widgets are represented by a class hierarchy in python with proper
# inheritance of base classes.
#
# As a result after creating a 'w = StdButtonBox', I can write
#              w.ok['text'] = 'Who Cares'
#    or              w.ok['bg'] = w['bg']
# or even       w.ok.invoke()
# etc.
#
# Compare the demo tixwidgets.py to the original Tcl program and you will
# appreciate the advantages.
#

import os
import tkinter
from tkinter import *
from tkinter import _cnfmerge

import _tkinter # If this fails your Python may not be configured for Tk

# Some more constants (for consistency with Tkinter)
WINDOW = 'window'
TEXT = 'text'
STATUS = 'status'
IMMEDIATE = 'immediate'
IMAGE = 'image'
IMAGETEXT = 'imagetext'
BALLOON = 'balloon'
AUTO = 'auto'
ACROSSTOP = 'acrosstop'

# A few useful constants for the Grid widget
ASCII = 'ascii'
CELL = 'cell'
COLUMN = 'column'
DECREASING = 'decreasing'
INCREASING = 'increasing'
INTEGER = 'integer'
MAIN = 'main'
MAX = 'max'
REAL = 'real'
ROW = 'row'
S_REGION = 's-region'
X_REGION = 'x-region'
Y_REGION = 'y-region'

# Some constants used by Tkinter dooneevent()
TCL_DONT_WAIT     = 1 << 1
TCL_WINDOW_EVENTS = 1 << 2
TCL_FILE_EVENTS   = 1 << 3
TCL_TIMER_EVENTS  = 1 << 4
TCL_IDLE_EVENTS   = 1 << 5
TCL_ALL_EVENTS    = 0

# BEWARE - this is implemented by copying some code from the Widget class
#          in Tkinter (to override Widget initialization) and is therefore
#          liable to break.

# Could probably add this to Tkinter.Misc
class tixCommand:
    """The tix commands provide access to miscellaneous  elements
    of  Tix's  internal state and the Tix application context.
    Most of the information manipulated by these  commands pertains
    to  the  application  as a whole, or to a screen or
    display, rather than to a particular window.

    This is a mixin class, assumed to be mixed to Tkinter.Tk
    that supports the self.tk.call method.
    """

    def tix_addbitmapdir(self, directory):
        """Tix maintains a list of directories under which
        the  tix_getimage  and tix_getbitmap commands will
        search for image files. The standard bitmap  directory
        is $TIX_LIBRARY/bitmaps. The addbitmapdir command
        adds directory into this list. By  using  this
        command, the  image  files  of an applications can
        also be located using the tix_getimage or tix_getbitmap
        command.
        """
        return self.tk.call('tix', 'addbitmapdir', directory)

    def tix_cget(self, option):
        """Returns  the  current  value  of the configuration
        option given by option. Option may be  any  of  the
        options described in the CONFIGURATION OPTIONS section.
        """
        return self.tk.call('tix', 'cget', option)

    def tix_configure(self, cnf=None, **kw):
        """Query or modify the configuration options of the Tix application
        context. If no option is specified, returns a dictionary all of the
        available options.  If option is specified with no value, then the
        command returns a list describing the one named option (this list
        will be identical to the corresponding sublist of the value
        returned if no option is specified).  If one or more option-value
        pairs are specified, then the command modifies the given option(s)
        to have the given value(s); in this case the command returns an
        empty string. Option may be any of the configuration options.
        """
        # Copied from Tkinter.py
        if kw:
            cnf = _cnfmerge((cnf, kw))
        elif cnf:
            cnf = _cnfmerge(cnf)
        if cnf is None:
            return self._getconfigure('tix', 'configure')
        if isinstance(cnf, str):
            return self._getconfigure1('tix', 'configure', '-'+cnf)
        return self.tk.call(('tix', 'configure') + self._options(cnf))

    def tix_filedialog(self, dlgclass=None):
        """Returns the file selection dialog that may be shared among
        different calls from this application.  This command will create a
        file selection dialog widget when it is called the first time. This
        dialog will be returned by all subsequent calls to tix_filedialog.
        An optional dlgclass parameter can be passed to specified what type
        of file selection dialog widget is desired. Possible options are
        tix FileSelectDialog or tixExFileSelectDialog.
        """
        if dlgclass is not None:
            return self.tk.call('tix', 'filedialog', dlgclass)
        else:
            return self.tk.call('tix', 'filedialog')

    def tix_getbitmap(self, name):
        """Locates a bitmap file of the name name.xpm or name in one of the
        bitmap directories (see the tix_addbitmapdir command above).  By
        using tix_getbitmap, you can avoid hard coding the pathnames of the
        bitmap files in your application. When successful, it returns the
        complete pathname of the bitmap file, prefixed with the character
        '@'.  The returned value can be used to configure the -bitmap
        option of the TK and Tix widgets.
        """
        return self.tk.call('tix', 'getbitmap', name)

    def tix_getimage(self, name):
        """Locates an image file of the name name.xpm, name.xbm or name.ppm
        in one of the bitmap directories (see the addbitmapdir command
        above). If more than one file with the same name (but different
        extensions) exist, then the image type is chosen according to the
        depth of the X display: xbm images are chosen on monochrome
        displays and color images are chosen on color displays. By using
        tix_ getimage, you can avoid hard coding the pathnames of the
        image files in your application. When successful, this command
        returns the name of the newly created image, which can be used to
        configure the -image option of the Tk and Tix widgets.
        """
        return self.tk.call('tix', 'getimage', name)

    def tix_option_get(self, name):
        """Gets  the options  maintained  by  the  Tix
        scheme mechanism. Available options include:

            active_bg       active_fg      bg
            bold_font       dark1_bg       dark1_fg
            dark2_bg        dark2_fg       disabled_fg
            fg              fixed_font     font
            inactive_bg     inactive_fg    input1_bg
            input2_bg       italic_font    light1_bg
            light1_fg       light2_bg      light2_fg
            menu_font       output1_bg     output2_bg
            select_bg       select_fg      selector
            """
        # could use self.tk.globalgetvar('tixOption', name)
        return self.tk.call('tix', 'option', 'get', name)

    def tix_resetoptions(self, newScheme, newFontSet, newScmPrio=None):
        """Resets the scheme and fontset of the Tix application to
        newScheme and newFontSet, respectively.  This affects only those
        widgets created after this call. Therefore, it is best to call the
        resetoptions command before the creation of any widgets in a Tix
        application.

        The optional parameter newScmPrio can be given to reset the
        priority level of the Tk options set by the Tix schemes.

        Because of the way Tk handles the X option database, after Tix has
        been has imported and inited, it is not possible to reset the color
        schemes and font sets using the tix config command.  Instead, the
        tix_resetoptions command must be used.
        """
        if newScmPrio is not None:
            return self.tk.call('tix', 'resetoptions', newScheme, newFontSet, newScmPrio)
        else:
            return self.tk.call('tix', 'resetoptions', newScheme, newFontSet)

class Tk(tkinter.Tk, tixCommand):
    """Toplevel widget of Tix which represents mostly the main window
    of an application. It has an associated Tcl interpreter."""
    def __init__(self, screenName=None, baseName=None, className='Tix'):
        tkinter.Tk.__init__(self, screenName, baseName, className)
        tixlib = os.environ.get('TIX_LIBRARY')
        self.tk.eval('global auto_path; lappend auto_path [file dir [info nameof]]')
        if tixlib is not None:
            self.tk.eval('global auto_path; lappend auto_path {%s}' % tixlib)
            self.tk.eval('global tcl_pkgPath; lappend tcl_pkgPath {%s}' % tixlib)
        # Load Tix - this should work dynamically or statically
        # If it's static, tcl/tix8.1/pkgIndex.tcl should have
        #               'load {} Tix'
        # If it's dynamic under Unix, tcl/tix8.1/pkgIndex.tcl should have
        #               'load libtix8.1.8.3.so Tix'
        self.tk.eval('package require Tix')

    def destroy(self):
        # For safety, remove the delete_window binding before destroy
        self.protocol("WM_DELETE_WINDOW", "")
        tkinter.Tk.destroy(self)

# The Tix 'tixForm' geometry manager
class Form:
    """The Tix Form geometry manager

    Widgets can be arranged by specifying attachments to other widgets.
    See Tix documentation for complete details"""

    def config(self, cnf={}, **kw):
        self.tk.call('tixForm', self._w, *self._options(cnf, kw))

    form = config

    def __setitem__(self, key, value):
        Form.form(self, {key: value})

    def check(self):
        return self.tk.call('tixForm', 'check', self._w)

    def forget(self):
        self.tk.call('tixForm', 'forget', self._w)

    def grid(self, xsize=0, ysize=0):
        if (not xsize) and (not ysize):
            x = self.tk.call('tixForm', 'grid', self._w)
            y = self.tk.splitlist(x)
            z = ()
            for x in y:
                z = z + (self.tk.getint(x),)
            return z
        return self.tk.call('tixForm', 'grid', self._w, xsize, ysize)

    def info(self, option=None):
        if not option:
            return self.tk.call('tixForm', 'info', self._w)
        if option[0] != '-':
            option = '-' + option
        return self.tk.call('tixForm', 'info', self._w, option)

    def slaves(self):
        return [self._nametowidget(x) for x in
                self.tk.splitlist(
                       self.tk.call(
                       'tixForm', 'slaves', self._w))]



tkinter.Widget.__bases__ = tkinter.Widget.__bases__ + (Form,)

class TixWidget(tkinter.Widget):
    """A TixWidget class is used to package all (or most) Tix widgets.

    Widget initialization is extended in two ways:
       1) It is possible to give a list of options which must be part of
       the creation command (so called Tix 'static' options). These cannot be
       given as a 'config' command later.
       2) It is possible to give the name of an existing TK widget. These are
       child widgets created automatically by a Tix mega-widget. The Tk call
       to create these widgets is therefore bypassed in TixWidget.__init__

    Both options are for use by subclasses only.
    """
    def __init__ (self, master=None, widgetName=None,
                static_options=None, cnf={}, kw={}):
        # Merge keywords and dictionary arguments
        if kw:
            cnf = _cnfmerge((cnf, kw))
        else:
            cnf = _cnfmerge(cnf)

        # Move static options into extra. static_options must be
        # a list of keywords (or None).
        extra=()

        # 'options' is always a static option
        if static_options:
            static_options.append('options')
        else:
            static_options = ['options']

        for k,v in list(cnf.items()):
            if k in static_options:
                extra = extra + ('-' + k, v)
                del cnf[k]

        self.widgetName = widgetName
        Widget._setup(self, master, cnf)

        # If widgetName is None, this is a dummy creation call where the
        # corresponding Tk widget has already been created by Tix
        if widgetName:
            self.tk.call(widgetName, self._w, *extra)

        # Non-static options - to be done via a 'config' command
        if cnf:
            Widget.config(self, cnf)

        # Dictionary to hold subwidget names for easier access. We can't
        # use the children list because the public Tix names may not be the
        # same as the pathname component
        self.subwidget_list = {}

    # We set up an attribute access function so that it is possible to
    # do w.ok['text'] = 'Hello' rather than w.subwidget('ok')['text'] = 'Hello'
    # when w is a StdButtonBox.
    # We can even do w.ok.invoke() because w.ok is subclassed from the
    # Button class if you go through the proper constructors
    def __getattr__(self, name):
        if name in self.subwidget_list:
            return self.subwidget_list[name]
        raise AttributeError(name)

    def set_silent(self, value):
        """Set a variable without calling its action routine"""
        self.tk.call('tixSetSilent', self._w, value)

    def subwidget(self, name):
        """Return the named subwidget (which must have been created by
        the sub-class)."""
        n = self._subwidget_name(name)
        if not n:
            raise TclError("Subwidget " + name + " not child of " + self._name)
        # Remove header of name and leading dot
        n = n[len(self._w)+1:]
        return self._nametowidget(n)

    def subwidgets_all(self):
        """Return all subwidgets."""
        names = self._subwidget_names()
        if not names:
            return []
        retlist = []
        for name in names:
            name = name[len(self._w)+1:]
            try:
                retlist.append(self._nametowidget(name))
            except:
                # some of the widgets are unknown e.g. border in LabelFrame
                pass
        return retlist

    def _subwidget_name(self,name):
        """Get a subwidget name (returns a String, not a Widget !)"""
        try:
            return self.tk.call(self._w, 'subwidget', name)
        except TclError:
            return None

    def _subwidget_names(self):
        """Return the name of all subwidgets."""
        try:
            x = self.tk.call(self._w, 'subwidgets', '-all')
            return self.tk.splitlist(x)
        except TclError:
            return None

    def config_all(self, option, value):
        """Set configuration options for all subwidgets (and self)."""
        if option == '':
            return
        elif not isinstance(option, str):
            option = repr(option)
        if not isinstance(value, str):
            value = repr(value)
        names = self._subwidget_names()
        for name in names:
            self.tk.call(name, 'configure', '-' + option, value)
    # These are missing from Tkinter
    def image_create(self, imgtype, cnf={}, master=None, **kw):
        if not master:
            master = self
        if kw and cnf: cnf = _cnfmerge((cnf, kw))
        elif kw: cnf = kw
        options = ()
        for k, v in cnf.items():
            if callable(v):
                v = self._register(v)
            options = options + ('-'+k, v)
        return master.tk.call(('image', 'create', imgtype,) + options)
    def image_delete(self, imgname):
        try:
            self.tk.call('image', 'delete', imgname)
        except TclError:
            # May happen if the root was destroyed
            pass

# Subwidgets are child widgets created automatically by mega-widgets.
# In python, we have to create these subwidgets manually to mirror their
# existence in Tk/Tix.
class TixSubWidget(TixWidget):
    """Subwidget class.

    This is used to mirror child widgets automatically created
    by Tix/Tk as part of a mega-widget in Python (which is not informed
    of this)"""

    def __init__(self, master, name,
               destroy_physically=1, check_intermediate=1):
        if check_intermediate:
            path = master._subwidget_name(name)
            try:
                path = path[len(master._w)+1:]
                plist = path.split('.')
            except:
                plist = []

        if not check_intermediate:
            # immediate descendant
            TixWidget.__init__(self, master, None, None, {'name' : name})
        else:
            # Ensure that the intermediate widgets exist
            parent = master
            for i in range(len(plist) - 1):
                n = '.'.join(plist[:i+1])
                try:
                    w = master._nametowidget(n)
                    parent = w
                except KeyError:
                    # Create the intermediate widget
                    parent = TixSubWidget(parent, plist[i],
                                          destroy_physically=0,
                                          check_intermediate=0)
            # The Tk widget name is in plist, not in name
            if plist:
                name = plist[-1]
            TixWidget.__init__(self, parent, None, None, {'name' : name})
        self.destroy_physically = destroy_physically

    def destroy(self):
        # For some widgets e.g., a NoteBook, when we call destructors,
        # we must be careful not to destroy the frame widget since this
        # also destroys the parent NoteBook thus leading to an exception
        # in Tkinter when it finally calls Tcl to destroy the NoteBook
        for c in list(self.children.values()): c.destroy()
        if self._name in self.master.children:
            del self.master.children[self._name]
        if self._name in self.master.subwidget_list:
            del self.master.subwidget_list[self._name]
        if self.destroy_physically:
            # This is bypassed only for a few widgets
            self.tk.call('destroy', self._w)


# Useful class to create a display style - later shared by many items.
# Contributed by Steffen Kremser
class DisplayStyle:
    """DisplayStyle - handle configuration options shared by
    (multiple) Display Items"""

    def __init__(self, itemtype, cnf={}, *, master=None, **kw):
        if not master:
            if 'refwindow' in kw:
                master = kw['refwindow']
            elif 'refwindow' in cnf:
                master = cnf['refwindow']
            else:
                master = tkinter._get_default_root('create display style')
        self.tk = master.tk
        self.stylename = self.tk.call('tixDisplayStyle', itemtype,
                            *self._options(cnf,kw) )

    def __str__(self):
        return self.stylename

    def _options(self, cnf, kw):
        if kw and cnf:
            cnf = _cnfmerge((cnf, kw))
        elif kw:
            cnf = kw
        opts = ()
        for k, v in cnf.items():
            opts = opts + ('-'+k, v)
        return opts

    def delete(self):
        self.tk.call(self.stylename, 'delete')

    def __setitem__(self,key,value):
        self.tk.call(self.stylename, 'configure', '-%s'%key, value)

    def config(self, cnf={}, **kw):
        return self._getconfigure(
            self.stylename, 'configure', *self._options(cnf,kw))

    def __getitem__(self,key):
        return self.tk.call(self.stylename, 'cget', '-%s'%key)


######################################################
### The Tix Widget classes - in alphabetical order ###
######################################################

class Balloon(TixWidget):
    """Balloon help widget.

    Subwidget       Class
    ---------       -----
    label           Label
    message         Message"""

    # FIXME: It should inherit -superclass tixShell
    def __init__(self, master=None, cnf={}, **kw):
        # static seem to be -installcolormap -initwait -statusbar -cursor
        static = ['options', 'installcolormap', 'initwait', 'statusbar',
                  'cursor']
        TixWidget.__init__(self, master, 'tixBalloon', static, cnf, kw)
        self.subwidget_list['label'] = _dummyLabel(self, 'label',
                                                   destroy_physically=0)
        self.subwidget_list['message'] = _dummyLabel(self, 'message',
                                                     destroy_physically=0)

    def bind_widget(self, widget, cnf={}, **kw):
        """Bind balloon widget to another.
        One balloon widget may be bound to several widgets at the same time"""
        self.tk.call(self._w, 'bind', widget._w, *self._options(cnf, kw))

    def unbind_widget(self, widget):
        self.tk.call(self._w, 'unbind', widget._w)

class ButtonBox(TixWidget):
    """ButtonBox - A container for pushbuttons.
    Subwidgets are the buttons added with the add method.
    """
    def __init__(self, master=None, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixButtonBox',
                           ['orientation', 'options'], cnf, kw)

    def add(self, name, cnf={}, **kw):
        """Add a button with given name to box."""

        btn = self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
        self.subwidget_list[name] = _dummyButton(self, name)
        return btn

    def invoke(self, name):
        if name in self.subwidget_list:
            self.tk.call(self._w, 'invoke', name)

class ComboBox(TixWidget):
    """ComboBox - an Entry field with a dropdown menu. The user can select a
    choice by either typing in the entry subwidget or selecting from the
    listbox subwidget.

    Subwidget       Class
    ---------       -----
    entry       Entry
    arrow       Button
    slistbox    ScrolledListBox
    tick        Button
    cross       Button : present if created with the fancy option"""

    # FIXME: It should inherit -superclass tixLabelWidget
    def __init__ (self, master=None, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixComboBox',
                           ['editable', 'dropdown', 'fancy', 'options'],
                           cnf, kw)
        self.subwidget_list['label'] = _dummyLabel(self, 'label')
        self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
        self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')
        self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
                                                                'slistbox')
        try:
            self.subwidget_list['tick'] = _dummyButton(self, 'tick')
            self.subwidget_list['cross'] = _dummyButton(self, 'cross')
        except TypeError:
            # unavailable when -fancy not specified
            pass

    # align

    def add_history(self, str):
        self.tk.call(self._w, 'addhistory', str)

    def append_history(self, str):
        self.tk.call(self._w, 'appendhistory', str)

    def insert(self, index, str):
        self.tk.call(self._w, 'insert', index, str)

    def pick(self, index):
        self.tk.call(self._w, 'pick', index)

class Control(TixWidget):
    """Control - An entry field with value change arrows.  The user can
    adjust the value by pressing the two arrow buttons or by entering
    the value directly into the entry. The new value will be checked
    against the user-defined upper and lower limits.

    Subwidget       Class
    ---------       -----
    incr       Button
    decr       Button
    entry       Entry
    label       Label"""

    # FIXME: It should inherit -superclass tixLabelWidget
    def __init__ (self, master=None, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixControl', ['options'], cnf, kw)
        self.subwidget_list['incr'] = _dummyButton(self, 'incr')
        self.subwidget_list['decr'] = _dummyButton(self, 'decr')
        self.subwidget_list['label'] = _dummyLabel(self, 'label')
        self.subwidget_list['entry'] = _dummyEntry(self, 'entry')

    def decrement(self):
        self.tk.call(self._w, 'decr')

    def increment(self):
        self.tk.call(self._w, 'incr')

    def invoke(self):
        self.tk.call(self._w, 'invoke')

    def update(self):
        self.tk.call(self._w, 'update')

class DirList(TixWidget):
    """DirList - displays a list view of a directory, its previous
    directories and its sub-directories. The user can choose one of
    the directories displayed in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist       HList
    hsb              Scrollbar
    vsb              Scrollbar"""

    # FIXME: It should inherit -superclass tixScrolledHList
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixDirList', ['options'], cnf, kw)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

    def chdir(self, dir):
        self.tk.call(self._w, 'chdir', dir)

class DirTree(TixWidget):
    """DirTree - Directory Listing in a hierarchical view.
    Displays a tree view of a directory, its previous directories and its
    sub-directories. The user can choose one of the directories displayed
    in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist           HList
    hsb             Scrollbar
    vsb             Scrollbar"""

    # FIXME: It should inherit -superclass tixScrolledHList
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixDirTree', ['options'], cnf, kw)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

    def chdir(self, dir):
        self.tk.call(self._w, 'chdir', dir)

class DirSelectBox(TixWidget):
    """DirSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBox"""

    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixDirSelectBox', ['options'], cnf, kw)
        self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
        self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')

class ExFileSelectBox(TixWidget):
    """ExFileSelectBox - MS Windows style file select box.
    It provides a convenient method for the user to select files.

    Subwidget       Class
    ---------       -----
    cancel       Button
    ok              Button
    hidden       Checkbutton
    types       ComboBox
    dir              ComboBox
    file       ComboBox
    dirlist       ScrolledListBox
    filelist       ScrolledListBox"""

    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixExFileSelectBox', ['options'], cnf, kw)
        self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
        self.subwidget_list['ok'] = _dummyButton(self, 'ok')
        self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
        self.subwidget_list['types'] = _dummyComboBox(self, 'types')
        self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
        self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
        self.subwidget_list['file'] = _dummyComboBox(self, 'file')
        self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')

    def filter(self):
        self.tk.call(self._w, 'filter')

    def invoke(self):
        self.tk.call(self._w, 'invoke')


# Should inherit from a Dialog class
class DirSelectDialog(TixWidget):
    """The DirSelectDialog widget presents the directories in the file
    system in a dialog window. The user can use this dialog window to
    navigate through the file system to select the desired directory.

    Subwidgets       Class
    ----------       -----
    dirbox       DirSelectDialog"""

    # FIXME: It should inherit -superclass tixDialogShell
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixDirSelectDialog',
                           ['options'], cnf, kw)
        self.subwidget_list['dirbox'] = _dummyDirSelectBox(self, 'dirbox')
        # cancel and ok buttons are missing

    def popup(self):
        self.tk.call(self._w, 'popup')

    def popdown(self):
        self.tk.call(self._w, 'popdown')


# Should inherit from a Dialog class
class ExFileSelectDialog(TixWidget):
    """ExFileSelectDialog - MS Windows style file select dialog.
    It provides a convenient method for the user to select files.

    Subwidgets       Class
    ----------       -----
    fsbox       ExFileSelectBox"""

    # FIXME: It should inherit -superclass tixDialogShell
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixExFileSelectDialog',
                           ['options'], cnf, kw)
        self.subwidget_list['fsbox'] = _dummyExFileSelectBox(self, 'fsbox')

    def popup(self):
        self.tk.call(self._w, 'popup')

    def popdown(self):
        self.tk.call(self._w, 'popdown')

class FileSelectBox(TixWidget):
    """ExFileSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBox"""

    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixFileSelectBox', ['options'], cnf, kw)
        self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
        self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
        self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
        self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')

    def apply_filter(self):              # name of subwidget is same as command
        self.tk.call(self._w, 'filter')

    def invoke(self):
        self.tk.call(self._w, 'invoke')

# Should inherit from a Dialog class
class FileSelectDialog(TixWidget):
    """FileSelectDialog - Motif style file select dialog.

    Subwidgets       Class
    ----------       -----
    btns       StdButtonBox
    fsbox       FileSelectBox"""

    # FIXME: It should inherit -superclass tixStdDialogShell
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixFileSelectDialog',
                           ['options'], cnf, kw)
        self.subwidget_list['btns'] = _dummyStdButtonBox(self, 'btns')
        self.subwidget_list['fsbox'] = _dummyFileSelectBox(self, 'fsbox')

    def popup(self):
        self.tk.call(self._w, 'popup')

    def popdown(self):
        self.tk.call(self._w, 'popdown')

class FileEntry(TixWidget):
    """FileEntry - Entry field with button that invokes a FileSelectDialog.
    The user can type in the filename manually. Alternatively, the user can
    press the button widget that sits next to the entry, which will bring
    up a file selection dialog.

    Subwidgets       Class
    ----------       -----
    button       Button
    entry       Entry"""

    # FIXME: It should inherit -superclass tixLabelWidget
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixFileEntry',
                           ['dialogtype', 'options'], cnf, kw)
        self.subwidget_list['button'] = _dummyButton(self, 'button')
        self.subwidget_list['entry'] = _dummyEntry(self, 'entry')

    def invoke(self):
        self.tk.call(self._w, 'invoke')

    def file_dialog(self):
        # FIXME: return python object
        pass

class HList(TixWidget, XView, YView):
    """HList - Hierarchy display  widget can be used to display any data
    that have a hierarchical structure, for example, file system directory
    trees. The list entries are indented and connected by branch lines
    according to their places in the hierarchy.

    Subwidgets - None"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixHList',
                           ['columns', 'options'], cnf, kw)

    def add(self, entry, cnf={}, **kw):
        return self.tk.call(self._w, 'add', entry, *self._options(cnf, kw))

    def add_child(self, parent=None, cnf={}, **kw):
        if not parent:
            parent = ''
        return self.tk.call(
                     self._w, 'addchild', parent, *self._options(cnf, kw))

    def anchor_set(self, entry):
        self.tk.call(self._w, 'anchor', 'set', entry)

    def anchor_clear(self):
        self.tk.call(self._w, 'anchor', 'clear')

    def column_width(self, col=0, width=None, chars=None):
        if not chars:
            return self.tk.call(self._w, 'column', 'width', col, width)
        else:
            return self.tk.call(self._w, 'column', 'width', col,
                                '-char', chars)

    def delete_all(self):
        self.tk.call(self._w, 'delete', 'all')

    def delete_entry(self, entry):
        self.tk.call(self._w, 'delete', 'entry', entry)

    def delete_offsprings(self, entry):
        self.tk.call(self._w, 'delete', 'offsprings', entry)

    def delete_siblings(self, entry):
        self.tk.call(self._w, 'delete', 'siblings', entry)

    def dragsite_set(self, index):
        self.tk.call(self._w, 'dragsite', 'set', index)

    def dragsite_clear(self):
        self.tk.call(self._w, 'dragsite', 'clear')

    def dropsite_set(self, index):
        self.tk.call(self._w, 'dropsite', 'set', index)

    def dropsite_clear(self):
        self.tk.call(self._w, 'dropsite', 'clear')

    def header_create(self, col, cnf={}, **kw):
        self.tk.call(self._w, 'header', 'create', col, *self._options(cnf, kw))

    def header_configure(self, col, cnf={}, **kw):
        if cnf is None:
            return self._getconfigure(self._w, 'header', 'configure', col)
        self.tk.call(self._w, 'header', 'configure', col,
                     *self._options(cnf, kw))

    def header_cget(self,  col, opt):
        return self.tk.call(self._w, 'header', 'cget', col, opt)

    def header_exists(self,  col):
        # A workaround to Tix library bug (issue #25464).
        # The documented command is "exists", but only erroneous "exist" is
        # accepted.
        return self.tk.getboolean(self.tk.call(self._w, 'header', 'exist', col))
    header_exist = header_exists

    def header_delete(self, col):
        self.tk.call(self._w, 'header', 'delete', col)

    def header_size(self, col):
        return self.tk.call(self._w, 'header', 'size', col)

    def hide_entry(self, entry):
        self.tk.call(self._w, 'hide', 'entry', entry)

    def indicator_create(self, entry, cnf={}, **kw):
        self.tk.call(
              self._w, 'indicator', 'create', entry, *self._options(cnf, kw))

    def indicator_configure(self, entry, cnf={}, **kw):
        if cnf is None:
            return self._getconfigure(
                self._w, 'indicator', 'configure', entry)
        self.tk.call(
              self._w, 'indicator', 'configure', entry, *self._options(cnf, kw))

    def indicator_cget(self,  entry, opt):
        return self.tk.call(self._w, 'indicator', 'cget', entry, opt)

    def indicator_exists(self,  entry):
        return self.tk.call (self._w, 'indicator', 'exists', entry)

    def indicator_delete(self, entry):
        self.tk.call(self._w, 'indicator', 'delete', entry)

    def indicator_size(self, entry):
        return self.tk.call(self._w, 'indicator', 'size', entry)

    def info_anchor(self):
        return self.tk.call(self._w, 'info', 'anchor')

    def info_bbox(self, entry):
        return self._getints(
                self.tk.call(self._w, 'info', 'bbox', entry)) or None

    def info_children(self, entry=None):
        c = self.tk.call(self._w, 'info', 'children', entry)
        return self.tk.splitlist(c)

    def info_data(self, entry):
        return self.tk.call(self._w, 'info', 'data', entry)

    def info_dragsite(self):
        return self.tk.call(self._w, 'info', 'dragsite')

    def info_dropsite(self):
        return self.tk.call(self._w, 'info', 'dropsite')

    def info_exists(self, entry):
        return self.tk.call(self._w, 'info', 'exists', entry)

    def info_hidden(self, entry):
        return self.tk.call(self._w, 'info', 'hidden', entry)

    def info_next(self, entry):
        return self.tk.call(self._w, 'info', 'next', entry)

    def info_parent(self, entry):
        return self.tk.call(self._w, 'info', 'parent', entry)

    def info_prev(self, entry):
        return self.tk.call(self._w, 'info', 'prev', entry)

    def info_selection(self):
        c = self.tk.call(self._w, 'info', 'selection')
        return self.tk.splitlist(c)

    def item_cget(self, entry, col, opt):
        return self.tk.call(self._w, 'item', 'cget', entry, col, opt)

    def item_configure(self, entry, col, cnf={}, **kw):
        if cnf is None:
            return self._getconfigure(self._w, 'item', 'configure', entry, col)
        self.tk.call(self._w, 'item', 'configure', entry, col,
              *self._options(cnf, kw))

    def item_create(self, entry, col, cnf={}, **kw):
        self.tk.call(
              self._w, 'item', 'create', entry, col, *self._options(cnf, kw))

    def item_exists(self, entry, col):
        return self.tk.call(self._w, 'item', 'exists', entry, col)

    def item_delete(self, entry, col):
        self.tk.call(self._w, 'item', 'delete', entry, col)

    def entrycget(self, entry, opt):
        return self.tk.call(self._w, 'entrycget', entry, opt)

    def entryconfigure(self, entry, cnf={}, **kw):
        if cnf is None:
            return self._getconfigure(self._w, 'entryconfigure', entry)
        self.tk.call(self._w, 'entryconfigure', entry,
              *self._options(cnf, kw))

    def nearest(self, y):
        return self.tk.call(self._w, 'nearest', y)

    def see(self, entry):
        self.tk.call(self._w, 'see', entry)

    def selection_clear(self, cnf={}, **kw):
        self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))

    def selection_includes(self, entry):
        return self.tk.call(self._w, 'selection', 'includes', entry)

    def selection_set(self, first, last=None):
        self.tk.call(self._w, 'selection', 'set', first, last)

    def show_entry(self, entry):
        return self.tk.call(self._w, 'show', 'entry', entry)

class InputOnly(TixWidget):
    """InputOnly - Invisible widget. Unix only.

    Subwidgets - None"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixInputOnly', None, cnf, kw)

class LabelEntry(TixWidget):
    """LabelEntry - Entry field with label. Packages an entry widget
    and a label into one mega widget. It can be used to simplify the creation
    of ``entry-form'' type of interface.

    Subwidgets       Class
    ----------       -----
    label       Label
    entry       Entry"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixLabelEntry',
                           ['labelside','options'], cnf, kw)
        self.subwidget_list['label'] = _dummyLabel(self, 'label')
        self.subwidget_list['entry'] = _dummyEntry(self, 'entry')

class LabelFrame(TixWidget):
    """LabelFrame - Labelled Frame container. Packages a frame widget
    and a label into one mega widget. To create widgets inside a
    LabelFrame widget, one creates the new widgets relative to the
    frame subwidget and manage them inside the frame subwidget.

    Subwidgets       Class
    ----------       -----
    label       Label
    frame       Frame"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixLabelFrame',
                           ['labelside','options'], cnf, kw)
        self.subwidget_list['label'] = _dummyLabel(self, 'label')
        self.subwidget_list['frame'] = _dummyFrame(self, 'frame')


class ListNoteBook(TixWidget):
    """A ListNoteBook widget is very similar to the TixNoteBook widget:
    it can be used to display many windows in a limited space using a
    notebook metaphor. The notebook is divided into a stack of pages
    (windows). At one time only one of these pages can be shown.
    The user can navigate through these pages by
    choosing the name of the desired page in the hlist subwidget."""

    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixListNoteBook', ['options'], cnf, kw)
        # Is this necessary? It's not an exposed subwidget in Tix.
        self.subwidget_list['pane'] = _dummyPanedWindow(self, 'pane',
                                                        destroy_physically=0)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['shlist'] = _dummyScrolledHList(self, 'shlist')

    def add(self, name, cnf={}, **kw):
        self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
        self.subwidget_list[name] = TixSubWidget(self, name)
        return self.subwidget_list[name]

    def page(self, name):
        return self.subwidget(name)

    def pages(self):
        # Can't call subwidgets_all directly because we don't want .nbframe
        names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
        ret = []
        for x in names:
            ret.append(self.subwidget(x))
        return ret

    def raise_page(self, name):              # raise is a python keyword
        self.tk.call(self._w, 'raise', name)

class Meter(TixWidget):
    """The Meter widget can be used to show the progress of a background
    job which may take a long time to execute.
    """

    def __init__(self, master=None, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixMeter',
                           ['options'], cnf, kw)

class NoteBook(TixWidget):
    """NoteBook - Multi-page container widget (tabbed notebook metaphor).

    Subwidgets       Class
    ----------       -----
    nbframe       NoteBookFrame
    <pages>       page widgets added dynamically with the add method"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self,master,'tixNoteBook', ['options'], cnf, kw)
        self.subwidget_list['nbframe'] = TixSubWidget(self, 'nbframe',
                                                      destroy_physically=0)

    def add(self, name, cnf={}, **kw):
        self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
        self.subwidget_list[name] = TixSubWidget(self, name)
        return self.subwidget_list[name]

    def delete(self, name):
        self.tk.call(self._w, 'delete', name)
        self.subwidget_list[name].destroy()
        del self.subwidget_list[name]

    def page(self, name):
        return self.subwidget(name)

    def pages(self):
        # Can't call subwidgets_all directly because we don't want .nbframe
        names = self.tk.splitlist(self.tk.call(self._w, 'pages'))
        ret = []
        for x in names:
            ret.append(self.subwidget(x))
        return ret

    def raise_page(self, name):              # raise is a python keyword
        self.tk.call(self._w, 'raise', name)

    def raised(self):
        return self.tk.call(self._w, 'raised')

class NoteBookFrame(TixWidget):
    # FIXME: This is dangerous to expose to be called on its own.
    pass

class OptionMenu(TixWidget):
    """OptionMenu - creates a menu button of options.

    Subwidget       Class
    ---------       -----
    menubutton      Menubutton
    menu            Menu"""

    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixOptionMenu', ['options'], cnf, kw)
        self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
        self.subwidget_list['menu'] = _dummyMenu(self, 'menu')

    def add_command(self, name, cnf={}, **kw):
        self.tk.call(self._w, 'add', 'command', name, *self._options(cnf, kw))

    def add_separator(self, name, cnf={}, **kw):
        self.tk.call(self._w, 'add', 'separator', name, *self._options(cnf, kw))

    def delete(self, name):
        self.tk.call(self._w, 'delete', name)

    def disable(self, name):
        self.tk.call(self._w, 'disable', name)

    def enable(self, name):
        self.tk.call(self._w, 'enable', name)

class PanedWindow(TixWidget):
    """PanedWindow - Multi-pane container widget
    allows the user to interactively manipulate the sizes of several
    panes. The panes can be arranged either vertically or horizontally.The
    user changes the sizes of the panes by dragging the resize handle
    between two panes.

    Subwidgets       Class
    ----------       -----
    <panes>       g/p widgets added dynamically with the add method."""

    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixPanedWindow', ['orientation', 'options'], cnf, kw)

    # add delete forget panecget paneconfigure panes setsize
    def add(self, name, cnf={}, **kw):
        self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
        self.subwidget_list[name] = TixSubWidget(self, name,
                                                 check_intermediate=0)
        return self.subwidget_list[name]

    def delete(self, name):
        self.tk.call(self._w, 'delete', name)
        self.subwidget_list[name].destroy()
        del self.subwidget_list[name]

    def forget(self, name):
        self.tk.call(self._w, 'forget', name)

    def panecget(self,  entry, opt):
        return self.tk.call(self._w, 'panecget', entry, opt)

    def paneconfigure(self, entry, cnf={}, **kw):
        if cnf is None:
            return self._getconfigure(self._w, 'paneconfigure', entry)
        self.tk.call(self._w, 'paneconfigure', entry, *self._options(cnf, kw))

    def panes(self):
        names = self.tk.splitlist(self.tk.call(self._w, 'panes'))
        return [self.subwidget(x) for x in names]

class PopupMenu(TixWidget):
    """PopupMenu widget can be used as a replacement of the tk_popup command.
    The advantage of the Tix PopupMenu widget is it requires less application
    code to manipulate.


    Subwidgets       Class
    ----------       -----
    menubutton       Menubutton
    menu       Menu"""

    # FIXME: It should inherit -superclass tixShell
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixPopupMenu', ['options'], cnf, kw)
        self.subwidget_list['menubutton'] = _dummyMenubutton(self, 'menubutton')
        self.subwidget_list['menu'] = _dummyMenu(self, 'menu')

    def bind_widget(self, widget):
        self.tk.call(self._w, 'bind', widget._w)

    def unbind_widget(self, widget):
        self.tk.call(self._w, 'unbind', widget._w)

    def post_widget(self, widget, x, y):
        self.tk.call(self._w, 'post', widget._w, x, y)

class ResizeHandle(TixWidget):
    """Internal widget to draw resize handles on Scrolled widgets."""
    def __init__(self, master, cnf={}, **kw):
        # There seems to be a Tix bug rejecting the configure method
        # Let's try making the flags -static
        flags = ['options', 'command', 'cursorfg', 'cursorbg',
                 'handlesize', 'hintcolor', 'hintwidth',
                 'x', 'y']
        # In fact, x y height width are configurable
        TixWidget.__init__(self, master, 'tixResizeHandle',
                           flags, cnf, kw)

    def attach_widget(self, widget):
        self.tk.call(self._w, 'attachwidget', widget._w)

    def detach_widget(self, widget):
        self.tk.call(self._w, 'detachwidget', widget._w)

    def hide(self, widget):
        self.tk.call(self._w, 'hide', widget._w)

    def show(self, widget):
        self.tk.call(self._w, 'show', widget._w)

class ScrolledHList(TixWidget):
    """ScrolledHList - HList with automatic scrollbars."""

    # FIXME: It should inherit -superclass tixScrolledWidget
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixScrolledHList', ['options'],
                           cnf, kw)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class ScrolledListBox(TixWidget):
    """ScrolledListBox - Listbox with automatic scrollbars."""

    # FIXME: It should inherit -superclass tixScrolledWidget
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixScrolledListBox', ['options'], cnf, kw)
        self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class ScrolledText(TixWidget):
    """ScrolledText - Text with automatic scrollbars."""

    # FIXME: It should inherit -superclass tixScrolledWidget
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixScrolledText', ['options'], cnf, kw)
        self.subwidget_list['text'] = _dummyText(self, 'text')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class ScrolledTList(TixWidget):
    """ScrolledTList - TList with automatic scrollbars."""

    # FIXME: It should inherit -superclass tixScrolledWidget
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixScrolledTList', ['options'],
                           cnf, kw)
        self.subwidget_list['tlist'] = _dummyTList(self, 'tlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class ScrolledWindow(TixWidget):
    """ScrolledWindow - Window with automatic scrollbars."""

    # FIXME: It should inherit -superclass tixScrolledWidget
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixScrolledWindow', ['options'], cnf, kw)
        self.subwidget_list['window'] = _dummyFrame(self, 'window')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class Select(TixWidget):
    """Select - Container of button subwidgets. It can be used to provide
    radio-box or check-box style of selection options for the user.

    Subwidgets are buttons added dynamically using the add method."""

    # FIXME: It should inherit -superclass tixLabelWidget
    def __init__(self, master, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixSelect',
                           ['allowzero', 'radio', 'orientation', 'labelside',
                            'options'],
                           cnf, kw)
        self.subwidget_list['label'] = _dummyLabel(self, 'label')

    def add(self, name, cnf={}, **kw):
        self.tk.call(self._w, 'add', name, *self._options(cnf, kw))
        self.subwidget_list[name] = _dummyButton(self, name)
        return self.subwidget_list[name]

    def invoke(self, name):
        self.tk.call(self._w, 'invoke', name)

class Shell(TixWidget):
    """Toplevel window.

    Subwidgets - None"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixShell', ['options', 'title'], cnf, kw)

class DialogShell(TixWidget):
    """Toplevel window, with popup popdown and center methods.
    It tells the window manager that it is a dialog window and should be
    treated specially. The exact treatment depends on the treatment of
    the window manager.

    Subwidgets - None"""

    # FIXME: It should inherit from  Shell
    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master,
                           'tixDialogShell',
                           ['options', 'title', 'mapped',
                            'minheight', 'minwidth',
                            'parent', 'transient'], cnf, kw)

    def popdown(self):
        self.tk.call(self._w, 'popdown')

    def popup(self):
        self.tk.call(self._w, 'popup')

    def center(self):
        self.tk.call(self._w, 'center')

class StdButtonBox(TixWidget):
    """StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) """

    def __init__(self, master=None, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixStdButtonBox',
                           ['orientation', 'options'], cnf, kw)
        self.subwidget_list['ok'] = _dummyButton(self, 'ok')
        self.subwidget_list['apply'] = _dummyButton(self, 'apply')
        self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
        self.subwidget_list['help'] = _dummyButton(self, 'help')

    def invoke(self, name):
        if name in self.subwidget_list:
            self.tk.call(self._w, 'invoke', name)

class TList(TixWidget, XView, YView):
    """TList - Hierarchy display widget which can be
    used to display data in a tabular format. The list entries of a TList
    widget are similar to the entries in the Tk listbox widget. The main
    differences are (1) the TList widget can display the list entries in a
    two dimensional format and (2) you can use graphical images as well as
    multiple colors and fonts for the list entries.

    Subwidgets - None"""

    def __init__ (self,master=None,cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixTList', ['options'], cnf, kw)

    def active_set(self, index):
        self.tk.call(self._w, 'active', 'set', index)

    def active_clear(self):
        self.tk.call(self._w, 'active', 'clear')

    def anchor_set(self, index):
        self.tk.call(self._w, 'anchor', 'set', index)

    def anchor_clear(self):
        self.tk.call(self._w, 'anchor', 'clear')

    def delete(self, from_, to=None):
        self.tk.call(self._w, 'delete', from_, to)

    def dragsite_set(self, index):
        self.tk.call(self._w, 'dragsite', 'set', index)

    def dragsite_clear(self):
        self.tk.call(self._w, 'dragsite', 'clear')

    def dropsite_set(self, index):
        self.tk.call(self._w, 'dropsite', 'set', index)

    def dropsite_clear(self):
        self.tk.call(self._w, 'dropsite', 'clear')

    def insert(self, index, cnf={}, **kw):
        self.tk.call(self._w, 'insert', index, *self._options(cnf, kw))

    def info_active(self):
        return self.tk.call(self._w, 'info', 'active')

    def info_anchor(self):
        return self.tk.call(self._w, 'info', 'anchor')

    def info_down(self, index):
        return self.tk.call(self._w, 'info', 'down', index)

    def info_left(self, index):
        return self.tk.call(self._w, 'info', 'left', index)

    def info_right(self, index):
        return self.tk.call(self._w, 'info', 'right', index)

    def info_selection(self):
        c = self.tk.call(self._w, 'info', 'selection')
        return self.tk.splitlist(c)

    def info_size(self):
        return self.tk.call(self._w, 'info', 'size')

    def info_up(self, index):
        return self.tk.call(self._w, 'info', 'up', index)

    def nearest(self, x, y):
        return self.tk.call(self._w, 'nearest', x, y)

    def see(self, index):
        self.tk.call(self._w, 'see', index)

    def selection_clear(self, cnf={}, **kw):
        self.tk.call(self._w, 'selection', 'clear', *self._options(cnf, kw))

    def selection_includes(self, index):
        return self.tk.call(self._w, 'selection', 'includes', index)

    def selection_set(self, first, last=None):
        self.tk.call(self._w, 'selection', 'set', first, last)

class Tree(TixWidget):
    """Tree - The tixTree widget can be used to display hierarchical
    data in a tree form. The user can adjust
    the view of the tree by opening or closing parts of the tree."""

    # FIXME: It should inherit -superclass tixScrolledWidget
    def __init__(self, master=None, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixTree',
                           ['options'], cnf, kw)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

    def autosetmode(self):
        '''This command calls the setmode method for all the entries in this
     Tree widget: if an entry has no child entries, its mode is set to
     none. Otherwise, if the entry has any hidden child entries, its mode is
     set to open; otherwise its mode is set to close.'''
        self.tk.call(self._w, 'autosetmode')

    def close(self, entrypath):
        '''Close the entry given by entryPath if its mode is close.'''
        self.tk.call(self._w, 'close', entrypath)

    def getmode(self, entrypath):
        '''Returns the current mode of the entry given by entryPath.'''
        return self.tk.call(self._w, 'getmode', entrypath)

    def open(self, entrypath):
        '''Open the entry given by entryPath if its mode is open.'''
        self.tk.call(self._w, 'open', entrypath)

    def setmode(self, entrypath, mode='none'):
        '''This command is used to indicate whether the entry given by
     entryPath has children entries and whether the children are visible. mode
     must be one of open, close or none. If mode is set to open, a (+)
     indicator is drawn next the entry. If mode is set to close, a (-)
     indicator is drawn next the entry. If mode is set to none, no
     indicators will be drawn for this entry. The default mode is none. The
     open mode indicates the entry has hidden children and this entry can be
     opened by the user. The close mode indicates that all the children of the
     entry are now visible and the entry can be closed by the user.'''
        self.tk.call(self._w, 'setmode', entrypath, mode)


# Could try subclassing Tree for CheckList - would need another arg to init
class CheckList(TixWidget):
    """The CheckList widget
    displays a list of items to be selected by the user. CheckList acts
    similarly to the Tk checkbutton or radiobutton widgets, except it is
    capable of handling many more items than checkbuttons or radiobuttons.
    """
    # FIXME: It should inherit -superclass tixTree
    def __init__(self, master=None, cnf={}, **kw):
        TixWidget.__init__(self, master, 'tixCheckList',
                           ['options', 'radio'], cnf, kw)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

    def autosetmode(self):
        '''This command calls the setmode method for all the entries in this
     Tree widget: if an entry has no child entries, its mode is set to
     none. Otherwise, if the entry has any hidden child entries, its mode is
     set to open; otherwise its mode is set to close.'''
        self.tk.call(self._w, 'autosetmode')

    def close(self, entrypath):
        '''Close the entry given by entryPath if its mode is close.'''
        self.tk.call(self._w, 'close', entrypath)

    def getmode(self, entrypath):
        '''Returns the current mode of the entry given by entryPath.'''
        return self.tk.call(self._w, 'getmode', entrypath)

    def open(self, entrypath):
        '''Open the entry given by entryPath if its mode is open.'''
        self.tk.call(self._w, 'open', entrypath)

    def getselection(self, mode='on'):
        '''Returns a list of items whose status matches status. If status is
     not specified, the list of items in the "on" status will be returned.
     Mode can be on, off, default'''
        return self.tk.splitlist(self.tk.call(self._w, 'getselection', mode))

    def getstatus(self, entrypath):
        '''Returns the current status of entryPath.'''
        return self.tk.call(self._w, 'getstatus', entrypath)

    def setstatus(self, entrypath, mode='on'):
        '''Sets the status of entryPath to be status. A bitmap will be
     displayed next to the entry its status is on, off or default.'''
        self.tk.call(self._w, 'setstatus', entrypath, mode)


###########################################################################
### The subclassing below is used to instantiate the subwidgets in each ###
### mega widget. This allows us to access their methods directly.       ###
###########################################################################

class _dummyButton(Button, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyCheckbutton(Checkbutton, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyEntry(Entry, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyFrame(Frame, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyLabel(Label, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyListbox(Listbox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyMenu(Menu, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyMenubutton(Menubutton, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyScrollbar(Scrollbar, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyText(Text, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyScrolledListBox(ScrolledListBox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['listbox'] = _dummyListbox(self, 'listbox')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class _dummyHList(HList, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyScrolledHList(ScrolledHList, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class _dummyTList(TList, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyComboBox(ComboBox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, ['fancy',destroy_physically])
        self.subwidget_list['label'] = _dummyLabel(self, 'label')
        self.subwidget_list['entry'] = _dummyEntry(self, 'entry')
        self.subwidget_list['arrow'] = _dummyButton(self, 'arrow')

        self.subwidget_list['slistbox'] = _dummyScrolledListBox(self,
                                                                'slistbox')
        try:
            self.subwidget_list['tick'] = _dummyButton(self, 'tick')
            #cross Button : present if created with the fancy option
            self.subwidget_list['cross'] = _dummyButton(self, 'cross')
        except TypeError:
            # unavailable when -fancy not specified
            pass

class _dummyDirList(DirList, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['hlist'] = _dummyHList(self, 'hlist')
        self.subwidget_list['vsb'] = _dummyScrollbar(self, 'vsb')
        self.subwidget_list['hsb'] = _dummyScrollbar(self, 'hsb')

class _dummyDirSelectBox(DirSelectBox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['dirlist'] = _dummyDirList(self, 'dirlist')
        self.subwidget_list['dircbx'] = _dummyFileComboBox(self, 'dircbx')

class _dummyExFileSelectBox(ExFileSelectBox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
        self.subwidget_list['ok'] = _dummyButton(self, 'ok')
        self.subwidget_list['hidden'] = _dummyCheckbutton(self, 'hidden')
        self.subwidget_list['types'] = _dummyComboBox(self, 'types')
        self.subwidget_list['dir'] = _dummyComboBox(self, 'dir')
        self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
        self.subwidget_list['file'] = _dummyComboBox(self, 'file')
        self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')

class _dummyFileSelectBox(FileSelectBox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['dirlist'] = _dummyScrolledListBox(self, 'dirlist')
        self.subwidget_list['filelist'] = _dummyScrolledListBox(self, 'filelist')
        self.subwidget_list['filter'] = _dummyComboBox(self, 'filter')
        self.subwidget_list['selection'] = _dummyComboBox(self, 'selection')

class _dummyFileComboBox(ComboBox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['dircbx'] = _dummyComboBox(self, 'dircbx')

class _dummyStdButtonBox(StdButtonBox, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)
        self.subwidget_list['ok'] = _dummyButton(self, 'ok')
        self.subwidget_list['apply'] = _dummyButton(self, 'apply')
        self.subwidget_list['cancel'] = _dummyButton(self, 'cancel')
        self.subwidget_list['help'] = _dummyButton(self, 'help')

class _dummyNoteBookFrame(NoteBookFrame, TixSubWidget):
    def __init__(self, master, name, destroy_physically=0):
        TixSubWidget.__init__(self, master, name, destroy_physically)

class _dummyPanedWindow(PanedWindow, TixSubWidget):
    def __init__(self, master, name, destroy_physically=1):
        TixSubWidget.__init__(self, master, name, destroy_physically)

########################
### Utility Routines ###
########################

#mike Should tixDestroy be exposed as a wrapper? - but not for widgets.

def OptionName(widget):
    '''Returns the qualified path name for the widget. Normally used to set
    default options for subwidgets. See tixwidgets.py'''
    return widget.tk.call('tixOptionName', widget._w)

# Called with a dictionary argument of the form
# {'*.c':'C source files', '*.txt':'Text Files', '*':'All files'}
# returns a string which can be used to configure the fsbox file types
# in an ExFileSelectBox. i.e.,
# '{{*} {* - All files}} {{*.c} {*.c - C source files}} {{*.txt} {*.txt - Text Files}}'
def FileTypeList(dict):
    s = ''
    for type in dict.keys():
        s = s + '{{' + type + '} {' + type + ' - ' + dict[type] + '}} '
    return s

# Still to be done:
# tixIconView
class CObjView(TixWidget):
    """This file implements the Canvas Object View widget. This is a base
    class of IconView. It implements automatic placement/adjustment of the
    scrollbars according to the canvas objects inside the canvas subwidget.
    The scrollbars are adjusted so that the canvas is just large enough
    to see all the objects.
    """
    # FIXME: It should inherit -superclass tixScrolledWidget
    pass


class Grid(TixWidget, XView, YView):
    '''The Tix Grid command creates a new window  and makes it into a
    tixGrid widget. Additional options, may be specified on the command
    line or in the option database to configure aspects such as its cursor
    and relief.

    A Grid widget displays its contents in a two dimensional grid of cells.
    Each cell may contain one Tix display item, which may be in text,
    graphics or other formats. See the DisplayStyle class for more information
    about Tix display items. Individual cells, or groups of cells, can be
    formatted with a wide range of attributes, such as its color, relief and
    border.

    Subwidgets - None'''
    # valid specific resources as of Tk 8.4
    # editdonecmd, editnotifycmd, floatingcols, floatingrows, formatcmd,
    # highlightbackground, highlightcolor, leftmargin, itemtype, selectmode,
    # selectunit, topmargin,
    def __init__(self, master=None, cnf={}, **kw):
        static= []
        self.cnf= cnf
        TixWidget.__init__(self, master, 'tixGrid', static, cnf, kw)

    # valid options as of Tk 8.4
    # anchor, bdtype, cget, configure, delete, dragsite, dropsite, entrycget,
    # edit, entryconfigure, format, geometryinfo, info, index, move, nearest,
    # selection, set, size, unset, xview, yview
    def anchor_clear(self):
        """Removes the selection anchor."""
        self.tk.call(self, 'anchor', 'clear')

    def anchor_get(self):
        "Get the (x,y) coordinate of the current anchor cell"
        return self._getints(self.tk.call(self, 'anchor', 'get'))

    def anchor_set(self, x, y):
        """Set the selection anchor to the cell at (x, y)."""
        self.tk.call(self, 'anchor', 'set', x, y)

    def delete_row(self, from_, to=None):
        """Delete rows between from_ and to inclusive.
        If to is not provided,  delete only row at from_"""
        if to is None:
            self.tk.call(self, 'delete', 'row', from_)
        else:
            self.tk.call(self, 'delete', 'row', from_, to)

    def delete_column(self, from_, to=None):
        """Delete columns between from_ and to inclusive.
        If to is not provided,  delete only column at from_"""
        if to is None:
            self.tk.call(self, 'delete', 'column', from_)
        else:
            self.tk.call(self, 'delete', 'column', from_, to)

    def edit_apply(self):
        """If any cell is being edited, de-highlight the cell  and  applies
        the changes."""
        self.tk.call(self, 'edit', 'apply')

    def edit_set(self, x, y):
        """Highlights  the  cell  at  (x, y) for editing, if the -editnotify
        command returns True for this cell."""
        self.tk.call(self, 'edit', 'set', x, y)

    def entrycget(self, x, y, option):
        "Get the option value for cell at (x,y)"
        if option and option[0] != '-':
            option = '-' + option
        return self.tk.call(self, 'entrycget', x, y, option)

    def entryconfigure(self, x, y, cnf=None, **kw):
        return self._configure(('entryconfigure', x, y), cnf, kw)

    # def format
    # def index

    def info_exists(self, x, y):
        "Return True if display item exists at (x,y)"
        return self._getboolean(self.tk.call(self, 'info', 'exists', x, y))

    def info_bbox(self, x, y):
        # This seems to always return '', at least for 'text' displayitems
        return self.tk.call(self, 'info', 'bbox', x, y)

    def move_column(self, from_, to, offset):
        """Moves the range of columns from position FROM through TO by
        the distance indicated by OFFSET. For example, move_column(2, 4, 1)
        moves the columns 2,3,4 to columns 3,4,5."""
        self.tk.call(self, 'move', 'column', from_, to, offset)

    def move_row(self, from_, to, offset):
        """Moves the range of rows from position FROM through TO by
        the distance indicated by OFFSET.
        For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5."""
        self.tk.call(self, 'move', 'row', from_, to, offset)

    def nearest(self, x, y):
        "Return coordinate of cell nearest pixel coordinate (x,y)"
        return self._getints(self.tk.call(self, 'nearest', x, y))

    # def selection adjust
    # def selection clear
    # def selection includes
    # def selection set
    # def selection toggle

    def set(self, x, y, itemtype=None, **kw):
        args= self._options(self.cnf, kw)
        if itemtype is not None:
            args= ('-itemtype', itemtype) + args
        self.tk.call(self, 'set', x, y, *args)

    def size_column(self, index, **kw):
        """Queries or sets the size of the column given by
        INDEX.  INDEX may be any non-negative
        integer that gives the position of a given column.
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all columns.
        When no option-value pair is given, this command returns a tuple
        containing the current size setting of the given column.  When
        option-value pairs are given, the corresponding options of the
        size setting of the given column are changed. Options may be one
        of the following:
              pad0 pixels
                     Specifies the paddings to the left of a column.
              pad1 pixels
                     Specifies the paddings to the right of a column.
              size val
                     Specifies the width of a column.  Val may be:
                     "auto" -- the width of the column is set to the
                     width of the widest cell in the column;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the width of the column to the
                     given number of characters."""
        return self.tk.splitlist(self.tk.call(self._w, 'size', 'column', index,
                             *self._options({}, kw)))

    def size_row(self, index, **kw):
        """Queries or sets the size of the row given by
        INDEX. INDEX may be any non-negative
        integer that gives the position of a given row .
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all rows.
        When no option-value pair is given, this command returns a list con-
        taining the current size setting of the given row . When option-value
        pairs are given, the corresponding options of the size setting of the
        given row are changed. Options may be one of the following:
              pad0 pixels
                     Specifies the paddings to the top of a row.
              pad1 pixels
                     Specifies the paddings to the bottom of a row.
              size val
                     Specifies the height of a row.  Val may be:
                     "auto" -- the height of the row is set to the
                     height of the highest cell in the row;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the height of the row to the
                     given number of characters."""
        return self.tk.splitlist(self.tk.call(
                    self, 'size', 'row', index, *self._options({}, kw)))

    def unset(self, x, y):
        """Clears the cell at (x, y) by removing its display item."""
        self.tk.call(self._w, 'unset', x, y)


class ScrolledGrid(Grid):
    '''Scrolled Grid widgets'''

    # FIXME: It should inherit -superclass tixScrolledWidget
    def __init__(self, master=None, cnf={}, **kw):
        static= []
        self.cnf= cnf
        TixWidget.__init__(self, master, 'tixScrolledGrid', static, cnf, kw)
PK�(�Z	�j����ttk.pynu�[���"""Ttk wrapper.

This module provides classes to allow using Tk themed widget set.

Ttk is based on a revised and enhanced version of
TIP #48 (http://tip.tcl.tk/48) specified style engine.

Its basic idea is to separate, to the extent possible, the code
implementing a widget's behavior from the code implementing its
appearance. Widget class bindings are primarily responsible for
maintaining the widget state and invoking callbacks, all aspects
of the widgets appearance lies at Themes.
"""

__version__ = "0.3.1"

__author__ = "Guilherme Polo <ggpolo@gmail.com>"

__all__ = ["Button", "Checkbutton", "Combobox", "Entry", "Frame", "Label",
           "Labelframe", "LabelFrame", "Menubutton", "Notebook", "Panedwindow",
           "PanedWindow", "Progressbar", "Radiobutton", "Scale", "Scrollbar",
           "Separator", "Sizegrip", "Spinbox", "Style", "Treeview",
           # Extensions
           "LabeledScale", "OptionMenu",
           # functions
           "tclobjs_to_py", "setup_master"]

import tkinter
from tkinter import _flatten, _join, _stringify, _splitdict

# Verify if Tk is new enough to not need the Tile package
_REQUIRE_TILE = True if tkinter.TkVersion < 8.5 else False

def _load_tile(master):
    if _REQUIRE_TILE:
        import os
        tilelib = os.environ.get('TILE_LIBRARY')
        if tilelib:
            # append custom tile path to the list of directories that
            # Tcl uses when attempting to resolve packages with the package
            # command
            master.tk.eval(
                    'global auto_path; '
                    'lappend auto_path {%s}' % tilelib)

        master.tk.eval('package require tile') # TclError may be raised here
        master._tile_loaded = True

def _format_optvalue(value, script=False):
    """Internal function."""
    if script:
        # if caller passes a Tcl script to tk.call, all the values need to
        # be grouped into words (arguments to a command in Tcl dialect)
        value = _stringify(value)
    elif isinstance(value, (list, tuple)):
        value = _join(value)
    return value

def _format_optdict(optdict, script=False, ignore=None):
    """Formats optdict to a tuple to pass it to tk.call.

    E.g. (script=False):
      {'foreground': 'blue', 'padding': [1, 2, 3, 4]} returns:
      ('-foreground', 'blue', '-padding', '1 2 3 4')"""

    opts = []
    for opt, value in optdict.items():
        if not ignore or opt not in ignore:
            opts.append("-%s" % opt)
            if value is not None:
                opts.append(_format_optvalue(value, script))

    return _flatten(opts)

def _mapdict_values(items):
    # each value in mapdict is expected to be a sequence, where each item
    # is another sequence containing a state (or several) and a value
    # E.g. (script=False):
    #   [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])]
    #   returns:
    #   ['active selected', 'grey', 'focus', [1, 2, 3, 4]]
    opt_val = []
    for *state, val in items:
        if len(state) == 1:
            # if it is empty (something that evaluates to False), then
            # format it to Tcl code to denote the "normal" state
            state = state[0] or ''
        else:
            # group multiple states
            state = ' '.join(state) # raise TypeError if not str
        opt_val.append(state)
        if val is not None:
            opt_val.append(val)
    return opt_val

def _format_mapdict(mapdict, script=False):
    """Formats mapdict to pass it to tk.call.

    E.g. (script=False):
      {'expand': [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])]}

      returns:

      ('-expand', '{active selected} grey focus {1, 2, 3, 4}')"""

    opts = []
    for opt, value in mapdict.items():
        opts.extend(("-%s" % opt,
                     _format_optvalue(_mapdict_values(value), script)))

    return _flatten(opts)

def _format_elemcreate(etype, script=False, *args, **kw):
    """Formats args and kw according to the given element factory etype."""
    spec = None
    opts = ()
    if etype in ("image", "vsapi"):
        if etype == "image": # define an element based on an image
            # first arg should be the default image name
            iname = args[0]
            # next args, if any, are statespec/value pairs which is almost
            # a mapdict, but we just need the value
            imagespec = _join(_mapdict_values(args[1:]))
            spec = "%s %s" % (iname, imagespec)

        else:
            # define an element whose visual appearance is drawn using the
            # Microsoft Visual Styles API which is responsible for the
            # themed styles on Windows XP and Vista.
            # Availability: Tk 8.6, Windows XP and Vista.
            class_name, part_id = args[:2]
            statemap = _join(_mapdict_values(args[2:]))
            spec = "%s %s %s" % (class_name, part_id, statemap)

        opts = _format_optdict(kw, script)

    elif etype == "from": # clone an element
        # it expects a themename and optionally an element to clone from,
        # otherwise it will clone {} (empty element)
        spec = args[0] # theme name
        if len(args) > 1: # elementfrom specified
            opts = (_format_optvalue(args[1], script),)

    if script:
        spec = '{%s}' % spec
        opts = ' '.join(opts)

    return spec, opts

def _format_layoutlist(layout, indent=0, indent_size=2):
    """Formats a layout list so we can pass the result to ttk::style
    layout and ttk::style settings. Note that the layout doesn't have to
    be a list necessarily.

    E.g.:
      [("Menubutton.background", None),
       ("Menubutton.button", {"children":
           [("Menubutton.focus", {"children":
               [("Menubutton.padding", {"children":
                [("Menubutton.label", {"side": "left", "expand": 1})]
               })]
           })]
       }),
       ("Menubutton.indicator", {"side": "right"})
      ]

      returns:

      Menubutton.background
      Menubutton.button -children {
        Menubutton.focus -children {
          Menubutton.padding -children {
            Menubutton.label -side left -expand 1
          }
        }
      }
      Menubutton.indicator -side right"""
    script = []

    for layout_elem in layout:
        elem, opts = layout_elem
        opts = opts or {}
        fopts = ' '.join(_format_optdict(opts, True, ("children",)))
        head = "%s%s%s" % (' ' * indent, elem, (" %s" % fopts) if fopts else '')

        if "children" in opts:
            script.append(head + " -children {")
            indent += indent_size
            newscript, indent = _format_layoutlist(opts['children'], indent,
                indent_size)
            script.append(newscript)
            indent -= indent_size
            script.append('%s}' % (' ' * indent))
        else:
            script.append(head)

    return '\n'.join(script), indent

def _script_from_settings(settings):
    """Returns an appropriate script, based on settings, according to
    theme_settings definition to be used by theme_settings and
    theme_create."""
    script = []
    # a script will be generated according to settings passed, which
    # will then be evaluated by Tcl
    for name, opts in settings.items():
        # will format specific keys according to Tcl code
        if opts.get('configure'): # format 'configure'
            s = ' '.join(_format_optdict(opts['configure'], True))
            script.append("ttk::style configure %s %s;" % (name, s))

        if opts.get('map'): # format 'map'
            s = ' '.join(_format_mapdict(opts['map'], True))
            script.append("ttk::style map %s %s;" % (name, s))

        if 'layout' in opts: # format 'layout' which may be empty
            if not opts['layout']:
                s = 'null' # could be any other word, but this one makes sense
            else:
                s, _ = _format_layoutlist(opts['layout'])
            script.append("ttk::style layout %s {\n%s\n}" % (name, s))

        if opts.get('element create'): # format 'element create'
            eopts = opts['element create']
            etype = eopts[0]

            # find where args end, and where kwargs start
            argc = 1 # etype was the first one
            while argc < len(eopts) and not hasattr(eopts[argc], 'items'):
                argc += 1

            elemargs = eopts[1:argc]
            elemkw = eopts[argc] if argc < len(eopts) and eopts[argc] else {}
            spec, opts = _format_elemcreate(etype, True, *elemargs, **elemkw)

            script.append("ttk::style element create %s %s %s %s" % (
                name, etype, spec, opts))

    return '\n'.join(script)

def _list_from_statespec(stuple):
    """Construct a list from the given statespec tuple according to the
    accepted statespec accepted by _format_mapdict."""
    if isinstance(stuple, str):
        return stuple
    result = []
    it = iter(stuple)
    for state, val in zip(it, it):
        if hasattr(state, 'typename'):  # this is a Tcl object
            state = str(state).split()
        elif isinstance(state, str):
            state = state.split()
        elif not isinstance(state, (tuple, list)):
            state = (state,)
        if hasattr(val, 'typename'):
            val = str(val)
        result.append((*state, val))

    return result

def _list_from_layouttuple(tk, ltuple):
    """Construct a list from the tuple returned by ttk::layout, this is
    somewhat the reverse of _format_layoutlist."""
    ltuple = tk.splitlist(ltuple)
    res = []

    indx = 0
    while indx < len(ltuple):
        name = ltuple[indx]
        opts = {}
        res.append((name, opts))
        indx += 1

        while indx < len(ltuple): # grab name's options
            opt, val = ltuple[indx:indx + 2]
            if not opt.startswith('-'): # found next name
                break

            opt = opt[1:] # remove the '-' from the option
            indx += 2

            if opt == 'children':
                val = _list_from_layouttuple(tk, val)

            opts[opt] = val

    return res

def _val_or_dict(tk, options, *args):
    """Format options then call Tk command with args and options and return
    the appropriate result.

    If no option is specified, a dict is returned. If an option is
    specified with the None value, the value for that option is returned.
    Otherwise, the function just sets the passed options and the caller
    shouldn't be expecting a return value anyway."""
    options = _format_optdict(options)
    res = tk.call(*(args + options))

    if len(options) % 2: # option specified without a value, return its value
        return res

    return _splitdict(tk, res, conv=_tclobj_to_py)

def _convert_stringval(value):
    """Converts a value to, hopefully, a more appropriate Python object."""
    value = str(value)
    try:
        value = int(value)
    except (ValueError, TypeError):
        pass

    return value

def _to_number(x):
    if isinstance(x, str):
        if '.' in x:
            x = float(x)
        else:
            x = int(x)
    return x

def _tclobj_to_py(val):
    """Return value converted from Tcl object to Python object."""
    if val and hasattr(val, '__len__') and not isinstance(val, str):
        if getattr(val[0], 'typename', None) == 'StateSpec':
            val = _list_from_statespec(val)
        else:
            val = list(map(_convert_stringval, val))

    elif hasattr(val, 'typename'): # some other (single) Tcl object
        val = _convert_stringval(val)

    return val

def tclobjs_to_py(adict):
    """Returns adict with its values converted from Tcl objects to Python
    objects."""
    for opt, val in adict.items():
        adict[opt] = _tclobj_to_py(val)

    return adict

def setup_master(master=None):
    """If master is not None, itself is returned. If master is None,
    the default master is returned if there is one, otherwise a new
    master is created and returned.

    If it is not allowed to use the default root and master is None,
    RuntimeError is raised."""
    if master is None:
        master = tkinter._get_default_root()
    return master


class Style(object):
    """Manipulate style database."""

    _name = "ttk::style"

    def __init__(self, master=None):
        master = setup_master(master)

        if not getattr(master, '_tile_loaded', False):
            # Load tile now, if needed
            _load_tile(master)

        self.master = master
        self.tk = self.master.tk


    def configure(self, style, query_opt=None, **kw):
        """Query or sets the default value of the specified option(s) in
        style.

        Each key in kw is an option and each value is either a string or
        a sequence identifying the value for that option."""
        if query_opt is not None:
            kw[query_opt] = None
        result = _val_or_dict(self.tk, kw, self._name, "configure", style)
        if result or query_opt:
            return result


    def map(self, style, query_opt=None, **kw):
        """Query or sets dynamic values of the specified option(s) in
        style.

        Each key in kw is an option and each value should be a list or a
        tuple (usually) containing statespecs grouped in tuples, or list,
        or something else of your preference. A statespec is compound of
        one or more states and then a value."""
        if query_opt is not None:
            result = self.tk.call(self._name, "map", style, '-%s' % query_opt)
            return _list_from_statespec(self.tk.splitlist(result))

        result = self.tk.call(self._name, "map", style, *_format_mapdict(kw))
        return {k: _list_from_statespec(self.tk.splitlist(v))
                for k, v in _splitdict(self.tk, result).items()}


    def lookup(self, style, option, state=None, default=None):
        """Returns the value specified for option in style.

        If state is specified it is expected to be a sequence of one
        or more states. If the default argument is set, it is used as
        a fallback value in case no specification for option is found."""
        state = ' '.join(state) if state else ''

        return self.tk.call(self._name, "lookup", style, '-%s' % option,
            state, default)


    def layout(self, style, layoutspec=None):
        """Define the widget layout for given style. If layoutspec is
        omitted, return the layout specification for given style.

        layoutspec is expected to be a list or an object different than
        None that evaluates to False if you want to "turn off" that style.
        If it is a list (or tuple, or something else), each item should be
        a tuple where the first item is the layout name and the second item
        should have the format described below:

        LAYOUTS

            A layout can contain the value None, if takes no options, or
            a dict of options specifying how to arrange the element.
            The layout mechanism uses a simplified version of the pack
            geometry manager: given an initial cavity, each element is
            allocated a parcel. Valid options/values are:

                side: whichside
                    Specifies which side of the cavity to place the
                    element; one of top, right, bottom or left. If
                    omitted, the element occupies the entire cavity.

                sticky: nswe
                    Specifies where the element is placed inside its
                    allocated parcel.

                children: [sublayout... ]
                    Specifies a list of elements to place inside the
                    element. Each element is a tuple (or other sequence)
                    where the first item is the layout name, and the other
                    is a LAYOUT."""
        lspec = None
        if layoutspec:
            lspec = _format_layoutlist(layoutspec)[0]
        elif layoutspec is not None: # will disable the layout ({}, '', etc)
            lspec = "null" # could be any other word, but this may make sense
                           # when calling layout(style) later

        return _list_from_layouttuple(self.tk,
            self.tk.call(self._name, "layout", style, lspec))


    def element_create(self, elementname, etype, *args, **kw):
        """Create a new element in the current theme of given etype."""
        spec, opts = _format_elemcreate(etype, False, *args, **kw)
        self.tk.call(self._name, "element", "create", elementname, etype,
            spec, *opts)


    def element_names(self):
        """Returns the list of elements defined in the current theme."""
        return tuple(n.lstrip('-') for n in self.tk.splitlist(
            self.tk.call(self._name, "element", "names")))


    def element_options(self, elementname):
        """Return the list of elementname's options."""
        return tuple(o.lstrip('-') for o in self.tk.splitlist(
            self.tk.call(self._name, "element", "options", elementname)))


    def theme_create(self, themename, parent=None, settings=None):
        """Creates a new theme.

        It is an error if themename already exists. If parent is
        specified, the new theme will inherit styles, elements and
        layouts from the specified parent theme. If settings are present,
        they are expected to have the same syntax used for theme_settings."""
        script = _script_from_settings(settings) if settings else ''

        if parent:
            self.tk.call(self._name, "theme", "create", themename,
                "-parent", parent, "-settings", script)
        else:
            self.tk.call(self._name, "theme", "create", themename,
                "-settings", script)


    def theme_settings(self, themename, settings):
        """Temporarily sets the current theme to themename, apply specified
        settings and then restore the previous theme.

        Each key in settings is a style and each value may contain the
        keys 'configure', 'map', 'layout' and 'element create' and they
        are expected to have the same format as specified by the methods
        configure, map, layout and element_create respectively."""
        script = _script_from_settings(settings)
        self.tk.call(self._name, "theme", "settings", themename, script)


    def theme_names(self):
        """Returns a list of all known themes."""
        return self.tk.splitlist(self.tk.call(self._name, "theme", "names"))


    def theme_use(self, themename=None):
        """If themename is None, returns the theme in use, otherwise, set
        the current theme to themename, refreshes all widgets and emits
        a <<ThemeChanged>> event."""
        if themename is None:
            # Starting on Tk 8.6, checking this global is no longer needed
            # since it allows doing self.tk.call(self._name, "theme", "use")
            return self.tk.eval("return $ttk::currentTheme")

        # using "ttk::setTheme" instead of "ttk::style theme use" causes
        # the variable currentTheme to be updated, also, ttk::setTheme calls
        # "ttk::style theme use" in order to change theme.
        self.tk.call("ttk::setTheme", themename)


class Widget(tkinter.Widget):
    """Base class for Tk themed widgets."""

    def __init__(self, master, widgetname, kw=None):
        """Constructs a Ttk Widget with the parent master.

        STANDARD OPTIONS

            class, cursor, takefocus, style

        SCROLLABLE WIDGET OPTIONS

            xscrollcommand, yscrollcommand

        LABEL WIDGET OPTIONS

            text, textvariable, underline, image, compound, width

        WIDGET STATES

            active, disabled, focus, pressed, selected, background,
            readonly, alternate, invalid
        """
        master = setup_master(master)
        if not getattr(master, '_tile_loaded', False):
            # Load tile now, if needed
            _load_tile(master)
        tkinter.Widget.__init__(self, master, widgetname, kw=kw)


    def identify(self, x, y):
        """Returns the name of the element at position x, y, or the empty
        string if the point does not lie within any element.

        x and y are pixel coordinates relative to the widget."""
        return self.tk.call(self._w, "identify", x, y)


    def instate(self, statespec, callback=None, *args, **kw):
        """Test the widget's state.

        If callback is not specified, returns True if the widget state
        matches statespec and False otherwise. If callback is specified,
        then it will be invoked with *args, **kw if the widget state
        matches statespec. statespec is expected to be a sequence."""
        ret = self.tk.getboolean(
                self.tk.call(self._w, "instate", ' '.join(statespec)))
        if ret and callback:
            return callback(*args, **kw)

        return ret


    def state(self, statespec=None):
        """Modify or inquire widget state.

        Widget state is returned if statespec is None, otherwise it is
        set according to the statespec flags and then a new state spec
        is returned indicating which flags were changed. statespec is
        expected to be a sequence."""
        if statespec is not None:
            statespec = ' '.join(statespec)

        return self.tk.splitlist(str(self.tk.call(self._w, "state", statespec)))


class Button(Widget):
    """Ttk Button widget, displays a textual label and/or image, and
    evaluates a command when pressed."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Button widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, default, width
        """
        Widget.__init__(self, master, "ttk::button", kw)


    def invoke(self):
        """Invokes the command associated with the button."""
        return self.tk.call(self._w, "invoke")


class Checkbutton(Widget):
    """Ttk Checkbutton widget which is either in on- or off-state."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Checkbutton widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, offvalue, onvalue, variable
        """
        Widget.__init__(self, master, "ttk::checkbutton", kw)


    def invoke(self):
        """Toggles between the selected and deselected states and
        invokes the associated command. If the widget is currently
        selected, sets the option variable to the offvalue option
        and deselects the widget; otherwise, sets the option variable
        to the option onvalue.

        Returns the result of the associated command."""
        return self.tk.call(self._w, "invoke")


class Entry(Widget, tkinter.Entry):
    """Ttk Entry widget displays a one-line text string and allows that
    string to be edited by the user."""

    def __init__(self, master=None, widget=None, **kw):
        """Constructs a Ttk Entry widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand

        WIDGET-SPECIFIC OPTIONS

            exportselection, invalidcommand, justify, show, state,
            textvariable, validate, validatecommand, width

        VALIDATION MODES

            none, key, focus, focusin, focusout, all
        """
        Widget.__init__(self, master, widget or "ttk::entry", kw)


    def bbox(self, index):
        """Return a tuple of (x, y, width, height) which describes the
        bounding box of the character given by index."""
        return self._getints(self.tk.call(self._w, "bbox", index))


    def identify(self, x, y):
        """Returns the name of the element at position x, y, or the
        empty string if the coordinates are outside the window."""
        return self.tk.call(self._w, "identify", x, y)


    def validate(self):
        """Force revalidation, independent of the conditions specified
        by the validate option. Returns False if validation fails, True
        if it succeeds. Sets or clears the invalid state accordingly."""
        return self.tk.getboolean(self.tk.call(self._w, "validate"))


class Combobox(Entry):
    """Ttk Combobox widget combines a text field with a pop-down list of
    values."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Combobox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            exportselection, justify, height, postcommand, state,
            textvariable, values, width
        """
        Entry.__init__(self, master, "ttk::combobox", **kw)


    def current(self, newindex=None):
        """If newindex is supplied, sets the combobox value to the
        element at position newindex in the list of values. Otherwise,
        returns the index of the current value in the list of values
        or -1 if the current value does not appear in the list."""
        if newindex is None:
            return self.tk.getint(self.tk.call(self._w, "current"))
        return self.tk.call(self._w, "current", newindex)


    def set(self, value):
        """Sets the value of the combobox to value."""
        self.tk.call(self._w, "set", value)


class Frame(Widget):
    """Ttk Frame widget is a container, used to group other widgets
    together."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Frame with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            borderwidth, relief, padding, width, height
        """
        Widget.__init__(self, master, "ttk::frame", kw)


class Label(Widget):
    """Ttk Label widget displays a textual label and/or image."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Label with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, style, takefocus, text,
            textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            anchor, background, font, foreground, justify, padding,
            relief, text, wraplength
        """
        Widget.__init__(self, master, "ttk::label", kw)


class Labelframe(Widget):
    """Ttk Labelframe widget is a container used to group other widgets
    together. It has an optional label, which may be a plain text string
    or another widget."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Labelframe with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS
            labelanchor, text, underline, padding, labelwidget, width,
            height
        """
        Widget.__init__(self, master, "ttk::labelframe", kw)

LabelFrame = Labelframe # tkinter name compatibility


class Menubutton(Widget):
    """Ttk Menubutton widget displays a textual label and/or image, and
    displays a menu when pressed."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Menubutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            direction, menu
        """
        Widget.__init__(self, master, "ttk::menubutton", kw)


class Notebook(Widget):
    """Ttk Notebook widget manages a collection of windows and displays
    a single one at a time. Each child window is associated with a tab,
    which the user may select to change the currently-displayed window."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Notebook with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            height, padding, width

        TAB OPTIONS

            state, sticky, padding, text, image, compound, underline

        TAB IDENTIFIERS (tab_id)

            The tab_id argument found in several methods may take any of
            the following forms:

                * An integer between zero and the number of tabs
                * The name of a child window
                * A positional specification of the form "@x,y", which
                  defines the tab
                * The string "current", which identifies the
                  currently-selected tab
                * The string "end", which returns the number of tabs (only
                  valid for method index)
        """
        Widget.__init__(self, master, "ttk::notebook", kw)


    def add(self, child, **kw):
        """Adds a new tab to the notebook.

        If window is currently managed by the notebook but hidden, it is
        restored to its previous position."""
        self.tk.call(self._w, "add", child, *(_format_optdict(kw)))


    def forget(self, tab_id):
        """Removes the tab specified by tab_id, unmaps and unmanages the
        associated window."""
        self.tk.call(self._w, "forget", tab_id)


    def hide(self, tab_id):
        """Hides the tab specified by tab_id.

        The tab will not be displayed, but the associated window remains
        managed by the notebook and its configuration remembered. Hidden
        tabs may be restored with the add command."""
        self.tk.call(self._w, "hide", tab_id)


    def identify(self, x, y):
        """Returns the name of the tab element at position x, y, or the
        empty string if none."""
        return self.tk.call(self._w, "identify", x, y)


    def index(self, tab_id):
        """Returns the numeric index of the tab specified by tab_id, or
        the total number of tabs if tab_id is the string "end"."""
        return self.tk.getint(self.tk.call(self._w, "index", tab_id))


    def insert(self, pos, child, **kw):
        """Inserts a pane at the specified position.

        pos is either the string end, an integer index, or the name of
        a managed child. If child is already managed by the notebook,
        moves it to the specified position."""
        self.tk.call(self._w, "insert", pos, child, *(_format_optdict(kw)))


    def select(self, tab_id=None):
        """Selects the specified tab.

        The associated child window will be displayed, and the
        previously-selected window (if different) is unmapped. If tab_id
        is omitted, returns the widget name of the currently selected
        pane."""
        return self.tk.call(self._w, "select", tab_id)


    def tab(self, tab_id, option=None, **kw):
        """Query or modify the options of the specific tab_id.

        If kw is not given, returns a dict of the tab option values. If option
        is specified, returns the value of that option. Otherwise, sets the
        options to the corresponding values."""
        if option is not None:
            kw[option] = None
        return _val_or_dict(self.tk, kw, self._w, "tab", tab_id)


    def tabs(self):
        """Returns a list of windows managed by the notebook."""
        return self.tk.splitlist(self.tk.call(self._w, "tabs") or ())


    def enable_traversal(self):
        """Enable keyboard traversal for a toplevel window containing
        this notebook.

        This will extend the bindings for the toplevel window containing
        this notebook as follows:

            Control-Tab: selects the tab following the currently selected
                         one

            Shift-Control-Tab: selects the tab preceding the currently
                               selected one

            Alt-K: where K is the mnemonic (underlined) character of any
                   tab, will select that tab.

        Multiple notebooks in a single toplevel may be enabled for
        traversal, including nested notebooks. However, notebook traversal
        only works properly if all panes are direct children of the
        notebook."""
        # The only, and good, difference I see is about mnemonics, which works
        # after calling this method. Control-Tab and Shift-Control-Tab always
        # works (here at least).
        self.tk.call("ttk::notebook::enableTraversal", self._w)


class Panedwindow(Widget, tkinter.PanedWindow):
    """Ttk Panedwindow widget displays a number of subwindows, stacked
    either vertically or horizontally."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Panedwindow with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, width, height

        PANE OPTIONS

            weight
        """
        Widget.__init__(self, master, "ttk::panedwindow", kw)


    forget = tkinter.PanedWindow.forget # overrides Pack.forget


    def insert(self, pos, child, **kw):
        """Inserts a pane at the specified positions.

        pos is either the string end, and integer index, or the name
        of a child. If child is already managed by the paned window,
        moves it to the specified position."""
        self.tk.call(self._w, "insert", pos, child, *(_format_optdict(kw)))


    def pane(self, pane, option=None, **kw):
        """Query or modify the options of the specified pane.

        pane is either an integer index or the name of a managed subwindow.
        If kw is not given, returns a dict of the pane option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values."""
        if option is not None:
            kw[option] = None
        return _val_or_dict(self.tk, kw, self._w, "pane", pane)


    def sashpos(self, index, newpos=None):
        """If newpos is specified, sets the position of sash number index.

        May adjust the positions of adjacent sashes to ensure that
        positions are monotonically increasing. Sash positions are further
        constrained to be between 0 and the total size of the widget.

        Returns the new position of sash number index."""
        return self.tk.getint(self.tk.call(self._w, "sashpos", index, newpos))

PanedWindow = Panedwindow # tkinter name compatibility


class Progressbar(Widget):
    """Ttk Progressbar widget shows the status of a long-running
    operation. They can operate in two modes: determinate mode shows the
    amount completed relative to the total amount of work to be done, and
    indeterminate mode provides an animated display to let the user know
    that something is happening."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Progressbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, length, mode, maximum, value, variable, phase
        """
        Widget.__init__(self, master, "ttk::progressbar", kw)


    def start(self, interval=None):
        """Begin autoincrement mode: schedules a recurring timer event
        that calls method step every interval milliseconds.

        interval defaults to 50 milliseconds (20 steps/second) if omitted."""
        self.tk.call(self._w, "start", interval)


    def step(self, amount=None):
        """Increments the value option by amount.

        amount defaults to 1.0 if omitted."""
        self.tk.call(self._w, "step", amount)


    def stop(self):
        """Stop autoincrement mode: cancels any recurring timer event
        initiated by start."""
        self.tk.call(self._w, "stop")


class Radiobutton(Widget):
    """Ttk Radiobutton widgets are used in groups to show or change a
    set of mutually-exclusive options."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Radiobutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, value, variable
        """
        Widget.__init__(self, master, "ttk::radiobutton", kw)


    def invoke(self):
        """Sets the option variable to the option value, selects the
        widget, and invokes the associated command.

        Returns the result of the command, or an empty string if
        no command is specified."""
        return self.tk.call(self._w, "invoke")


class Scale(Widget, tkinter.Scale):
    """Ttk Scale widget is typically used to control the numeric value of
    a linked variable that varies uniformly over some range."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Scale with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, from, length, orient, to, value, variable
        """
        Widget.__init__(self, master, "ttk::scale", kw)


    def configure(self, cnf=None, **kw):
        """Modify or query scale options.

        Setting a value for any of the "from", "from_" or "to" options
        generates a <<RangeChanged>> event."""
        retval = Widget.configure(self, cnf, **kw)
        if not isinstance(cnf, (type(None), str)):
            kw.update(cnf)
        if any(['from' in kw, 'from_' in kw, 'to' in kw]):
            self.event_generate('<<RangeChanged>>')
        return retval


    def get(self, x=None, y=None):
        """Get the current value of the value option, or the value
        corresponding to the coordinates x, y if they are specified.

        x and y are pixel coordinates relative to the scale widget
        origin."""
        return self.tk.call(self._w, 'get', x, y)


class Scrollbar(Widget, tkinter.Scrollbar):
    """Ttk Scrollbar controls the viewport of a scrollable widget."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Scrollbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, orient
        """
        Widget.__init__(self, master, "ttk::scrollbar", kw)


class Separator(Widget):
    """Ttk Separator widget displays a horizontal or vertical separator
    bar."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Separator with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient
        """
        Widget.__init__(self, master, "ttk::separator", kw)


class Sizegrip(Widget):
    """Ttk Sizegrip allows the user to resize the containing toplevel
    window by pressing and dragging the grip."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Sizegrip with parent master.

        STANDARD OPTIONS

            class, cursor, state, style, takefocus
        """
        Widget.__init__(self, master, "ttk::sizegrip", kw)


class Spinbox(Entry):
    """Ttk Spinbox is an Entry with increment and decrement arrows

    It is commonly used for number entry or to select from a list of
    string values.
    """

    def __init__(self, master=None, **kw):
        """Construct a Ttk Spinbox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, validate,
            validatecommand, xscrollcommand, invalidcommand

        WIDGET-SPECIFIC OPTIONS

            to, from_, increment, values, wrap, format, command
        """
        Entry.__init__(self, master, "ttk::spinbox", **kw)


    def set(self, value):
        """Sets the value of the Spinbox to value."""
        self.tk.call(self._w, "set", value)


class Treeview(Widget, tkinter.XView, tkinter.YView):
    """Ttk Treeview widget displays a hierarchical collection of items.

    Each item has a textual label, an optional image, and an optional list
    of data values. The data values are displayed in successive columns
    after the tree label."""

    def __init__(self, master=None, **kw):
        """Construct a Ttk Treeview with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand,
            yscrollcommand

        WIDGET-SPECIFIC OPTIONS

            columns, displaycolumns, height, padding, selectmode, show

        ITEM OPTIONS

            text, image, values, open, tags

        TAG OPTIONS

            foreground, background, font, image
        """
        Widget.__init__(self, master, "ttk::treeview", kw)


    def bbox(self, item, column=None):
        """Returns the bounding box (relative to the treeview widget's
        window) of the specified item in the form x y width height.

        If column is specified, returns the bounding box of that cell.
        If the item is not visible (i.e., if it is a descendant of a
        closed item or is scrolled offscreen), returns an empty string."""
        return self._getints(self.tk.call(self._w, "bbox", item, column)) or ''


    def get_children(self, item=None):
        """Returns a tuple of children belonging to item.

        If item is not specified, returns root children."""
        return self.tk.splitlist(
                self.tk.call(self._w, "children", item or '') or ())


    def set_children(self, item, *newchildren):
        """Replaces item's child with newchildren.

        Children present in item that are not present in newchildren
        are detached from tree. No items in newchildren may be an
        ancestor of item."""
        self.tk.call(self._w, "children", item, newchildren)


    def column(self, column, option=None, **kw):
        """Query or modify the options for the specified column.

        If kw is not given, returns a dict of the column option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values."""
        if option is not None:
            kw[option] = None
        return _val_or_dict(self.tk, kw, self._w, "column", column)


    def delete(self, *items):
        """Delete all specified items and all their descendants. The root
        item may not be deleted."""
        self.tk.call(self._w, "delete", items)


    def detach(self, *items):
        """Unlinks all of the specified items from the tree.

        The items and all of their descendants are still present, and may
        be reinserted at another point in the tree, but will not be
        displayed. The root item may not be detached."""
        self.tk.call(self._w, "detach", items)


    def exists(self, item):
        """Returns True if the specified item is present in the tree,
        False otherwise."""
        return self.tk.getboolean(self.tk.call(self._w, "exists", item))


    def focus(self, item=None):
        """If item is specified, sets the focus item to item. Otherwise,
        returns the current focus item, or '' if there is none."""
        return self.tk.call(self._w, "focus", item)


    def heading(self, column, option=None, **kw):
        """Query or modify the heading options for the specified column.

        If kw is not given, returns a dict of the heading option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.

        Valid options/values are:
            text: text
                The text to display in the column heading
            image: image_name
                Specifies an image to display to the right of the column
                heading
            anchor: anchor
                Specifies how the heading text should be aligned. One of
                the standard Tk anchor values
            command: callback
                A callback to be invoked when the heading label is
                pressed.

        To configure the tree column heading, call this with column = "#0" """
        cmd = kw.get('command')
        if cmd and not isinstance(cmd, str):
            # callback not registered yet, do it now
            kw['command'] = self.master.register(cmd, self._substitute)

        if option is not None:
            kw[option] = None

        return _val_or_dict(self.tk, kw, self._w, 'heading', column)


    def identify(self, component, x, y):
        """Returns a description of the specified component under the
        point given by x and y, or the empty string if no such component
        is present at that position."""
        return self.tk.call(self._w, "identify", component, x, y)


    def identify_row(self, y):
        """Returns the item ID of the item at position y."""
        return self.identify("row", 0, y)


    def identify_column(self, x):
        """Returns the data column identifier of the cell at position x.

        The tree column has ID #0."""
        return self.identify("column", x, 0)


    def identify_region(self, x, y):
        """Returns one of:

        heading: Tree heading area.
        separator: Space between two columns headings;
        tree: The tree area.
        cell: A data cell.

        * Availability: Tk 8.6"""
        return self.identify("region", x, y)


    def identify_element(self, x, y):
        """Returns the element at position x, y.

        * Availability: Tk 8.6"""
        return self.identify("element", x, y)


    def index(self, item):
        """Returns the integer index of item within its parent's list
        of children."""
        return self.tk.getint(self.tk.call(self._w, "index", item))


    def insert(self, parent, index, iid=None, **kw):
        """Creates a new item and return the item identifier of the newly
        created item.

        parent is the item ID of the parent item, or the empty string
        to create a new top-level item. index is an integer, or the value
        end, specifying where in the list of parent's children to insert
        the new item. If index is less than or equal to zero, the new node
        is inserted at the beginning, if index is greater than or equal to
        the current number of children, it is inserted at the end. If iid
        is specified, it is used as the item identifier, iid must not
        already exist in the tree. Otherwise, a new unique identifier
        is generated."""
        opts = _format_optdict(kw)
        if iid is not None:
            res = self.tk.call(self._w, "insert", parent, index,
                "-id", iid, *opts)
        else:
            res = self.tk.call(self._w, "insert", parent, index, *opts)

        return res


    def item(self, item, option=None, **kw):
        """Query or modify the options for the specified item.

        If no options are given, a dict with options/values for the item
        is returned. If option is specified then the value for that option
        is returned. Otherwise, sets the options to the corresponding
        values as given by kw."""
        if option is not None:
            kw[option] = None
        return _val_or_dict(self.tk, kw, self._w, "item", item)


    def move(self, item, parent, index):
        """Moves item to position index in parent's list of children.

        It is illegal to move an item under one of its descendants. If
        index is less than or equal to zero, item is moved to the
        beginning, if greater than or equal to the number of children,
        it is moved to the end. If item was detached it is reattached."""
        self.tk.call(self._w, "move", item, parent, index)

    reattach = move # A sensible method name for reattaching detached items


    def next(self, item):
        """Returns the identifier of item's next sibling, or '' if item
        is the last child of its parent."""
        return self.tk.call(self._w, "next", item)


    def parent(self, item):
        """Returns the ID of the parent of item, or '' if item is at the
        top level of the hierarchy."""
        return self.tk.call(self._w, "parent", item)


    def prev(self, item):
        """Returns the identifier of item's previous sibling, or '' if
        item is the first child of its parent."""
        return self.tk.call(self._w, "prev", item)


    def see(self, item):
        """Ensure that item is visible.

        Sets all of item's ancestors open option to True, and scrolls
        the widget if necessary so that item is within the visible
        portion of the tree."""
        self.tk.call(self._w, "see", item)


    def selection(self):
        """Returns the tuple of selected items."""
        return self.tk.splitlist(self.tk.call(self._w, "selection"))


    def _selection(self, selop, items):
        if len(items) == 1 and isinstance(items[0], (tuple, list)):
            items = items[0]

        self.tk.call(self._w, "selection", selop, items)


    def selection_set(self, *items):
        """The specified items becomes the new selection."""
        self._selection("set", items)


    def selection_add(self, *items):
        """Add all of the specified items to the selection."""
        self._selection("add", items)


    def selection_remove(self, *items):
        """Remove all of the specified items from the selection."""
        self._selection("remove", items)


    def selection_toggle(self, *items):
        """Toggle the selection state of each specified item."""
        self._selection("toggle", items)


    def set(self, item, column=None, value=None):
        """Query or set the value of given item.

        With one argument, return a dictionary of column/value pairs
        for the specified item. With two arguments, return the current
        value of the specified column. With three arguments, set the
        value of given column in given item to the specified value."""
        res = self.tk.call(self._w, "set", item, column, value)
        if column is None and value is None:
            return _splitdict(self.tk, res,
                              cut_minus=False, conv=_tclobj_to_py)
        else:
            return res


    def tag_bind(self, tagname, sequence=None, callback=None):
        """Bind a callback for the given event sequence to the tag tagname.
        When an event is delivered to an item, the callbacks for each
        of the item's tags option are called."""
        self._bind((self._w, "tag", "bind", tagname), sequence, callback, add=0)


    def tag_configure(self, tagname, option=None, **kw):
        """Query or modify the options for the specified tagname.

        If kw is not given, returns a dict of the option settings for tagname.
        If option is specified, returns the value for that option for the
        specified tagname. Otherwise, sets the options to the corresponding
        values for the given tagname."""
        if option is not None:
            kw[option] = None
        return _val_or_dict(self.tk, kw, self._w, "tag", "configure",
            tagname)


    def tag_has(self, tagname, item=None):
        """If item is specified, returns 1 or 0 depending on whether the
        specified item has the given tagname. Otherwise, returns a list of
        all items which have the specified tag.

        * Availability: Tk 8.6"""
        if item is None:
            return self.tk.splitlist(
                self.tk.call(self._w, "tag", "has", tagname))
        else:
            return self.tk.getboolean(
                self.tk.call(self._w, "tag", "has", tagname, item))


# Extensions

class LabeledScale(Frame):
    """A Ttk Scale widget with a Ttk Label widget indicating its
    current value.

    The Ttk Scale can be accessed through instance.scale, and Ttk Label
    can be accessed through instance.label"""

    def __init__(self, master=None, variable=None, from_=0, to=10, **kw):
        """Construct a horizontal LabeledScale with parent master, a
        variable to be associated with the Ttk Scale widget and its range.
        If variable is not specified, a tkinter.IntVar is created.

        WIDGET-SPECIFIC OPTIONS

            compound: 'top' or 'bottom'
                Specifies how to display the label relative to the scale.
                Defaults to 'top'.
        """
        self._label_top = kw.pop('compound', 'top') == 'top'

        Frame.__init__(self, master, **kw)
        self._variable = variable or tkinter.IntVar(master)
        self._variable.set(from_)
        self._last_valid = from_

        self.label = Label(self)
        self.scale = Scale(self, variable=self._variable, from_=from_, to=to)
        self.scale.bind('<<RangeChanged>>', self._adjust)

        # position scale and label according to the compound option
        scale_side = 'bottom' if self._label_top else 'top'
        label_side = 'top' if scale_side == 'bottom' else 'bottom'
        self.scale.pack(side=scale_side, fill='x')
        # Dummy required to make frame correct height
        dummy = Label(self)
        dummy.pack(side=label_side)
        dummy.lower()
        self.label.place(anchor='n' if label_side == 'top' else 's')

        # update the label as scale or variable changes
        self.__tracecb = self._variable.trace_variable('w', self._adjust)
        self.bind('<Configure>', self._adjust)
        self.bind('<Map>', self._adjust)


    def destroy(self):
        """Destroy this widget and possibly its associated variable."""
        try:
            self._variable.trace_vdelete('w', self.__tracecb)
        except AttributeError:
            pass
        else:
            del self._variable
        super().destroy()
        self.label = None
        self.scale = None


    def _adjust(self, *args):
        """Adjust the label position according to the scale."""
        def adjust_label():
            self.update_idletasks() # "force" scale redraw

            x, y = self.scale.coords()
            if self._label_top:
                y = self.scale.winfo_y() - self.label.winfo_reqheight()
            else:
                y = self.scale.winfo_reqheight() + self.label.winfo_reqheight()

            self.label.place_configure(x=x, y=y)

        from_ = _to_number(self.scale['from'])
        to = _to_number(self.scale['to'])
        if to < from_:
            from_, to = to, from_
        newval = self._variable.get()
        if not from_ <= newval <= to:
            # value outside range, set value back to the last valid one
            self.value = self._last_valid
            return

        self._last_valid = newval
        self.label['text'] = newval
        self.after_idle(adjust_label)

    @property
    def value(self):
        """Return current scale value."""
        return self._variable.get()

    @value.setter
    def value(self, val):
        """Set new scale value."""
        self._variable.set(val)


class OptionMenu(Menubutton):
    """Themed OptionMenu, based after tkinter's OptionMenu, which allows
    the user to select a value from a menu."""

    def __init__(self, master, variable, default=None, *values, **kwargs):
        """Construct a themed OptionMenu widget with master as the parent,
        the resource textvariable set to variable, the initially selected
        value specified by the default parameter, the menu values given by
        *values and additional keywords.

        WIDGET-SPECIFIC OPTIONS

            style: stylename
                Menubutton style.
            direction: 'above', 'below', 'left', 'right', or 'flush'
                Menubutton direction.
            command: callback
                A callback that will be invoked after selecting an item.
        """
        kw = {'textvariable': variable, 'style': kwargs.pop('style', None),
              'direction': kwargs.pop('direction', None)}
        Menubutton.__init__(self, master, **kw)
        self['menu'] = tkinter.Menu(self, tearoff=False)

        self._variable = variable
        self._callback = kwargs.pop('command', None)
        if kwargs:
            raise tkinter.TclError('unknown option -%s' % (
                next(iter(kwargs.keys()))))

        self.set_menu(default, *values)


    def __getitem__(self, item):
        if item == 'menu':
            return self.nametowidget(Menubutton.__getitem__(self, item))

        return Menubutton.__getitem__(self, item)


    def set_menu(self, default=None, *values):
        """Build a new menu of radiobuttons with *values and optionally
        a default value."""
        menu = self['menu']
        menu.delete(0, 'end')
        for val in values:
            menu.add_radiobutton(label=val,
                command=tkinter._setit(self._variable, val, self._callback),
                variable=self._variable)

        if default:
            self._variable.set(default)


    def destroy(self):
        """Destroy this widget and its associated variable."""
        try:
            del self._variable
        except AttributeError:
            pass
        super().destroy()
PK�(�Zq�
��__main__.pynu�[���"""Main entry point"""

import sys
if sys.argv[0].endswith("__main__.py"):
    sys.argv[0] = "python -m tkinter"
from . import _test as main
main()
PK�(�Z����@@font.pynu�[���# Tkinter font wrapper
#
# written by Fredrik Lundh, February 1998
#

__version__ = "0.9"

import itertools
import tkinter


# weight/slant
NORMAL = "normal"
ROMAN = "roman"
BOLD   = "bold"
ITALIC = "italic"


def nametofont(name):
    """Given the name of a tk named font, returns a Font representation.
    """
    return Font(name=name, exists=True)


class Font:
    """Represents a named font.

    Constructor options are:

    font -- font specifier (name, system font, or (family, size, style)-tuple)
    name -- name to use for this font configuration (defaults to a unique name)
    exists -- does a named font by this name already exist?
       Creates a new named font if False, points to the existing font if True.
       Raises _tkinter.TclError if the assertion is false.

       the following are ignored if font is specified:

    family -- font 'family', e.g. Courier, Times, Helvetica
    size -- font size in points
    weight -- font thickness: NORMAL, BOLD
    slant -- font slant: ROMAN, ITALIC
    underline -- font underlining: false (0), true (1)
    overstrike -- font strikeout: false (0), true (1)

    """

    counter = itertools.count(1)

    def _set(self, kw):
        options = []
        for k, v in kw.items():
            options.append("-"+k)
            options.append(str(v))
        return tuple(options)

    def _get(self, args):
        options = []
        for k in args:
            options.append("-"+k)
        return tuple(options)

    def _mkdict(self, args):
        options = {}
        for i in range(0, len(args), 2):
            options[args[i][1:]] = args[i+1]
        return options

    def __init__(self, root=None, font=None, name=None, exists=False,
                 **options):
        if not root:
            root = tkinter._get_default_root('use font')
        tk = getattr(root, 'tk', root)
        if font:
            # get actual settings corresponding to the given font
            font = tk.splitlist(tk.call("font", "actual", font))
        else:
            font = self._set(options)
        if not name:
            name = "font" + str(next(self.counter))
        self.name = name

        if exists:
            self.delete_font = False
            # confirm font exists
            if self.name not in tk.splitlist(tk.call("font", "names")):
                raise tkinter._tkinter.TclError(
                    "named font %s does not already exist" % (self.name,))
            # if font config info supplied, apply it
            if font:
                tk.call("font", "configure", self.name, *font)
        else:
            # create new font (raises TclError if the font exists)
            tk.call("font", "create", self.name, *font)
            self.delete_font = True
        self._tk = tk
        self._split = tk.splitlist
        self._call  = tk.call

    def __str__(self):
        return self.name

    def __eq__(self, other):
        if not isinstance(other, Font):
            return NotImplemented
        return self.name == other.name and self._tk == other._tk

    def __getitem__(self, key):
        return self.cget(key)

    def __setitem__(self, key, value):
        self.configure(**{key: value})

    def __del__(self):
        try:
            if self.delete_font:
                self._call("font", "delete", self.name)
        except Exception:
            pass

    def copy(self):
        "Return a distinct copy of the current font"
        return Font(self._tk, **self.actual())

    def actual(self, option=None, displayof=None):
        "Return actual font attributes"
        args = ()
        if displayof:
            args = ('-displayof', displayof)
        if option:
            args = args + ('-' + option, )
            return self._call("font", "actual", self.name, *args)
        else:
            return self._mkdict(
                self._split(self._call("font", "actual", self.name, *args)))

    def cget(self, option):
        "Get font attribute"
        return self._call("font", "config", self.name, "-"+option)

    def config(self, **options):
        "Modify font attributes"
        if options:
            self._call("font", "config", self.name,
                  *self._set(options))
        else:
            return self._mkdict(
                self._split(self._call("font", "config", self.name)))

    configure = config

    def measure(self, text, displayof=None):
        "Return text width"
        args = (text,)
        if displayof:
            args = ('-displayof', displayof, text)
        return self._tk.getint(self._call("font", "measure", self.name, *args))

    def metrics(self, *options, **kw):
        """Return font metrics.

        For best performance, create a dummy widget
        using this font before calling this method."""
        args = ()
        displayof = kw.pop('displayof', None)
        if displayof:
            args = ('-displayof', displayof)
        if options:
            args = args + self._get(options)
            return self._tk.getint(
                self._call("font", "metrics", self.name, *args))
        else:
            res = self._split(self._call("font", "metrics", self.name, *args))
            options = {}
            for i in range(0, len(res), 2):
                options[res[i][1:]] = self._tk.getint(res[i+1])
            return options


def families(root=None, displayof=None):
    "Get font families (as a tuple)"
    if not root:
        root = tkinter._get_default_root('use font.families()')
    args = ()
    if displayof:
        args = ('-displayof', displayof)
    return root.tk.splitlist(root.tk.call("font", "families", *args))


def names(root=None):
    "Get names of defined fonts (as a tuple)"
    if not root:
        root = tkinter._get_default_root('use font.names()')
    return root.tk.splitlist(root.tk.call("font", "names"))


# --------------------------------------------------------------------
# test stuff

if __name__ == "__main__":

    root = tkinter.Tk()

    # create a font
    f = Font(family="times", size=30, weight=NORMAL)

    print(f.actual())
    print(f.actual("family"))
    print(f.actual("weight"))

    print(f.config())
    print(f.cget("family"))
    print(f.cget("weight"))

    print(names())

    print(f.measure("hello"), f.metrics("linespace"))

    print(f.metrics(displayof=root))

    f = Font(font=("Courier", 20, "bold"))
    print(f.measure("hello"), f.metrics("linespace", displayof=root))

    w = tkinter.Label(root, text="Hello, world", font=f)
    w.pack()

    w = tkinter.Button(root, text="Quit!", command=root.destroy)
    w.pack()

    fb = Font(font=w["font"]).copy()
    fb.config(weight=BOLD)

    w.config(font=fb)

    tkinter.mainloop()
PK�(�ZU���}}
messagebox.pynu�[���# tk common message boxes
#
# this module provides an interface to the native message boxes
# available in Tk 4.2 and newer.
#
# written by Fredrik Lundh, May 1997
#

#
# options (all have default values):
#
# - default: which button to make default (one of the reply codes)
#
# - icon: which icon to display (see below)
#
# - message: the message to display
#
# - parent: which window to place the dialog on top of
#
# - title: dialog title
#
# - type: dialog type; that is, which buttons to display (see below)
#

from tkinter.commondialog import Dialog

#
# constants

# icons
ERROR = "error"
INFO = "info"
QUESTION = "question"
WARNING = "warning"

# types
ABORTRETRYIGNORE = "abortretryignore"
OK = "ok"
OKCANCEL = "okcancel"
RETRYCANCEL = "retrycancel"
YESNO = "yesno"
YESNOCANCEL = "yesnocancel"

# replies
ABORT = "abort"
RETRY = "retry"
IGNORE = "ignore"
OK = "ok"
CANCEL = "cancel"
YES = "yes"
NO = "no"


#
# message dialog class

class Message(Dialog):
    "A message box"

    command  = "tk_messageBox"


#
# convenience stuff

# Rename _icon and _type options to allow overriding them in options
def _show(title=None, message=None, _icon=None, _type=None, **options):
    if _icon and "icon" not in options:    options["icon"] = _icon
    if _type and "type" not in options:    options["type"] = _type
    if title:   options["title"] = title
    if message: options["message"] = message
    res = Message(**options).show()
    # In some Tcl installations, yes/no is converted into a boolean.
    if isinstance(res, bool):
        if res:
            return YES
        return NO
    # In others we get a Tcl_Obj.
    return str(res)


def showinfo(title=None, message=None, **options):
    "Show an info message"
    return _show(title, message, INFO, OK, **options)


def showwarning(title=None, message=None, **options):
    "Show a warning message"
    return _show(title, message, WARNING, OK, **options)


def showerror(title=None, message=None, **options):
    "Show an error message"
    return _show(title, message, ERROR, OK, **options)


def askquestion(title=None, message=None, **options):
    "Ask a question"
    return _show(title, message, QUESTION, YESNO, **options)


def askokcancel(title=None, message=None, **options):
    "Ask if operation should proceed; return true if the answer is ok"
    s = _show(title, message, QUESTION, OKCANCEL, **options)
    return s == OK


def askyesno(title=None, message=None, **options):
    "Ask a question; return true if the answer is yes"
    s = _show(title, message, QUESTION, YESNO, **options)
    return s == YES


def askyesnocancel(title=None, message=None, **options):
    "Ask a question; return true if the answer is yes, None if cancelled."
    s = _show(title, message, QUESTION, YESNOCANCEL, **options)
    # s might be a Tcl index object, so convert it to a string
    s = str(s)
    if s == CANCEL:
        return None
    return s == YES


def askretrycancel(title=None, message=None, **options):
    "Ask if operation should be retried; return true if the answer is yes"
    s = _show(title, message, WARNING, RETRYCANCEL, **options)
    return s == RETRY


# --------------------------------------------------------------------
# test stuff

if __name__ == "__main__":

    print("info", showinfo("Spam", "Egg Information"))
    print("warning", showwarning("Spam", "Egg Warning"))
    print("error", showerror("Spam", "Egg Alert"))
    print("question", askquestion("Spam", "Question?"))
    print("proceed", askokcancel("Spam", "Proceed?"))
    print("yes/no", askyesno("Spam", "Got it?"))
    print("yes/no/cancel", askyesnocancel("Spam", "Want it?"))
    print("try again", askretrycancel("Spam", "Try again?"))
PK�(�Zs��8�8
filedialog.pynu�[���"""File selection dialog classes.

Classes:

- FileDialog
- LoadFileDialog
- SaveFileDialog

This module also presents tk common file dialogues, it provides interfaces
to the native file dialogues available in Tk 4.2 and newer, and the
directory dialogue available in Tk 8.3 and newer.
These interfaces were written by Fredrik Lundh, May 1997.
"""

from tkinter import *
from tkinter.dialog import Dialog
from tkinter import commondialog
from tkinter.simpledialog import _setup_dialog

import os
import fnmatch


dialogstates = {}


class FileDialog:

    """Standard file selection dialog -- no checks on selected file.

    Usage:

        d = FileDialog(master)
        fname = d.go(dir_or_file, pattern, default, key)
        if fname is None: ...canceled...
        else: ...open file...

    All arguments to go() are optional.

    The 'key' argument specifies a key in the global dictionary
    'dialogstates', which keeps track of the values for the directory
    and pattern arguments, overriding the values passed in (it does
    not keep track of the default argument!).  If no key is specified,
    the dialog keeps no memory of previous state.  Note that memory is
    kept even when the dialog is canceled.  (All this emulates the
    behavior of the Macintosh file selection dialogs.)

    """

    title = "File Selection Dialog"

    def __init__(self, master, title=None):
        if title is None: title = self.title
        self.master = master
        self.directory = None

        self.top = Toplevel(master)
        self.top.title(title)
        self.top.iconname(title)
        _setup_dialog(self.top)

        self.botframe = Frame(self.top)
        self.botframe.pack(side=BOTTOM, fill=X)

        self.selection = Entry(self.top)
        self.selection.pack(side=BOTTOM, fill=X)
        self.selection.bind('<Return>', self.ok_event)

        self.filter = Entry(self.top)
        self.filter.pack(side=TOP, fill=X)
        self.filter.bind('<Return>', self.filter_command)

        self.midframe = Frame(self.top)
        self.midframe.pack(expand=YES, fill=BOTH)

        self.filesbar = Scrollbar(self.midframe)
        self.filesbar.pack(side=RIGHT, fill=Y)
        self.files = Listbox(self.midframe, exportselection=0,
                             yscrollcommand=(self.filesbar, 'set'))
        self.files.pack(side=RIGHT, expand=YES, fill=BOTH)
        btags = self.files.bindtags()
        self.files.bindtags(btags[1:] + btags[:1])
        self.files.bind('<ButtonRelease-1>', self.files_select_event)
        self.files.bind('<Double-ButtonRelease-1>', self.files_double_event)
        self.filesbar.config(command=(self.files, 'yview'))

        self.dirsbar = Scrollbar(self.midframe)
        self.dirsbar.pack(side=LEFT, fill=Y)
        self.dirs = Listbox(self.midframe, exportselection=0,
                            yscrollcommand=(self.dirsbar, 'set'))
        self.dirs.pack(side=LEFT, expand=YES, fill=BOTH)
        self.dirsbar.config(command=(self.dirs, 'yview'))
        btags = self.dirs.bindtags()
        self.dirs.bindtags(btags[1:] + btags[:1])
        self.dirs.bind('<ButtonRelease-1>', self.dirs_select_event)
        self.dirs.bind('<Double-ButtonRelease-1>', self.dirs_double_event)

        self.ok_button = Button(self.botframe,
                                 text="OK",
                                 command=self.ok_command)
        self.ok_button.pack(side=LEFT)
        self.filter_button = Button(self.botframe,
                                    text="Filter",
                                    command=self.filter_command)
        self.filter_button.pack(side=LEFT, expand=YES)
        self.cancel_button = Button(self.botframe,
                                    text="Cancel",
                                    command=self.cancel_command)
        self.cancel_button.pack(side=RIGHT)

        self.top.protocol('WM_DELETE_WINDOW', self.cancel_command)
        # XXX Are the following okay for a general audience?
        self.top.bind('<Alt-w>', self.cancel_command)
        self.top.bind('<Alt-W>', self.cancel_command)

    def go(self, dir_or_file=os.curdir, pattern="*", default="", key=None):
        if key and key in dialogstates:
            self.directory, pattern = dialogstates[key]
        else:
            dir_or_file = os.path.expanduser(dir_or_file)
            if os.path.isdir(dir_or_file):
                self.directory = dir_or_file
            else:
                self.directory, default = os.path.split(dir_or_file)
        self.set_filter(self.directory, pattern)
        self.set_selection(default)
        self.filter_command()
        self.selection.focus_set()
        self.top.wait_visibility() # window needs to be visible for the grab
        self.top.grab_set()
        self.how = None
        self.master.mainloop()          # Exited by self.quit(how)
        if key:
            directory, pattern = self.get_filter()
            if self.how:
                directory = os.path.dirname(self.how)
            dialogstates[key] = directory, pattern
        self.top.destroy()
        return self.how

    def quit(self, how=None):
        self.how = how
        self.master.quit()              # Exit mainloop()

    def dirs_double_event(self, event):
        self.filter_command()

    def dirs_select_event(self, event):
        dir, pat = self.get_filter()
        subdir = self.dirs.get('active')
        dir = os.path.normpath(os.path.join(self.directory, subdir))
        self.set_filter(dir, pat)

    def files_double_event(self, event):
        self.ok_command()

    def files_select_event(self, event):
        file = self.files.get('active')
        self.set_selection(file)

    def ok_event(self, event):
        self.ok_command()

    def ok_command(self):
        self.quit(self.get_selection())

    def filter_command(self, event=None):
        dir, pat = self.get_filter()
        try:
            names = os.listdir(dir)
        except OSError:
            self.master.bell()
            return
        self.directory = dir
        self.set_filter(dir, pat)
        names.sort()
        subdirs = [os.pardir]
        matchingfiles = []
        for name in names:
            fullname = os.path.join(dir, name)
            if os.path.isdir(fullname):
                subdirs.append(name)
            elif fnmatch.fnmatch(name, pat):
                matchingfiles.append(name)
        self.dirs.delete(0, END)
        for name in subdirs:
            self.dirs.insert(END, name)
        self.files.delete(0, END)
        for name in matchingfiles:
            self.files.insert(END, name)
        head, tail = os.path.split(self.get_selection())
        if tail == os.curdir: tail = ''
        self.set_selection(tail)

    def get_filter(self):
        filter = self.filter.get()
        filter = os.path.expanduser(filter)
        if filter[-1:] == os.sep or os.path.isdir(filter):
            filter = os.path.join(filter, "*")
        return os.path.split(filter)

    def get_selection(self):
        file = self.selection.get()
        file = os.path.expanduser(file)
        return file

    def cancel_command(self, event=None):
        self.quit()

    def set_filter(self, dir, pat):
        if not os.path.isabs(dir):
            try:
                pwd = os.getcwd()
            except OSError:
                pwd = None
            if pwd:
                dir = os.path.join(pwd, dir)
                dir = os.path.normpath(dir)
        self.filter.delete(0, END)
        self.filter.insert(END, os.path.join(dir or os.curdir, pat or "*"))

    def set_selection(self, file):
        self.selection.delete(0, END)
        self.selection.insert(END, os.path.join(self.directory, file))


class LoadFileDialog(FileDialog):

    """File selection dialog which checks that the file exists."""

    title = "Load File Selection Dialog"

    def ok_command(self):
        file = self.get_selection()
        if not os.path.isfile(file):
            self.master.bell()
        else:
            self.quit(file)


class SaveFileDialog(FileDialog):

    """File selection dialog which checks that the file may be created."""

    title = "Save File Selection Dialog"

    def ok_command(self):
        file = self.get_selection()
        if os.path.exists(file):
            if os.path.isdir(file):
                self.master.bell()
                return
            d = Dialog(self.top,
                       title="Overwrite Existing File Question",
                       text="Overwrite existing file %r?" % (file,),
                       bitmap='questhead',
                       default=1,
                       strings=("Yes", "Cancel"))
            if d.num != 0:
                return
        else:
            head, tail = os.path.split(file)
            if not os.path.isdir(head):
                self.master.bell()
                return
        self.quit(file)


# For the following classes and modules:
#
# options (all have default values):
#
# - defaultextension: added to filename if not explicitly given
#
# - filetypes: sequence of (label, pattern) tuples.  the same pattern
#   may occur with several patterns.  use "*" as pattern to indicate
#   all files.
#
# - initialdir: initial directory.  preserved by dialog instance.
#
# - initialfile: initial file (ignored by the open dialog).  preserved
#   by dialog instance.
#
# - parent: which window to place the dialog on top of
#
# - title: dialog title
#
# - multiple: if true user may select more than one file
#
# options for the directory chooser:
#
# - initialdir, parent, title: see above
#
# - mustexist: if true, user must pick an existing directory
#


class _Dialog(commondialog.Dialog):

    def _fixoptions(self):
        try:
            # make sure "filetypes" is a tuple
            self.options["filetypes"] = tuple(self.options["filetypes"])
        except KeyError:
            pass

    def _fixresult(self, widget, result):
        if result:
            # keep directory and filename until next time
            # convert Tcl path objects to strings
            try:
                result = result.string
            except AttributeError:
                # it already is a string
                pass
            path, file = os.path.split(result)
            self.options["initialdir"] = path
            self.options["initialfile"] = file
        self.filename = result # compatibility
        return result


#
# file dialogs

class Open(_Dialog):
    "Ask for a filename to open"

    command = "tk_getOpenFile"

    def _fixresult(self, widget, result):
        if isinstance(result, tuple):
            # multiple results:
            result = tuple([getattr(r, "string", r) for r in result])
            if result:
                path, file = os.path.split(result[0])
                self.options["initialdir"] = path
                # don't set initialfile or filename, as we have multiple of these
            return result
        if not widget.tk.wantobjects() and "multiple" in self.options:
            # Need to split result explicitly
            return self._fixresult(widget, widget.tk.splitlist(result))
        return _Dialog._fixresult(self, widget, result)


class SaveAs(_Dialog):
    "Ask for a filename to save as"

    command = "tk_getSaveFile"


# the directory dialog has its own _fix routines.
class Directory(commondialog.Dialog):
    "Ask for a directory"

    command = "tk_chooseDirectory"

    def _fixresult(self, widget, result):
        if result:
            # convert Tcl path objects to strings
            try:
                result = result.string
            except AttributeError:
                # it already is a string
                pass
            # keep directory until next time
            self.options["initialdir"] = result
        self.directory = result # compatibility
        return result

#
# convenience stuff


def askopenfilename(**options):
    "Ask for a filename to open"

    return Open(**options).show()


def asksaveasfilename(**options):
    "Ask for a filename to save as"

    return SaveAs(**options).show()


def askopenfilenames(**options):
    """Ask for multiple filenames to open

    Returns a list of filenames or empty list if
    cancel button selected
    """
    options["multiple"]=1
    return Open(**options).show()

# FIXME: are the following  perhaps a bit too convenient?


def askopenfile(mode = "r", **options):
    "Ask for a filename to open, and returned the opened file"

    filename = Open(**options).show()
    if filename:
        return open(filename, mode)
    return None


def askopenfiles(mode = "r", **options):
    """Ask for multiple filenames and return the open file
    objects

    returns a list of open file objects or an empty list if
    cancel selected
    """

    files = askopenfilenames(**options)
    if files:
        ofiles=[]
        for filename in files:
            ofiles.append(open(filename, mode))
        files=ofiles
    return files


def asksaveasfile(mode = "w", **options):
    "Ask for a filename to save as, and returned the opened file"

    filename = SaveAs(**options).show()
    if filename:
        return open(filename, mode)
    return None


def askdirectory (**options):
    "Ask for a directory, and return the file name"
    return Directory(**options).show()


# --------------------------------------------------------------------
# test stuff

def test():
    """Simple test program."""
    root = Tk()
    root.withdraw()
    fd = LoadFileDialog(root)
    loadfile = fd.go(key="test")
    fd = SaveFileDialog(root)
    savefile = fd.go(key="test")
    print(loadfile, savefile)

    # Since the file name may contain non-ASCII characters, we need
    # to find an encoding that likely supports the file name, and
    # displays correctly on the terminal.

    # Start off with UTF-8
    enc = "utf-8"
    import sys

    # See whether CODESET is defined
    try:
        import locale
        locale.setlocale(locale.LC_ALL,'')
        enc = locale.nl_langinfo(locale.CODESET)
    except (ImportError, AttributeError):
        pass

    # dialog for opening files

    openfilename=askopenfilename(filetypes=[("all files", "*")])
    try:
        fp=open(openfilename,"r")
        fp.close()
    except:
        print("Could not open File: ")
        print(sys.exc_info()[1])

    print("open", openfilename.encode(enc))

    # dialog for saving files

    saveasfilename=asksaveasfilename()
    print("saveas", saveasfilename.encode(enc))


if __name__ == '__main__':
    test()
PK�(�Z&���-�-simpledialog.pynu�[���#
# An Introduction to Tkinter
#
# Copyright (c) 1997 by Fredrik Lundh
#
# This copyright applies to Dialog, askinteger, askfloat and asktring
#
# fredrik@pythonware.com
# http://www.pythonware.com
#
"""This modules handles dialog boxes.

It contains the following public symbols:

SimpleDialog -- A simple but flexible modal dialog box

Dialog -- a base class for dialogs

askinteger -- get an integer from the user

askfloat -- get a float from the user

askstring -- get a string from the user
"""

from tkinter import *
from tkinter import messagebox, _get_default_root


class SimpleDialog:

    def __init__(self, master,
                 text='', buttons=[], default=None, cancel=None,
                 title=None, class_=None):
        if class_:
            self.root = Toplevel(master, class_=class_)
        else:
            self.root = Toplevel(master)
        if title:
            self.root.title(title)
            self.root.iconname(title)

        _setup_dialog(self.root)

        self.message = Message(self.root, text=text, aspect=400)
        self.message.pack(expand=1, fill=BOTH)
        self.frame = Frame(self.root)
        self.frame.pack()
        self.num = default
        self.cancel = cancel
        self.default = default
        self.root.bind('<Return>', self.return_event)
        for num in range(len(buttons)):
            s = buttons[num]
            b = Button(self.frame, text=s,
                       command=(lambda self=self, num=num: self.done(num)))
            if num == default:
                b.config(relief=RIDGE, borderwidth=8)
            b.pack(side=LEFT, fill=BOTH, expand=1)
        self.root.protocol('WM_DELETE_WINDOW', self.wm_delete_window)
        self._set_transient(master)

    def _set_transient(self, master, relx=0.5, rely=0.3):
        widget = self.root
        widget.withdraw() # Remain invisible while we figure out the geometry
        widget.transient(master)
        widget.update_idletasks() # Actualize geometry information
        if master.winfo_ismapped():
            m_width = master.winfo_width()
            m_height = master.winfo_height()
            m_x = master.winfo_rootx()
            m_y = master.winfo_rooty()
        else:
            m_width = master.winfo_screenwidth()
            m_height = master.winfo_screenheight()
            m_x = m_y = 0
        w_width = widget.winfo_reqwidth()
        w_height = widget.winfo_reqheight()
        x = m_x + (m_width - w_width) * relx
        y = m_y + (m_height - w_height) * rely
        if x+w_width > master.winfo_screenwidth():
            x = master.winfo_screenwidth() - w_width
        elif x < 0:
            x = 0
        if y+w_height > master.winfo_screenheight():
            y = master.winfo_screenheight() - w_height
        elif y < 0:
            y = 0
        widget.geometry("+%d+%d" % (x, y))
        widget.deiconify() # Become visible at the desired location

    def go(self):
        self.root.wait_visibility()
        self.root.grab_set()
        self.root.mainloop()
        self.root.destroy()
        return self.num

    def return_event(self, event):
        if self.default is None:
            self.root.bell()
        else:
            self.done(self.default)

    def wm_delete_window(self):
        if self.cancel is None:
            self.root.bell()
        else:
            self.done(self.cancel)

    def done(self, num):
        self.num = num
        self.root.quit()


class Dialog(Toplevel):

    '''Class to open dialogs.

    This class is intended as a base class for custom dialogs
    '''

    def __init__(self, parent, title = None):
        '''Initialize a dialog.

        Arguments:

            parent -- a parent window (the application window)

            title -- the dialog title
        '''
        master = parent
        if not master:
            master = _get_default_root('create dialog window')

        Toplevel.__init__(self, master)

        self.withdraw() # remain invisible for now
        # If the parent is not viewable, don't
        # make the child transient, or else it
        # would be opened withdrawn
        if parent is not None and parent.winfo_viewable():
            self.transient(parent)

        if title:
            self.title(title)

        _setup_dialog(self)

        self.parent = parent

        self.result = None

        body = Frame(self)
        self.initial_focus = self.body(body)
        body.pack(padx=5, pady=5)

        self.buttonbox()

        if not self.initial_focus:
            self.initial_focus = self

        self.protocol("WM_DELETE_WINDOW", self.cancel)

        if parent is not None:
            self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
                                      parent.winfo_rooty()+50))

        self.deiconify() # become visible now

        self.initial_focus.focus_set()

        # wait for window to appear on screen before calling grab_set
        self.wait_visibility()
        self.grab_set()
        self.wait_window(self)

    def destroy(self):
        '''Destroy the window'''
        self.initial_focus = None
        Toplevel.destroy(self)

    #
    # construction hooks

    def body(self, master):
        '''create dialog body.

        return widget that should have initial focus.
        This method should be overridden, and is called
        by the __init__ method.
        '''
        pass

    def buttonbox(self):
        '''add standard button box.

        override if you do not want the standard buttons
        '''

        box = Frame(self)

        w = Button(box, text="OK", width=10, command=self.ok, default=ACTIVE)
        w.pack(side=LEFT, padx=5, pady=5)
        w = Button(box, text="Cancel", width=10, command=self.cancel)
        w.pack(side=LEFT, padx=5, pady=5)

        self.bind("<Return>", self.ok)
        self.bind("<Escape>", self.cancel)

        box.pack()

    #
    # standard button semantics

    def ok(self, event=None):

        if not self.validate():
            self.initial_focus.focus_set() # put focus back
            return

        self.withdraw()
        self.update_idletasks()

        try:
            self.apply()
        finally:
            self.cancel()

    def cancel(self, event=None):

        # put focus back to the parent window
        if self.parent is not None:
            self.parent.focus_set()
        self.destroy()

    #
    # command hooks

    def validate(self):
        '''validate the data

        This method is called automatically to validate the data before the
        dialog is destroyed. By default, it always validates OK.
        '''

        return 1 # override

    def apply(self):
        '''process the data

        This method is called automatically to process the data, *after*
        the dialog is destroyed. By default, it does nothing.
        '''

        pass # override


def _setup_dialog(w):
    if w._windowingsystem == "aqua":
        w.tk.call("::tk::unsupported::MacWindowStyle", "style",
                  w, "moveableModal", "")
    elif w._windowingsystem == "x11":
        w.wm_attributes("-type", "dialog")

# --------------------------------------------------------------------
# convenience dialogues

class _QueryDialog(Dialog):

    def __init__(self, title, prompt,
                 initialvalue=None,
                 minvalue = None, maxvalue = None,
                 parent = None):

        self.prompt   = prompt
        self.minvalue = minvalue
        self.maxvalue = maxvalue

        self.initialvalue = initialvalue

        Dialog.__init__(self, parent, title)

    def destroy(self):
        self.entry = None
        Dialog.destroy(self)

    def body(self, master):

        w = Label(master, text=self.prompt, justify=LEFT)
        w.grid(row=0, padx=5, sticky=W)

        self.entry = Entry(master, name="entry")
        self.entry.grid(row=1, padx=5, sticky=W+E)

        if self.initialvalue is not None:
            self.entry.insert(0, self.initialvalue)
            self.entry.select_range(0, END)

        return self.entry

    def validate(self):
        try:
            result = self.getresult()
        except ValueError:
            messagebox.showwarning(
                "Illegal value",
                self.errormessage + "\nPlease try again",
                parent = self
            )
            return 0

        if self.minvalue is not None and result < self.minvalue:
            messagebox.showwarning(
                "Too small",
                "The allowed minimum value is %s. "
                "Please try again." % self.minvalue,
                parent = self
            )
            return 0

        if self.maxvalue is not None and result > self.maxvalue:
            messagebox.showwarning(
                "Too large",
                "The allowed maximum value is %s. "
                "Please try again." % self.maxvalue,
                parent = self
            )
            return 0

        self.result = result

        return 1


class _QueryInteger(_QueryDialog):
    errormessage = "Not an integer."

    def getresult(self):
        return self.getint(self.entry.get())


def askinteger(title, prompt, **kw):
    '''get an integer from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is an integer
    '''
    d = _QueryInteger(title, prompt, **kw)
    return d.result


class _QueryFloat(_QueryDialog):
    errormessage = "Not a floating point value."

    def getresult(self):
        return self.getdouble(self.entry.get())


def askfloat(title, prompt, **kw):
    '''get a float from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a float
    '''
    d = _QueryFloat(title, prompt, **kw)
    return d.result


class _QueryString(_QueryDialog):
    def __init__(self, *args, **kw):
        if "show" in kw:
            self.__show = kw["show"]
            del kw["show"]
        else:
            self.__show = None
        _QueryDialog.__init__(self, *args, **kw)

    def body(self, master):
        entry = _QueryDialog.body(self, master)
        if self.__show is not None:
            entry.configure(show=self.__show)
        return entry

    def getresult(self):
        return self.entry.get()


def askstring(title, prompt, **kw):
    '''get a string from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a string
    '''
    d = _QueryString(title, prompt, **kw)
    return d.result


if __name__ == '__main__':

    def test():
        root = Tk()
        def doit(root=root):
            d = SimpleDialog(root,
                         text="This is a test dialog.  "
                              "Would this have been an actual dialog, "
                              "the buttons below would have been glowing "
                              "in soft pink light.\n"
                              "Do you believe this?",
                         buttons=["Yes", "No", "Cancel"],
                         default=0,
                         cancel=2,
                         title="Test Dialog")
            print(d.go())
            print(askinteger("Spam", "Egg count", initialvalue=12*12))
            print(askfloat("Spam", "Egg weight\n(in tons)", minvalue=1,
                           maxvalue=100))
            print(askstring("Spam", "Egg label"))
        t = Button(root, text='Test', command=doit)
        t.pack()
        q = Button(root, text='Quit', command=t.quit)
        q.pack()
        t.mainloop()

    test()
PK�(�Zj�xx*__pycache__/constants.cpython-38.opt-1.pycnu�[���U

e5d��@s8dZZZdZZZdZdZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?d<Z@d=ZAd>ZBd?ZCd@ZDdAZEdBZFdCZGdDZHdEZIdFZJdGZKdHZLdIS)J���n�s�w�eZnw�sw�neZse�nsZewZnsew�centerZnone�x�yZboth�left�top�rightZbottomZraisedZsunkenZflatZridgeZgrooveZsolidZ
horizontalZvertical�numeric�charZwordZbaselineZinsideZoutsideZselz	sel.firstzsel.last�end�insertZcurrentZanchor�allZnormalZdisabledZactiveZhiddenZcascadeZcheckbuttonZcommandZradiobuttonZ	separatorZsingleZbrowseZmultipleZextendedZdotboxZ	underlineZpiesliceZchordZarc�firstZlastZbuttZ
projecting�roundZbevelZmiterZmovetoZscrollZunitsZpagesN)MZNOZFALSEZOFFZYESZTRUEZON�N�S�W�EZNWZSWZNEZSEZNSZEWZNSEWZCENTERZNONE�X�YZBOTHZLEFTZTOPZRIGHTZBOTTOMZRAISEDZSUNKENZFLATZRIDGEZGROOVEZSOLIDZ
HORIZONTALZVERTICALZNUMERICZCHARZWORDZBASELINEZINSIDEZOUTSIDEZSELZ	SEL_FIRSTZSEL_LASTZENDZINSERTZCURRENTZANCHORZALLZNORMALZDISABLEDZACTIVEZHIDDENZCASCADEZCHECKBUTTONZCOMMANDZRADIOBUTTONZ	SEPARATORZSINGLEZBROWSEZMULTIPLEZEXTENDEDZDOTBOXZ	UNDERLINEZPIESLICEZCHORDZARCZFIRSTZLASTZBUTTZ
PROJECTINGZROUNDZBEVELZMITERZMOVETOZSCROLLZUNITSZPAGES�rr�)/usr/lib64/python3.8/tkinter/constants.py�<module>s�PK�(�Z��00%__pycache__/filedialog.cpython-38.pycnu�[���U

e5d�8�@sdZddlTddlmZddlmZddlmZddlZddlZiZ	Gdd�d�Z
Gd	d
�d
e
�ZGdd�de
�ZGd
d�dej�Z
Gdd�de
�ZGdd�de
�ZGdd�dej�Zdd�Zdd�Zdd�Zd(dd�Zd)dd�Zd*d!d"�Zd#d$�Zd%d&�Zed'k�re�dS)+aUFile selection dialog classes.

Classes:

- FileDialog
- LoadFileDialog
- SaveFileDialog

This module also presents tk common file dialogues, it provides interfaces
to the native file dialogues available in Tk 4.2 and newer, and the
directory dialogue available in Tk 8.3 and newer.
These interfaces were written by Fredrik Lundh, May 1997.
�)�*)�Dialog)�commondialog)�
_setup_dialogNc@s�eZdZdZdZd$dd�Zejdddfdd	�Zd%d
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd&dd�Zdd�Zdd�Zd'dd�Zd d!�Zd"d#�ZdS)(�
FileDialoga�Standard file selection dialog -- no checks on selected file.

    Usage:

        d = FileDialog(master)
        fname = d.go(dir_or_file, pattern, default, key)
        if fname is None: ...canceled...
        else: ...open file...

    All arguments to go() are optional.

    The 'key' argument specifies a key in the global dictionary
    'dialogstates', which keeps track of the values for the directory
    and pattern arguments, overriding the values passed in (it does
    not keep track of the default argument!).  If no key is specified,
    the dialog keeps no memory of previous state.  Note that memory is
    kept even when the dialog is canceled.  (All this emulates the
    behavior of the Macintosh file selection dialogs.)

    zFile Selection DialogNcCs�|dkr|j}||_d|_t|�|_|j�|�|j�|�t|j�t|j�|_|jj	t
td�t|j�|_
|j
j	t
td�|j
�d|j�t|j�|_|jj	ttd�|j�d|j�t|j�|_|jj	ttd�t|j�|_|jj	ttd�t|jd|jdfd�|_|jj	tttd�|j��}|j�|dd�|dd��|j�d	|j�|j�d
|j�|jj|jdfd�t|j�|_ |j j	t!td�t|jd|j dfd�|_"|j"j	t!ttd�|j j|j"dfd�|j"��}|j"�|dd�|dd��|j"�d	|j#�|j"�d
|j$�t%|jd
|j&d�|_'|j'j	t!d�t%|jd|jd�|_(|j(j	t!td�t%|jd|j)d�|_*|j*j	td�|j�+d|j)�|j�d|j)�|j�d|j)�dS)N)�side�fillz<Return>)�expandrr�set)ZexportselectionZyscrollcommand)rr	r�z<ButtonRelease-1>z<Double-ButtonRelease-1>Zyview)�commandZOK)�textr)rZFilter)rr	�CancelZWM_DELETE_WINDOWz<Alt-w>z<Alt-W>),�title�master�	directoryZToplevel�topZiconnamerZFrameZbotframeZpackZBOTTOM�XZEntry�	selectionZbind�ok_event�filterZTOP�filter_commandZmidframeZYESZBOTHZ	ScrollbarZfilesbarZRIGHT�YZListbox�filesZbindtags�files_select_event�files_double_eventZconfigZdirsbarZLEFT�dirs�dirs_select_event�dirs_double_eventZButton�
ok_commandZ	ok_buttonZ
filter_button�cancel_commandZ
cancel_buttonZprotocol)�selfrrZbtags�r"�*/usr/lib64/python3.8/tkinter/filedialog.py�__init__4st

�
 �
 ���zFileDialog.__init__r�cCs�|r|tkrt|\|_}n2tj�|�}tj�|�r<||_ntj�|�\|_}|�|j|�|�|�|�	�|j
��|j�
�|j��d|_|j��|r�|��\}}|jr�tj�|j�}||ft|<|j��|jS�N)�dialogstatesr�os�path�
expanduser�isdir�split�
set_filter�
set_selectionrrZ	focus_setrZwait_visibilityZgrab_set�howrZmainloop�
get_filter�dirnameZdestroy)r!Zdir_or_file�pattern�default�keyrr"r"r#�gots*





z
FileDialog.gocCs||_|j��dSr&)r/r�quit)r!r/r"r"r#r6�szFileDialog.quitcCs|��dSr&)r�r!�eventr"r"r#r�szFileDialog.dirs_double_eventcCs@|��\}}|j�d�}tj�tj�|j|��}|�||�dS�NZactive)	r0r�getr(r)�normpath�joinrr-)r!r8�dir�patZsubdirr"r"r#r�szFileDialog.dirs_select_eventcCs|��dSr&�rr7r"r"r#r�szFileDialog.files_double_eventcCs|j�d�}|�|�dSr9)rr:r.)r!r8�filer"r"r#r�szFileDialog.files_select_eventcCs|��dSr&r?r7r"r"r#r�szFileDialog.ok_eventcCs|�|���dSr&)r6�
get_selection�r!r"r"r#r�szFileDialog.ok_commandcCs&|��\}}zt�|�}Wn tk
r:|j��YdSX||_|�||�|��tj	g}g}|D]@}tj
�||�}tj
�|�r�|�
|�qft�||�rf|�
|�qf|j�dt�|D]}|j�t|�q�|j�dt�|D]}|j�t|�q�tj
�|���\}	}
|
tjk�rd}
|�|
�dS)Nrr%)r0r(�listdir�OSErrorr�bellrr-�sort�pardirr)r<r+�append�fnmatchr�delete�END�insertrr,rA�curdirr.)r!r8r=r>�namesZsubdirsZ
matchingfiles�name�fullname�head�tailr"r"r#r�s6
zFileDialog.filter_commandcCsN|j��}tj�|�}|dd�tjks4tj�|�rBtj�|d�}tj�|�S)N���r)	rr:r(r)r*�sepr+r<r,)r!rr"r"r#r0�s

zFileDialog.get_filtercCs|j��}tj�|�}|Sr&)rr:r(r)r*�r!r@r"r"r#rA�s
zFileDialog.get_selectioncCs|��dSr&)r6r7r"r"r#r �szFileDialog.cancel_commandcCs�tj�|�sPzt��}Wntk
r0d}YnX|rPtj�||�}tj�|�}|j�dt	�|j�
t	tj�|pttj|pzd��dS)Nrr)r(r)�isabs�getcwdrDr<r;rrJrKrLrM)r!r=r>�pwdr"r"r#r-�s
zFileDialog.set_filtercCs,|j�dt�|j�ttj�|j|��dS)Nr)rrJrKrLr(r)r<rrUr"r"r#r.�szFileDialog.set_selection)N)N)N)N)�__name__�
__module__�__qualname__�__doc__rr$r(rMr5r6rrrrrrrr0rAr r-r.r"r"r"r#rs"
@


rc@seZdZdZdZdd�ZdS)�LoadFileDialogz8File selection dialog which checks that the file exists.zLoad File Selection DialogcCs.|��}tj�|�s |j��n
|�|�dSr&)rAr(r)�isfilerrEr6rUr"r"r#r�szLoadFileDialog.ok_commandN�rYrZr[r\rrr"r"r"r#r]�sr]c@seZdZdZdZdd�ZdS)�SaveFileDialogz@File selection dialog which checks that the file may be created.zSave File Selection DialogcCs�|��}tj�|�rZtj�|�r.|j��dSt|jdd|fdddd�}|j	dkr�dSn*tj�
|�\}}tj�|�s�|j��dS|�|�dS)Nz Overwrite Existing File QuestionzOverwrite existing file %r?Z	questheadr)ZYesr)rr
Zbitmapr3Zstringsr)rAr(r)�existsr+rrErrZnumr,r6)r!r@�drQrRr"r"r#r�s&
�

zSaveFileDialog.ok_commandNr_r"r"r"r#r`�sr`c@seZdZdd�Zdd�ZdS)�_DialogcCs2zt|jd�|jd<Wntk
r,YnXdS)N�	filetypes)�tuple�options�KeyErrorrBr"r"r#�_fixoptions,sz_Dialog._fixoptionscCsR|rHz
|j}Wntk
r"YnXtj�|�\}}||jd<||jd<||_|S)N�
initialdirZinitialfile)�string�AttributeErrorr(r)r,rf�filename�r!�widget�resultr)r@r"r"r#�
_fixresult3s


z_Dialog._fixresultN)rYrZr[rhrpr"r"r"r#rc*srcc@seZdZdZdZdd�ZdS)�Open�Ask for a filename to openZtk_getOpenFilecCsxt|t�rBtdd�|D��}|r>tj�|d�\}}||jd<|S|j��sjd|jkrj|�||j�	|��St
�|||�S)NcSsg|]}t|d|��qS)rj)�getattr)�.0�rr"r"r#�
<listcomp>Nsz#Open._fixresult.<locals>.<listcomp>rri�multiple)�
isinstancerer(r)r,rfZtkZwantobjectsrpZ	splitlistrcrmr"r"r#rpKs

zOpen._fixresultN�rYrZr[r\rrpr"r"r"r#rqFsrqc@seZdZdZdZdS)�SaveAs�Ask for a filename to save asZtk_getSaveFileN)rYrZr[r\rr"r"r"r#rzZsrzc@seZdZdZdZdd�ZdS)�	DirectoryzAsk for a directoryZtk_chooseDirectorycCs8|r.z
|j}Wntk
r"YnX||jd<||_|S)Nri)rjrkrfr)r!rnror"r"r#rpfs

zDirectory._fixresultNryr"r"r"r#r|asr|cKstf|���S)rr�rq�show�rfr"r"r#�askopenfilenamewsr�cKstf|���S)r{)rzr~rr"r"r#�asksaveasfilename}sr�cKsd|d<tf|���S)ztAsk for multiple filenames to open

    Returns a list of filenames or empty list if
    cancel button selected
    rrwr}rr"r"r#�askopenfilenames�sr�rucKs tf|���}|rt||�SdS)z8Ask for a filename to open, and returned the opened fileN)rqr~�open��moderfrlr"r"r#�askopenfile�s
r�cKs4tf|�}|r0g}|D]}|�t||��q|}|S)z�Ask for multiple filenames and return the open file
    objects

    returns a list of open file objects or an empty list if
    cancel selected
    )r�rHr�)r�rfrZofilesrlr"r"r#�askopenfiles�s
r��wcKs tf|���}|rt||�SdS)z;Ask for a filename to save as, and returned the opened fileN)rzr~r�r�r"r"r#�
asksaveasfile�s
r�cKstf|���S)z-Ask for a directory, and return the file name)r|r~rr"r"r#�askdirectory�sr�c
	Cs�t�}|��t|�}|jdd�}t|�}|jdd�}t||�d}ddl}z&ddl}|�|j	d�|�
|j�}Wntt
fk
r�YnXtdgd�}zt|d	�}|��Wn$td
�t|��d�YnXtd|�|��t�}	td
|	�|��dS)zSimple test program.�test)r4zutf-8rNr%)z	all filesr)rdruzCould not open File: rr�Zsaveas)ZTkZwithdrawr]r5r`�print�sys�locale�	setlocale�LC_ALL�nl_langinfo�CODESET�ImportErrorrkr�r��close�exc_info�encoder�)
�root�fdZloadfileZsavefile�encr�r�Zopenfilename�fpZsaveasfilenamer"r"r#r��s2

r��__main__)ru)ru)r�)r\ZtkinterZtkinter.dialogrrZtkinter.simpledialogrr(rIr'rr]r`rcrqrzr|r�r�r�r�r�r�r�r�rYr"r"r"r#�<module>s2I9
	

	,
PK�(�Z��z`,,$__pycache__/dnd.cpython-38.opt-1.pycnu�[���U

e5d�,�@sXdZddlZdd�ZGdd�d�ZGdd�d�ZGd	d
�d
�Zdd�Zed
krTe�dS)aFDrag-and-drop support for Tkinter.

This is very preliminary.  I currently only support dnd *within* one
application, between different windows (or within the same window).

I am trying to make this as generic as possible -- not dependent on
the use of a particular widget or icon type, etc.  I also hope that
this will work with Pmw.

To enable an object to be dragged, you must create an event binding
for it that starts the drag-and-drop process. Typically, you should
bind <ButtonPress> to a callback function that you write. The function
should call Tkdnd.dnd_start(source, event), where 'source' is the
object to be dragged, and 'event' is the event that invoked the call
(the argument to your callback function).  Even though this is a class
instantiation, the returned instance should not be stored -- it will
be kept alive automatically for the duration of the drag-and-drop.

When a drag-and-drop is already in process for the Tk interpreter, the
call is *ignored*; this normally averts starting multiple simultaneous
dnd processes, e.g. because different button callbacks all
dnd_start().

The object is *not* necessarily a widget -- it can be any
application-specific object that is meaningful to potential
drag-and-drop targets.

Potential drag-and-drop targets are discovered as follows.  Whenever
the mouse moves, and at the start and end of a drag-and-drop move, the
Tk widget directly under the mouse is inspected.  This is the target
widget (not to be confused with the target object, yet to be
determined).  If there is no target widget, there is no dnd target
object.  If there is a target widget, and it has an attribute
dnd_accept, this should be a function (or any callable object).  The
function is called as dnd_accept(source, event), where 'source' is the
object being dragged (the object passed to dnd_start() above), and
'event' is the most recent event object (generally a <Motion> event;
it can also be <ButtonPress> or <ButtonRelease>).  If the dnd_accept()
function returns something other than None, this is the new dnd target
object.  If dnd_accept() returns None, or if the target widget has no
dnd_accept attribute, the target widget's parent is considered as the
target widget, and the search for a target object is repeated from
there.  If necessary, the search is repeated all the way up to the
root widget.  If none of the target widgets can produce a target
object, there is no target object (the target object is None).

The target object thus produced, if any, is called the new target
object.  It is compared with the old target object (or None, if there
was no old target widget).  There are several cases ('source' is the
source object, and 'event' is the most recent event object):

- Both the old and new target objects are None.  Nothing happens.

- The old and new target objects are the same object.  Its method
dnd_motion(source, event) is called.

- The old target object was None, and the new target object is not
None.  The new target object's method dnd_enter(source, event) is
called.

- The new target object is None, and the old target object is not
None.  The old target object's method dnd_leave(source, event) is
called.

- The old and new target objects differ and neither is None.  The old
target object's method dnd_leave(source, event), and then the new
target object's method dnd_enter(source, event) is called.

Once this is done, the new target object replaces the old one, and the
Tk mainloop proceeds.  The return value of the methods mentioned above
is ignored; if they raise an exception, the normal exception handling
mechanisms take over.

The drag-and-drop processes can end in two ways: a final target object
is selected, or no final target object is selected.  When a final
target object is selected, it will always have been notified of the
potential drop by a call to its dnd_enter() method, as described
above, and possibly one or more calls to its dnd_motion() method; its
dnd_leave() method has not been called since the last call to
dnd_enter().  The target is notified of the drop by a call to its
method dnd_commit(source, event).

If no final target object is selected, and there was an old target
object, its dnd_leave(source, event) method is called to complete the
dnd sequence.

Finally, the source object is notified that the drag-and-drop process
is over, by a call to source.dnd_end(target, event), specifying either
the selected target object, or None if no target object was selected.
The source object can use this to implement the commit action; this is
sometimes simpler than to do it in the target's dnd_commit().  The
target's dnd_commit() method could then simply be aliased to
dnd_leave().

At any time during a dnd sequence, the application can cancel the
sequence by calling the cancel() method on the object returned by
dnd_start().  This will call dnd_leave() if a target is currently
active; it will never call dnd_commit().

�NcCst||�}|jr|SdSdS�N)�
DndHandler�root)�source�event�h�r�#/usr/lib64/python3.8/tkinter/dnd.py�	dnd_startls
r
c@sDeZdZdZdd�Zdd�Zdd�Zdd	�Zdd
d�Zdd
d�Z	dS)rNcCs�|jdkrdS|j��}z|jWdStk
rD||_||_YnX||_d|_|j|_}|j|_	}d||f|_
|dp�d|_|�|j
|j
�|�d|j�d|d<dS)N�z<B%d-ButtonRelease-%d>�cursor��<Motion>Zhand2)Znum�widgetZ_root�_DndHandler__dnd�AttributeErrorrr�targetZinitial_button�initial_widget�release_pattern�save_cursor�bind�
on_release�	on_motion)�selfrrrZbuttonrrrr	�__init__zs$

zDndHandler.__init__cCs2|j}d|_|r.z|`Wntk
r,YnXdSr)rrr�rrrrr	�__del__�szDndHandler.__del__c	Cs�|j|j}}|j�||�}|j}d}|rbz
|j}Wntk
rHYnX|||�}|rZqb|j}q&|j}||kr�|r�|�	||�n,|r�d|_|�
||�|r�|�||�||_dSr)�x_root�y_rootrZwinfo_containingr�
dnd_acceptrZmasterr�
dnd_motion�	dnd_leave�	dnd_enter)	rr�x�yZ
target_widgetr�
new_target�attrZ
old_targetrrr	r�s.

zDndHandler.on_motioncCs|�|d�dS)N���finish�rrrrr	r�szDndHandler.on_releasecCs|�|d�dS)Nrr(r*rrr	�cancel�szDndHandler.cancelrc
Cs�|j}|j}|j}|j}zf|`|j�|j�|j�d�|j|d<d|_|_|_|_|r||rp|�	||�n|�
||�W5|�||�XdS)Nrr)rrrr�dnd_endrZunbindrr�
dnd_commitr!)rrZcommitrrrrrrr	r)�s
zDndHandler.finish)N)r)
�__name__�
__module__�__qualname__rrrrrr+r)rrrr	rvs	
rc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�IconcCs||_d|_|_|_dSr)�name�canvas�label�id)rr2rrr	r�sz
Icon.__init__�
cCs�||jkr |j�|j||�dS|jr.|��|s6dStj||jddd�}|j|||dd�}||_||_||_|�	d|j
�dS)N�Zraised)�textZborderwidthZreliefZnw)ZwindowZanchorz
<ButtonPress>)r3�coordsr5�detach�tkinterZLabelr2Z
create_windowr4r�press)rr3r#r$r4r5rrr	�attach�s 

�zIcon.attachcCsB|j}|sdS|j}|j}d|_|_|_|�|�|��dSr)r3r5r4�deleteZdestroy)rr3r5r4rrr	r:�s
zIcon.detachcCs4t||�r0|j|_|j|_|j�|j�\|_|_	dSr)
r
r#�x_offr$�y_offr3r9r5�x_orig�y_origr*rrr	r<�s
z
Icon.presscCs(|�|j|�\}}|j�|j||�dSr)�wherer3r9r5)rrr#r$rrr	�move�sz	Icon.movecCs|j�|j|j|j�dSr)r3r9r5rArB)rrrr	�putback�szIcon.putbackcCs8|��}|��}|j|}|j|}||j||jfSr)Zwinfo_rootxZwinfo_rootyrrr?r@)rr3rZx_orgZy_orgr#r$rrr	rC�s


z
Icon.wherecCsdSrr)rrrrrr	r,szIcon.dnd_endN)r6r6)r.r/r0rr=r:r<rDrErCr,rrrr	r1�s


r1c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�TestercCs>t�|�|_tj|jddd�|_|jjddd�|j|j_dS)N�d)�widthZheightZbothr')Zfill�expand)r;ZToplevel�topZCanvasr3�packrrrrr	rszTester.__init__cCs|Srr�rrrrrr	rszTester.dnd_acceptcCsp|j��|�|j|�\}}|j�|j�\}}}}||||}	}
|j�||||	||
�|_|�||�dSr)r3�	focus_setrC�bboxr5Zcreate_rectangle�dndidr )rrrr#r$�x1�y1�x2�y2ZdxZdyrrr	r"s
zTester.dnd_enterc	CsF|�|j|�\}}|j�|j�\}}}}|j�|j||||�dSr)rCr3rNrOrD)	rrrr#r$rPrQrRrSrrr	r szTester.dnd_motioncCs"|j��|j�|j�d|_dSr)rJrMr3r>rOrLrrr	r!$s
zTester.dnd_leavecCs2|�||�|�|j|�\}}|�|j||�dSr)r!rCr3r=)rrrr#r$rrr	r-)szTester.dnd_commitN)	r.r/r0rrr"r r!r-rrrr	rFsrFcCs�t��}|�d�tj|jdd���t|�}|j�d�t|�}|j�d�t|�}|j�d�td�}td�}td	�}|�	|j
�|�	|j
�|�	|j
�|��dS)
Nz+1+1ZQuit)Zcommandr8z+1+60z+120+60z+240+60ZICON1ZICON2ZICON3)r;ZTkZgeometryZButton�quitrKrFrJr1r=r3Zmainloop)r�t1�t2Zt3Zi1Zi2Zi3rrr	�test/s 
rW�__main__)�__doc__r;r
rr1rFrWr.rrrr	�<module>sf
Y=#PK�(�Zs����-__pycache__/scrolledtext.cpython-38.opt-1.pycnu�[���U

e5d�@sldZdgZddlmZmZmZmZmZmZddl	m
Z
mZmZm
Z
Gdd�de�Zdd�Zedkrhe�d	S)
aA ScrolledText widget feels like a text widget but also has a
vertical scroll bar on its right.  (Later, options may be added to
add a horizontal bar as well, to make the bars disappear
automatically when not needed, to move them to the other side of the
window, etc.)

Configuration options are passed to the Text widget.
A Frame widget is inserted between the master and the text, to hold
the Scrollbar widget.
Most methods calls are inherited from the Text widget; Pack, Grid and
Place methods are redirected to the Frame widget however.
�ScrolledText�)�Frame�Text�	Scrollbar�Pack�Grid�Place)�RIGHT�LEFT�Y�BOTHc@seZdZddd�Zdd�ZdS)rNcKs�t|�|_t|j�|_|jjttd�|�d|jji�t	j
||jf|�|jttdd�|j
|jd<tt	���}tt���tt���Btt���B}|�|�}|D]4}|ddkr�|dkr�|d	kr�t||t|j|��q�dS)
N)�side�fillZyscrollcommandT)r
r�expandZcommandr�_ZconfigZ	configure)r�framerZvbar�packr	r�update�setr�__init__r
rZyview�vars�keysrrr�
difference�setattr�getattr)�selfZmaster�kwZ
text_meths�methods�m�r�,/usr/lib64/python3.8/tkinter/scrolledtext.pyrs
$
zScrolledText.__init__cCs
t|j�S)N)�strr)rrrr �__str__)szScrolledText.__str__)N)�__name__�
__module__�__qualname__rr"rrrr rs
cCsHddlm}tddd�}|�|t�|jttdd�|��|�	�dS)Nr)�ENDZwhite�
)ZbgZheightT)rr
r)
�tkinter.constantsr&r�insert�__doc__rrr
Z	focus_setZmainloop)r&Zstextrrr �example-sr+�__main__N)r*�__all__Ztkinterrrrrrrr(r	r
rrrr+r#rrrr �<module>s
 
PK�(�Zҧ����'__pycache__/dialog.cpython-38.opt-2.pycnu�[���U

e5d��@srddlTddlmZdZGdd�de�Zdd�Zedkrned	d
ddeeii�Z	ed	d
d
de	j
eii�Ze	��d	S)�)�*)�	_cnfmergeZ	questheadc@s"eZdZdifdd�Zdd�ZdS)�DialogNc
Ks�t||f�}d|_t�|||�|j�|jjd|j|d|d|d|df|d���|_zt�	|�Wnt
k
r~YnXdS)NZ
__dialog__Z	tk_dialog�title�text�bitmap�default�strings)rZ
widgetName�Widget�_setupZtkZgetintZcallZ_w�num�destroyZTclError)�selfZmasterZcnf�kw�r�&/usr/lib64/python3.8/tkinter/dialog.py�__init__
s&���zDialog.__init__cCsdS)Nr)rrrrr
�zDialog.destroy)�__name__�
__module__�__qualname__rr
rrrrr	s
rcCs$tdddtddd��}t|j�dS)Nz
File ModifiedzzFile "Python.h" has been modified since the last time it was saved. Do you want to save it before exiting the application.r)z	Save FilezDiscard ChangeszReturn to Editor)rrrrr	)r�DIALOG_ICON�printr)�drrr�_tests�r�__main__NrZTestZcommandZQuit)
Ztkinterrrr
rrrZButtonZPack�t�quit�qZmainlooprrrr�<module>s$��PK�(�ZD��@�*�*'__pycache__/simpledialog.cpython-38.pycnu�[���U

e5d�-�@s�dZddlTddlmZmZGdd�d�ZGdd�de�Zdd	�ZGd
d�de�ZGdd
�d
e�Z	dd�Z
Gdd�de�Zdd�ZGdd�de�Z
dd�Zedkr�dd�Ze�dS)a&This modules handles dialog boxes.

It contains the following public symbols:

SimpleDialog -- A simple but flexible modal dialog box

Dialog -- a base class for dialogs

askinteger -- get an integer from the user

askfloat -- get a float from the user

askstring -- get a string from the user
�)�*)�
messagebox�_get_default_rootc@sLeZdZdgddddfdd�Zddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�SimpleDialog�NcCs|rt||d�|_n
t|�|_|r:|j�|�|j�|�t|j�t|j|dd�|_|jjdtd�t	|j�|_
|j
��||_||_||_
|j�d|j�tt|��D]L}||}	t|j
|	||fdd�d	�}
||kr�|
jtd
d�|
jttdd�q�|j�d
|j�|�|�dS)N)�class_i�)�textZaspect�)�expand�fill�<Return>cSs
|�|�S�N)�done��self�num�r�,/usr/lib64/python3.8/tkinter/simpledialog.py�<lambda>8�z'SimpleDialog.__init__.<locals>.<lambda>�r�command�)ZreliefZborderwidth)�siderr
�WM_DELETE_WINDOW)�Toplevel�root�titleZiconname�
_setup_dialogZMessage�message�packZBOTH�Frame�framer�cancel�default�bind�return_event�range�len�ButtonZconfigZRIDGE�LEFT�protocol�wm_delete_window�_set_transient)r�masterr�buttonsr$r#rrr�s�brrr�__init__ s2


�zSimpleDialog.__init__��?�333333�?c
Cs|j}|��|�|�|��|��rJ|��}|��}|��}|��}n|�	�}|�
�}d}}|��}	|��}
|||	|}|||
|}||	|�	�kr�|�	�|	}n|dkr�d}||
|�
�kr�|�
�|
}n|dkr�d}|�
d||f�|��dS)Nr�+%d+%d)r�withdraw�	transient�update_idletasksZwinfo_ismappedZwinfo_widthZwinfo_height�winfo_rootx�winfo_rootyZwinfo_screenwidthZwinfo_screenheightZwinfo_reqwidthZwinfo_reqheight�geometry�	deiconify)
rr.ZrelxZrelyZwidgetZm_widthZm_heightZm_xZm_yZw_widthZw_height�x�yrrrr-?s4

zSimpleDialog._set_transientcCs.|j��|j��|j��|j��|jSr
)r�wait_visibility�grab_set�mainloop�destroyr�rrrr�go\s




zSimpleDialog.gocCs&|jdkr|j��n|�|j�dSr
)r$r�bellr�rZeventrrrr&cs
zSimpleDialog.return_eventcCs&|jdkr|j��n|�|j�dSr
)r#rrErrCrrrr,is
zSimpleDialog.wm_delete_windowcCs||_|j��dSr
)rr�quitrrrrroszSimpleDialog.done)r3r4)	�__name__�
__module__�__qualname__r2r-rDr&r,rrrrrrs�

rc@sVeZdZdZddd�Zdd�Zdd�Zd	d
�Zddd�Zdd
d�Z	dd�Z
dd�ZdS)�DialogzZClass to open dialogs.

    This class is intended as a base class for custom dialogs
    NcCs�|}|std�}t�||�|��|dk	r>|��r>|�|�|rL|�|�t|�||_d|_	t
|�}|�|�|_|j
ddd�|��|js�||_|�d|j�|dk	r�|�d|��d|��df�|��|j��|��|��|�|�dS)z�Initialize a dialog.

        Arguments:

            parent -- a parent window (the application window)

            title -- the dialog title
        zcreate dialog windowN�)�padx�padyrr5�2)rrr2r6Zwinfo_viewabler7rr�parent�resultr!�body�
initial_focusr �	buttonboxr+r#r;r9r:r<�	focus_setr?r@Zwait_window)rrPrr.rRrrrr2{s8	


�
zDialog.__init__cCsd|_t�|�dS)zDestroy the windowN)rSrrBrCrrrrB�szDialog.destroycCsdS)z�create dialog body.

        return widget that should have initial focus.
        This method should be overridden, and is called
        by the __init__ method.
        Nr)rr.rrrrR�szDialog.bodycCsvt|�}t|dd|jtd�}|jtddd�t|dd|jd�}|jtddd�|�d|j�|�d	|j�|��d
S)z[add standard button box.

        override if you do not want the standard buttons
        ZOK�
)r�widthrr$rL)rrMrN�Cancel)rrWrrz<Escape>N)r!r)�okZACTIVEr r*r#r%)rZbox�wrrrrT�szDialog.buttonboxcCsB|��s|j��dS|��|��z|��W5|��XdSr
)�validaterSrUr6r8r#�applyrFrrrrY�s
z	Dialog.okcCs |jdk	r|j��|��dSr
)rPrUrBrFrrrr#�s

z
Dialog.cancelcCsdS)z�validate the data

        This method is called automatically to validate the data before the
        dialog is destroyed. By default, it always validates OK.
        r	rrCrrrr[�szDialog.validatecCsdS)z�process the data

        This method is called automatically to process the data, *after*
        the dialog is destroyed. By default, it does nothing.
        NrrCrrrr\�szDialog.apply)N)N)N)rHrIrJ�__doc__r2rBrRrTrYr#r[r\rrrrrKts
7	


	rKcCs:|jdkr |j�dd|dd�n|jdkr6|�dd�dS)	NZaquaz!::tk::unsupported::MacWindowStyleZstyleZ
moveableModalrZx11z-typeZdialog)Z_windowingsystemZtkZcallZ
wm_attributes)rZrrrrs

�
rc@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�_QueryDialogNcCs*||_||_||_||_t�|||�dSr
)�prompt�minvalue�maxvalue�initialvaluerKr2)rrr_rbr`rarPrrrr2s
z_QueryDialog.__init__cCsd|_t�|�dSr
)�entryrKrBrCrrrrBsz_QueryDialog.destroycCsrt||jtd�}|jddtd�t|dd�|_|jjddttd�|jdk	rl|j�	d|j�|j�
dt�|jS)N)rZjustifyrrL)�rowrMZstickyrc)�namer	)ZLabelr_r*Zgrid�WZEntryrc�Erb�insertZselect_rangeZEND)rr.rZrrrrR s
z_QueryDialog.bodycCs�z|��}Wn,tk
r8tjd|jd|d�YdSX|jdk	rh||jkrhtjdd|j|d�dS|jdk	r�||jkr�tjdd|j|d�dS||_d	S)
Nz
Illegal valuez
Please try again)rPrz	Too smallz2The allowed minimum value is %s. Please try again.z	Too largez2The allowed maximum value is %s. Please try again.r	)�	getresult�
ValueErrorr�showwarning�errormessager`rarQ)rrQrrrr[.s:�����z_QueryDialog.validate)NNNN)rHrIrJr2rBrRr[rrrrr^
s�

r^c@seZdZdZdd�ZdS)�
_QueryIntegerzNot an integer.cCs|�|j���Sr
)Zgetintrc�getrCrrrriSsz_QueryInteger.getresultN�rHrIrJrlrirrrrrmPsrmcKst||f|�}|jS)z�get an integer from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is an integer
    )rmrQ�rr_�kw�drrr�
askintegerWsrsc@seZdZdZdd�ZdS)�_QueryFloatzNot a floating point value.cCs|�|j���Sr
)Z	getdoublercrnrCrrrriisz_QueryFloat.getresultNrorrrrrtfsrtcKst||f|�}|jS)z�get a float from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a float
    )rtrQrprrr�askfloatmsruc@s$eZdZdd�Zdd�Zdd�ZdS)�_QueryStringcOs6d|kr|d|_|d=nd|_tj|f|�|�dS)N�show)�_QueryString__showr^r2)r�argsrqrrrr2}s

z_QueryString.__init__cCs(t�||�}|jdk	r$|j|jd�|S)N)rw)r^rRrxZ	configure)rr.rcrrrrR�s
z_QueryString.bodycCs
|j��Sr
)rcrnrCrrrri�sz_QueryString.getresultN)rHrIrJr2rRrirrrrrv|srvcKst||f|�}|jS)z�get a string from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a string
    )rvrQrprrr�	askstring�srz�__main__cCsLt�}|fdd�}t|d|d�}|��t|d|jd�}|��|��dS)NcSs^t|ddddgdddd�}t|���ttd	d
dd��ttd	d
ddd��ttd	d��dS)Nz�This is a test dialog.  Would this have been an actual dialog, the buttons below would have been glowing in soft pink light.
Do you believe this?ZYesZNorXr�zTest Dialog)rr/r$r#rZSpamz	Egg count�)rbzEgg weight
(in tons)r	�d)r`raz	Egg label)r�printrDrsrurz)rrrrrr�doit�s�

�ztest.<locals>.doitZTestrZQuit)ZTkr)r rGrA)rr��t�qrrr�test�sr�N)r]ZtkinterrrrrrKrr^rmrsrtrurvrzrHr�rrrr�<module>s V
CPK�(�Z�(1616__pycache__/tix.cpython-38.pycnu�[���U

e5d-,�@sLddlZddlZddlTddlmZddlZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZGdd �d �Z Gd!d"�d"ej!e �Z!Gd#d$�d$�Z"ej#j$e"fej#_$Gd%d&�d&ej#�Z%Gd'd(�d(e%�Z&Gd)d*�d*�Z'Gd+d,�d,e%�Z(Gd-d.�d.e%�Z)Gd/d0�d0e%�Z*Gd1d2�d2e%�Z+Gd3d4�d4e%�Z,Gd5d6�d6e%�Z-Gd7d8�d8e%�Z.Gd9d:�d:e%�Z/Gd;d<�d<e%�Z0Gd=d>�d>e%�Z1Gd?d@�d@e%�Z2GdAdB�dBe%�Z3GdCdD�dDe%�Z4GdEdF�dFe%e5e6�Z7GdGdH�dHe%�Z8GdIdJ�dJe%�Z9GdKdL�dLe%�Z:GdMdN�dNe%�Z;GdOdP�dPe%�Z<GdQdR�dRe%�Z=GdSdT�dTe%�Z>GdUdV�dVe%�Z?GdWdX�dXe%�Z@GdYdZ�dZe%�ZAGd[d\�d\e%�ZBGd]d^�d^e%�ZCGd_d`�d`e%�ZDGdadb�dbe%�ZEGdcdd�dde%�ZFGdedf�dfe%�ZGGdgdh�dhe%�ZHGdidj�dje%�ZIGdkdl�dle%�ZJGdmdn�dne%�ZKGdodp�dpe%e5e6�ZLGdqdr�dre%�ZMGdsdt�dte%�ZNGdudv�dveOe&�ZPGdwdx�dxeQe&�ZRGdydz�dzeSe&�ZTGd{d|�d|eUe&�ZVGd}d~�d~eWe&�ZXGdd��d�eYe&�ZZGd�d��d�e[e&�Z\Gd�d��d�e]e&�Z^Gd�d��d�e_e&�Z`Gd�d��d�eae&�ZbGd�d��d�eDe&�ZcGd�d��d�e7e&�ZdGd�d��d�eCe&�ZeGd�d��d�eLe&�ZfGd�d��d�e*e&�ZgGd�d��d�e,e&�ZhGd�d��d�e.e&�ZiGd�d��d�e/e&�ZjGd�d��d�e2e&�ZkGd�d��d�e*e&�ZlGd�d��d�eKe&�ZmGd�d��d�e>e&�ZnGd�d��d�e@e&�Zod�d��Zpd�d��ZqGd�d��d�e%�ZrGd�d��d�e%e5e6�ZsGd�d��d�es�ZtdS)��N)�*)�	_cnfmerge�window�textZstatusZ	immediate�imageZ	imagetextZballoon�autoZ	acrosstop�asciiZcell�columnZ
decreasingZ
increasingZinteger�main�max�real�rowzs-regionzx-regionzy-region����� c@sVeZdZdZdd�Zdd�Zddd�Zdd	d
�Zdd�Zd
d�Z	dd�Z
ddd�ZdS)�
tixCommanda�The tix commands provide access to miscellaneous  elements
    of  Tix's  internal state and the Tix application context.
    Most of the information manipulated by these  commands pertains
    to  the  application  as a whole, or to a screen or
    display, rather than to a particular window.

    This is a mixin class, assumed to be mixed to Tkinter.Tk
    that supports the self.tk.call method.
    cCs|j�dd|�S)a�Tix maintains a list of directories under which
        the  tix_getimage  and tix_getbitmap commands will
        search for image files. The standard bitmap  directory
        is $TIX_LIBRARY/bitmaps. The addbitmapdir command
        adds directory into this list. By  using  this
        command, the  image  files  of an applications can
        also be located using the tix_getimage or tix_getbitmap
        command.
        �tixZaddbitmapdir��tk�call)�selfZ	directory�r�#/usr/lib64/python3.8/tkinter/tix.py�tix_addbitmapdirRs
ztixCommand.tix_addbitmapdircCs|j�dd|�S)z�Returns  the  current  value  of the configuration
        option given by option. Option may be  any  of  the
        options described in the CONFIGURATION OPTIONS section.
        r�cgetr�r�optionrrr�tix_cget^sztixCommand.tix_cgetNcKsd|rt||f�}n|rt|�}|dkr2|�dd�St|t�rN|�ddd|�S|j�d|�|��S)a�Query or modify the configuration options of the Tix application
        context. If no option is specified, returns a dictionary all of the
        available options.  If option is specified with no value, then the
        command returns a list describing the one named option (this list
        will be identical to the corresponding sublist of the value
        returned if no option is specified).  If one or more option-value
        pairs are specified, then the command modifies the given option(s)
        to have the given value(s); in this case the command returns an
        empty string. Option may be any of the configuration options.
        Nr�	configure�-)rr )r�
_getconfigure�
isinstance�strZ_getconfigure1rr�_options�r�cnf�kwrrr�
tix_configurees
ztixCommand.tix_configurecCs*|dk	r|j�dd|�S|j�dd�SdS)a�Returns the file selection dialog that may be shared among
        different calls from this application.  This command will create a
        file selection dialog widget when it is called the first time. This
        dialog will be returned by all subsequent calls to tix_filedialog.
        An optional dlgclass parameter can be passed to specified what type
        of file selection dialog widget is desired. Possible options are
        tix FileSelectDialog or tixExFileSelectDialog.
        NrZ
filedialogr)rZdlgclassrrr�tix_filedialog{s	ztixCommand.tix_filedialogcCs|j�dd|�S)a�Locates a bitmap file of the name name.xpm or name in one of the
        bitmap directories (see the tix_addbitmapdir command above).  By
        using tix_getbitmap, you can avoid hard coding the pathnames of the
        bitmap files in your application. When successful, it returns the
        complete pathname of the bitmap file, prefixed with the character
        '@'.  The returned value can be used to configure the -bitmap
        option of the TK and Tix widgets.
        rZ	getbitmapr�r�namerrr�
tix_getbitmap�s	ztixCommand.tix_getbitmapcCs|j�dd|�S)a�Locates an image file of the name name.xpm, name.xbm or name.ppm
        in one of the bitmap directories (see the addbitmapdir command
        above). If more than one file with the same name (but different
        extensions) exist, then the image type is chosen according to the
        depth of the X display: xbm images are chosen on monochrome
        displays and color images are chosen on color displays. By using
        tix_ getimage, you can avoid hard coding the pathnames of the
        image files in your application. When successful, this command
        returns the name of the newly created image, which can be used to
        configure the -image option of the Tk and Tix widgets.
        rZgetimagerr+rrr�tix_getimage�sztixCommand.tix_getimagecCs|j�ddd|�S)a@Gets  the options  maintained  by  the  Tix
        scheme mechanism. Available options include:

            active_bg       active_fg      bg
            bold_font       dark1_bg       dark1_fg
            dark2_bg        dark2_fg       disabled_fg
            fg              fixed_font     font
            inactive_bg     inactive_fg    input1_bg
            input2_bg       italic_font    light1_bg
            light1_fg       light2_bg      light2_fg
            menu_font       output1_bg     output2_bg
            select_bg       select_fg      selector
            rr�getrr+rrr�tix_option_get�sztixCommand.tix_option_getcCs2|dk	r|j�dd|||�S|j�dd||�SdS)a�Resets the scheme and fontset of the Tix application to
        newScheme and newFontSet, respectively.  This affects only those
        widgets created after this call. Therefore, it is best to call the
        resetoptions command before the creation of any widgets in a Tix
        application.

        The optional parameter newScmPrio can be given to reset the
        priority level of the Tk options set by the Tix schemes.

        Because of the way Tk handles the X option database, after Tix has
        been has imported and inited, it is not possible to reset the color
        schemes and font sets using the tix config command.  Instead, the
        tix_resetoptions command must be used.
        NrZresetoptionsr)rZ	newSchemeZ
newFontSetZ
newScmPriorrr�tix_resetoptions�sztixCommand.tix_resetoptions)N)N)N)�__name__�
__module__�__qualname__�__doc__rrr)r*r-r.r0r1rrrrrGs


rc@s"eZdZdZddd�Zdd�ZdS)	�Tkz{Toplevel widget of Tix which represents mostly the main window
    of an application. It has an associated Tcl interpreter.N�TixcCsbtj�||||�tj�d�}|j�d�|dk	rR|j�d|�|j�d|�|j�d�dS)NZTIX_LIBRARYz<global auto_path; lappend auto_path [file dir [info nameof]]z(global auto_path; lappend auto_path {%s}z,global tcl_pkgPath; lappend tcl_pkgPath {%s}zpackage require Tix)�tkinterr6�__init__�os�environr/r�eval)rZ
screenNameZbaseNameZ	classNameZtixlibrrrr9�szTk.__init__cCs|�dd�tj�|�dS)NZWM_DELETE_WINDOW�)Zprotocolr8r6�destroy�rrrrr>�sz
Tk.destroy)NNr7�r2r3r4r5r9r>rrrrr6�s
r6c@sTeZdZdZifdd�ZeZdd�Zdd�Zdd	�Zddd�Z	ddd�Z
dd�Zd
S)�Formz�The Tix Form geometry manager

    Widgets can be arranged by specifying attachments to other widgets.
    See Tix documentation for complete detailscKs"|jjd|jf|�||���dS)N�tixForm�rr�_wr%r&rrr�config�szForm.configcCst�|||i�dS�N)rA�form�r�key�valuerrr�__setitem__�szForm.__setitem__cCs|j�dd|j�S)NrB�check�rrrDr?rrrrL�sz
Form.checkcCs|j�dd|j�dS)NrB�forgetrMr?rrrrN�szForm.forgetrcCs`|sJ|sJ|j�dd|j�}|j�|�}d}|D]}||j�|�f}q.|S|j�dd|j||�S)NrB�gridr)rrrD�	splitlistZgetint)rZxsizeZysize�x�y�zrrrrO�sz	Form.gridNcCs>|s|j�dd|j�S|ddkr*d|}|j�dd|j|�S)NrB�inforr!rMrrrrrT�s
z	Form.infocs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr)�
_nametowidget��.0rQr?rr�
<listcomp>szForm.slaves.<locals>.<listcomp>rB�slaves�rrPrrDr?rr?rrYs
���zForm.slaves)rr)N)r2r3r4r5rErGrKrLrNrOrTrYrrrrrA�s


rAc@sreZdZdZdddiifdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zidfdd�Zdd�Z
dS)�	TixWidgetaQA TixWidget class is used to package all (or most) Tix widgets.

    Widget initialization is extended in two ways:
       1) It is possible to give a list of options which must be part of
       the creation command (so called Tix 'static' options). These cannot be
       given as a 'config' command later.
       2) It is possible to give the name of an existing TK widget. These are
       child widgets created automatically by a Tix mega-widget. The Tk call
       to create these widgets is therefore bypassed in TixWidget.__init__

    Both options are for use by subclasses only.
    Nc	Cs�|rt||f�}nt|�}d}|r.|�d�ndg}t|���D]&\}}||kr@|d||f}||=q@||_t�|||�|r�|jj||j	f|��|r�t�
||�i|_dS)Nr�optionsr!)r�append�list�items�
widgetName�Widget�_setuprrrDrE�subwidget_list)	r�masterr`Zstatic_optionsr'r(Zextra�k�vrrrr9s$zTixWidget.__init__cCs ||jkr|j|St|��dSrF)rc�AttributeErrorr+rrr�__getattr__Gs

zTixWidget.__getattr__cCs|j�d|j|�dS)z1Set a variable without calling its action routineZtixSetSilentNrM)rrJrrr�
set_silentLszTixWidget.set_silentcCsD|�|�}|s$td|d|j��|t|j�dd�}|�|�S)zSReturn the named subwidget (which must have been created by
        the sub-class).z
Subwidget z not child of �N)�_subwidget_name�TclError�_name�lenrDrU)rr,�nrrr�	subwidgetPs

zTixWidget.subwidgetcCsZ|��}|sgSg}|D]<}|t|j�dd�}z|�|�|��WqYqXq|S)zReturn all subwidgets.rjN)�_subwidget_namesrnrDr]rU)r�namesZretlistr,rrr�subwidgets_allZszTixWidget.subwidgets_allcCs0z|j�|jd|�WStk
r*YdSXdS)z7Get a subwidget name (returns a String, not a Widget !)rpN)rrrDrlr+rrrrkiszTixWidget._subwidget_namecCs<z |j�|jdd�}|j�|�WStk
r6YdSXdS)z"Return the name of all subwidgets.Z
subwidgetsz-allN)rrrDrPrl)rrQrrrrqps
zTixWidget._subwidget_namescCs\|dkrdSt|t�st|�}t|t�s0t|�}|��}|D]}|j�|dd||�q<dS)z8Set configuration options for all subwidgets (and self).r=Nr r!)r#r$�reprrqrr)rrrJrrr,rrr�
config_allxs

zTixWidget.config_allcKst|s|}|r|rt||f�}n|r&|}d}|��D]*\}}t|�rL|�|�}|d||f}q2|j�dd|f|�S)Nrr!r�create)rr_�callable�	_registerrr)rZimgtyper'rdr(r\rerfrrr�image_create�s
zTixWidget.image_createcCs.z|j�dd|�Wntk
r(YnXdS)Nr�delete)rrrl)rZimgnamerrr�image_delete�szTixWidget.image_delete)r2r3r4r5r9rhrirprsrkrqruryr{rrrrr[
s�
-
r[c@s"eZdZdZddd�Zdd�ZdS)	�TixSubWidgetz�Subwidget class.

    This is used to mirror child widgets automatically created
    by Tix/Tk as part of a mega-widget in Python (which is not informed
    of this)rjc
Cs�|rD|�|�}z$|t|j�dd�}|�d�}Wng}YnX|s`t�||ddd|i�n�|}tt|�d�D]V}d�|d|d��}	z|�|	�}
|
}Wqtt	k
r�t
|||ddd�}YqtXqt|r�|d}t�||ddd|i�||_dS)Nrj�.r,r)�destroy_physically�check_intermediate���)rkrnrD�splitr[r9�range�joinrU�KeyErrorr|r~)rrdr,r~r�pathZplist�parent�iro�wrrrr9�s0



�zTixSubWidget.__init__cCsjt|j���D]}|��q|j|jjkr6|jj|j=|j|jjkrP|jj|j=|jrf|j�	d|j
�dS)Nr>)r^�children�valuesr>rmrdrcr~rrrD�r�crrrr>�s
zTixSubWidget.destroyN)rjrjr@rrrrr|�s
�
 r|c@sVeZdZdZifdd�dd�Zdd�Zdd	�Zd
d�Zdd
�Zifdd�Z	dd�Z
dS)�DisplayStylezRDisplayStyle - handle configuration options shared by
    (multiple) Display ItemsN)rdcKs\|s2d|kr|d}nd|kr(|d}n
t�d�}|j|_|jjd|f|�||���|_dS)NZ	refwindowzcreate display styleZtixDisplayStyle)r8Z_get_default_rootrrr%�	stylename)r�itemtyper'rdr(rrrr9�s



�zDisplayStyle.__init__cCs|jSrF)r�r?rrr�__str__�szDisplayStyle.__str__cCsH|r|rt||f�}n|r|}d}|��D]\}}|d||f}q*|S)Nrr!)rr_)rr'r(Zoptsrerfrrrr%�szDisplayStyle._optionscCs|j�|jd�dS�Nrz�rrr�r?rrrrz�szDisplayStyle.deletecCs|j�|jdd||�dS)Nr �-%sr�rHrrrrK�szDisplayStyle.__setitem__cKs|j|jdf|�||���S)Nr )r"r�r%r&rrrrE�s�
�zDisplayStyle.configcCs|j�|jdd|�S)Nrr�r�)rrIrrr�__getitem__�szDisplayStyle.__getitem__)r2r3r4r5r9r�r%rzrKrEr�rrrrr��s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�BalloonzBalloon help widget.

    Subwidget       Class
    ---------       -----
    label           Label
    message         MessageNcKsNdddddg}t�||d|||�t|ddd	�|jd<t|d
dd	�|jd
<dS)Nr\ZinstallcolormapZinitwaitZ	statusbarZcursorZ
tixBalloon�labelr�r~�message�r[r9�_dummyLabelrc�rrdr'r(Zstaticrrrr9	s���zBalloon.__init__cKs&|jj|jd|jf|�||���dS)zkBind balloon widget to another.
        One balloon widget may be bound to several widgets at the same time�bindNrC)r�widgetr'r(rrr�bind_widgetszBalloon.bind_widgetcCs|j�|jd|j�dS�NZunbindrM�rr�rrr�
unbind_widgetszBalloon.unbind_widget)r2r3r4r5r9r�r�rrrrr�s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�	ButtonBoxzgButtonBox - A container for pushbuttons.
    Subwidgets are the buttons added with the add method.
    NcKst�||dddg||�dS)NZtixButtonBox�orientationr\�r[r9�rrdr'r(rrrr9s

�zButtonBox.__init__cKs4|jj|jd|f|�||���}t||�|j|<|S)z$Add a button with given name to box.�add�rrrDr%�_dummyButtonrc)rr,r'r(Zbtnrrrr�#s z
ButtonBox.addcCs ||jkr|j�|jd|�dS�N�invoke�rcrrrDr+rrrr�*s
zButtonBox.invoke�r2r3r4r5r9r�r�rrrrr�sr�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�ComboBoxa�ComboBox - an Entry field with a dropdown menu. The user can select a
    choice by either typing in the entry subwidget or selecting from the
    listbox subwidget.

    Subwidget       Class
    ---------       -----
    entry       Entry
    arrow       Button
    slistbox    ScrolledListBox
    tick        Button
    cross       Button : present if created with the fancy optionNc	Ks�t�||dddddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<z$t|d
�|jd
<t|d�|jd<Wntk
r�YnXdS)NZtixComboBoxZeditableZdropdown�fancyr\r��entry�arrow�slistbox�tick�cross)r[r9r�rc�_dummyEntryr��_dummyScrolledListBox�	TypeErrorr�rrrr9<s 

��
zComboBox.__init__cCs|j�|jd|�dS)NZ
addhistoryrM�rr$rrr�add_historyNszComboBox.add_historycCs|j�|jd|�dS)NZ
appendhistoryrMr�rrr�append_historyQszComboBox.append_historycCs|j�|jd||�dS�N�insertrM)r�indexr$rrrr�TszComboBox.insertcCs|j�|jd|�dS)N�pickrM�rr�rrrr�Wsz
ComboBox.pick)	r2r3r4r5r9r�r�r�r�rrrrr�.s
r�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�Controla�Control - An entry field with value change arrows.  The user can
    adjust the value by pressing the two arrow buttons or by entering
    the value directly into the entry. The new value will be checked
    against the user-defined upper and lower limits.

    Subwidget       Class
    ---------       -----
    incr       Button
    decr       Button
    entry       Entry
    label       LabelNcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixControlr\�incr�decrr�r�)r[r9r�rcr�r�r�rrrr9hs
zControl.__init__cCs|j�|jd�dS)Nr�rMr?rrr�	decrementoszControl.decrementcCs|j�|jd�dS)Nr�rMr?rrr�	incrementrszControl.incrementcCs|j�|jd�dSr�rMr?rrrr�uszControl.invokecCs|j�|jd�dS)N�updaterMr?rrrr�xszControl.update)	r2r3r4r5r9r�r�r�r�rrrrr�Zs
r�c@s$eZdZdZifdd�Zdd�ZdS)�DirListaRDirList - displays a list view of a directory, its previous
    directories and its sub-directories. The user can choose one of
    the directories displayed in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist       HList
    hsb              Scrollbar
    vsb              ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirListr\�hlist�vsb�hsb�r[r9�_dummyHListrc�_dummyScrollbarr�rrrr9�szDirList.__init__cCs|j�|jd|�dS�N�chdirrM�r�dirrrrr��sz
DirList.chdirN�r2r3r4r5r9r�rrrrr�{sr�c@s$eZdZdZifdd�Zdd�ZdS)�DirTreea�DirTree - Directory Listing in a hierarchical view.
    Displays a tree view of a directory, its previous directories and its
    sub-directories. The user can choose one of the directories displayed
    in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist           HList
    hsb             Scrollbar
    vsb             ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirTreer\r�r�r�r�r�rrrr9�szDirTree.__init__cCs|j�|jd|�dSr�rMr�rrrr��sz
DirTree.chdirNr�rrrrr��sr�c@seZdZdZifdd�ZdS)�DirSelectBoxa�DirSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixDirSelectBoxr\�dirlist�dircbx)r[r9�
_dummyDirListrc�_dummyFileComboBoxr�rrrr9�szDirSelectBox.__init__N�r2r3r4r5r9rrrrr��s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectBoxa�ExFileSelectBox - MS Windows style file select box.
    It provides a convenient method for the user to select files.

    Subwidget       Class
    ---------       -----
    cancel       Button
    ok              Button
    hidden       Checkbutton
    types       ComboBox
    dir              ComboBox
    file       ComboBox
    dirlist       ScrolledListBox
    filelist       ScrolledListBoxcKs�t�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<t|d
�|jd
<dS)NZtixExFileSelectBoxr\�cancel�ok�hidden�typesr�r��file�filelist)r[r9r�rc�_dummyCheckbutton�_dummyComboBoxr�r�r�rrrr9�szExFileSelectBox.__init__cCs|j�|jd�dS�N�filterrMr?rrrr��szExFileSelectBox.filtercCs|j�|jd�dSr�rMr?rrrr��szExFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�DirSelectDialoga#The DirSelectDialog widget presents the directories in the file
    system in a dialog window. The user can use this dialog window to
    navigate through the file system to select the desired directory.

    Subwidgets       Class
    ----------       -----
    dirbox       DirSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixDirSelectDialogr\Zdirbox)r[r9�_dummyDirSelectBoxrcr�rrrr9�s
�zDirSelectDialog.__init__cCs|j�|jd�dS�N�popuprMr?rrrr��szDirSelectDialog.popupcCs|j�|jd�dS�N�popdownrMr?rrrr��szDirSelectDialog.popdownN�r2r3r4r5r9r�r�rrrrr��s	r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectDialogz�ExFileSelectDialog - MS Windows style file select dialog.
    It provides a convenient method for the user to select files.

    Subwidgets       Class
    ----------       -----
    fsbox       ExFileSelectBoxcKs*t�||ddg||�t|d�|jd<dS)NZtixExFileSelectDialogr\�fsbox)r[r9�_dummyExFileSelectBoxrcr�rrrr9�s
�zExFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popdownNr�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�
FileSelectBoxa�ExFileSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixFileSelectBoxr\r�r�r��	selection)r[r9r�rcr�r�rrrr9s
zFileSelectBox.__init__cCs|j�|jd�dSr�rMr?rrr�apply_filterszFileSelectBox.apply_filtercCs|j�|jd�dSr�rMr?rrrr�szFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr�s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�FileSelectDialogz�FileSelectDialog - Motif style file select dialog.

    Subwidgets       Class
    ----------       -----
    btns       StdButtonBox
    fsbox       FileSelectBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixFileSelectDialogr\Zbtnsr�)r[r9�_dummyStdButtonBoxrc�_dummyFileSelectBoxr�rrrr9,s
�zFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�2szFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�5szFileSelectDialog.popdownNr�rrrrr�#sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�	FileEntrya_FileEntry - Entry field with button that invokes a FileSelectDialog.
    The user can type in the filename manually. Alternatively, the user can
    press the button widget that sits next to the entry, which will bring
    up a file selection dialog.

    Subwidgets       Class
    ----------       -----
    button       Button
    entry       EntrycKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZtixFileEntryZ
dialogtyper\Zbuttonr�)r[r9r�rcr�r�rrrr9Ds
�zFileEntry.__init__cCs|j�|jd�dSr�rMr?rrrr�JszFileEntry.invokecCsdSrFrr?rrr�file_dialogMszFileEntry.file_dialogN)r2r3r4r5r9r�r�rrrrr�8sr�c@s�eZdZdZdifdd�Zifdd�Zdifdd�Zd	d
�Zdd�Zdldd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zifd d!�Zifd"d#�Zd$d%�Zd&d'�ZeZd(d)�Zd*d+�Zd,d-�Zifd.d/�Zifd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z d<d=�Z!dmd>d?�Z"d@dA�Z#dBdC�Z$dDdE�Z%dFdG�Z&dHdI�Z'dJdK�Z(dLdM�Z)dNdO�Z*dPdQ�Z+dRdS�Z,ifdTdU�Z-ifdVdW�Z.dXdY�Z/dZd[�Z0d\d]�Z1ifd^d_�Z2d`da�Z3dbdc�Z4ifddde�Z5dfdg�Z6dndhdi�Z7djdk�Z8dS)o�HListaHList - Hierarchy display  widget can be used to display any data
    that have a hierarchical structure, for example, file system directory
    trees. The list entries are indented and connected by branch lines
    according to their places in the hierarchy.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixHList�columnsr\r�r�rrrr9Ys

�zHList.__init__cKs |jj|jd|f|�||���S�Nr�rC�rr�r'r(rrrr�]sz	HList.addcKs(|sd}|jj|jd|f|�||���S)Nr=ZaddchildrC)rr�r'r(rrr�	add_child`s�
�zHList.add_childcCs|j�|jdd|�dS�N�anchor�setrM�rr�rrr�
anchor_setfszHList.anchor_setcCs|j�|jdd�dS�Nr��clearrMr?rrr�anchor_cleariszHList.anchor_clearrcCs6|s|j�|jdd||�S|j�|jdd|d|�SdS)Nr	�widthz-charrM)r�colr�charsrrr�column_widthls�zHList.column_widthcCs|j�|jdd�dS)Nrz�allrMr?rrr�
delete_allsszHList.delete_allcCs|j�|jdd|�dS)Nrzr�rMr�rrr�delete_entryvszHList.delete_entrycCs|j�|jdd|�dS)NrzZ
offspringsrMr�rrr�delete_offspringsyszHList.delete_offspringscCs|j�|jdd|�dS)NrzZsiblingsrMr�rrr�delete_siblings|szHList.delete_siblingscCs|j�|jdd|�dS�N�dragsiter�rMr�rrr�dragsite_setszHList.dragsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dragsite_clear�szHList.dragsite_clearcCs|j�|jdd|�dS�N�dropsiter�rMr�rrr�dropsite_set�szHList.dropsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dropsite_clear�szHList.dropsite_clearcKs&|jj|jdd|f|�||���dS)N�headerrvrC�rrr'r(rrr�
header_create�szHList.header_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nrr �r"rDrrr%rrrr�header_configure�s

�zHList.header_configurecCs|j�|jdd||�S)NrrrM)rr�optrrr�header_cget�szHList.header_cgetcCs|j�|j�|jdd|��S)NrZexist)rZ
getbooleanrrD�rrrrr�
header_exists�szHList.header_existscCs|j�|jdd|�dS)NrrzrMrrrr�
header_delete�szHList.header_deletecCs|j�|jdd|�S)Nr�sizerMrrrr�header_size�szHList.header_sizecCs|j�|jdd|�dS)N�hider�rMr�rrr�
hide_entry�szHList.hide_entrycKs&|jj|jdd|f|�||���dS)N�	indicatorrvrCr�rrr�indicator_create�s�
�zHList.indicator_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nr#r rr�rrr�indicator_configure�s��
�zHList.indicator_configurecCs|j�|jdd||�S)Nr#rrM�rr�rrrr�indicator_cget�szHList.indicator_cgetcCs|j�|jdd|�S)Nr#�existsrMr�rrr�indicator_exists�szHList.indicator_existscCs|j�|jdd|�dS)Nr#rzrMr�rrr�indicator_delete�szHList.indicator_deletecCs|j�|jdd|�S)Nr#rrMr�rrr�indicator_size�szHList.indicator_sizecCs|j�|jdd�S�NrTr�rMr?rrr�info_anchor�szHList.info_anchorcCs|�|j�|jdd|��pdS�NrTZbbox)�_getintsrrrDr�rrr�	info_bbox�s
��zHList.info_bboxcCs |j�|jdd|�}|j�|�S)NrTr��rrrDrP)rr�r�rrr�
info_children�szHList.info_childrencCs|j�|jdd|�S)NrT�datarMr�rrr�	info_data�szHList.info_datacCs|j�|jdd�S)NrTrrMr?rrr�
info_dragsite�szHList.info_dragsitecCs|j�|jdd�S)NrTrrMr?rrr�
info_dropsite�szHList.info_dropsitecCs|j�|jdd|�S)NrTr(rMr�rrr�info_exists�szHList.info_existscCs|j�|jdd|�S)NrTr�rMr�rrr�info_hidden�szHList.info_hiddencCs|j�|jdd|�S)NrT�nextrMr�rrr�	info_next�szHList.info_nextcCs|j�|jdd|�S)NrTr�rMr�rrr�info_parent�szHList.info_parentcCs|j�|jdd|�S)NrT�prevrMr�rrr�	info_prev�szHList.info_prevcCs|j�|jdd�}|j�|�S�NrTr�r1r�rrr�info_selection�szHList.info_selectioncCs|j�|jdd|||�S)N�itemrrM)rr�rrrrr�	item_cget�szHList.item_cgetcKsD|dkr|�|jdd||�S|jj|jdd||f|�||���dS)Nr@r r�rr�rr'r(rrr�item_configure�s

�zHList.item_configurecKs(|jj|jdd||f|�||���dS)Nr@rvrCrBrrr�item_create�s�
�zHList.item_createcCs|j�|jdd||�S)Nr@r(rM�rr�rrrr�item_exists�szHList.item_existscCs|j�|jdd||�dS)Nr@rzrMrErrr�item_delete�szHList.item_deletecCs|j�|jd||�S)N�	entrycgetrMr&rrrrH�szHList.entrycgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS�N�entryconfigurerr�rrrrJ�s

�zHList.entryconfigurecCs|j�|jd|�S�N�nearestrM)rrRrrrrLsz
HList.nearestcCs|j�|jd|�dS�N�seerMr�rrrrNsz	HList.seecKs$|jj|jddf|�||���dS�Nr�rrCr&rrr�selection_clearszHList.selection_clearcCs|j�|jdd|�S�Nr�ZincludesrMr�rrr�selection_includes
szHList.selection_includescCs|j�|jdd||�dS�Nr�r�rM�r�firstZlastrrr�
selection_set
szHList.selection_setcCs|j�|jdd|�S)N�showr�rMr�rrr�
show_entryszHList.show_entry)rNN)N)N)9r2r3r4r5r9r�r�r�rrrrr	r
r
rrrrrrrZheader_existrr r"r$r%r'r)r*r+r-r0r2r4r5r6r7r8r:r;r=r?rArCrDrFrGrHrJrLrNrPrRrVrXrrrrr�Qsl


r�c@seZdZdZdifdd�ZdS)�	InputOnlyz?InputOnly - Invisible widget. Unix only.

    Subwidgets - NoneNcKst�||dd||�dS)NZtixInputOnlyr�r�rrrr9szInputOnly.__init__r�rrrrrYsrYc@seZdZdZdifdd�ZdS)�
LabelEntryaLabelEntry - Entry field with label. Packages an entry widget
    and a label into one mega widget. It can be used to simplify the creation
    of ``entry-form'' type of interface.

    Subwidgets       Class
    ----------       -----
    label       Label
    entry       EntryNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelEntry�	labelsider\r�r�)r[r9r�rcr�r�rrrr9%s
�zLabelEntry.__init__r�rrrrrZs	rZc@seZdZdZdifdd�ZdS)�
LabelFrameaeLabelFrame - Labelled Frame container. Packages a frame widget
    and a label into one mega widget. To create widgets inside a
    LabelFrame widget, one creates the new widgets relative to the
    frame subwidget and manage them inside the frame subwidget.

    Subwidgets       Class
    ----------       -----
    label       Label
    frame       FrameNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelFramer[r\r��frame)r[r9r�rc�_dummyFramer�rrrr96s
�zLabelFrame.__init__r�rrrrr\+s
r\c@s@eZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�ZdS)
�ListNoteBookaA ListNoteBook widget is very similar to the TixNoteBook widget:
    it can be used to display many windows in a limited space using a
    notebook metaphor. The notebook is divided into a stack of pages
    (windows). At one time only one of these pages can be shown.
    The user can navigate through these pages by
    choosing the name of the desired page in the hlist subwidget.cKsNt�||ddg||�t|ddd�|jd<t|d�|jd<t|d�|jd<dS)NZtixListNoteBookr\Zpanerr�r�Zshlist)r[r9�_dummyPanedWindowrcr��_dummyScrolledHListr�rrrr9Es�zListNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr��rrrDr%r|rc�rr,r'r(rrrr�Ms zListNoteBook.addcCs
|�|�SrF�rpr+rrr�pageRszListNoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |S�N�pages�rrPrrDr]rp�rrrZretrQrrrrgUs
zListNoteBook.pagescCs|j�|jd|�dS�N�raiserMr+rrr�
raise_page]szListNoteBook.raise_pageN)	r2r3r4r5r9r�rergrlrrrrr_=sr_c@seZdZdZdifdd�ZdS)�MeterzuThe Meter widget can be used to show the progress of a background
    job which may take a long time to execute.
    NcKst�||ddg||�dS)NZtixMeterr\r�r�rrrr9es

�zMeter.__init__r�rrrrrm`srmc@sReZdZdZdifdd�Zifdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�NoteBookz�NoteBook - Multi-page container widget (tabbed notebook metaphor).

    Subwidgets       Class
    ----------       -----
    nbframe       NoteBookFrame
    <pages>       page widgets added dynamically with the add methodNcKs.t�||ddg||�t|ddd�|jd<dS)NZtixNoteBookr\Znbframerr�)r[r9r|rcr�rrrr9qs�zNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�rbrcrrrr�vs zNoteBook.addcCs,|j�|jd|�|j|��|j|=dSr��rrrDrcr>r+rrrrz{szNoteBook.deletecCs
|�|�SrFrdr+rrrre�sz
NoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |Srfrhrirrrrg�s
zNoteBook.pagescCs|j�|jd|�dSrjrMr+rrrrl�szNoteBook.raise_pagecCs|j�|jd�S)N�raisedrMr?rrrrp�szNoteBook.raised)r2r3r4r5r9r�rzrergrlrprrrrrnisrnc@seZdZdS)�
NoteBookFrameN)r2r3r4rrrrrq�srqc@sLeZdZdZifdd�Zifdd�Zifdd�Zdd	�Zd
d�Zdd
�Z	dS)�
OptionMenuz�OptionMenu - creates a menu button of options.

    Subwidget       Class
    ---------       -----
    menubutton      Menubutton
    menu            MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZ
tixOptionMenur\�
menubutton�menu�r[r9�_dummyMenubuttonrc�
_dummyMenur�rrrr9�szOptionMenu.__init__cKs&|jj|jdd|f|�||���dS)Nr��commandrCrcrrr�add_command�szOptionMenu.add_commandcKs&|jj|jdd|f|�||���dS)Nr�Z	separatorrCrcrrr�
add_separator�szOptionMenu.add_separatorcCs|j�|jd|�dSr�rMr+rrrrz�szOptionMenu.deletecCs|j�|jd|�dS)N�disablerMr+rrrr{�szOptionMenu.disablecCs|j�|jd|�dS)N�enablerMr+rrrr|�szOptionMenu.enableN)
r2r3r4r5r9ryrzrzr{r|rrrrrr�srrc@sTeZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�Zifdd
�Z	dd�Z
dS)�PanedWindowa�PanedWindow - Multi-pane container widget
    allows the user to interactively manipulate the sizes of several
    panes. The panes can be arranged either vertically or horizontally.The
    user changes the sizes of the panes by dragging the resize handle
    between two panes.

    Subwidgets       Class
    ----------       -----
    <panes>       g/p widgets added dynamically with the add method.cKst�||dddg||�dS)NZtixPanedWindowr�r\r�r�rrrr9�szPanedWindow.__init__cKs>|jj|jd|f|�||���t||dd�|j|<|j|S)Nr�r)rrbrcrrrr��s
 �zPanedWindow.addcCs,|j�|jd|�|j|��|j|=dSr�ror+rrrrz�szPanedWindow.deletecCs|j�|jd|�dS)NrNrMr+rrrrN�szPanedWindow.forgetcCs|j�|jd||�S)N�panecgetrMr&rrrr~�szPanedWindow.panecgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS)N�
paneconfigurerr�rrrr�szPanedWindow.paneconfigurecs*�j��j��jd��}�fdd�|D�S)N�panescsg|]}��|��qSrrdrVr?rrrX�sz%PanedWindow.panes.<locals>.<listcomp>rZ)rrrrr?rr��szPanedWindow.panesN)r2r3r4r5r9r�rzrNr~rr�rrrrr}�s
r}c@s4eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
S)�	PopupMenuaPopupMenu widget can be used as a replacement of the tk_popup command.
    The advantage of the Tix PopupMenu widget is it requires less application
    code to manipulate.


    Subwidgets       Class
    ----------       -----
    menubutton       Menubutton
    menu       MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixPopupMenur\rsrtrur�rrrr9�szPopupMenu.__init__cCs|j�|jd|j�dS)Nr�rMr�rrrr��szPopupMenu.bind_widgetcCs|j�|jd|j�dSr�rMr�rrrr��szPopupMenu.unbind_widgetcCs|j�|jd|j||�dS)NZpostrM)rr�rQrRrrr�post_widget�szPopupMenu.post_widgetN)r2r3r4r5r9r�r�r�rrrrr��s
r�c@s<eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�ResizeHandlez;Internal widget to draw resize handles on Scrolled widgets.c	Ks.ddddddddd	g	}t�||d
|||�dS)Nr\rxZcursorfgZcursorbgZ
handlesizeZ	hintcolorZ	hintwidthrQrRZtixResizeHandler�)rrdr'r(�flagsrrrr9�s�
�zResizeHandle.__init__cCs|j�|jd|j�dS)NZattachwidgetrMr�rrr�
attach_widgetszResizeHandle.attach_widgetcCs|j�|jd|j�dS)NZdetachwidgetrMr�rrr�
detach_widgetszResizeHandle.detach_widgetcCs|j�|jd|j�dS)Nr!rMr�rrrr!szResizeHandle.hidecCs|j�|jd|j�dS)NrWrMr�rrrrW	szResizeHandle.showN)	r2r3r4r5r9r�r�r!rWrrrrr��s
r�c@seZdZdZifdd�ZdS)�
ScrolledHListz0ScrolledHList - HList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledHListr\r�r�r�r�r�rrrr9s�zScrolledHList.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledListBoxz4ScrolledListBox - Listbox with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledListBoxr\�listboxr�r�)r[r9�
_dummyListboxrcr�r�rrrr9szScrolledListBox.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledTextz.ScrolledText - Text with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTextr\rr�r�)r[r9�
_dummyTextrcr�r�rrrr9%szScrolledText.__init__Nr�rrrrr�!sr�c@seZdZdZifdd�ZdS)�
ScrolledTListz0ScrolledTList - TList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTListr\Ztlistr�r�)r[r9�_dummyTListrcr�r�rrrr9/s�zScrolledTList.__init__Nr�rrrrr�+sr�c@seZdZdZifdd�ZdS)�ScrolledWindowz2ScrolledWindow - Window with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledWindowr\rr�r�)r[r9r^rcr�r�rrrr9:szScrolledWindow.__init__Nr�rrrrr�6sr�c@s0eZdZdZifdd�Zifdd�Zdd�ZdS)	�Selectz�Select - Container of button subwidgets. It can be used to provide
    radio-box or check-box style of selection options for the user.

    Subwidgets are buttons added dynamically using the add method.c
Ks2t�||ddddddg||�t|d�|jd<dS)NZ	tixSelectZ	allowzero�radior�r[r\r�r�r�rrrr9Gs
��zSelect.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�r�rcrrrr�Ns z
Select.addcCs|j�|jd|�dSr�rMr+rrrr�Ssz
Select.invokeNr�rrrrr�@sr�c@seZdZdZdifdd�ZdS)�Shellz'Toplevel window.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixShellr\�titler�r�rrrr9[szShell.__init__r�rrrrr�Vsr�c@s6eZdZdZdifdd�Zdd�Zdd�Zd	d
�ZdS)�DialogShellz�Toplevel window, with popup popdown and center methods.
    It tells the window manager that it is a dialog window and should be
    treated specially. The exact treatment depends on the treatment of
    the window manager.

    Subwidgets - NoneNcKs&t�||ddddddddg||�dS)	NZtixDialogShellr\r�ZmappedZ	minheightZminwidthr�Z	transientr�r�rrrr9gs��zDialogShell.__init__cCs|j�|jd�dSr�rMr?rrrr�nszDialogShell.popdowncCs|j�|jd�dSr�rMr?rrrr�qszDialogShell.popupcCs|j�|jd�dS)N�centerrMr?rrrr�tszDialogShell.center)r2r3r4r5r9r�r�r�rrrrr�^s
r�c@s&eZdZdZdifdd�Zdd�ZdS)�StdButtonBoxz@StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) NcKs\t�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixStdButtonBoxr�r\r��applyr��help)r[r9r�rcr�rrrr9zs
�zStdButtonBox.__init__cCs ||jkr|j�|jd|�dSr�r�r+rrrr��s
zStdButtonBox.invoke)r2r3r4r5r9r�rrrrr�wsr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zd3d
d�Z	dd�Z
dd�Zdd�Zdd�Z
ifdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zifd-d.�Zd/d0�Zd4d1d2�ZdS)5�TLista�TList - Hierarchy display widget which can be
    used to display data in a tabular format. The list entries of a TList
    widget are similar to the entries in the Tk listbox widget. The main
    differences are (1) the TList widget can display the list entries in a
    two dimensional format and (2) you can use graphical images as well as
    multiple colors and fonts for the list entries.

    Subwidgets - NoneNcKst�||ddg||�dS)NZtixTListr\r�r�rrrr9�szTList.__init__cCs|j�|jdd|�dS)N�activer�rMr�rrr�
active_set�szTList.active_setcCs|j�|jdd�dS)Nr�rrMr?rrr�active_clear�szTList.active_clearcCs|j�|jdd|�dSr�rMr�rrrr��szTList.anchor_setcCs|j�|jdd�dSr�rMr?rrrr�szTList.anchor_clearcCs|j�|jd||�dSr�rM�r�from_�torrrrz�szTList.deletecCs|j�|jdd|�dSrrMr�rrrr
�szTList.dragsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dragsite_clearcCs|j�|jdd|�dSrrMr�rrrr�szTList.dropsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dropsite_clearcKs$|jj|jd|f|�||���dSr�rC)rr�r'r(rrrr��szTList.insertcCs|j�|jdd�S)NrTr�rMr?rrr�info_active�szTList.info_activecCs|j�|jdd�Sr,rMr?rrrr-�szTList.info_anchorcCs|j�|jdd|�S)NrTZdownrMr�rrr�	info_down�szTList.info_downcCs|j�|jdd|�S)NrT�leftrMr�rrr�	info_left�szTList.info_leftcCs|j�|jdd|�S)NrT�rightrMr�rrr�
info_right�szTList.info_rightcCs|j�|jdd�}|j�|�Sr>r1r�rrrr?�szTList.info_selectioncCs|j�|jdd�S)NrTrrMr?rrr�	info_size�szTList.info_sizecCs|j�|jdd|�S)NrTZuprMr�rrr�info_up�sz
TList.info_upcCs|j�|jd||�SrKrM�rrQrRrrrrL�sz
TList.nearestcCs|j�|jd|�dSrMrMr�rrrrN�sz	TList.seecKs$|jj|jddf|�||���dSrOrCr&rrrrP�szTList.selection_clearcCs|j�|jdd|�SrQrMr�rrrrR�szTList.selection_includescCs|j�|jdd||�dSrSrMrTrrrrV�szTList.selection_set)N)N)r2r3r4r5r9r�r�r�rrzr
rrrr�r�r-r�r�r�r?r�r�rLrNrPrRrVrrrrr��s2	
r�c@sHeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dS)�Treez�Tree - The tixTree widget can be used to display hierarchical
    data in a tree form. The user can adjust
    the view of the tree by opening or closing parts of the tree.NcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixTreer\r�r�r�r�r�rrrr9�s
�z
Tree.__init__cCs|j�|jd�dS�aThis command calls the setmode method for all the entries in this
     Tree widget: if an entry has no child entries, its mode is set to
     none. Otherwise, if the entry has any hidden child entries, its mode is
     set to open; otherwise its mode is set to close.�autosetmodeNrMr?rrrr��szTree.autosetmodecCs|j�|jd|�dS�z8Close the entry given by entryPath if its mode is close.�closeNrM�r�	entrypathrrrr��sz
Tree.closecCs|j�|jd|�S�z9Returns the current mode of the entry given by entryPath.�getmoderMr�rrrr��szTree.getmodecCs|j�|jd|�dS�z6Open the entry given by entryPath if its mode is open.�openNrMr�rrrr��sz	Tree.open�nonecCs|j�|jd||�dS)a�This command is used to indicate whether the entry given by
     entryPath has children entries and whether the children are visible. mode
     must be one of open, close or none. If mode is set to open, a (+)
     indicator is drawn next the entry. If mode is set to close, a (-)
     indicator is drawn next the entry. If mode is set to none, no
     indicators will be drawn for this entry. The default mode is none. The
     open mode indicates the entry has hidden children and this entry can be
     opened by the user. The close mode indicates that all the children of the
     entry are now visible and the entry can be closed by the user.�setmodeNrM�rr��moderrrr��s
zTree.setmode)r�)
r2r3r4r5r9r�r�r�r�r�rrrrr��sr�c@sZeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dd�Z
ddd�ZdS)�	CheckListz�The CheckList widget
    displays a list of items to be selected by the user. CheckList acts
    similarly to the Tk checkbutton or radiobutton widgets, except it is
    capable of handling many more items than checkbuttons or radiobuttons.
    NcKsLt�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixCheckListr\r�r�r�r�r�r�rrrr9s
�zCheckList.__init__cCs|j�|jd�dSr�rMr?rrrr�szCheckList.autosetmodecCs|j�|jd|�dSr�rMr�rrrr�szCheckList.closecCs|j�|jd|�Sr�rMr�rrrr� szCheckList.getmodecCs|j�|jd|�dSr�rMr�rrrr�$szCheckList.open�oncCs|j�|j�|jd|��S)z�Returns a list of items whose status matches status. If status is
     not specified, the list of items in the "on" status will be returned.
     Mode can be on, off, default�getselectionrZ)rr�rrrr�(szCheckList.getselectioncCs|j�|jd|�S)z(Returns the current status of entryPath.�	getstatusrMr�rrrr�.szCheckList.getstatuscCs|j�|jd||�dS)z~Sets the status of entryPath to be status. A bitmap will be
     displayed next to the entry its status is on, off or default.�	setstatusNrMr�rrrr�2szCheckList.setstatus)r�)r�)r2r3r4r5r9r�r�r�r�r�r�r�rrrrr�s
r�c@seZdZddd�ZdS)r�rjcCst�||||�dSrF�r|r9�rrdr,r~rrrr9>sz_dummyButton.__init__N)rj�r2r3r4r9rrrrr�=sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Bsz_dummyCheckbutton.__init__N)rjr�rrrrr�Asr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Fsz_dummyEntry.__init__N)rjr�rrrrr�Esr�c@seZdZddd�ZdS)r^rjcCst�||||�dSrFr�r�rrrr9Jsz_dummyFrame.__init__N)rjr�rrrrr^Isr^c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Nsz_dummyLabel.__init__N)rjr�rrrrr�Msr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Rsz_dummyListbox.__init__N)rjr�rrrrr�Qsr�c@seZdZddd�ZdS)rwrjcCst�||||�dSrFr�r�rrrr9Vsz_dummyMenu.__init__N)rjr�rrrrrwUsrwc@seZdZddd�ZdS)rvrjcCst�||||�dSrFr�r�rrrr9Zsz_dummyMenubutton.__init__N)rjr�rrrrrvYsrvc@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9^sz_dummyScrollbar.__init__N)rjr�rrrrr�]sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9bsz_dummyText.__init__N)rjr�rrrrr�asr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�)r|r9r�rcr�r�rrrr9fsz_dummyScrolledListBox.__init__N)rjr�rrrrr�esr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9msz_dummyHList.__init__N)rjr�rrrrr�lsr�c@seZdZddd�ZdS)rarjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS�Nr�r�r��r|r9r�rcr�r�rrrr9qsz_dummyScrolledHList.__init__N)rjr�rrrrrapsrac@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9xsz_dummyTList.__init__N)rjr�rrrrr�wsr�c@seZdZddd�ZdS)r�rjcCs�t�|||d|g�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<z$t|d�|jd<t|d�|jd<Wntk
r�YnXdS)Nr�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�r�rrrr9|s�
z_dummyComboBox.__init__N)rjr�rrrrr�{sr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dSr�r�r�rrrr9�sz_dummyDirList.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs4t�||||�t|d�|jd<t|d�|jd<dS)Nr�r�)r|r9r�rcr�r�rrrr9�sz_dummyDirSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs�t�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)	Nr�r�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�rrrr9�sz_dummyExFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�r�rrrr9�s
z_dummyFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs$t�||||�t|d�|jd<dS)Nr�)r|r9r�rcr�rrrr9�sz_dummyFileComboBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�rrrr9�s
z_dummyStdButtonBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)�_dummyNoteBookFramercCst�||||�dSrFr�r�rrrr9�sz_dummyNoteBookFrame.__init__N)rr�rrrrr��sr�c@seZdZddd�ZdS)r`rjcCst�||||�dSrFr�r�rrrr9�sz_dummyPanedWindow.__init__N)rjr�rrrrr`�sr`cCs|j�d|j�S)zzReturns the qualified path name for the widget. Normally used to set
    default options for subwidgets. See tixwidgets.pyZ
tixOptionNamerM)r�rrr�
OptionName�sr�cCs:d}|��D](}|d|d|d||d}q|S)Nr=z{{z} {z - z}} )�keys)�dict�s�typerrr�FileTypeList�s&r�c@seZdZdZdS)�CObjViewaBThis file implements the Canvas Object View widget. This is a base
    class of IconView. It implements automatic placement/adjustment of the
    scrollbars according to the canvas objects inside the canvas subwidget.
    The scrollbars are adjusted so that the canvas is just large enough
    to see all the objects.
    N)r2r3r4r5rrrrr��sr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zd)dd�Zd*d
d�Z	dd�Z
dd�Zdd�Zd+dd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd,d!d"�Zd#d$�Zd%d&�Zd'd(�ZdS)-�Grida}The Tix Grid command creates a new window  and makes it into a
    tixGrid widget. Additional options, may be specified on the command
    line or in the option database to configure aspects such as its cursor
    and relief.

    A Grid widget displays its contents in a two dimensional grid of cells.
    Each cell may contain one Tix display item, which may be in text,
    graphics or other formats. See the DisplayStyle class for more information
    about Tix display items. Individual cells, or groups of cells, can be
    formatted with a wide range of attributes, such as its color, relief and
    border.

    Subwidgets - NoneNcKs"g}||_t�||d|||�dS)NZtixGrid�r'r[r9r�rrrr9�sz
Grid.__init__cCs|j�|dd�dS)zRemoves the selection anchor.r�rNrr?rrrrszGrid.anchor_clearcCs|�|j�|dd��S)z3Get the (x,y) coordinate of the current anchor cellr�r/�r/rrr?rrr�
anchor_getszGrid.anchor_getcCs|j�|dd||�dS)z/Set the selection anchor to the cell at (x, y).r�r�Nrr�rrrr�szGrid.anchor_setcCs4|dkr|j�|dd|�n|j�|dd||�dS)zdDelete rows between from_ and to inclusive.
        If to is not provided,  delete only row at from_Nrzr
rr�rrr�
delete_rowszGrid.delete_rowcCs4|dkr|j�|dd|�n|j�|dd||�dS)zjDelete columns between from_ and to inclusive.
        If to is not provided,  delete only column at from_Nrzr	rr�rrr�
delete_columnszGrid.delete_columncCs|j�|dd�dS)zUIf any cell is being edited, de-highlight the cell  and  applies
        the changes.�editr�Nrr?rrr�
edit_applyszGrid.edit_applycCs|j�|dd||�dS)zmHighlights  the  cell  at  (x, y) for editing, if the -editnotify
        command returns True for this cell.r�r�Nrr�rrr�edit_set!sz
Grid.edit_setcCs,|r|ddkrd|}|j�|d|||�S)z&Get the option value for cell at (x,y)rr!rHr)rrQrRrrrrrH&szGrid.entrycgetcKs|�d||f||�SrI)Z
_configure)rrQrRr'r(rrrrJ,szGrid.entryconfigurec	Cs|�|j�|dd||��S)z+Return True if display item exists at (x,y)rTr()Z_getbooleanrrr�rrrr72szGrid.info_existscCs|j�|dd||�Sr.rr�rrrr06szGrid.info_bboxcCs|j�|dd|||�dS)z�Moves the range of columns from position FROM through TO by
        the distance indicated by OFFSET. For example, move_column(2, 4, 1)
        moves the columns 2,3,4 to columns 3,4,5.�mover	Nr�rr�r��offsetrrr�move_column:szGrid.move_columncCs|j�|dd|||�dS)z�Moves the range of rows from position FROM through TO by
        the distance indicated by OFFSET.
        For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.r�r
Nrr�rrr�move_row@sz
Grid.move_rowcCs|�|j�|d||��S)z8Return coordinate of cell nearest pixel coordinate (x,y)rLr�r�rrrrLFszGrid.nearestcKs>|�|j|�}|dk	r"d|f|}|jj|d||f|��dS)Nz	-itemtyper�)r%r'rr)rrQrRr�r(�argsrrrr�PszGrid.setcKs*|j�|jj|jdd|f|�i|����S)a�Queries or sets the size of the column given by
        INDEX.  INDEX may be any non-negative
        integer that gives the position of a given column.
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all columns.
        When no option-value pair is given, this command returns a tuple
        containing the current size setting of the given column.  When
        option-value pairs are given, the corresponding options of the
        size setting of the given column are changed. Options may be one
        of the following:
              pad0 pixels
                     Specifies the paddings to the left of a column.
              pad1 pixels
                     Specifies the paddings to the right of a column.
              size val
                     Specifies the width of a column.  Val may be:
                     "auto" -- the width of the column is set to the
                     width of the widest cell in the column;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the width of the column to the
                     given number of characters.rr	)rrPrrDr%�rr�r(rrr�size_columnVs
�zGrid.size_columncKs(|j�|jj|dd|f|�i|����S)a�Queries or sets the size of the row given by
        INDEX. INDEX may be any non-negative
        integer that gives the position of a given row .
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all rows.
        When no option-value pair is given, this command returns a list con-
        taining the current size setting of the given row . When option-value
        pairs are given, the corresponding options of the size setting of the
        given row are changed. Options may be one of the following:
              pad0 pixels
                     Specifies the paddings to the top of a row.
              pad1 pixels
                     Specifies the paddings to the bottom of a row.
              size val
                     Specifies the height of a row.  Val may be:
                     "auto" -- the height of the row is set to the
                     height of the highest cell in the row;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the height of the row to the
                     given number of characters.rr
)rrPrr%r�rrr�size_rowps�
�z
Grid.size_rowcCs|j�|jd||�dS)z7Clears the cell at (x, y) by removing its display item.�unsetNrMr�rrrr��sz
Grid.unset)N)N)N)N)r2r3r4r5r9rr�r�r�r�r�r�rHrJr7r0r�r�rLr�r�r�r�rrrrr��s(	




r�c@seZdZdZdifdd�ZdS)�ScrolledGridzScrolled Grid widgetsNcKs"g}||_t�||d|||�dS)NZtixScrolledGridr�r�rrrr9�szScrolledGrid.__init__r�rrrrr��sr�)ur:r8rZ_tkinterZWINDOWZTEXTZSTATUSZ	IMMEDIATEZIMAGEZ	IMAGETEXTZBALLOONZAUTOZ	ACROSSTOP�ASCIIZCELLZCOLUMNZ
DECREASINGZ
INCREASINGZINTEGERZMAIN�MAXZREALZROWZS_REGIONZX_REGIONZY_REGIONZ
TCL_DONT_WAITZTCL_WINDOW_EVENTSZTCL_FILE_EVENTSZTCL_TIMER_EVENTSZTCL_IDLE_EVENTSZTCL_ALL_EVENTSrr6rAra�	__bases__r[r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZXViewZYViewr�rYrZr\r_rmrnrqrrr}r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZButtonr�ZCheckbuttonr�ZEntryr�ZFramer^ZLabelr�ZListboxr�ZMenurwZ
MenubuttonrvZ	Scrollbarr�ZTextr�r�r�rar�r�r�r�r�r�r�r�r�r`r�r�r�r�r�rrrr�<module>s�-
8/,!"C#	()


S.6

*PK�(�Z ���I�I�$__pycache__/tix.cpython-38.opt-2.pycnu�[���U

e5d-,�@sLddlZddlZddlTddlmZddlZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZGdd �d �Z Gd!d"�d"ej!e �Z!Gd#d$�d$�Z"ej#j$e"fej#_$Gd%d&�d&ej#�Z%Gd'd(�d(e%�Z&Gd)d*�d*�Z'Gd+d,�d,e%�Z(Gd-d.�d.e%�Z)Gd/d0�d0e%�Z*Gd1d2�d2e%�Z+Gd3d4�d4e%�Z,Gd5d6�d6e%�Z-Gd7d8�d8e%�Z.Gd9d:�d:e%�Z/Gd;d<�d<e%�Z0Gd=d>�d>e%�Z1Gd?d@�d@e%�Z2GdAdB�dBe%�Z3GdCdD�dDe%�Z4GdEdF�dFe%e5e6�Z7GdGdH�dHe%�Z8GdIdJ�dJe%�Z9GdKdL�dLe%�Z:GdMdN�dNe%�Z;GdOdP�dPe%�Z<GdQdR�dRe%�Z=GdSdT�dTe%�Z>GdUdV�dVe%�Z?GdWdX�dXe%�Z@GdYdZ�dZe%�ZAGd[d\�d\e%�ZBGd]d^�d^e%�ZCGd_d`�d`e%�ZDGdadb�dbe%�ZEGdcdd�dde%�ZFGdedf�dfe%�ZGGdgdh�dhe%�ZHGdidj�dje%�ZIGdkdl�dle%�ZJGdmdn�dne%�ZKGdodp�dpe%e5e6�ZLGdqdr�dre%�ZMGdsdt�dte%�ZNGdudv�dveOe&�ZPGdwdx�dxeQe&�ZRGdydz�dzeSe&�ZTGd{d|�d|eUe&�ZVGd}d~�d~eWe&�ZXGdd��d�eYe&�ZZGd�d��d�e[e&�Z\Gd�d��d�e]e&�Z^Gd�d��d�e_e&�Z`Gd�d��d�eae&�ZbGd�d��d�eDe&�ZcGd�d��d�e7e&�ZdGd�d��d�eCe&�ZeGd�d��d�eLe&�ZfGd�d��d�e*e&�ZgGd�d��d�e,e&�ZhGd�d��d�e.e&�ZiGd�d��d�e/e&�ZjGd�d��d�e2e&�ZkGd�d��d�e*e&�ZlGd�d��d�eKe&�ZmGd�d��d�e>e&�ZnGd�d��d�e@e&�Zod�d��Zpd�d��ZqGd�d��d�e%�ZrGd�d��d�e%e5e6�ZsGd�d��d�es�ZtdS)��N)�*)�	_cnfmerge�window�textZstatusZ	immediate�imageZ	imagetextZballoon�autoZ	acrosstop�asciiZcell�columnZ
decreasingZ
increasingZinteger�main�max�real�rowzs-regionzx-regionzy-region����� c@sReZdZdd�Zdd�Zddd�Zddd	�Zd
d�Zdd
�Zdd�Z	ddd�Z
dS)�
tixCommandcCs|j�dd|�S)N�tixZaddbitmapdir��tk�call)�selfZ	directory�r�#/usr/lib64/python3.8/tkinter/tix.py�tix_addbitmapdirRs
ztixCommand.tix_addbitmapdircCs|j�dd|�S)Nr�cgetr�r�optionrrr�tix_cget^sztixCommand.tix_cgetNcKsd|rt||f�}n|rt|�}|dkr2|�dd�St|t�rN|�ddd|�S|j�d|�|��S)Nr�	configure�-)rr )r�
_getconfigure�
isinstance�strZ_getconfigure1rr�_options�r�cnf�kwrrr�
tix_configurees
ztixCommand.tix_configurecCs*|dk	r|j�dd|�S|j�dd�SdS)NrZ
filedialogr)rZdlgclassrrr�tix_filedialog{s	ztixCommand.tix_filedialogcCs|j�dd|�S)NrZ	getbitmapr�r�namerrr�
tix_getbitmap�s	ztixCommand.tix_getbitmapcCs|j�dd|�S)NrZgetimagerr+rrr�tix_getimage�sztixCommand.tix_getimagecCs|j�ddd|�S)Nrr�getrr+rrr�tix_option_get�sztixCommand.tix_option_getcCs2|dk	r|j�dd|||�S|j�dd||�SdS)NrZresetoptionsr)rZ	newSchemeZ
newFontSetZ
newScmPriorrr�tix_resetoptions�sztixCommand.tix_resetoptions)N)N)N)�__name__�
__module__�__qualname__rrr)r*r-r.r0r1rrrrrGs

rc@seZdZddd�Zdd�ZdS)�TkN�TixcCsbtj�||||�tj�d�}|j�d�|dk	rR|j�d|�|j�d|�|j�d�dS)NZTIX_LIBRARYz<global auto_path; lappend auto_path [file dir [info nameof]]z(global auto_path; lappend auto_path {%s}z,global tcl_pkgPath; lappend tcl_pkgPath {%s}zpackage require Tix)�tkinterr5�__init__�os�environr/r�eval)rZ
screenNameZbaseNameZ	classNameZtixlibrrrr8�szTk.__init__cCs|�dd�tj�|�dS)NZWM_DELETE_WINDOW�)Zprotocolr7r5�destroy�rrrrr=�sz
Tk.destroy)NNr6�r2r3r4r8r=rrrrr5�s
r5c@sPeZdZifdd�ZeZdd�Zdd�Zdd�Zdd
d�Zdd
d�Z	dd�Z
dS)�FormcKs"|jjd|jf|�||���dS)N�tixForm�rr�_wr%r&rrr�config�szForm.configcCst�|||i�dS�N)r@�form�r�key�valuerrr�__setitem__�szForm.__setitem__cCs|j�dd|j�S)NrA�check�rrrCr>rrrrK�sz
Form.checkcCs|j�dd|j�dS)NrA�forgetrLr>rrrrM�szForm.forgetrcCs`|sJ|sJ|j�dd|j�}|j�|�}d}|D]}||j�|�f}q.|S|j�dd|j||�S)NrA�gridr)rrrC�	splitlistZgetint)rZxsizeZysize�x�y�zrrrrN�sz	Form.gridNcCs>|s|j�dd|j�S|ddkr*d|}|j�dd|j|�S)NrA�inforr!rLrrrrrS�s
z	Form.infocs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr)�
_nametowidget��.0rPr>rr�
<listcomp>szForm.slaves.<locals>.<listcomp>rA�slaves�rrOrrCr>rr>rrXs
���zForm.slaves)rr)N)r2r3r4rDrFrJrKrMrNrSrXrrrrr@�s


r@c@sneZdZdddiifdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
idfdd�Zdd�ZdS)�	TixWidgetNc	Cs�|rt||f�}nt|�}d}|r.|�d�ndg}t|���D]&\}}||kr@|d||f}||=q@||_t�|||�|r�|jj||j	f|��|r�t�
||�i|_dS)Nr�optionsr!)r�append�list�items�
widgetName�Widget�_setuprrrCrD�subwidget_list)	r�masterr_Zstatic_optionsr'r(Zextra�k�vrrrr8s$zTixWidget.__init__cCs ||jkr|j|St|��dSrE)rb�AttributeErrorr+rrr�__getattr__Gs

zTixWidget.__getattr__cCs|j�d|j|�dS)NZtixSetSilentrL)rrIrrr�
set_silentLszTixWidget.set_silentcCsD|�|�}|s$td|d|j��|t|j�dd�}|�|�S)Nz
Subwidget z not child of �)�_subwidget_name�TclError�_name�lenrCrT)rr,�nrrr�	subwidgetPs

zTixWidget.subwidgetcCsZ|��}|sgSg}|D]<}|t|j�dd�}z|�|�|��WqYqXq|S)Nri)�_subwidget_namesrmrCr\rT)r�namesZretlistr,rrr�subwidgets_allZszTixWidget.subwidgets_allcCs0z|j�|jd|�WStk
r*YdSXdS)Nro)rrrCrkr+rrrrjiszTixWidget._subwidget_namecCs<z |j�|jdd�}|j�|�WStk
r6YdSXdS)NZ
subwidgetsz-all)rrrCrOrk)rrPrrrrpps
zTixWidget._subwidget_namescCs\|dkrdSt|t�st|�}t|t�s0t|�}|��}|D]}|j�|dd||�q<dS)Nr<r r!)r#r$�reprrprr)rrrIrqr,rrr�
config_allxs

zTixWidget.config_allcKst|s|}|r|rt||f�}n|r&|}d}|��D]*\}}t|�rL|�|�}|d||f}q2|j�dd|f|�S)Nrr!r�create)rr^�callable�	_registerrr)rZimgtyper'rcr(r[rdrerrr�image_create�s
zTixWidget.image_createcCs.z|j�dd|�Wntk
r(YnXdS)Nr�delete)rrrk)rZimgnamerrr�image_delete�szTixWidget.image_delete)
r2r3r4r8rgrhrorrrjrprtrxrzrrrrrZ
s
�
-
rZc@seZdZddd�Zdd�ZdS)�TixSubWidgetric
Cs�|rD|�|�}z$|t|j�dd�}|�d�}Wng}YnX|s`t�||ddd|i�n�|}tt|�d�D]V}d�|d|d��}	z|�|	�}
|
}Wqtt	k
r�t
|||ddd�}YqtXqt|r�|d}t�||ddd|i�||_dS)Nri�.r,r)�destroy_physically�check_intermediate���)rjrmrC�splitrZr8�range�joinrT�KeyErrorr{r})rrcr,r}r~�pathZplist�parent�irn�wrrrr8�s0



�zTixSubWidget.__init__cCsjt|j���D]}|��q|j|jjkr6|jj|j=|j|jjkrP|jj|j=|jrf|j�	d|j
�dS)Nr=)r]�children�valuesr=rlrcrbr}rrrC�r�crrrr=�s
zTixSubWidget.destroyN)ririr?rrrrr{�s�
 r{c@sReZdZifdd�dd�Zdd�Zdd�Zd	d
�Zdd�Zifd
d�Zdd�Z	dS)�DisplayStyleN)rccKs\|s2d|kr|d}nd|kr(|d}n
t�d�}|j|_|jjd|f|�||���|_dS)NZ	refwindowzcreate display styleZtixDisplayStyle)r7Z_get_default_rootrrr%�	stylename)r�itemtyper'rcr(rrrr8�s



�zDisplayStyle.__init__cCs|jSrE)r�r>rrr�__str__�szDisplayStyle.__str__cCsH|r|rt||f�}n|r|}d}|��D]\}}|d||f}q*|S)Nrr!)rr^)rr'r(Zoptsrdrerrrr%�szDisplayStyle._optionscCs|j�|jd�dS�Nry�rrr�r>rrrry�szDisplayStyle.deletecCs|j�|jdd||�dS)Nr �-%sr�rGrrrrJ�szDisplayStyle.__setitem__cKs|j|jdf|�||���S)Nr )r"r�r%r&rrrrD�s�
�zDisplayStyle.configcCs|j�|jdd|�S)Nrr�r�)rrHrrr�__getitem__�szDisplayStyle.__getitem__)
r2r3r4r8r�r%ryrJrDr�rrrrr��s
r�c@s.eZdZdifdd�Zifdd�Zdd�ZdS)�BalloonNcKsNdddddg}t�||d|||�t|ddd	�|jd<t|d
dd	�|jd
<dS)Nr[ZinstallcolormapZinitwaitZ	statusbarZcursorZ
tixBalloon�labelr�r}�message�rZr8�_dummyLabelrb�rrcr'r(Zstaticrrrr8	s���zBalloon.__init__cKs&|jj|jd|jf|�||���dS�NZbindrB)r�widgetr'r(rrr�bind_widgetszBalloon.bind_widgetcCs|j�|jd|j�dS�NZunbindrL�rr�rrr�
unbind_widgetszBalloon.unbind_widget)r2r3r4r8r�r�rrrrr�s	
r�c@s.eZdZdifdd�Zifdd�Zdd�ZdS)�	ButtonBoxNcKst�||dddg||�dS)NZtixButtonBox�orientationr[�rZr8�rrcr'r(rrrr8s

�zButtonBox.__init__cKs4|jj|jd|f|�||���}t||�|j|<|S�N�add�rrrCr%�_dummyButtonrb)rr,r'r(Zbtnrrrr�#s z
ButtonBox.addcCs ||jkr|j�|jd|�dS�N�invoke�rbrrrCr+rrrr�*s
zButtonBox.invoke�r2r3r4r8r�r�rrrrr�sr�c@s:eZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�ComboBoxNc	Ks�t�||dddddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<z$t|d
�|jd
<t|d�|jd<Wntk
r�YnXdS)NZtixComboBoxZeditableZdropdown�fancyr[r��entry�arrow�slistbox�tick�cross)rZr8r�rb�_dummyEntryr��_dummyScrolledListBox�	TypeErrorr�rrrr8<s 

��
zComboBox.__init__cCs|j�|jd|�dS)NZ
addhistoryrL�rr$rrr�add_historyNszComboBox.add_historycCs|j�|jd|�dS)NZ
appendhistoryrLr�rrr�append_historyQszComboBox.append_historycCs|j�|jd||�dS�N�insertrL)r�indexr$rrrr�TszComboBox.insertcCs|j�|jd|�dS)N�pickrL�rr�rrrr�Wsz
ComboBox.pick)r2r3r4r8r�r�r�r�rrrrr�.s
r�c@s:eZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�ControlNcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixControlr[�incr�decrr�r�)rZr8r�rbr�r�r�rrrr8hs
zControl.__init__cCs|j�|jd�dS)Nr�rLr>rrr�	decrementoszControl.decrementcCs|j�|jd�dS)Nr�rLr>rrr�	incrementrszControl.incrementcCs|j�|jd�dSr�rLr>rrrr�uszControl.invokecCs|j�|jd�dS)N�updaterLr>rrrr�xszControl.update)r2r3r4r8r�r�r�r�rrrrr�Zs
r�c@s eZdZifdd�Zdd�ZdS)�DirListcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirListr[�hlist�vsb�hsb�rZr8�_dummyHListrb�_dummyScrollbarr�rrrr8�szDirList.__init__cCs|j�|jd|�dS�N�chdirrL�r�dirrrrr��sz
DirList.chdirN�r2r3r4r8r�rrrrr�{sr�c@s eZdZifdd�Zdd�ZdS)�DirTreecKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirTreer[r�r�r�r�r�rrrr8�szDirTree.__init__cCs|j�|jd|�dSr�rLr�rrrr��sz
DirTree.chdirNr�rrrrr��s
r�c@seZdZifdd�ZdS)�DirSelectBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixDirSelectBoxr[�dirlist�dircbx)rZr8�
_dummyDirListrb�_dummyFileComboBoxr�rrrr8�szDirSelectBox.__init__N�r2r3r4r8rrrrr��sr�c@s(eZdZifdd�Zdd�Zdd�ZdS)�ExFileSelectBoxcKs�t�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<t|d
�|jd
<dS)NZtixExFileSelectBoxr[�cancel�ok�hidden�typesr�r��file�filelist)rZr8r�rb�_dummyCheckbutton�_dummyComboBoxr�r�r�rrrr8�szExFileSelectBox.__init__cCs|j�|jd�dS�N�filterrLr>rrrr��szExFileSelectBox.filtercCs|j�|jd�dSr�rLr>rrrr��szExFileSelectBox.invokeN)r2r3r4r8r�r�rrrrr��sr�c@s(eZdZifdd�Zdd�Zdd�ZdS)�DirSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixDirSelectDialogr[Zdirbox)rZr8�_dummyDirSelectBoxrbr�rrrr8�s
�zDirSelectDialog.__init__cCs|j�|jd�dS�N�popuprLr>rrrr��szDirSelectDialog.popupcCs|j�|jd�dS�N�popdownrLr>rrrr��szDirSelectDialog.popdownN�r2r3r4r8r�r�rrrrr��s
r�c@s(eZdZifdd�Zdd�Zdd�ZdS)�ExFileSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixExFileSelectDialogr[�fsbox)rZr8�_dummyExFileSelectBoxrbr�rrrr8�s
�zExFileSelectDialog.__init__cCs|j�|jd�dSr�rLr>rrrr�szExFileSelectDialog.popupcCs|j�|jd�dSr�rLr>rrrr�szExFileSelectDialog.popdownNr�rrrrr��s	r�c@s(eZdZifdd�Zdd�Zdd�ZdS)�
FileSelectBoxcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixFileSelectBoxr[r�r�r��	selection)rZr8r�rbr�r�rrrr8s
zFileSelectBox.__init__cCs|j�|jd�dSr�rLr>rrr�apply_filterszFileSelectBox.apply_filtercCs|j�|jd�dSr�rLr>rrrr�szFileSelectBox.invokeN)r2r3r4r8r�r�rrrrr�sr�c@s(eZdZifdd�Zdd�Zdd�ZdS)�FileSelectDialogcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixFileSelectDialogr[Zbtnsr�)rZr8�_dummyStdButtonBoxrb�_dummyFileSelectBoxr�rrrr8,s
�zFileSelectDialog.__init__cCs|j�|jd�dSr�rLr>rrrr�2szFileSelectDialog.popupcCs|j�|jd�dSr�rLr>rrrr�5szFileSelectDialog.popdownNr�rrrrr�#s	r�c@s(eZdZifdd�Zdd�Zdd�ZdS)�	FileEntrycKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZtixFileEntryZ
dialogtyper[Zbuttonr�)rZr8r�rbr�r�rrrr8Ds
�zFileEntry.__init__cCs|j�|jd�dSr�rLr>rrrr�JszFileEntry.invokecCsdSrErr>rrr�file_dialogMszFileEntry.file_dialogN)r2r3r4r8r�r�rrrrr�8sr�c@s�eZdZdifdd�Zifdd�Zdifdd�Zdd	�Zd
d�Zdkd
d�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zifdd �Zifd!d"�Zd#d$�Zd%d&�ZeZd'd(�Zd)d*�Zd+d,�Zifd-d.�Zifd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z dld=d>�Z!d?d@�Z"dAdB�Z#dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+ifdSdT�Z,ifdUdV�Z-dWdX�Z.dYdZ�Z/d[d\�Z0ifd]d^�Z1d_d`�Z2dadb�Z3ifdcdd�Z4dedf�Z5dmdgdh�Z6didj�Z7dS)n�HListNcKst�||dddg||�dS)NZtixHList�columnsr[r�r�rrrr8Ys

�zHList.__init__cKs |jj|jd|f|�||���Sr�rB�rr�r'r(rrrr�]sz	HList.addcKs(|sd}|jj|jd|f|�||���S)Nr<ZaddchildrB)rr�r'r(rrr�	add_child`s�
�zHList.add_childcCs|j�|jdd|�dS�N�anchor�setrL�rr�rrr�
anchor_setfszHList.anchor_setcCs|j�|jdd�dS�Nr��clearrLr>rrr�anchor_cleariszHList.anchor_clearrcCs6|s|j�|jdd||�S|j�|jdd|d|�SdS)Nr	�widthz-charrL)r�colr�charsrrr�column_widthls�zHList.column_widthcCs|j�|jdd�dS)Nry�allrLr>rrr�
delete_allsszHList.delete_allcCs|j�|jdd|�dS)Nryr�rLr�rrr�delete_entryvszHList.delete_entrycCs|j�|jdd|�dS)NryZ
offspringsrLr�rrr�delete_offspringsyszHList.delete_offspringscCs|j�|jdd|�dS)NryZsiblingsrLr�rrr�delete_siblings|szHList.delete_siblingscCs|j�|jdd|�dS�N�dragsiter�rLr�rrr�dragsite_setszHList.dragsite_setcCs|j�|jdd�dS�Nrr�rLr>rrr�dragsite_clear�szHList.dragsite_clearcCs|j�|jdd|�dS�N�dropsiter�rLr�rrr�dropsite_set�szHList.dropsite_setcCs|j�|jdd�dS�Nrr�rLr>rrr�dropsite_clear�szHList.dropsite_clearcKs&|jj|jdd|f|�||���dS)N�headerrurB�rrr'r(rrr�
header_create�szHList.header_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nrr �r"rCrrr%rrrr�header_configure�s

�zHList.header_configurecCs|j�|jdd||�S)NrrrL)rr�optrrr�header_cget�szHList.header_cgetcCs|j�|j�|jdd|��S)NrZexist)rZ
getbooleanrrC�rrrrr�
header_exists�szHList.header_existscCs|j�|jdd|�dS)NrryrLrrrr�
header_delete�szHList.header_deletecCs|j�|jdd|�S)Nr�sizerLrrrr�header_size�szHList.header_sizecCs|j�|jdd|�dS)N�hider�rLr�rrr�
hide_entry�szHList.hide_entrycKs&|jj|jdd|f|�||���dS)N�	indicatorrurBr�rrr�indicator_create�s�
�zHList.indicator_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nr"r rr�rrr�indicator_configure�s��
�zHList.indicator_configurecCs|j�|jdd||�S)Nr"rrL�rr�rrrr�indicator_cget�szHList.indicator_cgetcCs|j�|jdd|�S)Nr"�existsrLr�rrr�indicator_exists�szHList.indicator_existscCs|j�|jdd|�dS)Nr"ryrLr�rrr�indicator_delete�szHList.indicator_deletecCs|j�|jdd|�S)Nr"rrLr�rrr�indicator_size�szHList.indicator_sizecCs|j�|jdd�S�NrSr�rLr>rrr�info_anchor�szHList.info_anchorcCs|�|j�|jdd|��pdS�NrSZbbox)�_getintsrrrCr�rrr�	info_bbox�s
��zHList.info_bboxcCs |j�|jdd|�}|j�|�S)NrSr��rrrCrO)rr�r�rrr�
info_children�szHList.info_childrencCs|j�|jdd|�S)NrS�datarLr�rrr�	info_data�szHList.info_datacCs|j�|jdd�S)NrSrrLr>rrr�
info_dragsite�szHList.info_dragsitecCs|j�|jdd�S)NrSrrLr>rrr�
info_dropsite�szHList.info_dropsitecCs|j�|jdd|�S�NrSr'rLr�rrr�info_exists�szHList.info_existscCs|j�|jdd|�S)NrSr�rLr�rrr�info_hidden�szHList.info_hiddencCs|j�|jdd|�S)NrS�nextrLr�rrr�	info_next�szHList.info_nextcCs|j�|jdd|�S)NrSr�rLr�rrr�info_parent�szHList.info_parentcCs|j�|jdd|�S)NrS�prevrLr�rrr�	info_prev�szHList.info_prevcCs|j�|jdd�}|j�|�S�NrSr�r0r�rrr�info_selection�szHList.info_selectioncCs|j�|jdd|||�S)N�itemrrL)rr�rrrrr�	item_cget�szHList.item_cgetcKsD|dkr|�|jdd||�S|jj|jdd||f|�||���dS)Nr@r r�rr�rr'r(rrr�item_configure�s

�zHList.item_configurecKs(|jj|jdd||f|�||���dS)Nr@rurBrBrrr�item_create�s�
�zHList.item_createcCs|j�|jdd||�S)Nr@r'rL�rr�rrrr�item_exists�szHList.item_existscCs|j�|jdd||�dS)Nr@ryrLrErrr�item_delete�szHList.item_deletecCs|j�|jd||�S)N�	entrycgetrLr%rrrrH�szHList.entrycgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS�N�entryconfigurerr�rrrrJ�s

�zHList.entryconfigurecCs|j�|jd|�S�N�nearestrL)rrQrrrrLsz
HList.nearestcCs|j�|jd|�dS�N�seerLr�rrrrNsz	HList.seecKs$|jj|jddf|�||���dS�Nr�r�rBr&rrr�selection_clearszHList.selection_clearcCs|j�|jdd|�S�Nr�ZincludesrLr�rrr�selection_includes
szHList.selection_includescCs|j�|jdd||�dS�Nr�r�rL�r�firstZlastrrr�
selection_set
szHList.selection_setcCs|j�|jdd|�S)N�showr�rLr�rrr�
show_entryszHList.show_entry)rNN)N)N)8r2r3r4r8r�r�r�rrrrrr	rrrrrrrrZheader_existrrr!r#r$r&r(r)r*r,r/r1r3r4r5r7r8r:r;r=r?rArCrDrFrGrHrJrLrNrPrRrVrXrrrrr�Qsj


r�c@seZdZdifdd�ZdS)�	InputOnlyNcKst�||dd||�dS)NZtixInputOnlyr�r�rrrr8szInputOnly.__init__r�rrrrrYsrYc@seZdZdifdd�ZdS)�
LabelEntryNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelEntry�	labelsider[r�r�)rZr8r�rbr�r�rrrr8%s
�zLabelEntry.__init__r�rrrrrZs
rZc@seZdZdifdd�ZdS)�
LabelFrameNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelFramer[r[r��frame)rZr8r�rb�_dummyFramer�rrrr86s
�zLabelFrame.__init__r�rrrrr\+sr\c@s<eZdZifdd�Zifdd�Zdd�Zdd�Zd	d
�ZdS)�ListNoteBookcKsNt�||ddg||�t|ddd�|jd<t|d�|jd<t|d�|jd<dS)NZtixListNoteBookr[Zpanerr�r�Zshlist)rZr8�_dummyPanedWindowrbr��_dummyScrolledHListr�rrrr8Es�zListNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr��rrrCr%r{rb�rr,r'r(rrrr�Ms zListNoteBook.addcCs
|�|�SrE�ror+rrr�pageRszListNoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |S�N�pages�rrOrrCr\ro�rrqZretrPrrrrgUs
zListNoteBook.pagescCs|j�|jd|�dS�N�raiserLr+rrr�
raise_page]szListNoteBook.raise_pageN)r2r3r4r8r�rergrlrrrrr_=s
r_c@seZdZdifdd�ZdS)�MeterNcKst�||ddg||�dS)NZtixMeterr[r�r�rrrr8es

�zMeter.__init__r�rrrrrm`srmc@sNeZdZdifdd�Zifdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�NoteBookNcKs.t�||ddg||�t|ddd�|jd<dS)NZtixNoteBookr[Znbframerr�)rZr8r{rbr�rrrr8qs�zNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�rbrcrrrr�vs zNoteBook.addcCs,|j�|jd|�|j|��|j|=dSr��rrrCrbr=r+rrrry{szNoteBook.deletecCs
|�|�SrErdr+rrrre�sz
NoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |Srfrhrirrrrg�s
zNoteBook.pagescCs|j�|jd|�dSrjrLr+rrrrl�szNoteBook.raise_pagecCs|j�|jd�S)N�raisedrLr>rrrrp�szNoteBook.raised)
r2r3r4r8r�ryrergrlrprrrrrnisrnc@seZdZdS)�
NoteBookFrameN�r2r3r4rrrrrq�srqc@sHeZdZifdd�Zifdd�Zifdd�Zdd�Zd	d
�Zdd�Zd
S)�
OptionMenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZ
tixOptionMenur[�
menubutton�menu�rZr8�_dummyMenubuttonrb�
_dummyMenur�rrrr8�szOptionMenu.__init__cKs&|jj|jdd|f|�||���dS)Nr��commandrBrcrrr�add_command�szOptionMenu.add_commandcKs&|jj|jdd|f|�||���dS)Nr�Z	separatorrBrcrrr�
add_separator�szOptionMenu.add_separatorcCs|j�|jd|�dSr�rLr+rrrry�szOptionMenu.deletecCs|j�|jd|�dS)N�disablerLr+rrrr|�szOptionMenu.disablecCs|j�|jd|�dS)N�enablerLr+rrrr}�szOptionMenu.enableN)	r2r3r4r8rzr{ryr|r}rrrrrs�srsc@sPeZdZifdd�Zifdd�Zdd�Zdd�Zd	d
�Zifdd�Zd
d�Z	dS)�PanedWindowcKst�||dddg||�dS)NZtixPanedWindowr�r[r�r�rrrr8�szPanedWindow.__init__cKs>|jj|jd|f|�||���t||dd�|j|<|j|S)Nr�r)r~rbrcrrrr��s
 �zPanedWindow.addcCs,|j�|jd|�|j|��|j|=dSr�ror+rrrry�szPanedWindow.deletecCs|j�|jd|�dS)NrMrLr+rrrrM�szPanedWindow.forgetcCs|j�|jd||�S)N�panecgetrLr%rrrr�szPanedWindow.panecgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS)N�
paneconfigurerr�rrrr��szPanedWindow.paneconfigurecs*�j��j��jd��}�fdd�|D�S)N�panescsg|]}��|��qSrrdrUr>rrrW�sz%PanedWindow.panes.<locals>.<listcomp>rY)rrqrr>rr��szPanedWindow.panesN)
r2r3r4r8r�ryrMrr�r�rrrrr~�sr~c@s0eZdZifdd�Zdd�Zdd�Zdd�Zd	S)
�	PopupMenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixPopupMenur[rtrurvr�rrrr8�szPopupMenu.__init__cCs|j�|jd|j�dSr�rLr�rrrr��szPopupMenu.bind_widgetcCs|j�|jd|j�dSr�rLr�rrrr��szPopupMenu.unbind_widgetcCs|j�|jd|j||�dS)NZpostrL)rr�rPrQrrr�post_widget�szPopupMenu.post_widgetN)r2r3r4r8r�r�r�rrrrr��sr�c@s8eZdZifdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ResizeHandlec	Ks.ddddddddd	g	}t�||d
|||�dS)Nr[ryZcursorfgZcursorbgZ
handlesizeZ	hintcolorZ	hintwidthrPrQZtixResizeHandler�)rrcr'r(�flagsrrrr8�s�
�zResizeHandle.__init__cCs|j�|jd|j�dS)NZattachwidgetrLr�rrr�
attach_widgetszResizeHandle.attach_widgetcCs|j�|jd|j�dS)NZdetachwidgetrLr�rrr�
detach_widgetszResizeHandle.detach_widgetcCs|j�|jd|j�dS)Nr rLr�rrrr szResizeHandle.hidecCs|j�|jd|j�dS)NrWrLr�rrrrW	szResizeHandle.showN)r2r3r4r8r�r�r rWrrrrr��s

r�c@seZdZifdd�ZdS)�
ScrolledHListcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledHListr[r�r�r�r�r�rrrr8s�zScrolledHList.__init__Nr�rrrrr�sr�c@seZdZifdd�ZdS)�ScrolledListBoxcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledListBoxr[�listboxr�r�)rZr8�
_dummyListboxrbr�r�rrrr8szScrolledListBox.__init__Nr�rrrrr�sr�c@seZdZifdd�ZdS)�ScrolledTextcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTextr[rr�r�)rZr8�
_dummyTextrbr�r�rrrr8%szScrolledText.__init__Nr�rrrrr�!sr�c@seZdZifdd�ZdS)�
ScrolledTListcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTListr[Ztlistr�r�)rZr8�_dummyTListrbr�r�rrrr8/s�zScrolledTList.__init__Nr�rrrrr�+sr�c@seZdZifdd�ZdS)�ScrolledWindowcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledWindowr[rr�r�)rZr8r^rbr�r�rrrr8:szScrolledWindow.__init__Nr�rrrrr�6sr�c@s,eZdZifdd�Zifdd�Zdd�ZdS)�Selectc
Ks2t�||ddddddg||�t|d�|jd<dS)NZ	tixSelectZ	allowzero�radior�r[r[r�r�r�rrrr8Gs
��zSelect.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�r�rcrrrr�Ns z
Select.addcCs|j�|jd|�dSr�rLr+rrrr�Ssz
Select.invokeNr�rrrrr�@sr�c@seZdZdifdd�ZdS)�ShellNcKst�||dddg||�dS)NZtixShellr[�titler�r�rrrr8[szShell.__init__r�rrrrr�Vsr�c@s2eZdZdifdd�Zdd�Zdd�Zdd	�ZdS)
�DialogShellNcKs&t�||ddddddddg||�dS)	NZtixDialogShellr[r�ZmappedZ	minheightZminwidthr�Z	transientr�r�rrrr8gs��zDialogShell.__init__cCs|j�|jd�dSr�rLr>rrrr�nszDialogShell.popdowncCs|j�|jd�dSr�rLr>rrrr�qszDialogShell.popupcCs|j�|jd�dS)N�centerrLr>rrrr�tszDialogShell.center)r2r3r4r8r�r�r�rrrrr�^s	r�c@s"eZdZdifdd�Zdd�ZdS)�StdButtonBoxNcKs\t�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixStdButtonBoxr�r[r��applyr��help)rZr8r�rbr�rrrr8zs
�zStdButtonBox.__init__cCs ||jkr|j�|jd|�dSr�r�r+rrrr��s
zStdButtonBox.invoke)r2r3r4r8r�rrrrr�wsr�c@s�eZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zd2dd
�Zdd�Z	dd�Z
dd�Zdd�Zifdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zifd,d-�Zd.d/�Zd3d0d1�ZdS)4�TListNcKst�||ddg||�dS)NZtixTListr[r�r�rrrr8�szTList.__init__cCs|j�|jdd|�dS)N�activer�rLr�rrr�
active_set�szTList.active_setcCs|j�|jdd�dS)Nr�r�rLr>rrr�active_clear�szTList.active_clearcCs|j�|jdd|�dSr�rLr�rrrr��szTList.anchor_setcCs|j�|jdd�dSr�rLr>rrrr�szTList.anchor_clearcCs|j�|jd||�dSr�rL�r�from_�torrrry�szTList.deletecCs|j�|jdd|�dSr
rLr�rrrr�szTList.dragsite_setcCs|j�|jdd�dSr
rLr>rrrr�szTList.dragsite_clearcCs|j�|jdd|�dSrrLr�rrrr�szTList.dropsite_setcCs|j�|jdd�dSrrLr>rrrr�szTList.dropsite_clearcKs$|jj|jd|f|�||���dSr�rB)rr�r'r(rrrr��szTList.insertcCs|j�|jdd�S)NrSr�rLr>rrr�info_active�szTList.info_activecCs|j�|jdd�Sr+rLr>rrrr,�szTList.info_anchorcCs|j�|jdd|�S)NrSZdownrLr�rrr�	info_down�szTList.info_downcCs|j�|jdd|�S)NrS�leftrLr�rrr�	info_left�szTList.info_leftcCs|j�|jdd|�S)NrS�rightrLr�rrr�
info_right�szTList.info_rightcCs|j�|jdd�}|j�|�Sr>r0r�rrrr?�szTList.info_selectioncCs|j�|jdd�S)NrSrrLr>rrr�	info_size�szTList.info_sizecCs|j�|jdd|�S)NrSZuprLr�rrr�info_up�sz
TList.info_upcCs|j�|jd||�SrKrL�rrPrQrrrrL�sz
TList.nearestcCs|j�|jd|�dSrMrLr�rrrrN�sz	TList.seecKs$|jj|jddf|�||���dSrOrBr&rrrrP�szTList.selection_clearcCs|j�|jdd|�SrQrLr�rrrrR�szTList.selection_includescCs|j�|jdd||�dSrSrLrTrrrrV�szTList.selection_set)N)N)r2r3r4r8r�r�r�rryrrrrr�r�r,r�r�r�r?r�r�rLrNrPrRrVrrrrr��s0

r�c@sDeZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
d�ZdS)�TreeNcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixTreer[r�r�r�r�r�rrrr8�s
�z
Tree.__init__cCs|j�|jd�dS�N�autosetmoderLr>rrrr��szTree.autosetmodecCs|j�|jd|�dS�N�closerL�r�	entrypathrrrr��sz
Tree.closecCs|j�|jd|�S�N�getmoderLr�rrrr��szTree.getmodecCs|j�|jd|�dS�N�openrLr�rrrr��sz	Tree.open�nonecCs|j�|jd||�dS)N�setmoderL�rr��moderrrr��s
zTree.setmode)r�)	r2r3r4r8r�r�r�r�r�rrrrr��sr�c@sVeZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
d�Zdd�Z	ddd�Z
dS)�	CheckListNcKsLt�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixCheckListr[r�r�r�r�r�r�rrrr8s
�zCheckList.__init__cCs|j�|jd�dSr�rLr>rrrr�szCheckList.autosetmodecCs|j�|jd|�dSr�rLr�rrrr�szCheckList.closecCs|j�|jd|�Sr�rLr�rrrr� szCheckList.getmodecCs|j�|jd|�dSr�rLr�rrrr�$szCheckList.open�oncCs|j�|j�|jd|��S)N�getselectionrY)rr�rrrr�(szCheckList.getselectioncCs|j�|jd|�S)N�	getstatusrLr�rrrr�.szCheckList.getstatuscCs|j�|jd||�dS)N�	setstatusrLr�rrrr�2szCheckList.setstatus)r�)r�)r2r3r4r8r�r�r�r�r�r�r�rrrrr�s
r�c@seZdZddd�ZdS)r�ricCst�||||�dSrE�r{r8�rrcr,r}rrrr8>sz_dummyButton.__init__N)rir�rrrrr�=sr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Bsz_dummyCheckbutton.__init__N)rir�rrrrr�Asr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Fsz_dummyEntry.__init__N)rir�rrrrr�Esr�c@seZdZddd�ZdS)r^ricCst�||||�dSrEr�r�rrrr8Jsz_dummyFrame.__init__N)rir�rrrrr^Isr^c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Nsz_dummyLabel.__init__N)rir�rrrrr�Msr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Rsz_dummyListbox.__init__N)rir�rrrrr�Qsr�c@seZdZddd�ZdS)rxricCst�||||�dSrEr�r�rrrr8Vsz_dummyMenu.__init__N)rir�rrrrrxUsrxc@seZdZddd�ZdS)rwricCst�||||�dSrEr�r�rrrr8Zsz_dummyMenubutton.__init__N)rir�rrrrrwYsrwc@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8^sz_dummyScrollbar.__init__N)rir�rrrrr�]sr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8bsz_dummyText.__init__N)rir�rrrrr�asr�c@seZdZddd�ZdS)r�ricCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�)r{r8r�rbr�r�rrrr8fsz_dummyScrolledListBox.__init__N)rir�rrrrr�esr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8msz_dummyHList.__init__N)rir�rrrrr�lsr�c@seZdZddd�ZdS)raricCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS�Nr�r�r��r{r8r�rbr�r�rrrr8qsz_dummyScrolledHList.__init__N)rir�rrrrrapsrac@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8xsz_dummyTList.__init__N)rir�rrrrr�wsr�c@seZdZddd�ZdS)r�ricCs�t�|||d|g�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<z$t|d�|jd<t|d�|jd<Wntk
r�YnXdS)Nr�r�r�r�r�r�r�)r{r8r�rbr�r�r�r�r�rrrr8|s�
z_dummyComboBox.__init__N)rir�rrrrr�{sr�c@seZdZddd�ZdS)r�ricCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dSr�r�r�rrrr8�sz_dummyDirList.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCs4t�||||�t|d�|jd<t|d�|jd<dS)Nr�r�)r{r8r�rbr�r�rrrr8�sz_dummyDirSelectBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCs�t�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)	Nr�r�r�r�r�r�r�r�)r{r8r�rbr�r�r�r�rrrr8�sz_dummyExFileSelectBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r{r8r�rbr�r�rrrr8�s
z_dummyFileSelectBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCs$t�||||�t|d�|jd<dS)Nr�)r{r8r�rbr�rrrr8�sz_dummyFileComboBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r{r8r�rbr�rrrr8�s
z_dummyStdButtonBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)�_dummyNoteBookFramercCst�||||�dSrEr�r�rrrr8�sz_dummyNoteBookFrame.__init__N)rr�rrrrr��sr�c@seZdZddd�ZdS)r`ricCst�||||�dSrEr�r�rrrr8�sz_dummyPanedWindow.__init__N)rir�rrrrr`�sr`cCs|j�d|j�S)NZ
tixOptionNamerL)r�rrr�
OptionName�sr�cCs:d}|��D](}|d|d|d||d}q|S)Nr<z{{z} {z - z}} )�keys)�dict�s�typerrr�FileTypeList�s&r�c@seZdZdS)�CObjViewNrrrrrrr��sr�c@s�eZdZdifdd�Zdd�Zdd�Zdd	�Zd(d
d�Zd)dd
�Zdd�Z	dd�Z
dd�Zd*dd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd+d d!�Zd"d#�Zd$d%�Zd&d'�ZdS),�GridNcKs"g}||_t�||d|||�dS)NZtixGrid�r'rZr8r�rrrr8�sz
Grid.__init__cCs|j�|dd�dSr�rr>rrrrszGrid.anchor_clearcCs|�|j�|dd��S)Nr�r/�r.rrr>rrr�
anchor_getszGrid.anchor_getcCs|j�|dd||�dSr�rr�rrrr�szGrid.anchor_setcCs4|dkr|j�|dd|�n|j�|dd||�dS)Nryr
rr�rrr�
delete_rowszGrid.delete_rowcCs4|dkr|j�|dd|�n|j�|dd||�dS)Nryr	rr�rrr�
delete_columnszGrid.delete_columncCs|j�|dd�dS)N�editr�rr>rrr�
edit_applyszGrid.edit_applycCs|j�|dd||�dS)Nr�r�rr�rrr�edit_set!sz
Grid.edit_setcCs,|r|ddkrd|}|j�|d|||�S)Nrr!rHr)rrPrQrrrrrH&szGrid.entrycgetcKs|�d||f||�SrI)Z
_configure)rrPrQr'r(rrrrJ,szGrid.entryconfigurec	Cs|�|j�|dd||��Sr6)Z_getbooleanrrr�rrrr72szGrid.info_existscCs|j�|dd||�Sr-rr�rrrr/6szGrid.info_bboxcCs|j�|dd|||�dS)N�mover	r�rr�r��offsetrrr�move_column:szGrid.move_columncCs|j�|dd|||�dS)Nr�r
rr�rrr�move_row@sz
Grid.move_rowcCs|�|j�|d||��SrKr�r�rrrrLFszGrid.nearestcKs>|�|j|�}|dk	r"d|f|}|jj|d||f|��dS)Nz	-itemtyper�)r%r'rr)rrPrQr�r(�argsrrrr�PszGrid.setcKs*|j�|jj|jdd|f|�i|����S)Nrr	)rrOrrCr%�rr�r(rrr�size_columnVs
�zGrid.size_columncKs(|j�|jj|dd|f|�i|����S)Nrr
)rrOrr%r�rrr�size_rowps�
�z
Grid.size_rowcCs|j�|jd||�dS)N�unsetrLr�rrrr��sz
Grid.unset)N)N)N)N)r2r3r4r8rr�r�r�r�r�r�rHrJr7r/r�r�rLr�r�r�r�rrrrr��s&	




r�c@seZdZdifdd�ZdS)�ScrolledGridNcKs"g}||_t�||d|||�dS)NZtixScrolledGridr�r�rrrr8�szScrolledGrid.__init__r�rrrrr��sr�)ur9r7rZ_tkinterZWINDOWZTEXTZSTATUSZ	IMMEDIATEZIMAGEZ	IMAGETEXTZBALLOONZAUTOZ	ACROSSTOP�ASCIIZCELLZCOLUMNZ
DECREASINGZ
INCREASINGZINTEGERZMAIN�MAXZREALZROWZS_REGIONZX_REGIONZY_REGIONZ
TCL_DONT_WAITZTCL_WINDOW_EVENTSZTCL_FILE_EVENTSZTCL_TIMER_EVENTSZTCL_IDLE_EVENTSZTCL_ALL_EVENTSrr5r@r`�	__bases__rZr{r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZXViewZYViewr�rYrZr\r_rmrnrqrsr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZButtonr�ZCheckbuttonr�ZEntryr�ZFramer^ZLabelr�ZListboxr�ZMenurxZ
MenubuttonrwZ	Scrollbarr�ZTextr�r�r�rar�r�r�r�r�r�r�r�r�r`r�r�r�r�r�rrrr�<module>s�-
8/,!"C#	()


S.6

*PK�(�Z寉�CC-__pycache__/colorchooser.cpython-38.opt-2.pycnu�[���U

e5dA
�@s>ddlmZGdd�de�Zd	dd�Zedkr:ede��dS)
�)�Dialogc@s eZdZdZdd�Zdd�ZdS)�ChooserZtk_chooseColorcCs@z&|jd}t|t�r$d||jd<Wntk
r:YnXdS)N�initialcolorz
#%02x%02x%02x)�options�
isinstance�tuple�KeyError)�self�color�r�,/usr/lib64/python3.8/tkinter/colorchooser.py�_fixoptions!s

zChooser._fixoptionscCs>|rt|�sdS|�|�\}}}|d|d|dft|�fS)N)NN�)�strZ	winfo_rgb)r	Zwidget�result�r�g�brrr�
_fixresult.szChooser._fixresultN)�__name__�
__module__�__qualname__Zcommandr
rrrrrrs
rNcKs"|r|��}||d<tf|���S)Nr)�copyrZshow)r
rrrr�askcolorBsr�__main__r
)N)Ztkinter.commondialogrrrr�printrrrr�<module>s3
PK�(�Z��xx$__pycache__/constants.cpython-38.pycnu�[���U

e5d��@s8dZZZdZZZdZdZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?d<Z@d=ZAd>ZBd?ZCd@ZDdAZEdBZFdCZGdDZHdEZIdFZJdGZKdHZLdIS)J���n�s�w�eZnw�sw�neZse�nsZewZnsew�centerZnone�x�yZboth�left�top�rightZbottomZraisedZsunkenZflatZridgeZgrooveZsolidZ
horizontalZverticalZnumeric�charZwordZbaselineZinsideZoutsideZselz	sel.firstzsel.last�end�insertZcurrentZanchor�allZnormalZdisabledZactiveZhiddenZcascadeZcheckbuttonZcommandZradiobuttonZ	separatorZsingleZbrowseZmultipleZextendedZdotboxZ	underlineZpiesliceZchordZarc�firstZlastZbuttZ
projecting�roundZbevelZmiterZmovetoZscrollZunitsZpagesN)MZNOZFALSEZOFFZYESZTRUEZON�N�S�W�EZNWZSWZNEZSEZNSZEWZNSEWZCENTERZNONE�X�YZBOTHZLEFTZTOPZRIGHTZBOTTOMZRAISEDZSUNKENZFLATZRIDGEZGROOVEZSOLIDZ
HORIZONTALZVERTICALZNUMERICZCHARZWORDZBASELINEZINSIDEZOUTSIDEZSELZ	SEL_FIRSTZSEL_LASTZENDZINSERTZCURRENTZANCHORZALLZNORMALZDISABLEDZACTIVEZHIDDENZCASCADEZCHECKBUTTONZCOMMANDZRADIOBUTTONZ	SEPARATORZSINGLEZBROWSEZMULTIPLEZEXTENDEDZDOTBOXZ	UNDERLINEZPIESLICEZCHORDZARCZFIRSTZLASTZBUTTZ
PROJECTINGZROUNDZBEVELZMITERZMOVETOZSCROLLZUNITSZPAGES�rr�)/usr/lib64/python3.8/tkinter/constants.py�<module>s�PK�(�ZV�Fi%__pycache__/font.cpython-38.opt-2.pycnu�[���U

e5d@�@szdZddlZddlZdZdZdZdZdd�ZGd	d
�d
�Zd dd�Z	d!d
d�Z
edk�rve��Z
edded�Zee���ee�d��ee�d��ee���ee�d��ee�d��ee
��ee�d�e�d��eeje
d��edd�Zee�d�ejde
d��eje
ded�Ze��eje
de
jd�Ze��eedd���Zejed�ejed�e��dS)"z0.9�NZnormalZroman�boldZitaliccCst|dd�S)NT)�name�exists)�Font�r�r�$/usr/lib64/python3.8/tkinter/font.py�
nametofontsr	c@s�eZdZe�d�Zdd�Zdd�Zdd�Zd"d
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd#dd�Zdd�Zdd�ZeZd$dd�Zd d!�ZdS)%r�cCs:g}|��D]$\}}|�d|�|�t|��qt|�S�N�-)�items�append�str�tuple)�self�kw�options�k�vrrr�_set1s
z	Font._setcCs$g}|D]}|�d|�qt|�Sr)rr)r�argsrrrrr�_get8sz	Font._getcCs:i}tdt|�d�D] }||d|||dd�<q|S)Nr�r
)�range�len)rrr�irrr�_mkdict>szFont._mkdictNFcKs�|st�d�}t|d|�}|r4|�|�dd|��}n
|�|�}|sTdtt|j��}||_	|r�d|_
|j	|�|�dd��kr�tj�d|j	f��|r�|jdd|j	f|��n|jdd	|j	f|��d
|_
||_
|j|_|j|_dS)Nzuse font�tk�font�actualF�namesz$named font %s does not already exist�	configureZcreateT)�tkinter�_get_default_root�getattr�	splitlist�callrr�next�counterr�delete_fontZ_tkinterZTclError�_tk�_split�_call)r�rootrrrrrrrr�__init__Ds,


�z
Font.__init__cCs|jS�Nr�rrrr�__str__cszFont.__str__cCs&t|t�stS|j|jko$|j|jkSr0)�
isinstancer�NotImplementedrr+)r�otherrrr�__eq__fs
zFont.__eq__cCs
|�|�Sr0)�cget)r�keyrrr�__getitem__kszFont.__getitem__cCs|jf||i�dSr0)r")rr8�valuerrr�__setitem__nszFont.__setitem__cCs4z|jr|�dd|j�Wntk
r.YnXdS)Nr�delete)r*r-r�	Exceptionr1rrr�__del__qs
zFont.__del__cCst|jf|���Sr0)rr+r r1rrr�copyxsz	Font.copycCs^d}|rd|f}|r8|d|f}|jdd|jf|��S|�|�|jdd|jf|����SdS)Nr�
-displayofrrr )r-rrr,)r�option�	displayofrrrrr |s�zFont.actualcCs|�dd|jd|�S)Nr�configr)r-r)rrArrrr7�sz	Font.cgetc	KsB|r"|jdd|jf|�|���n|�|�|�dd|j���SdS)NrrC)r-rrrr,)rrrrrrC�s��zFont.configcCs2|f}|rd||f}|j�|jdd|jf|���S)Nr@r�measure)r+�getintr-r)r�textrBrrrrrD�s
zFont.measurecOs�d}|�dd�}|rd|f}|rL||�|�}|j�|jdd|jf|���S|�|jdd|jf|���}i}tdt|�d�D](}|j�||d�|||dd�<q||SdS)	NrrBr@r�metricsrrr
)	�poprr+rEr-rr,rr)rrrrrB�resrrrrrG�s�&zFont.metrics)NNNF)NN)N)�__name__�
__module__�__qualname__�	itertools�countr)rrrr/r2r6r9r;r>r?r r7rCr"rDrGrrrrrs"


	
rcCs6|st�d�}d}|rd|f}|j�|jjd|���S)Nzuse font.families()rr@r�families)rrO�r#r$rr&r')r.rBrrrrrO�s
rOcCs$|st�d�}|j�|j�dd��S)Nzuse font.names()rr!rP)r.rrrr!�s
r!�__main__�times�)�family�size�weightrTrVZhelloZ	linespace)rB)ZCourier�r)rzHello, world)rFrzQuit!)rFZcommandr)rV)NN)N)�__version__rMr#ZNORMALZROMANZBOLDZITALICr	rrOr!rJZTkr.�f�printr rCr7rDrGZLabel�wZpackZButtonZdestroyr?ZfbZmainlooprrrr�<module>sB






PK�(�Zҧ����!__pycache__/dialog.cpython-38.pycnu�[���U

e5d��@srddlTddlmZdZGdd�de�Zdd�Zedkrned	d
ddeeii�Z	ed	d
d
de	j
eii�Ze	��d	S)�)�*)�	_cnfmergeZ	questheadc@s"eZdZdifdd�Zdd�ZdS)�DialogNc
Ks�t||f�}d|_t�|||�|j�|jjd|j|d|d|d|df|d���|_zt�	|�Wnt
k
r~YnXdS)NZ
__dialog__Z	tk_dialog�title�text�bitmap�default�strings)rZ
widgetName�Widget�_setupZtkZgetintZcallZ_w�num�destroyZTclError)�selfZmasterZcnf�kw�r�&/usr/lib64/python3.8/tkinter/dialog.py�__init__
s&���zDialog.__init__cCsdS)Nr)rrrrr
�zDialog.destroy)�__name__�
__module__�__qualname__rr
rrrrr	s
rcCs$tdddtddd��}t|j�dS)Nz
File ModifiedzzFile "Python.h" has been modified since the last time it was saved. Do you want to save it before exiting the application.r)z	Save FilezDiscard ChangeszReturn to Editor)rrrrr	)r�DIALOG_ICON�printr)�drrr�_tests�r�__main__NrZTestZcommandZQuit)
Ztkinterrrr
rrrZButtonZPack�t�quit�qZmainlooprrrr�<module>s$��PK�(�Zb
p�nn$__pycache__/ttk.cpython-38.opt-2.pycnu�[���U

e5d���@s�dZdZdddddddd	d
ddd
dddddddddddddgZddlZddlmZmZmZmZejdkrldnd Z	d!d"�Z
dWd#d$�ZdXd%d&�Zd'd(�Z
dYd)d*�ZdZd+d,�Zd[d.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Zd>d�Zd\d?d�ZGd@d�de�ZGdAdB�dBej�ZGdCd�de�ZGdDd�de�ZGdEd�deej�ZGdFd�de�Z GdGd�de�Z!GdHd�de�Z"GdId�de�Z#e#Z$GdJd
�d
e�Z%GdKd�de�Z&GdLd�deej'�Z(e(Z'GdMd�de�Z)GdNd�de�Z*GdOd�deej+�Z+GdPd�deej,�Z,GdQd�de�Z-GdRd�de�Z.GdSd�de�Z/GdTd�deej0ej1�Z2GdUd�de!�Z3GdVd�de%�Z4dS)]z0.3.1z!Guilherme Polo <ggpolo@gmail.com>�Button�Checkbutton�Combobox�Entry�Frame�Label�
Labelframe�
LabelFrame�
Menubutton�Notebook�Panedwindow�PanedWindow�Progressbar�Radiobutton�Scale�	Scrollbar�	Separator�Sizegrip�Spinbox�Style�Treeview�LabeledScale�
OptionMenu�
tclobjs_to_py�setup_master�N)�_flatten�_join�
_stringify�
_splitdictg!@TFcCsBtr>ddl}|j�d�}|r,|j�d|�|j�d�d|_dS)NrZTILE_LIBRARYz(global auto_path; lappend auto_path {%s}zpackage require tileT)�
_REQUIRE_TILE�os�environ�get�tk�eval�_tile_loaded)�masterr Ztilelib�r'�#/usr/lib64/python3.8/tkinter/ttk.py�
_load_tile"s��r)cCs(|rt|�}nt|ttf�r$t|�}|S�N)r�
isinstance�list�tupler)�value�scriptr'r'r(�_format_optvalue1s

r0cCsPg}|��D]:\}}|r ||kr|�d|�|dk	r|�t||��qt|�S�N�-%s)�items�appendr0r)Zoptdictr/�ignore�opts�optr.r'r'r(�_format_optdict;sr8cCsXg}|D]J�^}}t|�dkr,|dp(d}n
d�|�}|�|�|dk	r|�|�q|S)N�r�� )�len�joinr4)r3Zopt_val�state�valr'r'r(�_mapdict_valuesKs

r@cCs:g}|��D]$\}}|�d|tt|�|�f�qt|�Sr1)r3�extendr0r@r)Zmapdictr/r6r7r.r'r'r(�_format_mapdict`s

�rBcOs�d}d}|dkr�|dkrB|d}tt|dd���}d||f}n2|dd�\}}	tt|dd���}
d||	|
f}t||�}n,|d	kr�|d}t|�dkr�t|d|�f}|r�d
|}d�|�}||fS)Nr')�imageZvsapirCrr9z%s %s�z%s %s %s�fromz{%s}r;)rr@r8r<r0r=)�etyper/�args�kw�specr6ZinameZ	imagespec�
class_nameZpart_idZstatemapr'r'r(�_format_elemcreateqs&
rKrDc
Cs�g}|D]�}|\}}|pi}d�t|dd��}dd|||rDd|ndf}d|kr�|�|d�||7}t|d||�\}	}|�|	�||8}|�d	d|�q|�|�qd
�|�|fS)Nr;T)�childrenz%s%s%sz %sr:rLz -children {z%s}�
)r=r8r4�_format_layoutlist)
�layout�indentZindent_sizer/Zlayout_elem�elemr6Zfopts�headZ	newscriptr'r'r(rN�s"
�
rNcCsXg}|��D�]>\}}|�d�rFd�t|dd��}|�d||f�|�d�rvd�t|dd��}|�d||f�d|kr�|ds�d}nt|d�\}}|�d	||f�|�d
�r|d
}|d}d}|t|�kr�t||d
�s�|d7}q�|d|�}	|t|�k�r||�r||ni}
t	|df|	�|
�\}}|�d||||f�qd�|�S)N�	configurer;Tzttk::style configure %s %s;�mapzttk::style map %s %s;rO�nullzttk::style layout %s {
%s
}zelement createrr9r3z%ttk::style element create %s %s %s %srM)
r3r"r=r8r4rBrNr<�hasattrrK)�settingsr/�namer6�s�_ZeoptsrFZargcZelemargsZelemkwrIr'r'r(�_script_from_settings�s:



$�
r[cCs�t|t�r|Sg}t|�}t||�D]j\}}t|d�rDt|���}n(t|t�rX|��}nt|ttf�sl|f}t|d�r~t|�}|�||f��q$|S)N�typename)	r+�str�iter�ziprV�splitr-r,r4)Zstuple�result�itr>r?r'r'r(�_list_from_statespec�s




rccCs�|�|�}g}d}|t|�kr�||}i}|�||f�|d7}|t|�kr|||d�\}}|�d�slq|dd�}|d7}|dkr�t||�}|||<q@q|S)Nrr9rD�-rL)�	splitlistr<r4�
startswith�_list_from_layouttuple)r#Zltuple�resZindxrXr6r7r?r'r'r(rgs$


rgcGs4t|�}|j||�}t|�dr&|St||td�S)NrD)�conv)r8�callr<r�
_tclobj_to_py)r#�optionsrGrhr'r'r(�_val_or_dict!s
rmc	Cs2t|�}zt|�}Wnttfk
r,YnX|Sr*)r]�int�
ValueError�	TypeError)r.r'r'r(�_convert_stringval1srqcCs(t|t�r$d|krt|�}nt|�}|S)N�.)r+r]�floatrn)�xr'r'r(�
_to_number;s


rucCs\|rFt|d�rFt|t�sFt|ddd�dkr6t|�}qXttt|��}nt|d�rXt|�}|S)N�__len__rr\Z	StateSpec)rVr+r]�getattrrcr,rTrq)r?r'r'r(rkCs

rkcCs"|��D]\}}t|�||<q|Sr*)r3rk)Zadictr7r?r'r'r(rPscCs|dkrt��}|Sr*)�tkinterZ_get_default_root)r&r'r'r(rXsc@s~eZdZdZddd�Zddd�Zddd�Zdd	d
�Zddd�Zd
d�Z	dd�Z
dd�Zd dd�Zdd�Z
dd�Zd!dd�ZdS)"rz
ttk::styleNcCs0t|�}t|dd�st|�||_|jj|_dS)Nr%F)rrwr)r&r#)�selfr&r'r'r(�__init__is
zStyle.__init__cKs4|dk	rd||<t|j||jd|�}|s,|r0|SdS)NrS)rmr#�_name�ry�styleZ	query_optrHrar'r'r(rSts
zStyle.configurecsj|dk	r0�j��jd|d|�}t�j�|��S�jj�jd|ft|���}�fdd�t�j|���D�S)NrTr2cs"i|]\}}|t�j�|���qSr')rcr#re)�.0�k�v�ryr'r(�
<dictcomp>�s�zStyle.map.<locals>.<dictcomp>)r#rjr{rcrerBrr3r|r'r�r(rT�s
�z	Style.mapcCs.|rd�|�nd}|j�|jd|d|||�S)Nr;r:�lookupr2)r=r#rjr{)ryr}�optionr>�defaultr'r'r(r��s
�zStyle.lookupcCs>d}|rt|�d}n|dk	r"d}t|j|j�|jd||��S)NrrUrO)rNrgr#rjr{)ryr}Z
layoutspecZlspecr'r'r(rO�s �zStyle.layoutcOs8t|df|�|�\}}|jj|jdd|||f|��dS)NF�element�create)rKr#rjr{)ry�elementnamerFrGrHrIr6r'r'r(�element_create�s��zStyle.element_createc	Cs(tdd�|j�|j�|jdd��D��S)Ncss|]}|�d�VqdS�rdN��lstrip)r~�nr'r'r(�	<genexpr>�sz&Style.element_names.<locals>.<genexpr>r��names�r-r#rerjr{r�r'r'r(�
element_names�s�zStyle.element_namesc
Cs*tdd�|j�|j�|jdd|��D��S)Ncss|]}|�d�VqdSr�r�)r~�or'r'r(r��sz(Style.element_options.<locals>.<genexpr>r�rlr�)ryr�r'r'r(�element_options�s�zStyle.element_optionsc
CsN|rt|�nd}|r2|j�|jdd|d|d|�n|j�|jdd|d|�dS)Nr:�themer�z-parentz	-settings�r[r#rjr{)ry�	themename�parentrWr/r'r'r(�theme_create�s��zStyle.theme_createcCs"t|�}|j�|jdd||�dS)Nr�rWr�)ryr�rWr/r'r'r(�theme_settings�szStyle.theme_settingscCs|j�|j�|jdd��S)Nr�r�)r#rerjr{r�r'r'r(�theme_names�szStyle.theme_namescCs&|dkr|j�d�S|j�d|�dS)Nzreturn $ttk::currentThemez
ttk::setTheme)r#r$rj)ryr�r'r'r(�	theme_use�szStyle.theme_use)N)N)N)NN)N)NN)N)�__name__�
__module__�__qualname__r{rzrSrTr�rOr�r�r�r�r�r�r�r'r'r'r(rds




+
c@s2eZdZd
dd�Zdd�Zddd�Zddd	�ZdS)
�WidgetNcCs4t|�}t|dd�st|�tjj||||d�dS)Nr%F)rH)rrwr)rxr�rz)ryr&Z
widgetnamerHr'r'r(rzszWidget.__init__cCs|j�|jd||�S�N�identify�r#rj�_w�ryrt�yr'r'r(r�+szWidget.identifyc	Os6|j�|j�|jdd�|���}|r2|r2|||�S|S)N�instater;)r#�
getbooleanrjr�r=)ry�	statespec�callbackrGrHZretr'r'r(r�3s�
zWidget.instatecCs0|dk	rd�|�}|j�t|j�|jd|���S)Nr;r>)r=r#rer]rjr�)ryr�r'r'r(r>Bs
zWidget.state)N)N)N)r�r�r�rzr�r�r>r'r'r'r(r�
s

r�c@seZdZddd�Zdd�ZdS)rNcKst�||d|�dS)Nzttk::button�r�rz�ryr&rHr'r'r(rzSszButton.__init__cCs|j�|jd�S�N�invoker�r�r'r'r(r�bsz
Button.invoke)N�r�r�r�rzr�r'r'r'r(rOs
c@seZdZddd�Zdd�ZdS)rNcKst�||d|�dS)Nzttk::checkbuttonr�r�r'r'r(rzjszCheckbutton.__init__cCs|j�|jd�Sr�r�r�r'r'r(r�yszCheckbutton.invoke)Nr�r'r'r'r(rgs
c@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)rNcKst�|||pd|�dS)Nz
ttk::entryr�)ryr&ZwidgetrHr'r'r(rz�szEntry.__init__cCs|�|j�|jd|��S)N�bbox�Z_getintsr#rjr�)ry�indexr'r'r(r��sz
Entry.bboxcCs|j�|jd||�Sr�r�r�r'r'r(r��szEntry.identifycCs|j�|j�|jd��S)N�validate�r#r�rjr�r�r'r'r(r��szEntry.validate)NN)r�r�r�rzr�r�r�r'r'r'r(r�s
c@s(eZdZddd�Zd	dd�Zdd�ZdS)
rNcKstj||df|�dS)Nz
ttk::combobox�rrzr�r'r'r(rz�szCombobox.__init__cCs2|dkr |j�|j�|jd��S|j�|jd|�S)N�current�r#Zgetintrjr�)ryZnewindexr'r'r(r��szCombobox.currentcCs|j�|jd|�dS�N�setr��ryr.r'r'r(r��szCombobox.set)N)N)r�r�r�rzr�r�r'r'r'r(r�s


c@seZdZddd�ZdS)rNcKst�||d|�dS)Nz
ttk::framer�r�r'r'r(rz�szFrame.__init__)N�r�r�r�rzr'r'r'r(r�sc@seZdZddd�ZdS)rNcKst�||d|�dS)Nz
ttk::labelr�r�r'r'r(rz�s
zLabel.__init__)Nr�r'r'r'r(r�sc@seZdZddd�ZdS)rNcKst�||d|�dS)Nzttk::labelframer�r�r'r'r(rz�szLabelframe.__init__)Nr�r'r'r'r(r�sc@seZdZddd�ZdS)r	NcKst�||d|�dS)Nzttk::menubuttonr�r�r'r'r(rzszMenubutton.__init__)Nr�r'r'r'r(r	
sc@sjeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	ddd�Z
ddd�Zdd�Zdd�Z
dS)r
NcKst�||d|�dS)Nz
ttk::notebookr�r�r'r'r(rz"szNotebook.__init__cKs |jj|jd|ft|���dS�N�add�r#rjr�r8)ry�childrHr'r'r(r�BszNotebook.addcCs|j�|jd|�dS)N�forgetr��ry�tab_idr'r'r(r�JszNotebook.forgetcCs|j�|jd|�dS)N�hider�r�r'r'r(r�Psz
Notebook.hidecCs|j�|jd||�Sr�r�r�r'r'r(r�YszNotebook.identifycCs|j�|j�|jd|��S�Nr�r�r�r'r'r(r�_szNotebook.indexcKs"|jj|jd||ft|���dS�N�insertr��ry�posr�rHr'r'r(r�eszNotebook.insertcCs|j�|jd|�S)N�selectr�r�r'r'r(r�nszNotebook.selectcKs$|dk	rd||<t|j||jd|�S)N�tab�rmr#r�)ryr�r�rHr'r'r(r�xszNotebook.tabcCs|j�|j�|jd�pd�S)N�tabsr'�r#rerjr�r�r'r'r(r��sz
Notebook.tabscCs|j�d|j�dS)Nzttk::notebook::enableTraversalr�r�r'r'r(�enable_traversal�szNotebook.enable_traversal)N)N)N)r�r�r�rzr�r�r�r�r�r�r�r�r�r�r'r'r'r(r
s
 		


c@s:eZdZd
dd�ZejjZdd�Zddd�Zddd	�Z	dS)
rNcKst�||d|�dS)Nzttk::panedwindowr�r�r'r'r(rz�szPanedwindow.__init__cKs"|jj|jd||ft|���dSr�r�r�r'r'r(r��szPanedwindow.insertcKs$|dk	rd||<t|j||jd|�S)N�paner�)ryr�r�rHr'r'r(r��szPanedwindow.panecCs|j�|j�|jd||��S)N�sashposr�)ryr�Znewposr'r'r(r��szPanedwindow.sashpos)N)N)N)
r�r�r�rzrxrr�r�r�r�r'r'r'r(r�s

	
c@s2eZdZd
dd�Zddd�Zddd�Zdd	�ZdS)
r
NcKst�||d|�dS)Nzttk::progressbarr�r�r'r'r(rz�szProgressbar.__init__cCs|j�|jd|�dS)N�startr�)ryZintervalr'r'r(r��szProgressbar.startcCs|j�|jd|�dS)N�stepr�)ryZamountr'r'r(r��szProgressbar.stepcCs|j�|jd�dS)N�stopr�r�r'r'r(r�szProgressbar.stop)N)N)N)r�r�r�rzr�r�r�r'r'r'r(r
�s


c@seZdZddd�Zdd�ZdS)rNcKst�||d|�dS)Nzttk::radiobuttonr�r�r'r'r(rzszRadiobutton.__init__cCs|j�|jd�Sr�r�r�r'r'r(r�szRadiobutton.invoke)Nr�r'r'r'r(rs
c@s*eZdZddd�Zd	dd�Zd
dd�ZdS)rNcKst�||d|�dS)Nz
ttk::scaler�r�r'r'r(rz'szScale.__init__cKsTtj||f|�}t|td�tf�s,|�|�td|kd|kd|kg�rP|�d�|S)NrE�from_�to�<<RangeChanged>>)r�rSr+�typer]�update�anyZevent_generate)ryZcnfrHZretvalr'r'r(rS5s

zScale.configurecCs|j�|jd||�S)Nr"r�r�r'r'r(r"Bsz	Scale.get)N)N)NN)r�r�r�rzrSr"r'r'r'r(r#s


c@seZdZddd�ZdS)rNcKst�||d|�dS)Nzttk::scrollbarr�r�r'r'r(rzNszScrollbar.__init__)Nr�r'r'r'r(rKsc@seZdZddd�ZdS)rNcKst�||d|�dS)Nzttk::separatorr�r�r'r'r(rz`szSeparator.__init__)Nr�r'r'r'r(r\sc@seZdZddd�ZdS)rNcKst�||d|�dS)Nz
ttk::sizegripr�r�r'r'r(rzrszSizegrip.__init__)Nr�r'r'r'r(rnsc@seZdZddd�Zdd�ZdS)rNcKstj||df|�dS)Nzttk::spinboxr�r�r'r'r(rz�szSpinbox.__init__cCs|j�|jd|�dSr�r�r�r'r'r(r��szSpinbox.set)N)r�r�r�rzr�r'r'r'r(r|s
c@s0eZdZdDdd�ZdEdd�ZdFdd�Zdd	�ZdGd
d�Zdd
�Zdd�Z	dd�Z
dHdd�ZdIdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�ZdJd"d#�ZdKd$d%�Zd&d'�ZeZd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z dLd<d=�Z!dMd>d?�Z"dNd@dA�Z#dOdBdC�Z$dS)PrNcKst�||d|�dS)Nz
ttk::treeviewr�r�r'r'r(rz�szTreeview.__init__cCs|�|j�|jd||��pdS)Nr�r:r�)ry�item�columnr'r'r(r��sz
Treeview.bboxcCs"|j�|j�|jd|pd�pd�S)NrLr:r'r��ryr�r'r'r(�get_children�s�zTreeview.get_childrencGs|j�|jd||�dS)NrLr�)ryr�Znewchildrenr'r'r(�set_children�szTreeview.set_childrencKs$|dk	rd||<t|j||jd|�S)Nr�r�)ryr�r�rHr'r'r(r��szTreeview.columncGs|j�|jd|�dS)N�deleter��ryr3r'r'r(r��szTreeview.deletecGs|j�|jd|�dS)N�detachr�r�r'r'r(r��szTreeview.detachcCs|j�|j�|jd|��S)N�existsr�r�r'r'r(r��szTreeview.existscCs|j�|jd|�S)N�focusr�r�r'r'r(r��szTreeview.focuscKsP|�d�}|r,t|t�s,|j�||j�|d<|dk	r<d||<t|j||jd|�S)N�command�heading)	r"r+r]r&�registerZ_substitutermr#r�)ryr�r�rH�cmdr'r'r(r��s
zTreeview.headingcCs|j�|jd|||�Sr�r�)ryZ	componentrtr�r'r'r(r�szTreeview.identifycCs|�dd|�S)N�rowr�r�)ryr�r'r'r(�identify_rowszTreeview.identify_rowcCs|�d|d�S)Nr�rr�)ryrtr'r'r(�identify_column"szTreeview.identify_columncCs|�d||�S)NZregionr�r�r'r'r(�identify_region)s	zTreeview.identify_regioncCs|�d||�S)Nr�r�r�r'r'r(�identify_element5szTreeview.identify_elementcCs|j�|j�|jd|��Sr�r�r�r'r'r(r�<szTreeview.indexcKsNt|�}|dk	r0|jj|jd||d|f|��}n|jj|jd||f|��}|S)Nr�z-id)r8r#rjr�)ryr�r�ZiidrHr6rhr'r'r(r�Bs
��zTreeview.insertcKs$|dk	rd||<t|j||jd|�S)Nr�r�)ryr�r�rHr'r'r(r�Ysz
Treeview.itemcCs|j�|jd|||�dS)N�mover�)ryr�r�r�r'r'r(r�esz
Treeview.movecCs|j�|jd|�S)N�nextr�r�r'r'r(r�qsz
Treeview.nextcCs|j�|jd|�S)Nr�r�r�r'r'r(r�wszTreeview.parentcCs|j�|jd|�S)N�prevr�r�r'r'r(r�}sz
Treeview.prevcCs|j�|jd|�dS)N�seer�r�r'r'r(r��szTreeview.seecCs|j�|j�|jd��S)N�	selectionr�r�r'r'r(r��szTreeview.selectioncCs>t|�dkr&t|dttf�r&|d}|j�|jd||�dS)Nr9rr�)r<r+r-r,r#rjr�)ryZselopr3r'r'r(�
_selection�szTreeview._selectioncGs|�d|�dSr��r�r�r'r'r(�
selection_set�szTreeview.selection_setcGs|�d|�dSr�r�r�r'r'r(�
selection_add�szTreeview.selection_addcGs|�d|�dS)N�remover�r�r'r'r(�selection_remove�szTreeview.selection_removecGs|�d|�dS)NZtoggler�r�r'r'r(�selection_toggle�szTreeview.selection_togglecCs@|j�|jd|||�}|dkr8|dkr8t|j|dtd�S|SdS)Nr�F)Z	cut_minusri)r#rjr�rrk)ryr�r�r.rhr'r'r(r��s�zTreeview.setcCs |j|jdd|f||dd�dS)N�tag�bindr)r�)Z_bindr�)ry�tagnameZsequencer�r'r'r(�tag_bind�szTreeview.tag_bindcKs&|dk	rd||<t|j||jdd|�S)Nr�rSr�)ryr�r�rHr'r'r(�
tag_configure�s
�zTreeview.tag_configurec	CsF|dkr$|j�|j�|jdd|��S|j�|j�|jdd||��SdS)Nr�Zhas)r#rerjr�r�)ryr�r�r'r'r(�tag_has�s��zTreeview.tag_has)N)N)N)N)N)N)N)N)NN)NN)N)N)%r�r�r�rzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zreattachr�r�r�r�r�r�r�r�r�r�r�r�r�r�r'r'r'r(r�sD



	
	

 

		



csHeZdZd
dd�Z�fdd�Zdd	�Zed
d��Zejdd��Z�Z	S)rNr�
c	Ks|�dd�dk|_tj||f|�|p.t�|�|_|j�|�||_t	|�|_
t||j||d�|_|j�
d|j�|jr|dnd}|dkr�dnd}|jj|dd�t	|�}|j|d�|��|j
j|dkr�d	nd
d�|j�d|j�|_|�
d
|j�|�
d|j�dS)NZcompound�top)�variabler�r�r�Zbottomrt)�sideZfill)rr�rY)Zanchor�wz<Configure>z<Map>)�pop�
_label_toprrzrxZIntVar�	_variabler��_last_validr�labelr�scaler��_adjustZpack�lowerZplaceZtrace_variable�_LabeledScale__tracecb)	ryr&rr�r�rHZ
scale_sideZ
label_sideZdummyr'r'r(rz�s$
zLabeledScale.__init__csHz|j�d|j�Wntk
r(YnX|`t���d|_d|_dS)Nr)rZ
trace_vdeleter�AttributeError�super�destroyrr	r���	__class__r'r(rs
zLabeledScale.destroycs��fdd�}t�jd�}t�jd�}||kr:||}}�j��}||krX|ksfn�j�_dS|�_|�jd<��|�dS)NcsZ����j��\}}�jr2�j���j��}n�j���j��}�jj||d�dS)N�rtr�)Zupdate_idletasksr	ZcoordsrZwinfo_yrZwinfo_reqheightZplace_configurerr�r'r(�adjust_labelsz*LabeledScale._adjust.<locals>.adjust_labelrEr��text)rur	rr"rr.rZ
after_idle)ryrGrr�r�Znewvalr'r�r(r
s


zLabeledScale._adjustcCs
|j��Sr*)rr"r�r'r'r(r.4szLabeledScale.valuecCs|j�|�dSr*)rr�)ryr?r'r'r(r.9s)NNrr�)
r�r�r�rzrr
�propertyr.�setter�
__classcell__r'r'rr(r�s
&

cs8eZdZd
dd�Zdd�Zddd�Z�fdd	�Z�ZS)rNcOs�||�dd�|�dd�d�}tj||f|�tj|dd�|d<||_|�dd�|_|rpt�dtt	|�
�����|j|f|��dS)	Nr}�	direction)Ztextvariabler}rF)Ztearoff�menur�zunknown option -%s)rr	rzrxZMenur�	_callbackZTclErrorr�r^�keys�set_menu)ryr&rr��values�kwargsrHr'r'r(rzCs
��zOptionMenu.__init__cCs&|dkr|�t�||��St�||�S)Nr)Znametowidgetr	�__getitem__r�r'r'r(r`szOptionMenu.__getitem__cGsR|d}|�dd�|D]$}|j|t�|j||j�|jd�q|rN|j�|�dS)Nrr�end)rr�r)r�Zadd_radiobuttonrxZ_setitrrr�)ryr�rrr?r'r'r(rgs�zOptionMenu.set_menucs,z|`Wntk
rYnXt���dSr*)rr
rrr�rr'r(rus
zOptionMenu.destroy)N)N)r�r�r�rzrrrrr'r'rr(r?s

)F)FN)F)F)rrD)N)5�__version__�
__author__�__all__rxrrrrZ	TkVersionrr)r0r8r@rBrKrNr[rcrgrmrqrurkrr�objectrr�rrrrrrrrr	r
rrr
rrrrrrZXViewZYViewrrrr'r'r'r(�<module>s��	




%
1*


*B*"8*(J`PK�(�Z�x��2$2$-__pycache__/simpledialog.cpython-38.opt-2.pycnu�[���U

e5d�-�@s�ddlTddlmZmZGdd�d�ZGdd�de�Zdd�ZGd	d
�d
e�ZGdd�de�Zd
d�Z	Gdd�de�Z
dd�ZGdd�de�Zdd�Z
edkr�dd�Ze�dS)�)�*)�
messagebox�_get_default_rootc@sLeZdZdgddddfdd�Zddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�SimpleDialog�NcCs|rt||d�|_n
t|�|_|r:|j�|�|j�|�t|j�t|j|dd�|_|jjdtd�t	|j�|_
|j
��||_||_||_
|j�d|j�tt|��D]L}||}	t|j
|	||fdd�d	�}
||kr�|
jtd
d�|
jttdd�q�|j�d
|j�|�|�dS)N)�class_i�)�textZaspect�)�expand�fill�<Return>cSs
|�|�S�N)�done��self�num�r�,/usr/lib64/python3.8/tkinter/simpledialog.py�<lambda>8�z'SimpleDialog.__init__.<locals>.<lambda>�r�command�)ZreliefZborderwidth)�siderr
�WM_DELETE_WINDOW)�Toplevel�root�titleZiconname�
_setup_dialogZMessage�message�packZBOTH�Frame�framer�cancel�default�bind�return_event�range�len�ButtonZconfigZRIDGE�LEFT�protocol�wm_delete_window�_set_transient)r�masterr�buttonsr$r#rrr�s�brrr�__init__ s2


�zSimpleDialog.__init__��?�333333�?c
Cs|j}|��|�|�|��|��rJ|��}|��}|��}|��}n|�	�}|�
�}d}}|��}	|��}
|||	|}|||
|}||	|�	�kr�|�	�|	}n|dkr�d}||
|�
�kr�|�
�|
}n|dkr�d}|�
d||f�|��dS)Nr�+%d+%d)r�withdraw�	transient�update_idletasksZwinfo_ismappedZwinfo_widthZwinfo_height�winfo_rootx�winfo_rootyZwinfo_screenwidthZwinfo_screenheightZwinfo_reqwidthZwinfo_reqheight�geometry�	deiconify)
rr.ZrelxZrelyZwidgetZm_widthZm_heightZm_xZm_yZw_widthZw_height�x�yrrrr-?s4

zSimpleDialog._set_transientcCs.|j��|j��|j��|j��|jSr
)r�wait_visibility�grab_set�mainloop�destroyr�rrrr�go\s




zSimpleDialog.gocCs&|jdkr|j��n|�|j�dSr
)r$r�bellr�rZeventrrrr&cs
zSimpleDialog.return_eventcCs&|jdkr|j��n|�|j�dSr
)r#rrErrCrrrr,is
zSimpleDialog.wm_delete_windowcCs||_|j��dSr
)rr�quitrrrrroszSimpleDialog.done)r3r4)	�__name__�
__module__�__qualname__r2r-rDr&r,rrrrrrs�

rc@sReZdZddd�Zdd�Zdd�Zdd	�Zdd
d�Zddd
�Zdd�Z	dd�Z
dS)�DialogNcCs�|}|std�}t�||�|��|dk	r>|��r>|�|�|rL|�|�t|�||_d|_	t
|�}|�|�|_|j
ddd�|��|js�||_|�d|j�|dk	r�|�d|��d|��df�|��|j��|��|��|�|�dS)Nzcreate dialog window�)�padx�padyrr5�2)rrr2r6Zwinfo_viewabler7rr�parent�resultr!�body�
initial_focusr �	buttonboxr+r#r;r9r:r<�	focus_setr?r@Zwait_window)rrPrr.rRrrrr2{s8	


�
zDialog.__init__cCsd|_t�|�dSr
)rSrrBrCrrrrB�szDialog.destroycCsdSr
r)rr.rrrrR�szDialog.bodycCsvt|�}t|dd|jtd�}|jtddd�t|dd|jd�}|jtddd�|�d|j�|�d	|j�|��dS)
NZOK�
)r�widthrr$rL)rrMrN�Cancel)rrWrrz<Escape>)r!r)�okZACTIVEr r*r#r%)rZbox�wrrrrT�szDialog.buttonboxcCsB|��s|j��dS|��|��z|��W5|��XdSr
)�validaterSrUr6r8r#�applyrFrrrrY�s
z	Dialog.okcCs |jdk	r|j��|��dSr
)rPrUrBrFrrrr#�s

z
Dialog.cancelcCsdS)Nr	rrCrrrr[�szDialog.validatecCsdSr
rrCrrrr\�szDialog.apply)N)N)N)rHrIrJr2rBrRrTrYr#r[r\rrrrrKts
7	


	rKcCs:|jdkr |j�dd|dd�n|jdkr6|�dd�dS)	NZaquaz!::tk::unsupported::MacWindowStyleZstyleZ
moveableModalrZx11z-typeZdialog)Z_windowingsystemZtkZcallZ
wm_attributes)rZrrrrs

�
rc@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�_QueryDialogNcCs*||_||_||_||_t�|||�dSr
)�prompt�minvalue�maxvalue�initialvaluerKr2)rrr^rar_r`rPrrrr2s
z_QueryDialog.__init__cCsd|_t�|�dSr
)�entryrKrBrCrrrrBsz_QueryDialog.destroycCsrt||jtd�}|jddtd�t|dd�|_|jjddttd�|jdk	rl|j�	d|j�|j�
dt�|jS)N)rZjustifyrrL)�rowrMZstickyrb)�namer	)ZLabelr^r*Zgrid�WZEntryrb�Era�insertZselect_rangeZEND)rr.rZrrrrR s
z_QueryDialog.bodycCs�z|��}Wn,tk
r8tjd|jd|d�YdSX|jdk	rh||jkrhtjdd|j|d�dS|jdk	r�||jkr�tjdd|j|d�dS||_d	S)
Nz
Illegal valuez
Please try again)rPrz	Too smallz2The allowed minimum value is %s. Please try again.z	Too largez2The allowed maximum value is %s. Please try again.r	)�	getresult�
ValueErrorr�showwarning�errormessager_r`rQ)rrQrrrr[.s:�����z_QueryDialog.validate)NNNN)rHrIrJr2rBrRr[rrrrr]
s�

r]c@seZdZdZdd�ZdS)�
_QueryIntegerzNot an integer.cCs|�|j���Sr
)Zgetintrb�getrCrrrrhSsz_QueryInteger.getresultN�rHrIrJrkrhrrrrrlPsrlcKst||f|�}|jSr
)rlrQ�rr^�kw�drrr�
askintegerWsrrc@seZdZdZdd�ZdS)�_QueryFloatzNot a floating point value.cCs|�|j���Sr
)Z	getdoublerbrmrCrrrrhisz_QueryFloat.getresultNrnrrrrrsfsrscKst||f|�}|jSr
)rsrQrorrr�askfloatmsrtc@s$eZdZdd�Zdd�Zdd�ZdS)�_QueryStringcOs6d|kr|d|_|d=nd|_tj|f|�|�dS)N�show)�_QueryString__showr]r2)r�argsrprrrr2}s

z_QueryString.__init__cCs(t�||�}|jdk	r$|j|jd�|S)N)rv)r]rRrwZ	configure)rr.rbrrrrR�s
z_QueryString.bodycCs
|j��Sr
)rbrmrCrrrrh�sz_QueryString.getresultN)rHrIrJr2rRrhrrrrru|srucKst||f|�}|jSr
)rurQrorrr�	askstring�sry�__main__cCsLt�}|fdd�}t|d|d�}|��t|d|jd�}|��|��dS)NcSs^t|ddddgdddd�}t|���ttd	d
dd��ttd	d
ddd��ttd	d��dS)Nz�This is a test dialog.  Would this have been an actual dialog, the buttons below would have been glowing in soft pink light.
Do you believe this?ZYesZNorXr�zTest Dialog)rr/r$r#rZSpamz	Egg count�)razEgg weight
(in tons)r	�d)r_r`z	Egg label)r�printrDrrrtry)rrqrrr�doit�s�

�ztest.<locals>.doitZTestrZQuit)ZTkr)r rGrA)rr�t�qrrr�test�sr�N)ZtkinterrrrrrKrr]rlrrrsrtruryrHr�rrrr�<module>sV
CPK�(�Z<,��22#__pycache__/__main__.cpython-38.pycnu�[���U

e5d��@s<dZddlZejd�d�r&dejd<ddlmZe�dS)zMain entry point�Nz__main__.pyzpython -m tkinter�)�_test)�__doc__�sys�argv�endswith�r�main�r
r
�(/usr/lib64/python3.8/tkinter/__main__.py�<module>s

PK�(�Z�(1616$__pycache__/tix.cpython-38.opt-1.pycnu�[���U

e5d-,�@sLddlZddlZddlTddlmZddlZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZGdd �d �Z Gd!d"�d"ej!e �Z!Gd#d$�d$�Z"ej#j$e"fej#_$Gd%d&�d&ej#�Z%Gd'd(�d(e%�Z&Gd)d*�d*�Z'Gd+d,�d,e%�Z(Gd-d.�d.e%�Z)Gd/d0�d0e%�Z*Gd1d2�d2e%�Z+Gd3d4�d4e%�Z,Gd5d6�d6e%�Z-Gd7d8�d8e%�Z.Gd9d:�d:e%�Z/Gd;d<�d<e%�Z0Gd=d>�d>e%�Z1Gd?d@�d@e%�Z2GdAdB�dBe%�Z3GdCdD�dDe%�Z4GdEdF�dFe%e5e6�Z7GdGdH�dHe%�Z8GdIdJ�dJe%�Z9GdKdL�dLe%�Z:GdMdN�dNe%�Z;GdOdP�dPe%�Z<GdQdR�dRe%�Z=GdSdT�dTe%�Z>GdUdV�dVe%�Z?GdWdX�dXe%�Z@GdYdZ�dZe%�ZAGd[d\�d\e%�ZBGd]d^�d^e%�ZCGd_d`�d`e%�ZDGdadb�dbe%�ZEGdcdd�dde%�ZFGdedf�dfe%�ZGGdgdh�dhe%�ZHGdidj�dje%�ZIGdkdl�dle%�ZJGdmdn�dne%�ZKGdodp�dpe%e5e6�ZLGdqdr�dre%�ZMGdsdt�dte%�ZNGdudv�dveOe&�ZPGdwdx�dxeQe&�ZRGdydz�dzeSe&�ZTGd{d|�d|eUe&�ZVGd}d~�d~eWe&�ZXGdd��d�eYe&�ZZGd�d��d�e[e&�Z\Gd�d��d�e]e&�Z^Gd�d��d�e_e&�Z`Gd�d��d�eae&�ZbGd�d��d�eDe&�ZcGd�d��d�e7e&�ZdGd�d��d�eCe&�ZeGd�d��d�eLe&�ZfGd�d��d�e*e&�ZgGd�d��d�e,e&�ZhGd�d��d�e.e&�ZiGd�d��d�e/e&�ZjGd�d��d�e2e&�ZkGd�d��d�e*e&�ZlGd�d��d�eKe&�ZmGd�d��d�e>e&�ZnGd�d��d�e@e&�Zod�d��Zpd�d��ZqGd�d��d�e%�ZrGd�d��d�e%e5e6�ZsGd�d��d�es�ZtdS)��N)�*)�	_cnfmerge�window�textZstatusZ	immediate�imageZ	imagetextZballoon�autoZ	acrosstop�asciiZcell�columnZ
decreasingZ
increasingZinteger�main�max�real�rowzs-regionzx-regionzy-region����� c@sVeZdZdZdd�Zdd�Zddd�Zdd	d
�Zdd�Zd
d�Z	dd�Z
ddd�ZdS)�
tixCommanda�The tix commands provide access to miscellaneous  elements
    of  Tix's  internal state and the Tix application context.
    Most of the information manipulated by these  commands pertains
    to  the  application  as a whole, or to a screen or
    display, rather than to a particular window.

    This is a mixin class, assumed to be mixed to Tkinter.Tk
    that supports the self.tk.call method.
    cCs|j�dd|�S)a�Tix maintains a list of directories under which
        the  tix_getimage  and tix_getbitmap commands will
        search for image files. The standard bitmap  directory
        is $TIX_LIBRARY/bitmaps. The addbitmapdir command
        adds directory into this list. By  using  this
        command, the  image  files  of an applications can
        also be located using the tix_getimage or tix_getbitmap
        command.
        �tixZaddbitmapdir��tk�call)�selfZ	directory�r�#/usr/lib64/python3.8/tkinter/tix.py�tix_addbitmapdirRs
ztixCommand.tix_addbitmapdircCs|j�dd|�S)z�Returns  the  current  value  of the configuration
        option given by option. Option may be  any  of  the
        options described in the CONFIGURATION OPTIONS section.
        r�cgetr�r�optionrrr�tix_cget^sztixCommand.tix_cgetNcKsd|rt||f�}n|rt|�}|dkr2|�dd�St|t�rN|�ddd|�S|j�d|�|��S)a�Query or modify the configuration options of the Tix application
        context. If no option is specified, returns a dictionary all of the
        available options.  If option is specified with no value, then the
        command returns a list describing the one named option (this list
        will be identical to the corresponding sublist of the value
        returned if no option is specified).  If one or more option-value
        pairs are specified, then the command modifies the given option(s)
        to have the given value(s); in this case the command returns an
        empty string. Option may be any of the configuration options.
        Nr�	configure�-)rr )r�
_getconfigure�
isinstance�strZ_getconfigure1rr�_options�r�cnf�kwrrr�
tix_configurees
ztixCommand.tix_configurecCs*|dk	r|j�dd|�S|j�dd�SdS)a�Returns the file selection dialog that may be shared among
        different calls from this application.  This command will create a
        file selection dialog widget when it is called the first time. This
        dialog will be returned by all subsequent calls to tix_filedialog.
        An optional dlgclass parameter can be passed to specified what type
        of file selection dialog widget is desired. Possible options are
        tix FileSelectDialog or tixExFileSelectDialog.
        NrZ
filedialogr)rZdlgclassrrr�tix_filedialog{s	ztixCommand.tix_filedialogcCs|j�dd|�S)a�Locates a bitmap file of the name name.xpm or name in one of the
        bitmap directories (see the tix_addbitmapdir command above).  By
        using tix_getbitmap, you can avoid hard coding the pathnames of the
        bitmap files in your application. When successful, it returns the
        complete pathname of the bitmap file, prefixed with the character
        '@'.  The returned value can be used to configure the -bitmap
        option of the TK and Tix widgets.
        rZ	getbitmapr�r�namerrr�
tix_getbitmap�s	ztixCommand.tix_getbitmapcCs|j�dd|�S)a�Locates an image file of the name name.xpm, name.xbm or name.ppm
        in one of the bitmap directories (see the addbitmapdir command
        above). If more than one file with the same name (but different
        extensions) exist, then the image type is chosen according to the
        depth of the X display: xbm images are chosen on monochrome
        displays and color images are chosen on color displays. By using
        tix_ getimage, you can avoid hard coding the pathnames of the
        image files in your application. When successful, this command
        returns the name of the newly created image, which can be used to
        configure the -image option of the Tk and Tix widgets.
        rZgetimagerr+rrr�tix_getimage�sztixCommand.tix_getimagecCs|j�ddd|�S)a@Gets  the options  maintained  by  the  Tix
        scheme mechanism. Available options include:

            active_bg       active_fg      bg
            bold_font       dark1_bg       dark1_fg
            dark2_bg        dark2_fg       disabled_fg
            fg              fixed_font     font
            inactive_bg     inactive_fg    input1_bg
            input2_bg       italic_font    light1_bg
            light1_fg       light2_bg      light2_fg
            menu_font       output1_bg     output2_bg
            select_bg       select_fg      selector
            rr�getrr+rrr�tix_option_get�sztixCommand.tix_option_getcCs2|dk	r|j�dd|||�S|j�dd||�SdS)a�Resets the scheme and fontset of the Tix application to
        newScheme and newFontSet, respectively.  This affects only those
        widgets created after this call. Therefore, it is best to call the
        resetoptions command before the creation of any widgets in a Tix
        application.

        The optional parameter newScmPrio can be given to reset the
        priority level of the Tk options set by the Tix schemes.

        Because of the way Tk handles the X option database, after Tix has
        been has imported and inited, it is not possible to reset the color
        schemes and font sets using the tix config command.  Instead, the
        tix_resetoptions command must be used.
        NrZresetoptionsr)rZ	newSchemeZ
newFontSetZ
newScmPriorrr�tix_resetoptions�sztixCommand.tix_resetoptions)N)N)N)�__name__�
__module__�__qualname__�__doc__rrr)r*r-r.r0r1rrrrrGs


rc@s"eZdZdZddd�Zdd�ZdS)	�Tkz{Toplevel widget of Tix which represents mostly the main window
    of an application. It has an associated Tcl interpreter.N�TixcCsbtj�||||�tj�d�}|j�d�|dk	rR|j�d|�|j�d|�|j�d�dS)NZTIX_LIBRARYz<global auto_path; lappend auto_path [file dir [info nameof]]z(global auto_path; lappend auto_path {%s}z,global tcl_pkgPath; lappend tcl_pkgPath {%s}zpackage require Tix)�tkinterr6�__init__�os�environr/r�eval)rZ
screenNameZbaseNameZ	classNameZtixlibrrrr9�szTk.__init__cCs|�dd�tj�|�dS)NZWM_DELETE_WINDOW�)Zprotocolr8r6�destroy�rrrrr>�sz
Tk.destroy)NNr7�r2r3r4r5r9r>rrrrr6�s
r6c@sTeZdZdZifdd�ZeZdd�Zdd�Zdd	�Zddd�Z	ddd�Z
dd�Zd
S)�Formz�The Tix Form geometry manager

    Widgets can be arranged by specifying attachments to other widgets.
    See Tix documentation for complete detailscKs"|jjd|jf|�||���dS)N�tixForm�rr�_wr%r&rrr�config�szForm.configcCst�|||i�dS�N)rA�form�r�key�valuerrr�__setitem__�szForm.__setitem__cCs|j�dd|j�S)NrB�check�rrrDr?rrrrL�sz
Form.checkcCs|j�dd|j�dS)NrB�forgetrMr?rrrrN�szForm.forgetrcCs`|sJ|sJ|j�dd|j�}|j�|�}d}|D]}||j�|�f}q.|S|j�dd|j||�S)NrB�gridr)rrrD�	splitlistZgetint)rZxsizeZysize�x�y�zrrrrO�sz	Form.gridNcCs>|s|j�dd|j�S|ddkr*d|}|j�dd|j|�S)NrB�inforr!rMrrrrrT�s
z	Form.infocs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr)�
_nametowidget��.0rQr?rr�
<listcomp>szForm.slaves.<locals>.<listcomp>rB�slaves�rrPrrDr?rr?rrYs
���zForm.slaves)rr)N)r2r3r4r5rErGrKrLrNrOrTrYrrrrrA�s


rAc@sreZdZdZdddiifdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zidfdd�Zdd�Z
dS)�	TixWidgetaQA TixWidget class is used to package all (or most) Tix widgets.

    Widget initialization is extended in two ways:
       1) It is possible to give a list of options which must be part of
       the creation command (so called Tix 'static' options). These cannot be
       given as a 'config' command later.
       2) It is possible to give the name of an existing TK widget. These are
       child widgets created automatically by a Tix mega-widget. The Tk call
       to create these widgets is therefore bypassed in TixWidget.__init__

    Both options are for use by subclasses only.
    Nc	Cs�|rt||f�}nt|�}d}|r.|�d�ndg}t|���D]&\}}||kr@|d||f}||=q@||_t�|||�|r�|jj||j	f|��|r�t�
||�i|_dS)Nr�optionsr!)r�append�list�items�
widgetName�Widget�_setuprrrDrE�subwidget_list)	r�masterr`Zstatic_optionsr'r(Zextra�k�vrrrr9s$zTixWidget.__init__cCs ||jkr|j|St|��dSrF)rc�AttributeErrorr+rrr�__getattr__Gs

zTixWidget.__getattr__cCs|j�d|j|�dS)z1Set a variable without calling its action routineZtixSetSilentNrM)rrJrrr�
set_silentLszTixWidget.set_silentcCsD|�|�}|s$td|d|j��|t|j�dd�}|�|�S)zSReturn the named subwidget (which must have been created by
        the sub-class).z
Subwidget z not child of �N)�_subwidget_name�TclError�_name�lenrDrU)rr,�nrrr�	subwidgetPs

zTixWidget.subwidgetcCsZ|��}|sgSg}|D]<}|t|j�dd�}z|�|�|��WqYqXq|S)zReturn all subwidgets.rjN)�_subwidget_namesrnrDr]rU)r�namesZretlistr,rrr�subwidgets_allZszTixWidget.subwidgets_allcCs0z|j�|jd|�WStk
r*YdSXdS)z7Get a subwidget name (returns a String, not a Widget !)rpN)rrrDrlr+rrrrkiszTixWidget._subwidget_namecCs<z |j�|jdd�}|j�|�WStk
r6YdSXdS)z"Return the name of all subwidgets.Z
subwidgetsz-allN)rrrDrPrl)rrQrrrrqps
zTixWidget._subwidget_namescCs\|dkrdSt|t�st|�}t|t�s0t|�}|��}|D]}|j�|dd||�q<dS)z8Set configuration options for all subwidgets (and self).r=Nr r!)r#r$�reprrqrr)rrrJrrr,rrr�
config_allxs

zTixWidget.config_allcKst|s|}|r|rt||f�}n|r&|}d}|��D]*\}}t|�rL|�|�}|d||f}q2|j�dd|f|�S)Nrr!r�create)rr_�callable�	_registerrr)rZimgtyper'rdr(r\rerfrrr�image_create�s
zTixWidget.image_createcCs.z|j�dd|�Wntk
r(YnXdS)Nr�delete)rrrl)rZimgnamerrr�image_delete�szTixWidget.image_delete)r2r3r4r5r9rhrirprsrkrqruryr{rrrrr[
s�
-
r[c@s"eZdZdZddd�Zdd�ZdS)	�TixSubWidgetz�Subwidget class.

    This is used to mirror child widgets automatically created
    by Tix/Tk as part of a mega-widget in Python (which is not informed
    of this)rjc
Cs�|rD|�|�}z$|t|j�dd�}|�d�}Wng}YnX|s`t�||ddd|i�n�|}tt|�d�D]V}d�|d|d��}	z|�|	�}
|
}Wqtt	k
r�t
|||ddd�}YqtXqt|r�|d}t�||ddd|i�||_dS)Nrj�.r,r)�destroy_physically�check_intermediate���)rkrnrD�splitr[r9�range�joinrU�KeyErrorr|r~)rrdr,r~r�pathZplist�parent�iro�wrrrr9�s0



�zTixSubWidget.__init__cCsjt|j���D]}|��q|j|jjkr6|jj|j=|j|jjkrP|jj|j=|jrf|j�	d|j
�dS)Nr>)r^�children�valuesr>rmrdrcr~rrrD�r�crrrr>�s
zTixSubWidget.destroyN)rjrjr@rrrrr|�s
�
 r|c@sVeZdZdZifdd�dd�Zdd�Zdd	�Zd
d�Zdd
�Zifdd�Z	dd�Z
dS)�DisplayStylezRDisplayStyle - handle configuration options shared by
    (multiple) Display ItemsN)rdcKs\|s2d|kr|d}nd|kr(|d}n
t�d�}|j|_|jjd|f|�||���|_dS)NZ	refwindowzcreate display styleZtixDisplayStyle)r8Z_get_default_rootrrr%�	stylename)r�itemtyper'rdr(rrrr9�s



�zDisplayStyle.__init__cCs|jSrF)r�r?rrr�__str__�szDisplayStyle.__str__cCsH|r|rt||f�}n|r|}d}|��D]\}}|d||f}q*|S)Nrr!)rr_)rr'r(Zoptsrerfrrrr%�szDisplayStyle._optionscCs|j�|jd�dS�Nrz�rrr�r?rrrrz�szDisplayStyle.deletecCs|j�|jdd||�dS)Nr �-%sr�rHrrrrK�szDisplayStyle.__setitem__cKs|j|jdf|�||���S)Nr )r"r�r%r&rrrrE�s�
�zDisplayStyle.configcCs|j�|jdd|�S)Nrr�r�)rrIrrr�__getitem__�szDisplayStyle.__getitem__)r2r3r4r5r9r�r%rzrKrEr�rrrrr��s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�BalloonzBalloon help widget.

    Subwidget       Class
    ---------       -----
    label           Label
    message         MessageNcKsNdddddg}t�||d|||�t|ddd	�|jd<t|d
dd	�|jd
<dS)Nr\ZinstallcolormapZinitwaitZ	statusbarZcursorZ
tixBalloon�labelr�r~�message�r[r9�_dummyLabelrc�rrdr'r(Zstaticrrrr9	s���zBalloon.__init__cKs&|jj|jd|jf|�||���dS)zkBind balloon widget to another.
        One balloon widget may be bound to several widgets at the same time�bindNrC)r�widgetr'r(rrr�bind_widgetszBalloon.bind_widgetcCs|j�|jd|j�dS�NZunbindrM�rr�rrr�
unbind_widgetszBalloon.unbind_widget)r2r3r4r5r9r�r�rrrrr�s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�	ButtonBoxzgButtonBox - A container for pushbuttons.
    Subwidgets are the buttons added with the add method.
    NcKst�||dddg||�dS)NZtixButtonBox�orientationr\�r[r9�rrdr'r(rrrr9s

�zButtonBox.__init__cKs4|jj|jd|f|�||���}t||�|j|<|S)z$Add a button with given name to box.�add�rrrDr%�_dummyButtonrc)rr,r'r(Zbtnrrrr�#s z
ButtonBox.addcCs ||jkr|j�|jd|�dS�N�invoke�rcrrrDr+rrrr�*s
zButtonBox.invoke�r2r3r4r5r9r�r�rrrrr�sr�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�ComboBoxa�ComboBox - an Entry field with a dropdown menu. The user can select a
    choice by either typing in the entry subwidget or selecting from the
    listbox subwidget.

    Subwidget       Class
    ---------       -----
    entry       Entry
    arrow       Button
    slistbox    ScrolledListBox
    tick        Button
    cross       Button : present if created with the fancy optionNc	Ks�t�||dddddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<z$t|d
�|jd
<t|d�|jd<Wntk
r�YnXdS)NZtixComboBoxZeditableZdropdown�fancyr\r��entry�arrow�slistbox�tick�cross)r[r9r�rc�_dummyEntryr��_dummyScrolledListBox�	TypeErrorr�rrrr9<s 

��
zComboBox.__init__cCs|j�|jd|�dS)NZ
addhistoryrM�rr$rrr�add_historyNszComboBox.add_historycCs|j�|jd|�dS)NZ
appendhistoryrMr�rrr�append_historyQszComboBox.append_historycCs|j�|jd||�dS�N�insertrM)r�indexr$rrrr�TszComboBox.insertcCs|j�|jd|�dS)N�pickrM�rr�rrrr�Wsz
ComboBox.pick)	r2r3r4r5r9r�r�r�r�rrrrr�.s
r�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�Controla�Control - An entry field with value change arrows.  The user can
    adjust the value by pressing the two arrow buttons or by entering
    the value directly into the entry. The new value will be checked
    against the user-defined upper and lower limits.

    Subwidget       Class
    ---------       -----
    incr       Button
    decr       Button
    entry       Entry
    label       LabelNcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixControlr\�incr�decrr�r�)r[r9r�rcr�r�r�rrrr9hs
zControl.__init__cCs|j�|jd�dS)Nr�rMr?rrr�	decrementoszControl.decrementcCs|j�|jd�dS)Nr�rMr?rrr�	incrementrszControl.incrementcCs|j�|jd�dSr�rMr?rrrr�uszControl.invokecCs|j�|jd�dS)N�updaterMr?rrrr�xszControl.update)	r2r3r4r5r9r�r�r�r�rrrrr�Zs
r�c@s$eZdZdZifdd�Zdd�ZdS)�DirListaRDirList - displays a list view of a directory, its previous
    directories and its sub-directories. The user can choose one of
    the directories displayed in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist       HList
    hsb              Scrollbar
    vsb              ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirListr\�hlist�vsb�hsb�r[r9�_dummyHListrc�_dummyScrollbarr�rrrr9�szDirList.__init__cCs|j�|jd|�dS�N�chdirrM�r�dirrrrr��sz
DirList.chdirN�r2r3r4r5r9r�rrrrr�{sr�c@s$eZdZdZifdd�Zdd�ZdS)�DirTreea�DirTree - Directory Listing in a hierarchical view.
    Displays a tree view of a directory, its previous directories and its
    sub-directories. The user can choose one of the directories displayed
    in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist           HList
    hsb             Scrollbar
    vsb             ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirTreer\r�r�r�r�r�rrrr9�szDirTree.__init__cCs|j�|jd|�dSr�rMr�rrrr��sz
DirTree.chdirNr�rrrrr��sr�c@seZdZdZifdd�ZdS)�DirSelectBoxa�DirSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixDirSelectBoxr\�dirlist�dircbx)r[r9�
_dummyDirListrc�_dummyFileComboBoxr�rrrr9�szDirSelectBox.__init__N�r2r3r4r5r9rrrrr��s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectBoxa�ExFileSelectBox - MS Windows style file select box.
    It provides a convenient method for the user to select files.

    Subwidget       Class
    ---------       -----
    cancel       Button
    ok              Button
    hidden       Checkbutton
    types       ComboBox
    dir              ComboBox
    file       ComboBox
    dirlist       ScrolledListBox
    filelist       ScrolledListBoxcKs�t�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<t|d
�|jd
<dS)NZtixExFileSelectBoxr\�cancel�ok�hidden�typesr�r��file�filelist)r[r9r�rc�_dummyCheckbutton�_dummyComboBoxr�r�r�rrrr9�szExFileSelectBox.__init__cCs|j�|jd�dS�N�filterrMr?rrrr��szExFileSelectBox.filtercCs|j�|jd�dSr�rMr?rrrr��szExFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�DirSelectDialoga#The DirSelectDialog widget presents the directories in the file
    system in a dialog window. The user can use this dialog window to
    navigate through the file system to select the desired directory.

    Subwidgets       Class
    ----------       -----
    dirbox       DirSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixDirSelectDialogr\Zdirbox)r[r9�_dummyDirSelectBoxrcr�rrrr9�s
�zDirSelectDialog.__init__cCs|j�|jd�dS�N�popuprMr?rrrr��szDirSelectDialog.popupcCs|j�|jd�dS�N�popdownrMr?rrrr��szDirSelectDialog.popdownN�r2r3r4r5r9r�r�rrrrr��s	r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectDialogz�ExFileSelectDialog - MS Windows style file select dialog.
    It provides a convenient method for the user to select files.

    Subwidgets       Class
    ----------       -----
    fsbox       ExFileSelectBoxcKs*t�||ddg||�t|d�|jd<dS)NZtixExFileSelectDialogr\�fsbox)r[r9�_dummyExFileSelectBoxrcr�rrrr9�s
�zExFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popdownNr�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�
FileSelectBoxa�ExFileSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixFileSelectBoxr\r�r�r��	selection)r[r9r�rcr�r�rrrr9s
zFileSelectBox.__init__cCs|j�|jd�dSr�rMr?rrr�apply_filterszFileSelectBox.apply_filtercCs|j�|jd�dSr�rMr?rrrr�szFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr�s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�FileSelectDialogz�FileSelectDialog - Motif style file select dialog.

    Subwidgets       Class
    ----------       -----
    btns       StdButtonBox
    fsbox       FileSelectBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixFileSelectDialogr\Zbtnsr�)r[r9�_dummyStdButtonBoxrc�_dummyFileSelectBoxr�rrrr9,s
�zFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�2szFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�5szFileSelectDialog.popdownNr�rrrrr�#sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�	FileEntrya_FileEntry - Entry field with button that invokes a FileSelectDialog.
    The user can type in the filename manually. Alternatively, the user can
    press the button widget that sits next to the entry, which will bring
    up a file selection dialog.

    Subwidgets       Class
    ----------       -----
    button       Button
    entry       EntrycKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZtixFileEntryZ
dialogtyper\Zbuttonr�)r[r9r�rcr�r�rrrr9Ds
�zFileEntry.__init__cCs|j�|jd�dSr�rMr?rrrr�JszFileEntry.invokecCsdSrFrr?rrr�file_dialogMszFileEntry.file_dialogN)r2r3r4r5r9r�r�rrrrr�8sr�c@s�eZdZdZdifdd�Zifdd�Zdifdd�Zd	d
�Zdd�Zdldd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zifd d!�Zifd"d#�Zd$d%�Zd&d'�ZeZd(d)�Zd*d+�Zd,d-�Zifd.d/�Zifd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z d<d=�Z!dmd>d?�Z"d@dA�Z#dBdC�Z$dDdE�Z%dFdG�Z&dHdI�Z'dJdK�Z(dLdM�Z)dNdO�Z*dPdQ�Z+dRdS�Z,ifdTdU�Z-ifdVdW�Z.dXdY�Z/dZd[�Z0d\d]�Z1ifd^d_�Z2d`da�Z3dbdc�Z4ifddde�Z5dfdg�Z6dndhdi�Z7djdk�Z8dS)o�HListaHList - Hierarchy display  widget can be used to display any data
    that have a hierarchical structure, for example, file system directory
    trees. The list entries are indented and connected by branch lines
    according to their places in the hierarchy.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixHList�columnsr\r�r�rrrr9Ys

�zHList.__init__cKs |jj|jd|f|�||���S�Nr�rC�rr�r'r(rrrr�]sz	HList.addcKs(|sd}|jj|jd|f|�||���S)Nr=ZaddchildrC)rr�r'r(rrr�	add_child`s�
�zHList.add_childcCs|j�|jdd|�dS�N�anchor�setrM�rr�rrr�
anchor_setfszHList.anchor_setcCs|j�|jdd�dS�Nr��clearrMr?rrr�anchor_cleariszHList.anchor_clearrcCs6|s|j�|jdd||�S|j�|jdd|d|�SdS)Nr	�widthz-charrM)r�colr�charsrrr�column_widthls�zHList.column_widthcCs|j�|jdd�dS)Nrz�allrMr?rrr�
delete_allsszHList.delete_allcCs|j�|jdd|�dS)Nrzr�rMr�rrr�delete_entryvszHList.delete_entrycCs|j�|jdd|�dS)NrzZ
offspringsrMr�rrr�delete_offspringsyszHList.delete_offspringscCs|j�|jdd|�dS)NrzZsiblingsrMr�rrr�delete_siblings|szHList.delete_siblingscCs|j�|jdd|�dS�N�dragsiter�rMr�rrr�dragsite_setszHList.dragsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dragsite_clear�szHList.dragsite_clearcCs|j�|jdd|�dS�N�dropsiter�rMr�rrr�dropsite_set�szHList.dropsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dropsite_clear�szHList.dropsite_clearcKs&|jj|jdd|f|�||���dS)N�headerrvrC�rrr'r(rrr�
header_create�szHList.header_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nrr �r"rDrrr%rrrr�header_configure�s

�zHList.header_configurecCs|j�|jdd||�S)NrrrM)rr�optrrr�header_cget�szHList.header_cgetcCs|j�|j�|jdd|��S)NrZexist)rZ
getbooleanrrD�rrrrr�
header_exists�szHList.header_existscCs|j�|jdd|�dS)NrrzrMrrrr�
header_delete�szHList.header_deletecCs|j�|jdd|�S)Nr�sizerMrrrr�header_size�szHList.header_sizecCs|j�|jdd|�dS)N�hider�rMr�rrr�
hide_entry�szHList.hide_entrycKs&|jj|jdd|f|�||���dS)N�	indicatorrvrCr�rrr�indicator_create�s�
�zHList.indicator_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nr#r rr�rrr�indicator_configure�s��
�zHList.indicator_configurecCs|j�|jdd||�S)Nr#rrM�rr�rrrr�indicator_cget�szHList.indicator_cgetcCs|j�|jdd|�S)Nr#�existsrMr�rrr�indicator_exists�szHList.indicator_existscCs|j�|jdd|�dS)Nr#rzrMr�rrr�indicator_delete�szHList.indicator_deletecCs|j�|jdd|�S)Nr#rrMr�rrr�indicator_size�szHList.indicator_sizecCs|j�|jdd�S�NrTr�rMr?rrr�info_anchor�szHList.info_anchorcCs|�|j�|jdd|��pdS�NrTZbbox)�_getintsrrrDr�rrr�	info_bbox�s
��zHList.info_bboxcCs |j�|jdd|�}|j�|�S)NrTr��rrrDrP)rr�r�rrr�
info_children�szHList.info_childrencCs|j�|jdd|�S)NrT�datarMr�rrr�	info_data�szHList.info_datacCs|j�|jdd�S)NrTrrMr?rrr�
info_dragsite�szHList.info_dragsitecCs|j�|jdd�S)NrTrrMr?rrr�
info_dropsite�szHList.info_dropsitecCs|j�|jdd|�S)NrTr(rMr�rrr�info_exists�szHList.info_existscCs|j�|jdd|�S)NrTr�rMr�rrr�info_hidden�szHList.info_hiddencCs|j�|jdd|�S)NrT�nextrMr�rrr�	info_next�szHList.info_nextcCs|j�|jdd|�S)NrTr�rMr�rrr�info_parent�szHList.info_parentcCs|j�|jdd|�S)NrT�prevrMr�rrr�	info_prev�szHList.info_prevcCs|j�|jdd�}|j�|�S�NrTr�r1r�rrr�info_selection�szHList.info_selectioncCs|j�|jdd|||�S)N�itemrrM)rr�rrrrr�	item_cget�szHList.item_cgetcKsD|dkr|�|jdd||�S|jj|jdd||f|�||���dS)Nr@r r�rr�rr'r(rrr�item_configure�s

�zHList.item_configurecKs(|jj|jdd||f|�||���dS)Nr@rvrCrBrrr�item_create�s�
�zHList.item_createcCs|j�|jdd||�S)Nr@r(rM�rr�rrrr�item_exists�szHList.item_existscCs|j�|jdd||�dS)Nr@rzrMrErrr�item_delete�szHList.item_deletecCs|j�|jd||�S)N�	entrycgetrMr&rrrrH�szHList.entrycgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS�N�entryconfigurerr�rrrrJ�s

�zHList.entryconfigurecCs|j�|jd|�S�N�nearestrM)rrRrrrrLsz
HList.nearestcCs|j�|jd|�dS�N�seerMr�rrrrNsz	HList.seecKs$|jj|jddf|�||���dS�Nr�rrCr&rrr�selection_clearszHList.selection_clearcCs|j�|jdd|�S�Nr�ZincludesrMr�rrr�selection_includes
szHList.selection_includescCs|j�|jdd||�dS�Nr�r�rM�r�firstZlastrrr�
selection_set
szHList.selection_setcCs|j�|jdd|�S)N�showr�rMr�rrr�
show_entryszHList.show_entry)rNN)N)N)9r2r3r4r5r9r�r�r�rrrrr	r
r
rrrrrrrZheader_existrr r"r$r%r'r)r*r+r-r0r2r4r5r6r7r8r:r;r=r?rArCrDrFrGrHrJrLrNrPrRrVrXrrrrr�Qsl


r�c@seZdZdZdifdd�ZdS)�	InputOnlyz?InputOnly - Invisible widget. Unix only.

    Subwidgets - NoneNcKst�||dd||�dS)NZtixInputOnlyr�r�rrrr9szInputOnly.__init__r�rrrrrYsrYc@seZdZdZdifdd�ZdS)�
LabelEntryaLabelEntry - Entry field with label. Packages an entry widget
    and a label into one mega widget. It can be used to simplify the creation
    of ``entry-form'' type of interface.

    Subwidgets       Class
    ----------       -----
    label       Label
    entry       EntryNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelEntry�	labelsider\r�r�)r[r9r�rcr�r�rrrr9%s
�zLabelEntry.__init__r�rrrrrZs	rZc@seZdZdZdifdd�ZdS)�
LabelFrameaeLabelFrame - Labelled Frame container. Packages a frame widget
    and a label into one mega widget. To create widgets inside a
    LabelFrame widget, one creates the new widgets relative to the
    frame subwidget and manage them inside the frame subwidget.

    Subwidgets       Class
    ----------       -----
    label       Label
    frame       FrameNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelFramer[r\r��frame)r[r9r�rc�_dummyFramer�rrrr96s
�zLabelFrame.__init__r�rrrrr\+s
r\c@s@eZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�ZdS)
�ListNoteBookaA ListNoteBook widget is very similar to the TixNoteBook widget:
    it can be used to display many windows in a limited space using a
    notebook metaphor. The notebook is divided into a stack of pages
    (windows). At one time only one of these pages can be shown.
    The user can navigate through these pages by
    choosing the name of the desired page in the hlist subwidget.cKsNt�||ddg||�t|ddd�|jd<t|d�|jd<t|d�|jd<dS)NZtixListNoteBookr\Zpanerr�r�Zshlist)r[r9�_dummyPanedWindowrcr��_dummyScrolledHListr�rrrr9Es�zListNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr��rrrDr%r|rc�rr,r'r(rrrr�Ms zListNoteBook.addcCs
|�|�SrF�rpr+rrr�pageRszListNoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |S�N�pages�rrPrrDr]rp�rrrZretrQrrrrgUs
zListNoteBook.pagescCs|j�|jd|�dS�N�raiserMr+rrr�
raise_page]szListNoteBook.raise_pageN)	r2r3r4r5r9r�rergrlrrrrr_=sr_c@seZdZdZdifdd�ZdS)�MeterzuThe Meter widget can be used to show the progress of a background
    job which may take a long time to execute.
    NcKst�||ddg||�dS)NZtixMeterr\r�r�rrrr9es

�zMeter.__init__r�rrrrrm`srmc@sReZdZdZdifdd�Zifdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�NoteBookz�NoteBook - Multi-page container widget (tabbed notebook metaphor).

    Subwidgets       Class
    ----------       -----
    nbframe       NoteBookFrame
    <pages>       page widgets added dynamically with the add methodNcKs.t�||ddg||�t|ddd�|jd<dS)NZtixNoteBookr\Znbframerr�)r[r9r|rcr�rrrr9qs�zNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�rbrcrrrr�vs zNoteBook.addcCs,|j�|jd|�|j|��|j|=dSr��rrrDrcr>r+rrrrz{szNoteBook.deletecCs
|�|�SrFrdr+rrrre�sz
NoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |Srfrhrirrrrg�s
zNoteBook.pagescCs|j�|jd|�dSrjrMr+rrrrl�szNoteBook.raise_pagecCs|j�|jd�S)N�raisedrMr?rrrrp�szNoteBook.raised)r2r3r4r5r9r�rzrergrlrprrrrrnisrnc@seZdZdS)�
NoteBookFrameN)r2r3r4rrrrrq�srqc@sLeZdZdZifdd�Zifdd�Zifdd�Zdd	�Zd
d�Zdd
�Z	dS)�
OptionMenuz�OptionMenu - creates a menu button of options.

    Subwidget       Class
    ---------       -----
    menubutton      Menubutton
    menu            MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZ
tixOptionMenur\�
menubutton�menu�r[r9�_dummyMenubuttonrc�
_dummyMenur�rrrr9�szOptionMenu.__init__cKs&|jj|jdd|f|�||���dS)Nr��commandrCrcrrr�add_command�szOptionMenu.add_commandcKs&|jj|jdd|f|�||���dS)Nr�Z	separatorrCrcrrr�
add_separator�szOptionMenu.add_separatorcCs|j�|jd|�dSr�rMr+rrrrz�szOptionMenu.deletecCs|j�|jd|�dS)N�disablerMr+rrrr{�szOptionMenu.disablecCs|j�|jd|�dS)N�enablerMr+rrrr|�szOptionMenu.enableN)
r2r3r4r5r9ryrzrzr{r|rrrrrr�srrc@sTeZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�Zifdd
�Z	dd�Z
dS)�PanedWindowa�PanedWindow - Multi-pane container widget
    allows the user to interactively manipulate the sizes of several
    panes. The panes can be arranged either vertically or horizontally.The
    user changes the sizes of the panes by dragging the resize handle
    between two panes.

    Subwidgets       Class
    ----------       -----
    <panes>       g/p widgets added dynamically with the add method.cKst�||dddg||�dS)NZtixPanedWindowr�r\r�r�rrrr9�szPanedWindow.__init__cKs>|jj|jd|f|�||���t||dd�|j|<|j|S)Nr�r)rrbrcrrrr��s
 �zPanedWindow.addcCs,|j�|jd|�|j|��|j|=dSr�ror+rrrrz�szPanedWindow.deletecCs|j�|jd|�dS)NrNrMr+rrrrN�szPanedWindow.forgetcCs|j�|jd||�S)N�panecgetrMr&rrrr~�szPanedWindow.panecgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS)N�
paneconfigurerr�rrrr�szPanedWindow.paneconfigurecs*�j��j��jd��}�fdd�|D�S)N�panescsg|]}��|��qSrrdrVr?rrrX�sz%PanedWindow.panes.<locals>.<listcomp>rZ)rrrrr?rr��szPanedWindow.panesN)r2r3r4r5r9r�rzrNr~rr�rrrrr}�s
r}c@s4eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
S)�	PopupMenuaPopupMenu widget can be used as a replacement of the tk_popup command.
    The advantage of the Tix PopupMenu widget is it requires less application
    code to manipulate.


    Subwidgets       Class
    ----------       -----
    menubutton       Menubutton
    menu       MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixPopupMenur\rsrtrur�rrrr9�szPopupMenu.__init__cCs|j�|jd|j�dS)Nr�rMr�rrrr��szPopupMenu.bind_widgetcCs|j�|jd|j�dSr�rMr�rrrr��szPopupMenu.unbind_widgetcCs|j�|jd|j||�dS)NZpostrM)rr�rQrRrrr�post_widget�szPopupMenu.post_widgetN)r2r3r4r5r9r�r�r�rrrrr��s
r�c@s<eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�ResizeHandlez;Internal widget to draw resize handles on Scrolled widgets.c	Ks.ddddddddd	g	}t�||d
|||�dS)Nr\rxZcursorfgZcursorbgZ
handlesizeZ	hintcolorZ	hintwidthrQrRZtixResizeHandler�)rrdr'r(�flagsrrrr9�s�
�zResizeHandle.__init__cCs|j�|jd|j�dS)NZattachwidgetrMr�rrr�
attach_widgetszResizeHandle.attach_widgetcCs|j�|jd|j�dS)NZdetachwidgetrMr�rrr�
detach_widgetszResizeHandle.detach_widgetcCs|j�|jd|j�dS)Nr!rMr�rrrr!szResizeHandle.hidecCs|j�|jd|j�dS)NrWrMr�rrrrW	szResizeHandle.showN)	r2r3r4r5r9r�r�r!rWrrrrr��s
r�c@seZdZdZifdd�ZdS)�
ScrolledHListz0ScrolledHList - HList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledHListr\r�r�r�r�r�rrrr9s�zScrolledHList.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledListBoxz4ScrolledListBox - Listbox with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledListBoxr\�listboxr�r�)r[r9�
_dummyListboxrcr�r�rrrr9szScrolledListBox.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledTextz.ScrolledText - Text with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTextr\rr�r�)r[r9�
_dummyTextrcr�r�rrrr9%szScrolledText.__init__Nr�rrrrr�!sr�c@seZdZdZifdd�ZdS)�
ScrolledTListz0ScrolledTList - TList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTListr\Ztlistr�r�)r[r9�_dummyTListrcr�r�rrrr9/s�zScrolledTList.__init__Nr�rrrrr�+sr�c@seZdZdZifdd�ZdS)�ScrolledWindowz2ScrolledWindow - Window with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledWindowr\rr�r�)r[r9r^rcr�r�rrrr9:szScrolledWindow.__init__Nr�rrrrr�6sr�c@s0eZdZdZifdd�Zifdd�Zdd�ZdS)	�Selectz�Select - Container of button subwidgets. It can be used to provide
    radio-box or check-box style of selection options for the user.

    Subwidgets are buttons added dynamically using the add method.c
Ks2t�||ddddddg||�t|d�|jd<dS)NZ	tixSelectZ	allowzero�radior�r[r\r�r�r�rrrr9Gs
��zSelect.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�r�rcrrrr�Ns z
Select.addcCs|j�|jd|�dSr�rMr+rrrr�Ssz
Select.invokeNr�rrrrr�@sr�c@seZdZdZdifdd�ZdS)�Shellz'Toplevel window.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixShellr\�titler�r�rrrr9[szShell.__init__r�rrrrr�Vsr�c@s6eZdZdZdifdd�Zdd�Zdd�Zd	d
�ZdS)�DialogShellz�Toplevel window, with popup popdown and center methods.
    It tells the window manager that it is a dialog window and should be
    treated specially. The exact treatment depends on the treatment of
    the window manager.

    Subwidgets - NoneNcKs&t�||ddddddddg||�dS)	NZtixDialogShellr\r�ZmappedZ	minheightZminwidthr�Z	transientr�r�rrrr9gs��zDialogShell.__init__cCs|j�|jd�dSr�rMr?rrrr�nszDialogShell.popdowncCs|j�|jd�dSr�rMr?rrrr�qszDialogShell.popupcCs|j�|jd�dS)N�centerrMr?rrrr�tszDialogShell.center)r2r3r4r5r9r�r�r�rrrrr�^s
r�c@s&eZdZdZdifdd�Zdd�ZdS)�StdButtonBoxz@StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) NcKs\t�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixStdButtonBoxr�r\r��applyr��help)r[r9r�rcr�rrrr9zs
�zStdButtonBox.__init__cCs ||jkr|j�|jd|�dSr�r�r+rrrr��s
zStdButtonBox.invoke)r2r3r4r5r9r�rrrrr�wsr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zd3d
d�Z	dd�Z
dd�Zdd�Zdd�Z
ifdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zifd-d.�Zd/d0�Zd4d1d2�ZdS)5�TLista�TList - Hierarchy display widget which can be
    used to display data in a tabular format. The list entries of a TList
    widget are similar to the entries in the Tk listbox widget. The main
    differences are (1) the TList widget can display the list entries in a
    two dimensional format and (2) you can use graphical images as well as
    multiple colors and fonts for the list entries.

    Subwidgets - NoneNcKst�||ddg||�dS)NZtixTListr\r�r�rrrr9�szTList.__init__cCs|j�|jdd|�dS)N�activer�rMr�rrr�
active_set�szTList.active_setcCs|j�|jdd�dS)Nr�rrMr?rrr�active_clear�szTList.active_clearcCs|j�|jdd|�dSr�rMr�rrrr��szTList.anchor_setcCs|j�|jdd�dSr�rMr?rrrr�szTList.anchor_clearcCs|j�|jd||�dSr�rM�r�from_�torrrrz�szTList.deletecCs|j�|jdd|�dSrrMr�rrrr
�szTList.dragsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dragsite_clearcCs|j�|jdd|�dSrrMr�rrrr�szTList.dropsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dropsite_clearcKs$|jj|jd|f|�||���dSr�rC)rr�r'r(rrrr��szTList.insertcCs|j�|jdd�S)NrTr�rMr?rrr�info_active�szTList.info_activecCs|j�|jdd�Sr,rMr?rrrr-�szTList.info_anchorcCs|j�|jdd|�S)NrTZdownrMr�rrr�	info_down�szTList.info_downcCs|j�|jdd|�S)NrT�leftrMr�rrr�	info_left�szTList.info_leftcCs|j�|jdd|�S)NrT�rightrMr�rrr�
info_right�szTList.info_rightcCs|j�|jdd�}|j�|�Sr>r1r�rrrr?�szTList.info_selectioncCs|j�|jdd�S)NrTrrMr?rrr�	info_size�szTList.info_sizecCs|j�|jdd|�S)NrTZuprMr�rrr�info_up�sz
TList.info_upcCs|j�|jd||�SrKrM�rrQrRrrrrL�sz
TList.nearestcCs|j�|jd|�dSrMrMr�rrrrN�sz	TList.seecKs$|jj|jddf|�||���dSrOrCr&rrrrP�szTList.selection_clearcCs|j�|jdd|�SrQrMr�rrrrR�szTList.selection_includescCs|j�|jdd||�dSrSrMrTrrrrV�szTList.selection_set)N)N)r2r3r4r5r9r�r�r�rrzr
rrrr�r�r-r�r�r�r?r�r�rLrNrPrRrVrrrrr��s2	
r�c@sHeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dS)�Treez�Tree - The tixTree widget can be used to display hierarchical
    data in a tree form. The user can adjust
    the view of the tree by opening or closing parts of the tree.NcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixTreer\r�r�r�r�r�rrrr9�s
�z
Tree.__init__cCs|j�|jd�dS�aThis command calls the setmode method for all the entries in this
     Tree widget: if an entry has no child entries, its mode is set to
     none. Otherwise, if the entry has any hidden child entries, its mode is
     set to open; otherwise its mode is set to close.�autosetmodeNrMr?rrrr��szTree.autosetmodecCs|j�|jd|�dS�z8Close the entry given by entryPath if its mode is close.�closeNrM�r�	entrypathrrrr��sz
Tree.closecCs|j�|jd|�S�z9Returns the current mode of the entry given by entryPath.�getmoderMr�rrrr��szTree.getmodecCs|j�|jd|�dS�z6Open the entry given by entryPath if its mode is open.�openNrMr�rrrr��sz	Tree.open�nonecCs|j�|jd||�dS)a�This command is used to indicate whether the entry given by
     entryPath has children entries and whether the children are visible. mode
     must be one of open, close or none. If mode is set to open, a (+)
     indicator is drawn next the entry. If mode is set to close, a (-)
     indicator is drawn next the entry. If mode is set to none, no
     indicators will be drawn for this entry. The default mode is none. The
     open mode indicates the entry has hidden children and this entry can be
     opened by the user. The close mode indicates that all the children of the
     entry are now visible and the entry can be closed by the user.�setmodeNrM�rr��moderrrr��s
zTree.setmode)r�)
r2r3r4r5r9r�r�r�r�r�rrrrr��sr�c@sZeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dd�Z
ddd�ZdS)�	CheckListz�The CheckList widget
    displays a list of items to be selected by the user. CheckList acts
    similarly to the Tk checkbutton or radiobutton widgets, except it is
    capable of handling many more items than checkbuttons or radiobuttons.
    NcKsLt�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixCheckListr\r�r�r�r�r�r�rrrr9s
�zCheckList.__init__cCs|j�|jd�dSr�rMr?rrrr�szCheckList.autosetmodecCs|j�|jd|�dSr�rMr�rrrr�szCheckList.closecCs|j�|jd|�Sr�rMr�rrrr� szCheckList.getmodecCs|j�|jd|�dSr�rMr�rrrr�$szCheckList.open�oncCs|j�|j�|jd|��S)z�Returns a list of items whose status matches status. If status is
     not specified, the list of items in the "on" status will be returned.
     Mode can be on, off, default�getselectionrZ)rr�rrrr�(szCheckList.getselectioncCs|j�|jd|�S)z(Returns the current status of entryPath.�	getstatusrMr�rrrr�.szCheckList.getstatuscCs|j�|jd||�dS)z~Sets the status of entryPath to be status. A bitmap will be
     displayed next to the entry its status is on, off or default.�	setstatusNrMr�rrrr�2szCheckList.setstatus)r�)r�)r2r3r4r5r9r�r�r�r�r�r�r�rrrrr�s
r�c@seZdZddd�ZdS)r�rjcCst�||||�dSrF�r|r9�rrdr,r~rrrr9>sz_dummyButton.__init__N)rj�r2r3r4r9rrrrr�=sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Bsz_dummyCheckbutton.__init__N)rjr�rrrrr�Asr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Fsz_dummyEntry.__init__N)rjr�rrrrr�Esr�c@seZdZddd�ZdS)r^rjcCst�||||�dSrFr�r�rrrr9Jsz_dummyFrame.__init__N)rjr�rrrrr^Isr^c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Nsz_dummyLabel.__init__N)rjr�rrrrr�Msr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Rsz_dummyListbox.__init__N)rjr�rrrrr�Qsr�c@seZdZddd�ZdS)rwrjcCst�||||�dSrFr�r�rrrr9Vsz_dummyMenu.__init__N)rjr�rrrrrwUsrwc@seZdZddd�ZdS)rvrjcCst�||||�dSrFr�r�rrrr9Zsz_dummyMenubutton.__init__N)rjr�rrrrrvYsrvc@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9^sz_dummyScrollbar.__init__N)rjr�rrrrr�]sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9bsz_dummyText.__init__N)rjr�rrrrr�asr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�)r|r9r�rcr�r�rrrr9fsz_dummyScrolledListBox.__init__N)rjr�rrrrr�esr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9msz_dummyHList.__init__N)rjr�rrrrr�lsr�c@seZdZddd�ZdS)rarjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS�Nr�r�r��r|r9r�rcr�r�rrrr9qsz_dummyScrolledHList.__init__N)rjr�rrrrrapsrac@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9xsz_dummyTList.__init__N)rjr�rrrrr�wsr�c@seZdZddd�ZdS)r�rjcCs�t�|||d|g�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<z$t|d�|jd<t|d�|jd<Wntk
r�YnXdS)Nr�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�r�rrrr9|s�
z_dummyComboBox.__init__N)rjr�rrrrr�{sr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dSr�r�r�rrrr9�sz_dummyDirList.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs4t�||||�t|d�|jd<t|d�|jd<dS)Nr�r�)r|r9r�rcr�r�rrrr9�sz_dummyDirSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs�t�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)	Nr�r�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�rrrr9�sz_dummyExFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�r�rrrr9�s
z_dummyFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs$t�||||�t|d�|jd<dS)Nr�)r|r9r�rcr�rrrr9�sz_dummyFileComboBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�rrrr9�s
z_dummyStdButtonBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)�_dummyNoteBookFramercCst�||||�dSrFr�r�rrrr9�sz_dummyNoteBookFrame.__init__N)rr�rrrrr��sr�c@seZdZddd�ZdS)r`rjcCst�||||�dSrFr�r�rrrr9�sz_dummyPanedWindow.__init__N)rjr�rrrrr`�sr`cCs|j�d|j�S)zzReturns the qualified path name for the widget. Normally used to set
    default options for subwidgets. See tixwidgets.pyZ
tixOptionNamerM)r�rrr�
OptionName�sr�cCs:d}|��D](}|d|d|d||d}q|S)Nr=z{{z} {z - z}} )�keys)�dict�s�typerrr�FileTypeList�s&r�c@seZdZdZdS)�CObjViewaBThis file implements the Canvas Object View widget. This is a base
    class of IconView. It implements automatic placement/adjustment of the
    scrollbars according to the canvas objects inside the canvas subwidget.
    The scrollbars are adjusted so that the canvas is just large enough
    to see all the objects.
    N)r2r3r4r5rrrrr��sr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zd)dd�Zd*d
d�Z	dd�Z
dd�Zdd�Zd+dd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd,d!d"�Zd#d$�Zd%d&�Zd'd(�ZdS)-�Grida}The Tix Grid command creates a new window  and makes it into a
    tixGrid widget. Additional options, may be specified on the command
    line or in the option database to configure aspects such as its cursor
    and relief.

    A Grid widget displays its contents in a two dimensional grid of cells.
    Each cell may contain one Tix display item, which may be in text,
    graphics or other formats. See the DisplayStyle class for more information
    about Tix display items. Individual cells, or groups of cells, can be
    formatted with a wide range of attributes, such as its color, relief and
    border.

    Subwidgets - NoneNcKs"g}||_t�||d|||�dS)NZtixGrid�r'r[r9r�rrrr9�sz
Grid.__init__cCs|j�|dd�dS)zRemoves the selection anchor.r�rNrr?rrrrszGrid.anchor_clearcCs|�|j�|dd��S)z3Get the (x,y) coordinate of the current anchor cellr�r/�r/rrr?rrr�
anchor_getszGrid.anchor_getcCs|j�|dd||�dS)z/Set the selection anchor to the cell at (x, y).r�r�Nrr�rrrr�szGrid.anchor_setcCs4|dkr|j�|dd|�n|j�|dd||�dS)zdDelete rows between from_ and to inclusive.
        If to is not provided,  delete only row at from_Nrzr
rr�rrr�
delete_rowszGrid.delete_rowcCs4|dkr|j�|dd|�n|j�|dd||�dS)zjDelete columns between from_ and to inclusive.
        If to is not provided,  delete only column at from_Nrzr	rr�rrr�
delete_columnszGrid.delete_columncCs|j�|dd�dS)zUIf any cell is being edited, de-highlight the cell  and  applies
        the changes.�editr�Nrr?rrr�
edit_applyszGrid.edit_applycCs|j�|dd||�dS)zmHighlights  the  cell  at  (x, y) for editing, if the -editnotify
        command returns True for this cell.r�r�Nrr�rrr�edit_set!sz
Grid.edit_setcCs,|r|ddkrd|}|j�|d|||�S)z&Get the option value for cell at (x,y)rr!rHr)rrQrRrrrrrH&szGrid.entrycgetcKs|�d||f||�SrI)Z
_configure)rrQrRr'r(rrrrJ,szGrid.entryconfigurec	Cs|�|j�|dd||��S)z+Return True if display item exists at (x,y)rTr()Z_getbooleanrrr�rrrr72szGrid.info_existscCs|j�|dd||�Sr.rr�rrrr06szGrid.info_bboxcCs|j�|dd|||�dS)z�Moves the range of columns from position FROM through TO by
        the distance indicated by OFFSET. For example, move_column(2, 4, 1)
        moves the columns 2,3,4 to columns 3,4,5.�mover	Nr�rr�r��offsetrrr�move_column:szGrid.move_columncCs|j�|dd|||�dS)z�Moves the range of rows from position FROM through TO by
        the distance indicated by OFFSET.
        For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.r�r
Nrr�rrr�move_row@sz
Grid.move_rowcCs|�|j�|d||��S)z8Return coordinate of cell nearest pixel coordinate (x,y)rLr�r�rrrrLFszGrid.nearestcKs>|�|j|�}|dk	r"d|f|}|jj|d||f|��dS)Nz	-itemtyper�)r%r'rr)rrQrRr�r(�argsrrrr�PszGrid.setcKs*|j�|jj|jdd|f|�i|����S)a�Queries or sets the size of the column given by
        INDEX.  INDEX may be any non-negative
        integer that gives the position of a given column.
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all columns.
        When no option-value pair is given, this command returns a tuple
        containing the current size setting of the given column.  When
        option-value pairs are given, the corresponding options of the
        size setting of the given column are changed. Options may be one
        of the following:
              pad0 pixels
                     Specifies the paddings to the left of a column.
              pad1 pixels
                     Specifies the paddings to the right of a column.
              size val
                     Specifies the width of a column.  Val may be:
                     "auto" -- the width of the column is set to the
                     width of the widest cell in the column;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the width of the column to the
                     given number of characters.rr	)rrPrrDr%�rr�r(rrr�size_columnVs
�zGrid.size_columncKs(|j�|jj|dd|f|�i|����S)a�Queries or sets the size of the row given by
        INDEX. INDEX may be any non-negative
        integer that gives the position of a given row .
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all rows.
        When no option-value pair is given, this command returns a list con-
        taining the current size setting of the given row . When option-value
        pairs are given, the corresponding options of the size setting of the
        given row are changed. Options may be one of the following:
              pad0 pixels
                     Specifies the paddings to the top of a row.
              pad1 pixels
                     Specifies the paddings to the bottom of a row.
              size val
                     Specifies the height of a row.  Val may be:
                     "auto" -- the height of the row is set to the
                     height of the highest cell in the row;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the height of the row to the
                     given number of characters.rr
)rrPrr%r�rrr�size_rowps�
�z
Grid.size_rowcCs|j�|jd||�dS)z7Clears the cell at (x, y) by removing its display item.�unsetNrMr�rrrr��sz
Grid.unset)N)N)N)N)r2r3r4r5r9rr�r�r�r�r�r�rHrJr7r0r�r�rLr�r�r�r�rrrrr��s(	




r�c@seZdZdZdifdd�ZdS)�ScrolledGridzScrolled Grid widgetsNcKs"g}||_t�||d|||�dS)NZtixScrolledGridr�r�rrrr9�szScrolledGrid.__init__r�rrrrr��sr�)ur:r8rZ_tkinterZWINDOWZTEXTZSTATUSZ	IMMEDIATEZIMAGEZ	IMAGETEXTZBALLOONZAUTOZ	ACROSSTOP�ASCIIZCELLZCOLUMNZ
DECREASINGZ
INCREASINGZINTEGERZMAIN�MAXZREALZROWZS_REGIONZX_REGIONZY_REGIONZ
TCL_DONT_WAITZTCL_WINDOW_EVENTSZTCL_FILE_EVENTSZTCL_TIMER_EVENTSZTCL_IDLE_EVENTSZTCL_ALL_EVENTSrr6rAra�	__bases__r[r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZXViewZYViewr�rYrZr\r_rmrnrqrrr}r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZButtonr�ZCheckbuttonr�ZEntryr�ZFramer^ZLabelr�ZListboxr�ZMenurwZ
MenubuttonrvZ	Scrollbarr�ZTextr�r�r�rar�r�r�r�r�r�r�r�r�r`r�r�r�r�r�rrrr�<module>s�-
8/,!"C#	()


S.6

*PK�(�Z��z`,,__pycache__/dnd.cpython-38.pycnu�[���U

e5d�,�@sXdZddlZdd�ZGdd�d�ZGdd�d�ZGd	d
�d
�Zdd�Zed
krTe�dS)aFDrag-and-drop support for Tkinter.

This is very preliminary.  I currently only support dnd *within* one
application, between different windows (or within the same window).

I am trying to make this as generic as possible -- not dependent on
the use of a particular widget or icon type, etc.  I also hope that
this will work with Pmw.

To enable an object to be dragged, you must create an event binding
for it that starts the drag-and-drop process. Typically, you should
bind <ButtonPress> to a callback function that you write. The function
should call Tkdnd.dnd_start(source, event), where 'source' is the
object to be dragged, and 'event' is the event that invoked the call
(the argument to your callback function).  Even though this is a class
instantiation, the returned instance should not be stored -- it will
be kept alive automatically for the duration of the drag-and-drop.

When a drag-and-drop is already in process for the Tk interpreter, the
call is *ignored*; this normally averts starting multiple simultaneous
dnd processes, e.g. because different button callbacks all
dnd_start().

The object is *not* necessarily a widget -- it can be any
application-specific object that is meaningful to potential
drag-and-drop targets.

Potential drag-and-drop targets are discovered as follows.  Whenever
the mouse moves, and at the start and end of a drag-and-drop move, the
Tk widget directly under the mouse is inspected.  This is the target
widget (not to be confused with the target object, yet to be
determined).  If there is no target widget, there is no dnd target
object.  If there is a target widget, and it has an attribute
dnd_accept, this should be a function (or any callable object).  The
function is called as dnd_accept(source, event), where 'source' is the
object being dragged (the object passed to dnd_start() above), and
'event' is the most recent event object (generally a <Motion> event;
it can also be <ButtonPress> or <ButtonRelease>).  If the dnd_accept()
function returns something other than None, this is the new dnd target
object.  If dnd_accept() returns None, or if the target widget has no
dnd_accept attribute, the target widget's parent is considered as the
target widget, and the search for a target object is repeated from
there.  If necessary, the search is repeated all the way up to the
root widget.  If none of the target widgets can produce a target
object, there is no target object (the target object is None).

The target object thus produced, if any, is called the new target
object.  It is compared with the old target object (or None, if there
was no old target widget).  There are several cases ('source' is the
source object, and 'event' is the most recent event object):

- Both the old and new target objects are None.  Nothing happens.

- The old and new target objects are the same object.  Its method
dnd_motion(source, event) is called.

- The old target object was None, and the new target object is not
None.  The new target object's method dnd_enter(source, event) is
called.

- The new target object is None, and the old target object is not
None.  The old target object's method dnd_leave(source, event) is
called.

- The old and new target objects differ and neither is None.  The old
target object's method dnd_leave(source, event), and then the new
target object's method dnd_enter(source, event) is called.

Once this is done, the new target object replaces the old one, and the
Tk mainloop proceeds.  The return value of the methods mentioned above
is ignored; if they raise an exception, the normal exception handling
mechanisms take over.

The drag-and-drop processes can end in two ways: a final target object
is selected, or no final target object is selected.  When a final
target object is selected, it will always have been notified of the
potential drop by a call to its dnd_enter() method, as described
above, and possibly one or more calls to its dnd_motion() method; its
dnd_leave() method has not been called since the last call to
dnd_enter().  The target is notified of the drop by a call to its
method dnd_commit(source, event).

If no final target object is selected, and there was an old target
object, its dnd_leave(source, event) method is called to complete the
dnd sequence.

Finally, the source object is notified that the drag-and-drop process
is over, by a call to source.dnd_end(target, event), specifying either
the selected target object, or None if no target object was selected.
The source object can use this to implement the commit action; this is
sometimes simpler than to do it in the target's dnd_commit().  The
target's dnd_commit() method could then simply be aliased to
dnd_leave().

At any time during a dnd sequence, the application can cancel the
sequence by calling the cancel() method on the object returned by
dnd_start().  This will call dnd_leave() if a target is currently
active; it will never call dnd_commit().

�NcCst||�}|jr|SdSdS�N)�
DndHandler�root)�source�event�h�r�#/usr/lib64/python3.8/tkinter/dnd.py�	dnd_startls
r
c@sDeZdZdZdd�Zdd�Zdd�Zdd	�Zdd
d�Zdd
d�Z	dS)rNcCs�|jdkrdS|j��}z|jWdStk
rD||_||_YnX||_d|_|j|_}|j|_	}d||f|_
|dp�d|_|�|j
|j
�|�d|j�d|d<dS)N�z<B%d-ButtonRelease-%d>�cursor��<Motion>Zhand2)Znum�widgetZ_root�_DndHandler__dnd�AttributeErrorrr�targetZinitial_button�initial_widget�release_pattern�save_cursor�bind�
on_release�	on_motion)�selfrrrZbuttonrrrr	�__init__zs$

zDndHandler.__init__cCs2|j}d|_|r.z|`Wntk
r,YnXdSr)rrr�rrrrr	�__del__�szDndHandler.__del__c	Cs�|j|j}}|j�||�}|j}d}|rbz
|j}Wntk
rHYnX|||�}|rZqb|j}q&|j}||kr�|r�|�	||�n,|r�d|_|�
||�|r�|�||�||_dSr)�x_root�y_rootrZwinfo_containingr�
dnd_acceptrZmasterr�
dnd_motion�	dnd_leave�	dnd_enter)	rr�x�yZ
target_widgetr�
new_target�attrZ
old_targetrrr	r�s.

zDndHandler.on_motioncCs|�|d�dS)N���finish�rrrrr	r�szDndHandler.on_releasecCs|�|d�dS)Nrr(r*rrr	�cancel�szDndHandler.cancelrc
Cs�|j}|j}|j}|j}zf|`|j�|j�|j�d�|j|d<d|_|_|_|_|r||rp|�	||�n|�
||�W5|�||�XdS)Nrr)rrrr�dnd_endrZunbindrr�
dnd_commitr!)rrZcommitrrrrrrr	r)�s
zDndHandler.finish)N)r)
�__name__�
__module__�__qualname__rrrrrr+r)rrrr	rvs	
rc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�IconcCs||_d|_|_|_dSr)�name�canvas�label�id)rr2rrr	r�sz
Icon.__init__�
cCs�||jkr |j�|j||�dS|jr.|��|s6dStj||jddd�}|j|||dd�}||_||_||_|�	d|j
�dS)N�Zraised)�textZborderwidthZreliefZnw)ZwindowZanchorz
<ButtonPress>)r3�coordsr5�detach�tkinterZLabelr2Z
create_windowr4r�press)rr3r#r$r4r5rrr	�attach�s 

�zIcon.attachcCsB|j}|sdS|j}|j}d|_|_|_|�|�|��dSr)r3r5r4�deleteZdestroy)rr3r5r4rrr	r:�s
zIcon.detachcCs4t||�r0|j|_|j|_|j�|j�\|_|_	dSr)
r
r#�x_offr$�y_offr3r9r5�x_orig�y_origr*rrr	r<�s
z
Icon.presscCs(|�|j|�\}}|j�|j||�dSr)�wherer3r9r5)rrr#r$rrr	�move�sz	Icon.movecCs|j�|j|j|j�dSr)r3r9r5rArB)rrrr	�putback�szIcon.putbackcCs8|��}|��}|j|}|j|}||j||jfSr)Zwinfo_rootxZwinfo_rootyrrr?r@)rr3rZx_orgZy_orgr#r$rrr	rC�s


z
Icon.wherecCsdSrr)rrrrrr	r,szIcon.dnd_endN)r6r6)r.r/r0rr=r:r<rDrErCr,rrrr	r1�s


r1c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�TestercCs>t�|�|_tj|jddd�|_|jjddd�|j|j_dS)N�d)�widthZheightZbothr')Zfill�expand)r;ZToplevel�topZCanvasr3�packrrrrr	rszTester.__init__cCs|Srr�rrrrrr	rszTester.dnd_acceptcCsp|j��|�|j|�\}}|j�|j�\}}}}||||}	}
|j�||||	||
�|_|�||�dSr)r3�	focus_setrC�bboxr5Zcreate_rectangle�dndidr )rrrr#r$�x1�y1�x2�y2ZdxZdyrrr	r"s
zTester.dnd_enterc	CsF|�|j|�\}}|j�|j�\}}}}|j�|j||||�dSr)rCr3rNrOrD)	rrrr#r$rPrQrRrSrrr	r szTester.dnd_motioncCs"|j��|j�|j�d|_dSr)rJrMr3r>rOrLrrr	r!$s
zTester.dnd_leavecCs2|�||�|�|j|�\}}|�|j||�dSr)r!rCr3r=)rrrr#r$rrr	r-)szTester.dnd_commitN)	r.r/r0rrr"r r!r-rrrr	rFsrFcCs�t��}|�d�tj|jdd���t|�}|j�d�t|�}|j�d�t|�}|j�d�td�}td�}td	�}|�	|j
�|�	|j
�|�	|j
�|��dS)
Nz+1+1ZQuit)Zcommandr8z+1+60z+120+60z+240+60ZICON1ZICON2ZICON3)r;ZTkZgeometryZButton�quitrKrFrJr1r=r3Zmainloop)r�t1�t2Zt3Zi1Zi2Zi3rrr	�test/s 
rW�__main__)�__doc__r;r
rr1rFrWr.rrrr	�<module>sf
Y=#PK�(�ZD��@�*�*-__pycache__/simpledialog.cpython-38.opt-1.pycnu�[���U

e5d�-�@s�dZddlTddlmZmZGdd�d�ZGdd�de�Zdd	�ZGd
d�de�ZGdd
�d
e�Z	dd�Z
Gdd�de�Zdd�ZGdd�de�Z
dd�Zedkr�dd�Ze�dS)a&This modules handles dialog boxes.

It contains the following public symbols:

SimpleDialog -- A simple but flexible modal dialog box

Dialog -- a base class for dialogs

askinteger -- get an integer from the user

askfloat -- get a float from the user

askstring -- get a string from the user
�)�*)�
messagebox�_get_default_rootc@sLeZdZdgddddfdd�Zddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�SimpleDialog�NcCs|rt||d�|_n
t|�|_|r:|j�|�|j�|�t|j�t|j|dd�|_|jjdtd�t	|j�|_
|j
��||_||_||_
|j�d|j�tt|��D]L}||}	t|j
|	||fdd�d	�}
||kr�|
jtd
d�|
jttdd�q�|j�d
|j�|�|�dS)N)�class_i�)�textZaspect�)�expand�fill�<Return>cSs
|�|�S�N)�done��self�num�r�,/usr/lib64/python3.8/tkinter/simpledialog.py�<lambda>8�z'SimpleDialog.__init__.<locals>.<lambda>�r�command�)ZreliefZborderwidth)�siderr
�WM_DELETE_WINDOW)�Toplevel�root�titleZiconname�
_setup_dialogZMessage�message�packZBOTH�Frame�framer�cancel�default�bind�return_event�range�len�ButtonZconfigZRIDGE�LEFT�protocol�wm_delete_window�_set_transient)r�masterr�buttonsr$r#rrr�s�brrr�__init__ s2


�zSimpleDialog.__init__��?�333333�?c
Cs|j}|��|�|�|��|��rJ|��}|��}|��}|��}n|�	�}|�
�}d}}|��}	|��}
|||	|}|||
|}||	|�	�kr�|�	�|	}n|dkr�d}||
|�
�kr�|�
�|
}n|dkr�d}|�
d||f�|��dS)Nr�+%d+%d)r�withdraw�	transient�update_idletasksZwinfo_ismappedZwinfo_widthZwinfo_height�winfo_rootx�winfo_rootyZwinfo_screenwidthZwinfo_screenheightZwinfo_reqwidthZwinfo_reqheight�geometry�	deiconify)
rr.ZrelxZrelyZwidgetZm_widthZm_heightZm_xZm_yZw_widthZw_height�x�yrrrr-?s4

zSimpleDialog._set_transientcCs.|j��|j��|j��|j��|jSr
)r�wait_visibility�grab_set�mainloop�destroyr�rrrr�go\s




zSimpleDialog.gocCs&|jdkr|j��n|�|j�dSr
)r$r�bellr�rZeventrrrr&cs
zSimpleDialog.return_eventcCs&|jdkr|j��n|�|j�dSr
)r#rrErrCrrrr,is
zSimpleDialog.wm_delete_windowcCs||_|j��dSr
)rr�quitrrrrroszSimpleDialog.done)r3r4)	�__name__�
__module__�__qualname__r2r-rDr&r,rrrrrrs�

rc@sVeZdZdZddd�Zdd�Zdd�Zd	d
�Zddd�Zdd
d�Z	dd�Z
dd�ZdS)�DialogzZClass to open dialogs.

    This class is intended as a base class for custom dialogs
    NcCs�|}|std�}t�||�|��|dk	r>|��r>|�|�|rL|�|�t|�||_d|_	t
|�}|�|�|_|j
ddd�|��|js�||_|�d|j�|dk	r�|�d|��d|��df�|��|j��|��|��|�|�dS)z�Initialize a dialog.

        Arguments:

            parent -- a parent window (the application window)

            title -- the dialog title
        zcreate dialog windowN�)�padx�padyrr5�2)rrr2r6Zwinfo_viewabler7rr�parent�resultr!�body�
initial_focusr �	buttonboxr+r#r;r9r:r<�	focus_setr?r@Zwait_window)rrPrr.rRrrrr2{s8	


�
zDialog.__init__cCsd|_t�|�dS)zDestroy the windowN)rSrrBrCrrrrB�szDialog.destroycCsdS)z�create dialog body.

        return widget that should have initial focus.
        This method should be overridden, and is called
        by the __init__ method.
        Nr)rr.rrrrR�szDialog.bodycCsvt|�}t|dd|jtd�}|jtddd�t|dd|jd�}|jtddd�|�d|j�|�d	|j�|��d
S)z[add standard button box.

        override if you do not want the standard buttons
        ZOK�
)r�widthrr$rL)rrMrN�Cancel)rrWrrz<Escape>N)r!r)�okZACTIVEr r*r#r%)rZbox�wrrrrT�szDialog.buttonboxcCsB|��s|j��dS|��|��z|��W5|��XdSr
)�validaterSrUr6r8r#�applyrFrrrrY�s
z	Dialog.okcCs |jdk	r|j��|��dSr
)rPrUrBrFrrrr#�s

z
Dialog.cancelcCsdS)z�validate the data

        This method is called automatically to validate the data before the
        dialog is destroyed. By default, it always validates OK.
        r	rrCrrrr[�szDialog.validatecCsdS)z�process the data

        This method is called automatically to process the data, *after*
        the dialog is destroyed. By default, it does nothing.
        NrrCrrrr\�szDialog.apply)N)N)N)rHrIrJ�__doc__r2rBrRrTrYr#r[r\rrrrrKts
7	


	rKcCs:|jdkr |j�dd|dd�n|jdkr6|�dd�dS)	NZaquaz!::tk::unsupported::MacWindowStyleZstyleZ
moveableModalrZx11z-typeZdialog)Z_windowingsystemZtkZcallZ
wm_attributes)rZrrrrs

�
rc@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�_QueryDialogNcCs*||_||_||_||_t�|||�dSr
)�prompt�minvalue�maxvalue�initialvaluerKr2)rrr_rbr`rarPrrrr2s
z_QueryDialog.__init__cCsd|_t�|�dSr
)�entryrKrBrCrrrrBsz_QueryDialog.destroycCsrt||jtd�}|jddtd�t|dd�|_|jjddttd�|jdk	rl|j�	d|j�|j�
dt�|jS)N)rZjustifyrrL)�rowrMZstickyrc)�namer	)ZLabelr_r*Zgrid�WZEntryrc�Erb�insertZselect_rangeZEND)rr.rZrrrrR s
z_QueryDialog.bodycCs�z|��}Wn,tk
r8tjd|jd|d�YdSX|jdk	rh||jkrhtjdd|j|d�dS|jdk	r�||jkr�tjdd|j|d�dS||_d	S)
Nz
Illegal valuez
Please try again)rPrz	Too smallz2The allowed minimum value is %s. Please try again.z	Too largez2The allowed maximum value is %s. Please try again.r	)�	getresult�
ValueErrorr�showwarning�errormessager`rarQ)rrQrrrr[.s:�����z_QueryDialog.validate)NNNN)rHrIrJr2rBrRr[rrrrr^
s�

r^c@seZdZdZdd�ZdS)�
_QueryIntegerzNot an integer.cCs|�|j���Sr
)Zgetintrc�getrCrrrriSsz_QueryInteger.getresultN�rHrIrJrlrirrrrrmPsrmcKst||f|�}|jS)z�get an integer from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is an integer
    )rmrQ�rr_�kw�drrr�
askintegerWsrsc@seZdZdZdd�ZdS)�_QueryFloatzNot a floating point value.cCs|�|j���Sr
)Z	getdoublercrnrCrrrriisz_QueryFloat.getresultNrorrrrrtfsrtcKst||f|�}|jS)z�get a float from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a float
    )rtrQrprrr�askfloatmsruc@s$eZdZdd�Zdd�Zdd�ZdS)�_QueryStringcOs6d|kr|d|_|d=nd|_tj|f|�|�dS)N�show)�_QueryString__showr^r2)r�argsrqrrrr2}s

z_QueryString.__init__cCs(t�||�}|jdk	r$|j|jd�|S)N)rw)r^rRrxZ	configure)rr.rcrrrrR�s
z_QueryString.bodycCs
|j��Sr
)rcrnrCrrrri�sz_QueryString.getresultN)rHrIrJr2rRrirrrrrv|srvcKst||f|�}|jS)z�get a string from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a string
    )rvrQrprrr�	askstring�srz�__main__cCsLt�}|fdd�}t|d|d�}|��t|d|jd�}|��|��dS)NcSs^t|ddddgdddd�}t|���ttd	d
dd��ttd	d
ddd��ttd	d��dS)Nz�This is a test dialog.  Would this have been an actual dialog, the buttons below would have been glowing in soft pink light.
Do you believe this?ZYesZNorXr�zTest Dialog)rr/r$r#rZSpamz	Egg count�)rbzEgg weight
(in tons)r	�d)r`raz	Egg label)r�printrDrsrurz)rrrrrr�doit�s�

�ztest.<locals>.doitZTestrZQuit)ZTkr)r rGrA)rr��t�qrrr�test�sr�N)r]ZtkinterrrrrrKrr^rmrsrtrurvrzrHr�rrrr�<module>s V
CPK�(�Zz��YVV-__pycache__/scrolledtext.cpython-38.opt-2.pycnu�[���U

e5d�@shdgZddlmZmZmZmZmZmZddlm	Z	m
Z
mZmZGdd�de�Z
dd�Zedkrde�dS)	�ScrolledText�)�Frame�Text�	Scrollbar�Pack�Grid�Place)�RIGHT�LEFT�Y�BOTHc@seZdZddd�Zdd�ZdS)rNcKs�t|�|_t|j�|_|jjttd�|�d|jji�t	j
||jf|�|jttdd�|j
|jd<tt	���}tt���tt���Btt���B}|�|�}|D]4}|ddkr�|dkr�|d	kr�t||t|j|��q�dS)
N)�side�fillZyscrollcommandT)r
r�expandZcommandr�_ZconfigZ	configure)r�framerZvbar�packr	r�update�setr�__init__r
rZyview�vars�keysrrr�
difference�setattr�getattr)�selfZmaster�kwZ
text_meths�methods�m�r�,/usr/lib64/python3.8/tkinter/scrolledtext.pyrs
$
zScrolledText.__init__cCs
t|j�S)N)�strr)rrrr �__str__)szScrolledText.__str__)N)�__name__�
__module__�__qualname__rr"rrrr rs
cCsHddlm}tddd�}|�|t�|jttdd�|��|�	�dS)Nr)�ENDZwhite�
)ZbgZheightT)rr
r)
�tkinter.constantsr&r�insert�__doc__rrr
Z	focus_setZmainloop)r&Zstextrrr �example-sr+�__main__N)�__all__Ztkinterrrrrrrr(r	r
rrrr+r#rrrr �<module>s 
PK�(�Z\�yd3�3�)__pycache__/__init__.cpython-38.opt-1.pycnu�[���U

e5d͕�@s�dZddlZddlZddlZejZddlTddlZdZeej	�Z
eej�Zej
Z
ejZejZe�d�Ze�dej�Zdd�Zd	d
�Zdd�Zz
ejZWnek
r�YnXd
d�Zz
ejZWnek
r�YnXdydd�ZGdd�deej�ZGdd�d�Zdadadd�Z dzdd�Z!dd�Z"d{dd�Z#da$Gdd�d�Z%Gd d!�d!e%�Z&Gd"d#�d#e%�Z'Gd$d%�d%e%�Z(Gd&d'�d'e%�Z)d|d(d)�Z*e+Z,eZ-d*d+�Z.Gd,d-�d-�Z/Gd.d/�d/�Z0Gd0d1�d1�Z1Gd2d3�d3�Z2Gd4d5�d5�Z3Gd6d7�d7e/e3�Z4d}d8d9�Z5Gd:d;�d;�Z6Gd<d=�d=�Z7Gd>d?�d?�Z8Gd@dA�dAe/�Z9GdBdC�dCe9e6e7e8�Z:GdDdE�dEe9e3�Z;GdFdG�dGe:�Z<GdHdI�dIe:e1e2�Z=GdJdK�dKe:�Z>GdLdM�dMe:e1�Z?GdNdO�dOe:�Z@GdPdQ�dQe:�ZAGdRdS�dSe:e1e2�ZBGdTdU�dUe:�ZCGdVdW�dWe:�ZDGdXdY�dYe:�ZEGdZd[�d[e:�ZFGd\d]�d]e:�ZGGd^d_�d_e:�ZHGd`da�dae:e1e2�ZIGdbdc�dc�ZJGddde�deeD�ZKGdfdg�dg�ZLGdhdi�dieL�ZMGdjdk�dkeL�ZNdldm�ZOdndo�ZPGdpdq�dqe:e1�ZQGdrds�dse:�ZRGdtdu�due:�ZSdvdw�ZTeUdxk�r�eT�dS)~a8Wrapper functions for Tcl/Tk.

Tkinter provides classes which allow the display, positioning and
control of widgets. Toplevel widgets are Tk and Toplevel. Other
widgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,
Checkbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox
LabelFrame and PanedWindow.

Properties of the widgets are specified with keyword arguments.
Keyword arguments have the same name as the corresponding resource
under Tk.

Widgets are positioned with one of the geometry managers Place, Pack
or Grid. These managers can be called with methods place, pack, grid
available in every Widget.

Actions are bound to events by resources (e.g. keyword argument
command) or with the method bind.

Example (Hello, World):
import tkinter
from tkinter.constants import *
tk = tkinter.Tk()
frame = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)
frame.pack(fill=BOTH,expand=1)
label = tkinter.Label(frame, text="Hello, World")
label.pack(fill=X, expand=1)
button = tkinter.Button(frame,text="Exit",command=tk.destroy)
button.pack(side=BOTTOM)
tk.mainloop()
�N)�*�z([\\{}])z([\s])cCsd�tt|��S)�Internal function.� )�join�map�
_stringify��value�r�(/usr/lib64/python3.8/tkinter/__init__.py�_join8sr
cCs�t|ttf�rHt|�dkr:t|d�}t�|�rFd|}q�dt|�}ntt|�}|sZd}nbt�|�r�t�	d|�}|�
dd�}t�	d|�}|ddkr�d	|}n|ddks�t�|�r�d|}|S)
rrrz{%s}z{}z\\\1�
z\n�"�\)�
isinstance�list�tuple�lenr�	_magic_re�searchr
�str�sub�replace�	_space_rer	rrrr=s$



rcCs@d}|D]2}t|ttf�r(|t|�}q|dk	r||f}q|S)rrN)rrr�_flatten)�seq�res�itemrrrrVsrcCs�t|t�r|St|td�tf�r$|Si}t|�D]^}z|�|�Wq0ttfk
r�}z(td|�|�	�D]\}}|||<qjW5d}~XYq0Xq0|SdS)rNz_cnfmerge: fallback due to:)
r�dict�typerr�update�AttributeError�	TypeError�print�items)Zcnfs�cnf�c�msg�k�vrrr�	_cnfmergees

r+Tc	Csz|�|�}t|�drtd��t|�}i}t||�D]@\}}t|�}|r`|ddkr`|dd�}|rl||�}|||<q4|S)aReturn a properly formatted dict built from Tcl list pairs.

    If cut_minus is True, the supposed '-' prefix will be removed from
    keys. If conv is specified, it is used to convert values.

    Tcl list is expected to contain an even number of elements.
    �zNTcl list representing a dict is expected to contain an even number of elementsr�-rN)�	splitlistr�RuntimeError�iter�zipr)	�tkr*Z	cut_minus�conv�t�itr�keyr
rrr�
_splitdict{s

r7c@s�eZdZdZeZdZdZeZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)e*j+Z+d&S)'�	EventType�2�3�4�5�6�7�8�9Z10Z11Z12Z13Z14Z15Z16Z17Z18Z19Z20Z21Z22Z23Z24Z25Z26Z27Z28Z29Z30Z31Z32Z33Z34Z35Z36Z37Z38N),�__name__�
__module__�__qualname__ZKeyPressZKeyZ
KeyReleaseZButtonPress�ButtonZ
ButtonReleaseZMotionZEnterZLeaveZFocusInZFocusOutZKeymapZExposeZGraphicsExposeZNoExposeZ
VisibilityZCreateZDestroyZUnmapZMapZ
MapRequestZReparentZ	ConfigureZConfigureRequestZGravityZ
ResizeRequestZ	CirculateZCirculateRequestZPropertyZSelectionClearZSelectionRequestZ	SelectionZColormapZ
ClientMessage�MappingZVirtualEventZActivateZ
DeactivateZ
MouseWheelr�__str__rrrrr8�sPr8c@seZdZdZdd�ZdS)�Eventa�Container for the properties of an event.

    Instances of this type are generated if one of the following events occurs:

    KeyPress, KeyRelease - for keyboard events
    ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events
    Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate,
    Colormap, Gravity, Reparent, Property, Destroy, Activate,
    Deactivate - for window events.

    If a callback function for one of these events is registered
    using bind, bind_all, bind_class, or tag_bind, the callback is
    called with an Event as first argument. It will have the
    following attributes (in braces are the event types for which
    the attribute is valid):

        serial - serial number of event
    num - mouse button pressed (ButtonPress, ButtonRelease)
    focus - whether the window has the focus (Enter, Leave)
    height - height of the exposed window (Configure, Expose)
    width - width of the exposed window (Configure, Expose)
    keycode - keycode of the pressed key (KeyPress, KeyRelease)
    state - state of the event as a number (ButtonPress, ButtonRelease,
                            Enter, KeyPress, KeyRelease,
                            Leave, Motion)
    state - state as a string (Visibility)
    time - when the event occurred
    x - x-position of the mouse
    y - y-position of the mouse
    x_root - x-position of the mouse on the screen
             (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    y_root - y-position of the mouse on the screen
             (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    char - pressed character (KeyPress, KeyRelease)
    send_event - see X/Windows documentation
    keysym - keysym of the event as a string (KeyPress, KeyRelease)
    keysym_num - keysym of the event as a number (KeyPress, KeyRelease)
    type - type of the event as a number
    widget - widget in which the event occurred
    delta - delta of wheel movement (MouseWheel)
    csdd�|j��D��|js"�d=n|jdkr:t|j��d<t|dd�sL�d=|jdkr^�d=n|t|jt�r�|j}d	}g}t|�D]\}}|d
|>@r�|�	|�q�|d
t
|�>d
@}|s�|s�|�	t|��d�|��d<|j
dkr�d=d
}dt|jd|j�d��fdd�|D��fS)NcSsi|]\}}|dkr||�qS)�??r��.0r)r*rrr�
<dictcomp>�sz"Event.__repr__.<locals>.<dictcomp>�charrH�
send_eventTr�state)
ZShiftZLockZControlZMod1ZMod2ZMod3ZMod4ZMod5ZButton1ZButton2ZButton3ZButton4ZButton5r�|�delta)rMrN�keysym�keycoderL�numrP�focus�x�y�width�heightz<%s event%s>�name�c3s&|]}|�krd|�|fVqdS)z %s=%sNr)rJr)��attrsrr�	<genexpr>
sz!Event.__repr__.<locals>.<genexpr>)�__dict__r%rL�repr�getattrrNr�int�	enumerate�appendr�hexrrPr )�selfrNZmods�s�i�n�keysrr[r�__repr__�s6


�zEvent.__repr__N)rArBrC�__doc__rjrrrrrG�s*rGcCsdadabdS)z�Inhibit setting of default root window.

    Call this function to inhibit that the first instance of
    Tk is used for windows without an explicit parent window.
    FN)�_support_default_root�
_default_rootrrrr�
NoDefaultRootsrncCs.tstd��ts*|r$td|�d���t�}tS)NzINo master specified and tkinter is configured to not support default rootz
Too early to z: no default root window)rlr/rm�Tk)�what�rootrrr�_get_default_root#srrcCsdS�rNr)�errrrr�_tkerror/srucCs.zt|�}Wntk
r YnXt|��dS)zBInternal function. Calling it will raise the exception SystemExit.N)ra�
ValueError�
SystemExit)�coderrr�_exit4s
ryc@s�eZdZdZdZdZdZddd�Zdd�Zdd	�Z	d
d�Z
e
Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�ZeZdd�Zdd�Zdd�ZdS)�Variablez�Class to define value holders for e.g. buttons.

    Subclasses StringVar, IntVar, DoubleVar, BooleanVar are specializations
    that constrain the type of the value returned from get().rZNcCs�|dk	rt|t�std��|s&td�}|��|_|j|_|rD||_ndtt	�|_t	d7a	|dk	rn|�
|�n&|j�|j�dd|j��s�|�
|j
�dS)a.Construct a variable

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to "")
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nzname must be a stringzcreate variable�PY_VARr�info�exists)rrr#rr�_rootr2�_tk�_namer_�_varnum�
initialize�
getboolean�call�_default�re�masterr
rYrrr�__init__Is

zVariable.__init__cCsb|jdkrdS|j�|j�dd|j��r6|j�|j�|jdk	r^|jD]}|j�|�qFd|_dS)zUnset the variable in Tcl.Nr|r})rr�r�r�Zglobalunsetvar�_tclCommands�
deletecommand�rerYrrr�__del__gs


zVariable.__del__cCs|jS)z'Return the name of the variable in Tcl.)r��rerrrrFsszVariable.__str__cCs|j�|j|�S�zSet the variable to VALUE.)r�globalsetvarr��rer
rrr�setwszVariable.setcCs|j�|j�S)zReturn value of variable.)r�globalgetvarr�r�rrr�get}szVariable.getcCs�t|d|j�j}tt|��}z
|j}Wntk
r:YnXz||j}Wntk
r^YnX|j�	||�|j
dkr~g|_
|j
�|�|S�N)�CallWrapperr~�__call__r_�id�__func__r"rAr�
createcommandr�rc)re�callback�f�cbnamerrr�	_register�s

zVariable._registercCs(|�|�}|j�ddd|j||f�|S)a#Define a trace callback for the variable.

        Mode is one of "read", "write", "unset", or a list or tuple of
        such strings.
        Callback must be a function which is called when the variable is
        read, written or unset.

        Return the name of the callback.
        �trace�add�variable�r�rr�r��re�moder�r�rrr�	trace_add�s

�zVariable.trace_addcCsx|j�ddd|j||�|��D] \}}|j�|�d|kr qtq |j�|�z|j�|�Wntk
rrYnXdS)aDelete the trace callback for a variable.

        Mode is one of "read", "write", "unset" or a list or tuple of
        such strings.  Must be same as were specified in trace_add().
        cbname is the name of the callback returned from trace_add().
        r��remover�rN)	rr�r��
trace_infor.r�r�r�rv�rer�r��mZcarrr�trace_remove�s�zVariable.trace_removec
s4|jj��fdd�t��|j�ddd|j���D�S)z&Return all trace callback information.csg|]\}}�|�|f�qSrrrI�r.rr�
<listcomp>�sz'Variable.trace_info.<locals>.<listcomp>r�r|r�)rr.rr�r�r�rr�rr��s�zVariable.trace_infocCs$|�|�}|j�dd|j||�|S)a�Define a trace callback for the variable.

        MODE is one of "r", "w", "u" for read, write, undefine.
        CALLBACK must be a function which is called when
        the variable is read, written or undefined.

        Return the name of the callback.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_add() instead.
        r�r�r�r�rrr�trace_variable�s
zVariable.trace_variablecCs�|j�dd|j||�|j�|�d}|��D] \}}|j�|�d|kr.q�q.|j�|�z|j�|�Wntk
r�YnXdS)aSDelete the trace callback for a variable.

        MODE is one of "r", "w", "u" for read, write, undefine.
        CBNAME is the name of the callback returned from trace_variable or trace.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_remove() instead.
        r�ZvdeleterN)	rr�r�r.r�r�r�r�rvr�rrr�
trace_vdelete�s
zVariable.trace_vdeletecs(�fdd��j��j�dd�j��D�S)z�Return all trace callback information.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_info() instead.
        csg|]}�j�|��qSr)rr.�rJrUr�rrr��sz(Variable.trace_vinfo.<locals>.<listcomp>r�Zvinfo)rr.r�r�r�rr�r�trace_vinfo�s�zVariable.trace_vinfocCs6t|t�stS|j|jko4|jj|jjko4|j|jkSr�)rrz�NotImplementedr��	__class__rAr)re�otherrrr�__eq__�s
�
�zVariable.__eq__)NNN)rArBrCrkr�rr�r�r�rFr�r�r�r�r�r�r�r�r�r�r�r�rrrrrz@s&

rzc@s&eZdZdZdZddd�Zdd�ZdS)	�	StringVarz#Value holder for strings variables.rZNcCst�||||�dS)a6Construct a string variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to "")
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        N�rzr�r�rrrr��s
zStringVar.__init__cCs$|j�|j�}t|t�r|St|�S)z#Return value of variable as string.)rr�r�rrr�rrrr�s
z
StringVar.get)NNN�rArBrCrkr�r�r�rrrrr��s
r�c@s&eZdZdZdZddd�Zdd�ZdS)	�IntVarz#Value holder for integer variables.rNcCst�||||�dS)a7Construct an integer variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to 0)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nr�r�rrrr�s
zIntVar.__init__c	CsJ|j�|j�}z|j�|�WSttfk
rDt|j�|��YSXdS)z/Return the value of the variable as an integer.N)rr�r��getintr#�TclErrorra�	getdoubler�rrrr�s
z
IntVar.get)NNNr�rrrrr�
s
r�c@s&eZdZdZdZddd�Zdd�ZdS)	�	DoubleVarz!Value holder for float variables.gNcCst�||||�dS)a6Construct a float variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to 0.0)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nr�r�rrrr�*s
zDoubleVar.__init__cCs|j�|j�|j��S)z,Return the value of the variable as a float.)rr�r�r�r�rrrr�6sz
DoubleVar.get)NNNr�rrrrr�&s
r�c@s2eZdZdZdZd
dd�Zdd�ZeZdd	�ZdS)�
BooleanVarz#Value holder for boolean variables.FNcCst�||||�dS)a:Construct a boolean variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to False)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nr�r�rrrr�?s
zBooleanVar.__init__cCs|j�|j|j�|��Sr�)rr�r�r�r�rrrr�KszBooleanVar.setcCs:z|j�|j�|j��WStk
r4td��YnXdS)z+Return the value of the variable as a bool.� invalid literal for getboolean()N)rr�r�r�r�rvr�rrrr�QszBooleanVar.get)NNN)	rArBrCrkr�r�r�r�r�rrrrr�;s
r�cCstd�j�|�dS)zRun the main loop of Tcl.zrun the main loopN)rrr2�mainloop)rhrrrr�Ysr�cCs4ztd�j�|�WStk
r.td��YnXdS)z$Convert Tcl object to True or False.zuse getboolean()r�N)rrr2r�r�rv�rfrrrr�csr�c@s�eZdZdZdZdZdd�Zdd�Z�d1dd�Zd	d
�Z	dd�Z
�d2dd�ZeZ�d3dd�Z
�d4dd�Z�d5dd�Z�d6dd�Zdd�Zdd�Zdd�Zdd �ZeZd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z�d7d/d0�Zd1d2�Zd3d4�Z�d8d6d7�Z d8d9�Z!d:d;�Z"d<d=�Z#d>d?�Z$d@dA�Z%dBdC�Z&dDdE�Z'dFdG�Z(�d9dHdI�Z)dJdK�Z*dLdM�Z+�d:dNdO�Z,dPdQ�Z-dRdS�Z.dTdU�Z/dVdW�Z0dXdY�Z1dZd[�Z2�d;d\d]�Z3�d<d^d_�Z4e4Z5�d=d`da�Z6�d>dbdc�Z7ddde�Z8dfdg�Z9dhdi�Z:djdk�Z;�d?dldm�Z<dndo�Z=dpdq�Z>drds�Z?dtdu�Z@dvdw�ZAdxdy�ZB�d@dzd{�ZCd|d}�ZDd~d�ZEd�d��ZFd�d��ZG�dAd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^�dBd�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��Zed�d„Zfd�dĄZgd�dƄZhd�dȄZid�dʄZj�dCd�d̄Zk�dDd�dτZl�dEd�dфZm�dFd�dӄZn�dGd�dՄZod�dׄZp�dHd�dلZqd�dۄZr�dId�d݄Zsd�d߄Ztd�d�Zud�d�Zvd�d�Zwd�d�Zxeyd�d��Zz�dJd�d�Z{d�d�Z|e|Z}�dKd�d�Z~e~Zd�d�Z�d�Z�d�e��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��dLd�d��Z�e�Z��d�d�Z�e�Z��d�d�Z��d�d�Z��d�d�Z��d�d	�Z��d
gZ�e�f�d�d�Z�e�Z��d
�d�Z�e�Z��d�d�Z��dM�d�d�Z�e�Z��dN�d�d�Z�e�Z��d�d�Z��d�d�Z�if�d�d�Z�e�Z��d�d�Z�e�f�d�d�Z�if�d�d �Z�e�Z��d!�d"�Z�e�Z��dO�d#�d$�Z��d%�d&�Z��d'�d(�Z��d)�d*�Z��dP�d+�d,�Z��d-�d.�Z��d/�d0�Z�dS(Q�MisczRInternal class.

    Base class which defines methods common for interior widgets.NcCs,|jdk	r(|jD]}|j�|�qd|_dS)zkInternal function.

        Delete all Tcl commands created for
        this widget in the Tcl interpreter.N)r�r2r�r�rrr�destroyxs

zMisc.destroycCs6|j�|�z|j�|�Wntk
r0YnXdS)zDInternal function.

        Delete the Tcl command provided in NAME.N)r2r�r�r�rvr�rrrr��s
zMisc.deletecommandcCs|j�|j�dd|��S)z�Set Tcl internal variable, whether the look and feel
        should adhere to Motif.

        A parameter of 1 means adhere to Motif (e.g. no color
        change if mouse passes over slider).
        Returns the set value.r��tk_strictMotif)r2r�r��re�booleanrrrr��s
�zMisc.tk_strictMotifcCs|j�d�dS)zDChange the color scheme to light brown as used in Tk 3.6 and before.�	tk_bisqueN�r2r�r�rrrr��szMisc.tk_bisquecOs(|j�dt|�tt|�����dS)aSet a new color scheme for all widget elements.

        A single color as argument will cause that all colors of Tk
        widget elements are derived from this.
        Alternatively several keyword parameters and its associated
        colors can be given. The following keywords are valid:
        activeBackground, foreground, selectColor,
        activeForeground, highlightBackground, selectBackground,
        background, highlightColor, selectForeground,
        disabledForeground, insertBackground, troughColor.)�
tk_setPaletteN)r2r�rrr%�re�args�kwrrrr��s
��zMisc.tk_setPaletter{cCs|j�dd|�dS)z�Wait until the variable is modified.

        A parameter of type IntVar, StringVar, DoubleVar or
        BooleanVar must be given.�tkwaitr�Nr�r�rrr�
wait_variable�szMisc.wait_variablecCs"|dkr|}|j�dd|j�dS)zQWait until a WIDGET is destroyed.

        If no parameter is given self is used.Nr��window�r2r��_w�rer�rrr�wait_window�szMisc.wait_windowcCs"|dkr|}|j�dd|j�dS)zxWait until the visibility of a WIDGET changes
        (e.g. it appears).

        If no parameter is given self is used.Nr�Z
visibilityr�r�rrr�wait_visibility�szMisc.wait_visibility�1cCs|j�||�dS)zSet Tcl variable NAME to VALUE.N)r2�setvar)rerYr
rrrr��szMisc.setvarcCs|j�|�S)z"Return value of Tcl variable NAME.)r2�getvarr�rrrr��szMisc.getvarc
CsBz|j�|�WStk
r<}ztt|���W5d}~XYnXdSr�)r2r�r�rvr�rerf�excrrrr��szMisc.getintc
CsBz|j�|�WStk
r<}ztt|���W5d}~XYnXdSr�)r2r�r�rvrr�rrrr��szMisc.getdoublecCs0z|j�|�WStk
r*td��YnXdS)zPReturn a boolean value for Tcl boolean values true and false given as parameter.r�N)r2r�r�rv)rerfrrrr��szMisc.getbooleancCs|j�d|j�dS)z�Direct input focus to this widget.

        If the application currently does not have the focus
        this widget will get the focus if the application gets
        the focus through the window manager.rTNr�r�rrr�	focus_set�szMisc.focus_setcCs|j�dd|j�dS)ztDirect input focus to this widget even if the
        application does not have the focus. Use with
        caution!rTz-forceNr�r�rrr�focus_force�szMisc.focus_forcecCs&|j�d�}|dks|sdS|�|�S)z�Return the widget which has currently the focus in the
        application.

        Use focus_displayof to allow working with several
        displays. Return None if application does not have
        the focus.rT�noneN)r2r��
_nametowidgetr�rrr�	focus_get�szMisc.focus_getcCs,|j�dd|j�}|dks|s"dS|�|�S)z�Return the widget which has currently the focus on the
        display where this widget is located.

        Return None if the application does not have the focus.rT�
-displayofr�N�r2r�r�r�r�rrr�focus_displayof�szMisc.focus_displayofcCs,|j�dd|j�}|dks|s"dS|�|�S)zyReturn the widget which would have the focus if top level
        for this widget gets the focus from the window manager.rTz-lastforr�Nr�r�rrr�
focus_lastforszMisc.focus_lastforcCs|j�d�dS)zXThe widget under mouse will get automatically focus. Can not
        be disabled easily.�tk_focusFollowsMouseNr�r�rrrr�szMisc.tk_focusFollowsMousecCs"|j�d|j�}|sdS|�|�S)anReturn the next widget in the focus order which follows
        widget which has currently the focus.

        The focus order first goes to the next child, then to
        the children of the child recursively and then to the
        next sibling which is higher in the stacking order.  A
        widget is omitted if it has the takefocus resource set
        to 0.�tk_focusNextNr�r�rrrr�
s	zMisc.tk_focusNextcCs"|j�d|j�}|sdS|�|�S)zHReturn previous widget in the focus order. See tk_focusNext for details.�tk_focusPrevNr�r�rrrr�szMisc.tk_focusPrevcsN�s�j�d|�dS����fdd�}�j|_��|���j�d|��SdS)aCall function once after given time.

        MS specifies the time in milliseconds. FUNC gives the
        function which shall be called. Additional parameters
        are given as parameters to the function call.  Return
        identifier to cancel scheduling with after_cancel.�afterNcs8z���W5z����Wntk
r0YnXXdSr�)r�r�r�r��funcrYrerr�callit,szMisc.after.<locals>.callit)r2r�rAr�)reZmsr�r�r�rr�rr� s
z
Misc.aftercGs|jd|f|��S)z�Call FUNC once if the Tcl main loop has no event to
        process.

        Return an identifier to cancel the scheduling with
        after_cancel.Zidle)r�)rer�r�rrr�
after_idle8szMisc.after_idlecCsd|std��z.|j�dd|�}|j�|�d}|�|�Wntk
rNYnX|j�dd|�dS)z�Cancel scheduling of function identified with ID.

        Identifier returned by after or after_idle must be
        given as first parameter.
        z?id must be a valid identifier returned from after or after_idler�r|rZcancelN)rvr2r�r.r�r�)rer��dataZscriptrrr�after_cancel@szMisc.after_cancelrcCs|j�d|�|��dS)zRing a display's bell.)�bellN)r2r��
_displayof�re�	displayofrrrr�Qsz	Misc.bellcKsdd|krN|jdkrNz d|d<|j�d|�|��WStk
rL|d=YnX|j�d|�|��S)a�Retrieve data from the clipboard on window's display.

        The window keyword defaults to the root window of the Tkinter
        application.

        The type keyword specifies the form in which the data is
        to be returned and should be an atom name such as STRING
        or FILE_NAME.  Type defaults to STRING, except on X11, where the default
        is to try UTF8_STRING and fall back to STRING.

        This command is equivalent to:

        selection_get(CLIPBOARD)
        r �x11�UTF8_STRING)�	clipboardr�)�_windowingsystemr2r��_optionsr��rer�rrr�
clipboard_getVszMisc.clipboard_getcKs,d|kr|j|d<|j�d|�|��dS)z�Clear the data in the Tk clipboard.

        A widget specified for the optional displayof keyword
        argument specifies the target display.r�)r��clearN�r�r2r�r�r�rrr�clipboard_clearms
zMisc.clipboard_clearcKs4d|kr|j|d<|j�d|�|�d|f�dS)z�Append STRING to the Tk clipboard.

        A widget specified at the optional displayof keyword
        argument specifies the target display. The clipboard
        can be retrieved with selection_get.r�)r�rc�--Nr�)re�stringr�rrr�clipboard_appendus

�zMisc.clipboard_appendcCs$|j�dd|j�}|sdS|�|�S)zOReturn widget which has currently the grab in this application
        or None.�grabZcurrentNr�r�rrr�grab_current�szMisc.grab_currentcCs|j�dd|j�dS)z.Release grab for this widget if currently set.r��releaseNr�r�rrr�grab_release�szMisc.grab_releasecCs|j�dd|j�dS)zwSet grab for this widget.

        A grab directs all events to this and descendant
        widgets in the application.r�r�Nr�r�rrr�grab_set�sz
Misc.grab_setcCs|j�ddd|j�dS)z�Set global grab for this widget.

        A global grab directs all events to this and
        descendant widgets on the display. Use with caution -
        other applications do not get events anymore.r�r�z-globalNr�r�rrr�grab_set_global�szMisc.grab_set_globalcCs"|j�dd|j�}|dkrd}|S)zYReturn None, "local" or "global" if this widget has
        no, a local or a global grab.r��statusr�Nr�)rerrrr�grab_status�szMisc.grab_statuscCs|j�dd|||�dS)z�Set a VALUE (second parameter) for an option
        PATTERN (first parameter).

        An optional third parameter gives the numeric priority
        (defaults to 80).�optionr�Nr�)re�patternr
�priorityrrr�
option_add�szMisc.option_addcCs|j�dd�dS)zPClear the option database.

        It will be reloaded if option_add is called.rr�Nr�r�rrr�option_clear�szMisc.option_clearcCs|j�dd|j||�S)z�Return the value for an option NAME for this widget
        with CLASSNAME.

        Values with higher priority override lower values.rr�r�)rerY�	classNamerrr�
option_get�szMisc.option_getcCs|j�dd||�dS)zvRead file FILENAME into the option database.

        An optional second parameter gives the numeric
        priority.rZreadfileNr�)reZfileNamerrrr�option_readfile�szMisc.option_readfilecKs,d|kr|j|d<|j�d|�|��dS)zClear the current X selection.r�)�	selectionr�Nr�r�rrr�selection_clear�s
zMisc.selection_clearcKsvd|kr|j|d<d|kr`|jdkr`z d|d<|j�d|�|��WStk
r^|d=YnX|j�d|�|��S)a�Return the contents of the current X selection.

        A keyword parameter selection specifies the name of
        the selection and defaults to PRIMARY.  A keyword
        parameter displayof specifies a widget on the display
        to use. A keyword parameter type specifies the form of data to be
        fetched, defaulting to STRING except on X11, where UTF8_STRING is tried
        before STRING.r�r r�r�)rr�)r�r�r2r�r�r�r�rrr�
selection_get�s	
zMisc.selection_getcKs.|�|�}|j�d|�|�|j|f�dS)aSpecify a function COMMAND to call if the X
        selection owned by this widget is queried by another
        application.

        This function must return the contents of the
        selection. The function will be called with the
        arguments OFFSET and LENGTH which allows the chunking
        of very long selections. The following keyword
        parameters can be provided:
        selection - name of the selection (default PRIMARY),
        type - type of the selection (e.g. STRING, FILE_NAME).)rZhandleN)r�r2r�r�r�)re�commandr�rYrrr�selection_handle�s
�zMisc.selection_handlecKs"|j�d|�|�|jf�dS)z�Become owner of X selection.

        A keyword parameter selection specifies the name of
        the selection (default PRIMARY).�rZownN)r2r�r�r�r�rrr�
selection_own�s
��zMisc.selection_owncKs:d|kr|j|d<|j�d|�|��}|s0dS|�|�S)z�Return owner of X selection.

        The following keyword parameter can
        be provided:
        selection - name of the selection (default PRIMARY),
        type - type of the selection (e.g. STRING, FILE_NAME).r�rN)r�r2r�r�r�)rer�rYrrr�selection_own_get�s
zMisc.selection_own_getcGs|j�d||f|�S)zDSend Tcl command CMD to different interpreter INTERP to be executed.�sendr�)reZinterp�cmdr�rrrr�sz	Misc.sendcCs|j�d|j|�dS)z(Lower this widget in the stacking order.�lowerNr�)re�	belowThisrrrr�sz
Misc.lowercCs|j�d|j|�dS)z(Raise this widget in the stacking order.�raiseNr�)re�	aboveThisrrr�tkraiseszMisc.tkraisecCs(d|�|�|f}|j�|j�|��S)z*Return integer which represents atom NAME.)�winfoZatom)r�r2r�r�)rerYr�r�rrr�
winfo_atomszMisc.winfo_atomcCs d|�|�|f}|j�|�S)z'Return name of atom with identifier ID.)rZatomname�r�r2r��rer�r�r�rrr�winfo_atomnames��zMisc.winfo_atomnamecCs|j�|j�dd|j��S)z7Return number of cells in the colormap for this widget.rZcells�r2r�r�r�r�rrr�winfo_cellss�zMisc.winfo_cellsc	CsRg}|j�|j�dd|j��D].}z|�|�|��Wqtk
rJYqXq|S)z?Return a list of all widgets which are children of this widget.r�children)r2r.r�r�rcr��KeyError)re�result�childrrr�winfo_childrens�zMisc.winfo_childrencCs|j�dd|j�S)z(Return window class name of this widget.r�classr�r�rrr�winfo_class#szMisc.winfo_classcCs|j�|j�dd|j��S)z?Return True if at the last color request the colormap was full.rZcolormapfull�r2r�r�r�r�rrr�winfo_colormapfull's�zMisc.winfo_colormapfullcCs4d|�|�||f}|j�|�}|s*dS|�|�S)z@Return the widget which is at the root coordinates ROOTX, ROOTY.)rZ
containingN)r�r2r�r�)reZrootXZrootYr�r�rYrrr�winfo_containing,s��zMisc.winfo_containingcCs|j�|j�dd|j��S)z$Return the number of bits per pixel.rZdepthr r�rrr�winfo_depth4szMisc.winfo_depthcCs|j�|j�dd|j��S)z"Return true if this widget exists.rr}r r�rrr�winfo_exists8s�zMisc.winfo_existscCs|j�|j�dd|j|��S)zWReturn the number of pixels for the given distance NUMBER
        (e.g. "3c") as float.rZfpixels�r2r�r�r��re�numberrrr�
winfo_fpixels=s�zMisc.winfo_fpixelscCs|j�dd|j�S)zFReturn geometry string for this widget in the form "widthxheight+X+Y".r�geometryr�r�rrr�winfo_geometryCszMisc.winfo_geometrycCs|j�|j�dd|j��S)zReturn height of this widget.rrXr r�rrr�winfo_heightGs�zMisc.winfo_heightcCst|j�dd|j�d�S)z%Return identifier ID for this widget.rr�r)rar2r�r�r�rrr�winfo_idLsz
Misc.winfo_idcCs"d|�|�}|j�|j�|��S)z9Return the name of all Tcl interpreters for this display.)rZinterps)r�r2r.r�)rer�r�rrr�
winfo_interpsPszMisc.winfo_interpscCs|j�|j�dd|j��S)z%Return true if this widget is mapped.rZismappedr r�rrr�winfo_ismappedUs�zMisc.winfo_ismappedcCs|j�dd|j�S)z/Return the window manager name for this widget.rZmanagerr�r�rrr�
winfo_managerZszMisc.winfo_managercCs|j�dd|j�S)zReturn the name of this widget.rrYr�r�rrr�
winfo_name^szMisc.winfo_namecCs|j�dd|j�S)z-Return the name of the parent of this widget.r�parentr�r�rrr�winfo_parentbszMisc.winfo_parentcCs d|�|�|f}|j�|�S)z.Return the pathname of the widget given by ID.)r�pathnamerrrrr�winfo_pathnamefs��zMisc.winfo_pathnamecCs|j�|j�dd|j|��S)z'Rounded integer value of winfo_fpixels.rZpixelsr r/rrr�winfo_pixelsls�zMisc.winfo_pixelscCs|j�|j�dd|j��S)z:Return the x coordinate of the pointer on the root window.rZpointerxr r�rrr�winfo_pointerxqs�zMisc.winfo_pointerxcCs|�|j�dd|j��S)zHReturn a tuple of x and y coordinates of the pointer on the root window.rZ	pointerxy��_getintsr2r�r�r�rrr�winfo_pointerxyvs�zMisc.winfo_pointerxycCs|j�|j�dd|j��S)z:Return the y coordinate of the pointer on the root window.rZpointeryr r�rrr�winfo_pointery{s�zMisc.winfo_pointerycCs|j�|j�dd|j��S)z'Return requested height of this widget.rZ	reqheightr r�rrr�winfo_reqheight�s�zMisc.winfo_reqheightcCs|j�|j�dd|j��S)z&Return requested width of this widget.rZreqwidthr r�rrr�winfo_reqwidth�s�zMisc.winfo_reqwidthcCs|�|j�dd|j|��S)zNReturn a tuple of integer RGB values in range(65536) for color in this widget.rZrgbr@)reZcolorrrr�	winfo_rgb�s�zMisc.winfo_rgbcCs|j�|j�dd|j��S)zSReturn x coordinate of upper left corner of this widget on the
        root window.rZrootxr r�rrr�winfo_rootx�s�zMisc.winfo_rootxcCs|j�|j�dd|j��S)zSReturn y coordinate of upper left corner of this widget on the
        root window.rZrootyr r�rrr�winfo_rooty�s�zMisc.winfo_rootycCs|j�dd|j�S)z&Return the screen name of this widget.r�screenr�r�rrr�winfo_screen�szMisc.winfo_screencCs|j�|j�dd|j��S)zTReturn the number of the cells in the colormap of the screen
        of this widget.rZscreencellsr r�rrr�winfo_screencells�s�zMisc.winfo_screencellscCs|j�|j�dd|j��S)z\Return the number of bits per pixel of the root window of the
        screen of this widget.rZscreendepthr r�rrr�winfo_screendepth�s�zMisc.winfo_screendepthcCs|j�|j�dd|j��S)zXReturn the number of pixels of the height of the screen of this widget
        in pixel.rZscreenheightr r�rrr�winfo_screenheight�s�zMisc.winfo_screenheightcCs|j�|j�dd|j��S)zUReturn the number of pixels of the height of the screen of
        this widget in mm.rZscreenmmheightr r�rrr�winfo_screenmmheight�s�zMisc.winfo_screenmmheightcCs|j�|j�dd|j��S)zTReturn the number of pixels of the width of the screen of
        this widget in mm.rZ
screenmmwidthr r�rrr�winfo_screenmmwidth�s�zMisc.winfo_screenmmwidthcCs|j�dd|j�S)z�Return one of the strings directcolor, grayscale, pseudocolor,
        staticcolor, staticgray, or truecolor for the default
        colormodel of this screen.rZscreenvisualr�r�rrr�winfo_screenvisual�szMisc.winfo_screenvisualcCs|j�|j�dd|j��S)zWReturn the number of pixels of the width of the screen of
        this widget in pixel.rZscreenwidthr r�rrr�winfo_screenwidth�s�zMisc.winfo_screenwidthcCs|j�dd|j�S)zxReturn information of the X-Server of the screen of this widget in
        the form "XmajorRminor vendor vendorVersion".rZserverr�r�rrr�winfo_server�szMisc.winfo_servercCs|�|j�dd|j��S)z*Return the toplevel widget of this widget.r�toplevel)r�r2r�r�r�rrr�winfo_toplevel�s

�zMisc.winfo_toplevelcCs|j�|j�dd|j��S)zBReturn true if the widget and all its higher ancestors are mapped.rZviewabler r�rrr�winfo_viewable�s�zMisc.winfo_viewablecCs|j�dd|j�S)z�Return one of the strings directcolor, grayscale, pseudocolor,
        staticcolor, staticgray, or truecolor for the
        colormodel of this widget.r�visualr�r�rrr�winfo_visual�szMisc.winfo_visualcCs|j�dd|j�S)z7Return the X identifier for the visual for this widget.rZvisualidr�r�rrr�winfo_visualid�szMisc.winfo_visualidFcsH�j�dd�j|rdnd�}�fdd��j�|�D�}�fdd�|D�S)z�Return a list of all visuals available for the screen
        of this widget.

        Each item in the list consists of a visual name (see winfo_visual), a
        depth and if includeids is true is given also the X identifier.rZvisualsavailable�
includeidsNcsg|]}�j�|��qSr)r2r.r�r�rrr��sz/Misc.winfo_visualsavailable.<locals>.<listcomp>csg|]}��|��qSr)�_Misc__winfo_parseitemr�r�rrr��s)r2r�r�r.)rerYr�rr�r�winfo_visualsavailable�s

�zMisc.winfo_visualsavailablecCs$|dd�tt|j|dd���S)rNr)rr�_Misc__winfo_getint)rer4rrrZ__winfo_parseitem�szMisc.__winfo_parseitemcCs
t|d�S)rr)ra�rerUrrrZ__winfo_getint�szMisc.__winfo_getintcCs|j�|j�dd|j��S)z�Return the height of the virtual root window associated with this
        widget in pixels. If there is no virtual root window return the
        height of the screen.rZvrootheightr r�rrr�winfo_vrootheight�s�zMisc.winfo_vrootheightcCs|j�|j�dd|j��S)z�Return the width of the virtual root window associated with this
        widget in pixel. If there is no virtual root window return the
        width of the screen.rZ
vrootwidthr r�rrr�winfo_vrootwidth�s�zMisc.winfo_vrootwidthcCs|j�|j�dd|j��S)ziReturn the x offset of the virtual root relative to the root
        window of the screen of this widget.rZvrootxr r�rrr�winfo_vrootxs�zMisc.winfo_vrootxcCs|j�|j�dd|j��S)ziReturn the y offset of the virtual root relative to the root
        window of the screen of this widget.rZvrootyr r�rrr�winfo_vrooty	s�zMisc.winfo_vrootycCs|j�|j�dd|j��S)z Return the width of this widget.rrWr r�rrr�winfo_widths�zMisc.winfo_widthcCs|j�|j�dd|j��S)zVReturn the x coordinate of the upper left corner of this widget
        in the parent.rrUr r�rrr�winfo_xs�zMisc.winfo_xcCs|j�|j�dd|j��S)zVReturn the y coordinate of the upper left corner of this widget
        in the parent.rrVr r�rrr�winfo_ys�zMisc.winfo_ycCs|j�d�dS)zEEnter event loop until all pending events have been processed by Tcl.r!Nr�r�rrrr! szMisc.updatecCs|j�dd�dS)z�Enter event loop until all idle callbacks have been called. This
        will update the display of windows but not process events caused by
        the user.r!Z	idletasksNr�r�rrr�update_idletasks$szMisc.update_idletaskscCs6|dkr |j�|j�d|j��S|j�d|j|�dS)a,Set or get the list of bindtags for this widget.

        With no argument return the list of all bindtags associated with
        this widget. With a list of strings as argument the bindtags are
        set to this list. The bindtags determine in which order events are
        processed (see bind).N�bindtags�r2r.r�r�)reZtagListrrrrf*s
�z
Misc.bindtagsrcCs�t|t�r |j�|||f�nn|rd|�||j|�}d|r>dp@d||jf}|j�|||f�|S|rz|j�||f�S|j�|j�|��SdS)rz"%sif {"[%s %s]" == "break"} break
�+rZN)rrr2r�r��_substitute�_subst_format_strr.)rerp�sequencer�r��needcleanup�funcidrrrr�_bind7s"

�
��z
Misc._bindcCs|�d|jf|||�S)aOBind to this widget at event SEQUENCE a call to function FUNC.

        SEQUENCE is a string of concatenated event
        patterns. An event pattern is of the form
        <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one
        of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,
        Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,
        B3, Alt, Button4, B4, Double, Button5, B5 Triple,
        Mod1, M1. TYPE is one of Activate, Enter, Map,
        ButtonPress, Button, Expose, Motion, ButtonRelease
        FocusIn, MouseWheel, Circulate, FocusOut, Property,
        Colormap, Gravity Reparent, Configure, KeyPress, Key,
        Unmap, Deactivate, KeyRelease Visibility, Destroy,
        Leave and DETAIL is the button number for ButtonPress,
        ButtonRelease and DETAIL is the Keysym for KeyPress and
        KeyRelease. Examples are
        <Control-Button-1> for pressing Control and mouse button 1 or
        <Alt-A> for pressing A and the Alt key (KeyPress can be omitted).
        An event pattern can also be a virtual event of the form
        <<AString>> where AString can be arbitrary. This
        event can be generated by event_generate.
        If events are concatenated they must appear shortly
        after each other.

        FUNC will be called if the event sequence occurs with an
        instance of Event as argument. If the return value of FUNC is
        "break" no further bound function is invoked.

        An additional boolean parameter ADD specifies whether FUNC will
        be called additionally to the other bound function or whether
        it will replace the previous function.

        Bind will return an identifier to allow deletion of the bound function with
        unbind without memory leak.

        If FUNC or SEQUENCE is omitted the bound function or list
        of bound events are returned.�bind�rnr��rerkr�r�rrrroIs'z	Misc.bindcCs&|j�d|j|d�|r"|�|�dS)zWUnbind for this widget for event SEQUENCE  the
        function identified with FUNCID.rorZN�r2r�r�r�)rerkrmrrr�unbindrszMisc.unbindcCs|�d|||d�S)aBind to all widgets at an event SEQUENCE a call to function FUNC.
        An additional boolean parameter ADD specifies whether FUNC will
        be called additionally to the other bound function or whether
        it will replace the previous function. See bind for the return value.)ro�allr�rnrqrrr�bind_allysz
Misc.bind_allcCs|j�dd|d�dS)z8Unbind for all widgets for event SEQUENCE all functions.rortrZNr�)rerkrrr�
unbind_all�szMisc.unbind_allcCs|�d|f|||d�S)a=Bind to widgets with bindtag CLASSNAME at event
        SEQUENCE a call of function FUNC. An additional
        boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or
        whether it will replace the previous function. See bind for
        the return value.rorru)rer	rkr�r�rrr�
bind_class�szMisc.bind_classcCs|j�d||d�dS)zWUnbind for all widgets with bindtag CLASSNAME for event SEQUENCE
        all functions.rorZNr�)rer	rkrrr�unbind_class�szMisc.unbind_classcCs|j�|�dS)zCall the mainloop of Tk.N)r2r�)rerhrrrr��sz
Misc.mainloopcCs|j��dS)z8Quit the Tcl interpreter. All widgets will be destroyed.N)r2�quitr�rrrrz�sz	Misc.quitcCs"|rtt|jj|j�|���SdSrs)rrr2r�r.�rer�rrrrA�sz
Misc._getintscCs"|rtt|jj|j�|���SdSrs)rrr2r�r.r{rrr�_getdoubles�szMisc._getdoublescCs|r|j�|�SdSrs)r2r�r{rrr�_getboolean�szMisc._getbooleancCs"|rd|fS|dkrd|jfSdS)rr�Nr�r�r�rrrr��s

zMisc._displayofcCsBz|��jWStk
r<|j�dd�}|��_|YSXdS)rr2ZwindowingsystemN)r~Z_windowingsystem_cachedr"r2r�)reZwsrrrr��s�zMisc._windowingsystemcCs�|rt||f�}nt|�}d}|��D]�\}}|dk	r&|ddkrN|dd�}t|�rb|�|�}n^t|ttf�r�g}|D]<}t|t�r�|�t	|��qxt|t	�r�|�t
|��qxq�qxd�|�}|d||f}q&|S)rrN����_rr-)r+r%�callabler�rrrrarcrrr)rer&r�rr)r*Znvrrrrr��s*


z
Misc._optionscCsNt|��d�}|}|ds.|��}|dd�}|D]}|s>qJ|j|}q2|S)zPReturn the Tkinter instance of a widget identified by
        its Tcl name NAME.�.rrN)r�splitr~r")rerY�wrhrrr�nametowidget�szMisc.nametowidgetcCs�t|||�j}tt|��}z
|j}Wntk
r8YnXz||j}Wntk
r\YnX|j�||�|r�|j	dkr�g|_	|j	�
|�|S)z�Return a newly created Tcl function. If this
        function is called, the Python function FUNC will
        be executed. An optional function SUBST can
        be given which will be executed before FUNC.N)r�r�r_r�r�r"rAr2r�r�rc)rer��substrlr�rYrrrr��s 

zMisc._registercCs|}|jr|j}q|S)r�r�)rer�rrrr~sz
Misc._root)z%#z%bz%fz%hz%kz%sz%tz%wz%xz%yz%Az%Ez%Kz%Nz%Wz%Tz%Xz%Yz%Drcs�t|�t|j�kr|S|jj}|jj��fdd�}|\}}}}}}	}
}}}
}}}}}}}}}t�}�|�|_||�|_z||�|_Wnt	k
r�YnX||�|_
||�|_||	�|_||
�|_
||�|_||�|_||
�|_||_z||�|_Wnt	k
�r
YnX||_||�|_zt|�|_Wntk
�rF||_YnXz|�|�|_Wntk
�rt||_YnX||�|_||�|_z�|�|_Wn tt	fk
�r�d|_YnX|fS)rc	s,z
�|�WSttfk
r&|YSXdS)z?Tk changed behavior in 8.4.2, returning "??" rather more often.N)rvr�r��r�rr�getint_events
z&Misc._substitute.<locals>.getint_eventr)r�
_subst_formatr2r�r�rG�serialrSrTr�rXrRrN�timerWrUrVrLrMrQZ
keysym_numr8r rvr��widgetr#Zx_rootZy_rootrP)rer�r�r�Znsign�br��hr)rfr4r�rUrV�A�E�K�N�W�T�X�Y�D�err�rrisT*











zMisc._substitutecCs(t��\}}}|��}|�|||�dSrs)�sys�exc_infor~�report_callback_exception)rer��val�tbrqrrr�_report_exceptionHszMisc._report_exceptioncGs\i}|j�|jj|��D]>}|j�|�}|ddd�f|dd�||ddd�<q|S)z;Call Tcl configure command and return the result as a dict.rrN�r2r.r�)rer�r&rUrrr�
_getconfigureNs
0zMisc._getconfigurecGs2|j�|jj|��}|ddd�f|dd�S)Nrrr�)rer�rUrrr�_getconfigure1VszMisc._getconfigure1cCs�|rt||f�}n|rt|�}|dkr:|�t|j|f��St|t�r^|�t|j|d|f��S|j�t|j|f�|�	|��dS)rNr-)
r+r�rr�rrr�r2r�r�)rerr&r�rrr�
_configureZs
zMisc._configurecKs|�d||�S)z�Configure resources of a widget.

        The values for resources are specified as keyword
        arguments. To get an overview about
        the allowed keyword arguments call the method keys.
        �	configure�r��rer&r�rrrr�gszMisc.configurecCs|j�|jdd|�S)z4Return the resource value for a KEY given as string.�cgetr-r��rer6rrrr�rsz	Misc.cgetcCs|�||i�dSr�)r��rer6r
rrr�__setitem__xszMisc.__setitem__cs*|jj��fdd��|j�|jd��D�S)z3Return a list of all resource names of this widget.cs g|]}�|�ddd��qS)rrNrr�r�rrr�~szMisc.keys.<locals>.<listcomp>r�rgr�rr�rri{s
�z	Misc.keyscCs|jS)z+Return the window path name of this widget.r~r�rrrrF�szMisc.__str__cCsd|jj|jj|jfS)Nz<%s.%s object %s>)r�rBrCr�r�rrrrj�s
�z
Misc.__repr__�_noarg_cCs:|tjkr"|�|j�dd|j��S|j�dd|j|�dS)aSet or get the status for propagation of geometry information.

        A boolean argument specifies whether the geometry information
        of the slaves will determine the size of this widget. If no argument
        is given the current setting will be returned.
        �pack�	propagateN�r�r�r}r2r�r��re�flagrrr�pack_propagate�s

�zMisc.pack_propagatecs(�fdd��j��j�dd�j��D�S)�HReturn a list of all slaves of this widget
        in its packing order.csg|]}��|��qSr�r�r�r�rrr��sz$Misc.pack_slaves.<locals>.<listcomp>r��slavesrgr�rr�r�pack_slaves�s

��zMisc.pack_slavescs(�fdd��j��j�dd�j��D�S)r�csg|]}��|��qSrr�r�r�rrr��sz%Misc.place_slaves.<locals>.<listcomp>�placer�rgr�rr�r�place_slaves�s
���zMisc.place_slavescCs|j�dd|j|�dS)z�The anchor value controls how to place the grid within the
        master when no row/column has any weight.

        The default anchor is nw.�grid�anchorNr�)rer�rrr�grid_anchor�szMisc.grid_anchorcCsZdd|jf}|dk	r(|dk	r(|||f}|dk	rD|dk	rD|||f}|�|jj|��pXdS)a�Return a tuple of integer coordinates for the bounding
        box of this widget controlled by the geometry manager grid.

        If COLUMN, ROW is given the bounding box applies from
        the cell with row and column 0 to the specified
        cell. If COL2 and ROW2 are given the bounding box
        starts at that cell.

        The returned integers specify the offset of the upper left
        corner in the master widget and the width and height.
        r��bboxN)r�rAr2r�)re�column�rowZcol2Zrow2r�rrr�	grid_bbox�szMisc.grid_bboxc	Csht|ttjf�rdz:t|�}|s$WdSd|kr:|j�|�WS|j�|�WSWnttfk
rbYnX|S)Nr�)	rr�_tkinterZTcl_Objr2r�r�rvr�)rer
Zsvaluerrr�_gridconvvalue�szMisc._gridconvvaluecCs�t|t�rJ|sJ|dd�dkr*|dd�}|dd�dkrBd|}|f}n|�||�}|s|t|j|j�d||j|�|jd�S|j�d||j|f|�}t|�dkr�|�|�SdS)rrNr�rr-r�)r3)	rrr�r7r2r�r�r�r)rer�indexr&r��optionsrrrr�_grid_configure�s(���zMisc._grid_configurecKs|�d|||�S)z�Configure column INDEX of a grid.

        Valid resources are minsize (minimum size of the column),
        weight (how much does additional space propagate to this column)
        and pad (how much space to let additionally).�columnconfigure�r��rer�r&r�rrr�grid_columnconfigure�szMisc.grid_columnconfigurec	Cs |�|j�dd|j||��pdS)z�Return a tuple of column and row which identify the cell
        at which the pixel at position X and Y inside the master
        widget is located.r��locationNr@�rerUrVrrr�
grid_location�s���zMisc.grid_locationcCs:|tjkr"|�|j�dd|j��S|j�dd|j|�dS)aSet or get the status for propagation of geometry information.

        A boolean argument specifies whether the geometry information
        of the slaves will determine the size of this widget. If no argument
        is given, the current setting will be returned.
        r�r�Nr�r�rrr�grid_propagates

�zMisc.grid_propagatecKs|�d|||�S)z�Configure row INDEX of a grid.

        Valid resources are minsize (minimum size of the row),
        weight (how much does additional space propagate to this row)
        and pad (how much space to let additionally).�rowconfigurer�r�rrr�grid_rowconfigureszMisc.grid_rowconfigurecCs|�|j�dd|j��pdS)z<Return a tuple of the number of column and rows in the grid.r��sizeNr@r�rrr�	grid_sizes
��zMisc.grid_sizecsZd}|dk	r|d|f}|dk	r,|d|f}�fdd��j��j�dd�jf|��D�S)	r�rNz-rowz-columncsg|]}��|��qSrr�r�r�rrr�(sz$Misc.grid_slaves.<locals>.<listcomp>r�r�rg)rer�r�r�rr�r�grid_slaves s
��zMisc.grid_slavescGsdd|f|}|j�|�dS)z�Bind a virtual event VIRTUAL (of the form <<Name>>)
        to an event SEQUENCE such that the virtual event is triggered
        whenever SEQUENCE occurs.�eventr�Nr��re�virtual�	sequencesr�rrr�	event_add/szMisc.event_addcGsdd|f|}|j�|�dS)z-Unbind a virtual event VIRTUAL from SEQUENCE.r��deleteNr�r�rrr�event_delete6szMisc.event_deletecKsDdd|j|f}|��D]\}}|d|t|�f}q|j�|�dS)z�Generate an event SEQUENCE. Additional
        keyword arguments specify parameter of the event
        (e.g. x, y, rootx, rooty).r�Zgenerate�-%sN)r�r%rr2r�)rerkr�r�r)r*rrr�event_generate;szMisc.event_generatecCs|j�|j�dd|��S)zuReturn a list of all virtual events or the information
        about the SEQUENCE bound to the virtual event VIRTUAL.r�r|r�)rer�rrr�
event_infoDs�zMisc.event_infocCs|j�|j�dd��S)z*Return a list of all existing image names.�image�namesr�r�rrr�image_namesLszMisc.image_namescCs|j�|j�dd��S)z?Return a list of all available image types (e.g. photo bitmap).r��typesr�r�rrr�image_typesPszMisc.image_types)N)r{)N)N)r{r�)r{)N)r)N)N)N)N)r)r)r)r)r)F)N)r)NNN)N)NNN)NNN)r)N)Nr)N)N)NNNN)NN)N)�rArBrCrk�_last_child_idsr�r�r�r�r�r�r�Zwaitvarr�r�r�r�r�r�r�r�rTr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr
rr
rrrrrrr�liftrrr!r&r(r*r+r,r-r1r3r4r5r6r7r8r9r;r=r>r?rBrCrDrErFrGrHrJrKrLrMrNrOrPrQrRrTrUrWrXr[rZr\r^r_r`rarbrcrdr!rerfrnrorsrvrwrxryr�rzrAr|r}r��propertyr�r�r�r�r��registerr~r�rrjrir�r�r�r�r��configr��__getitem__r�rirFrjr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�msP
		


)

	
=
	


	r�c@s eZdZdZdd�Zdd�ZdS)r�zwInternal class. Stores function to call when some user
    defined Tcl function is called e.g. after an event occurred.cCs||_||_||_dS)z(Store FUNC, SUBST and WIDGET as members.N)r�r�r�)rer�r�r�rrrr�YszCallWrapper.__init__cGsLz|jr|j|�}|j|�WStk
r2�Yn|j��YnXdS)z3Apply first function SUBST to arguments, than FUNC.N)r�r�rwr�r��rer�rrrr�_s
zCallWrapper.__call__N�rArBrCrkr�r�rrrrr�Usr�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�XViewzXMix-in class for querying and changing the horizontal position
    of a widget's window.cGs(|jj|jdf|��}|s$|�|�SdS)z5Query and change the horizontal position of the view.�xviewN�r2r�r�r|�rer�rrrrr�oszXView.xviewcCs|j�|jdd|�dS)zsAdjusts the view in the window so that FRACTION of the
        total width of the canvas is off-screen to the left.r��movetoNr��re�fractionrrr�xview_movetouszXView.xview_movetocCs|j�|jdd||�dS)z\Shift the x-view according to NUMBER which is measured in "units"
        or "pages" (WHAT).r��scrollNr��rer0rprrr�xview_scrollzszXView.xview_scrollN)rArBrCrkr�r�r�rrrrr�ksr�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�YViewzVMix-in class for querying and changing the vertical position
    of a widget's window.cGs(|jj|jdf|��}|s$|�|�SdS)z3Query and change the vertical position of the view.�yviewNr�r�rrrr��szYView.yviewcCs|j�|jdd|�dS)zsAdjusts the view in the window so that FRACTION of the
        total height of the canvas is off-screen to the top.r�r�Nr�r�rrr�yview_moveto�szYView.yview_movetocCs|j�|jdd||�dS)z\Shift the y-view according to NUMBER which is measured in
        "units" or "pages" (WHAT).r�r�Nr�r�rrr�yview_scroll�szYView.yview_scrollN)rArBrCrkr�r�r�rrrrr��sr�c@s�eZdZdZdBdd�ZeZdd�ZeZdCdd�ZeZ	d	d
�Z
e
ZdDdd�ZeZ
d
d�ZeZdEdd�ZeZdd�ZeZdd�ZeZdFdd�ZeZdGdd�ZeZdHdd�ZeZdIdd�ZeZdd�ZeZdJdd �Z e Z!dKd!d"�Z"e"Z#dLd$d%�Z$e$Z%dMd&d'�Z&e&Z'dNd(d)�Z(e(Z)d*d+�Z*e*Z+dOd,d-�Z,e,Z-dPd.d/�Z.e.Z/dQd0d1�Z0e0Z1dRd2d3�Z2e2Z3dSd4d5�Z4e4Z5dTd6d7�Z6e6Z7dUd8d9�Z8e8Z9dVd:d;�Z:e:Z;dWd<d=�Z<e<Z=dXd>d?�Z>e>Z?d@dA�Z@e@ZAdS)Y�WmzAProvides functions for the communication with the window manager.NcCs |�|j�dd|j||||��S)z�Instruct the window manager to set the aspect ratio (width/height)
        of this widget to be between MINNUMER/MINDENOM and MAXNUMER/MAXDENOM. Return a tuple
        of the actual values if no argument is given.�wm�aspectr@)reZminNumerZminDenomZmaxNumerZmaxDenomrrr�	wm_aspect�s��zWm.wm_aspectcGsdd|jf|}|j�|�S)a�This subcommand returns or sets platform specific attributes

        The first form returns a list of the platform specific flags and
        their values. The second form returns the value for the specific
        option. The third form sets one or more of the values. The values
        are as follows:

        On Windows, -disabled gets or sets whether the window is in a
        disabled state. -toolwindow gets or sets the style of the window
        to toolwindow (as defined in the MSDN). -topmost gets or sets
        whether this is a topmost window (displays above all other
        windows).

        On Macintosh, XXXXX

        On Unix, there are currently no special attribute values.
        r��
attributes)r�r2r�r�rrr�
wm_attributes�szWm.wm_attributescCs|j�dd|j|�S)zVStore NAME in WM_CLIENT_MACHINE property of this widget. Return
        current value.r��clientr�r�rrr�	wm_client�szWm.wm_clientcsZt|�dkr|f}dd�jf|}|r4�j�|�n"�fdd��j��j�|��D�SdS)z�Store list of window names (WLIST) into WM_COLORMAPWINDOWS property
        of this widget. This list contains windows whose colormaps differ from their
        parents. Return current list of widgets if WLIST is empty.rr��colormapwindowscsg|]}��|��qSrr�r�r�rrr��s�z)Wm.wm_colormapwindows.<locals>.<listcomp>N)rr�r2r�r.)reZwlistr�rr�r�wm_colormapwindows�s
�zWm.wm_colormapwindowscCs|j�dd|j|�S)z�Store VALUE in WM_COMMAND property. It is the command
        which shall be used to invoke the application. Return current
        command if VALUE is None.r�rr�r�rrr�
wm_command�sz
Wm.wm_commandcCs|j�dd|j�S)z�Deiconify this widget. If it was never mapped it will not be mapped.
        On Windows it will raise this widget and give it the focus.r��	deiconifyr�r�rrr�wm_deiconify�szWm.wm_deiconifycCs|j�dd|j|�S)z�Set focus model to MODEL. "active" means that this widget will claim
        the focus itself, "passive" means that the window manager shall give
        the focus. Return current focus model if MODEL is None.r��
focusmodelr�)reZmodelrrr�
wm_focusmodel�szWm.wm_focusmodelcCs|j�dd|�dS)aAThe window will be unmapped from the screen and will no longer
        be managed by wm. toplevel windows will be treated like frame
        windows once they are no longer managed by wm, however, the menu
        option configuration will be remembered and the menus will return
        once the widget is managed again.r��forgetNr�r�rrr�	wm_forget�szWm.wm_forgetcCs|j�dd|j�S)zAReturn identifier for decorative frame of this widget if present.r��framer�r�rrr�wm_frame�szWm.wm_framecCs|j�dd|j|�S)ziSet geometry to NEWGEOMETRY of the form =widthxheight+x+y. Return
        current value if None is given.r�r2r�)reZnewGeometryrrr�wm_geometry�szWm.wm_geometrycCs |�|j�dd|j||||��S)aInstruct the window manager that this widget shall only be
        resized on grid boundaries. WIDTHINC and HEIGHTINC are the width and
        height of a grid unit in pixels. BASEWIDTH and BASEHEIGHT are the
        number of grid units requested in Tk_GeometryRequest.r�r�r@)reZ	baseWidthZ
baseHeightZwidthIncZ	heightIncrrr�wm_grids
�z
Wm.wm_gridcCs|j�dd|j|�S)z~Set the group leader widgets for related widgets to PATHNAME. Return
        the group leader of this widget if None is given.r��groupr��reZpathNamerrr�wm_group
szWm.wm_groupcCs2|r|j�dd|jd|�S|j�dd|j|�SdS)a�Set bitmap for the iconified widget to BITMAP. Return
        the bitmap if None is given.

        Under Windows, the DEFAULT parameter can be used to set the icon
        for the widget and any descendents that don't have an icon set
        explicitly.  DEFAULT can be the relative path to a .ico file
        (example: root.iconbitmap(default='myicon.ico') ).  See Tk
        documentation for more information.r��
iconbitmap�-defaultNr�)re�bitmap�defaultrrr�
wm_iconbitmaps	zWm.wm_iconbitmapcCs|j�dd|j�S)zDisplay widget as icon.r��iconifyr�r�rrr�
wm_iconify$sz
Wm.wm_iconifycCs|j�dd|j|�S)zVSet mask for the icon bitmap of this widget. Return the
        mask if None is given.r��iconmaskr�)rerrrr�wm_iconmask*szWm.wm_iconmaskcCs|j�dd|j|�S)zSSet the name of the icon for this widget. Return the name if
        None is given.r��iconnamer�)reZnewNamerrr�wm_iconname1szWm.wm_iconnameFcGs<|r |jjdd|jdf|��n|jjdd|jf|��dS)a�Sets the titlebar icon for this window based on the named photo
        images passed through args. If default is True, this is applied to
        all future created toplevels as well.

        The data in the images is taken as a snapshot at the time of
        invocation. If the images are later changed, this is not reflected
        to the titlebar icons. Multiple images are accepted to allow
        different images sizes to be provided. The window manager may scale
        provided icons to an appropriate size.

        On Windows, the images are packed into a Windows icon structure.
        This will override an icon specified to wm_iconbitmap, and vice
        versa.

        On X, the images are arranged into the _NET_WM_ICON X property,
        which most modern window managers support. An icon specified by
        wm_iconbitmap may exist simultaneously.

        On Macintosh, this currently does nothing.r��	iconphotorNr�)rerr�rrr�wm_iconphoto8szWm.wm_iconphotoc	Cs|�|j�dd|j||��S)z�Set the position of the icon of this widget to X and Y. Return
        a tuple of the current values of X and X if None is given.r��iconpositionr@r�rrr�wm_iconpositionSs
�zWm.wm_iconpositioncCs|j�dd|j|�S)zgSet widget PATHNAME to be displayed instead of icon. Return the current
        value if None is given.r��
iconwindowr�r
rrr�
wm_iconwindow[szWm.wm_iconwindowcCs|j�dd|�dS)z�The widget specified will become a stand alone top-level window.
        The window will be decorated with the window managers title bar,
        etc.r��manageNr�)rer�rrr�	wm_managebszWm.wm_managec	Cs|�|j�dd|j||��S)z�Set max WIDTH and HEIGHT for this widget. If the window is gridded
        the values are given in grid units. Return the current values if None
        is given.r��maxsizer@�rerWrXrrr�
wm_maxsizejs
�z
Wm.wm_maxsizec	Cs|�|j�dd|j||��S)z�Set min WIDTH and HEIGHT for this widget. If the window is gridded
        the values are given in grid units. Return the current values if None
        is given.r��minsizer@r#rrr�
wm_minsizess
�z
Wm.wm_minsizecCs|�|j�dd|j|��S)z�Instruct the window manager to ignore this widget
        if BOOLEAN is given with 1. Return the current value if None
        is given.r��overrideredirect)r}r2r�r�r�rrr�wm_overrideredirect|s
�zWm.wm_overrideredirectcCs|j�dd|j|�S)z�Instruct the window manager that the position of this widget shall
        be defined by the user if WHO is "user", and by its own policy if WHO is
        "program".r��positionfromr��reZwhorrr�wm_positionfrom�szWm.wm_positionfromcCs.t|�r|�|�}n|}|j�dd|j||�S)z�Bind function FUNC to command NAME for this widget.
        Return the function bound to NAME if None is given. NAME could be
        e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW".r��protocol)r�r�r2r�r�)rerYr�rrrr�wm_protocol�s�zWm.wm_protocolcCs|j�dd|j||�S)zyInstruct the window manager whether this width can be resized
        in WIDTH or HEIGHT. Both values are boolean values.r��	resizabler�r#rrr�wm_resizable�szWm.wm_resizablecCs|j�dd|j|�S)z�Instruct the window manager that the size of this widget shall
        be defined by the user if WHO is "user", and by its own policy if WHO is
        "program".r��sizefromr�r*rrr�wm_sizefrom�szWm.wm_sizefromcCs|j�dd|j|�S)z�Query or set the state of this widget as one of normal, icon,
        iconic (see wm_iconwindow), withdrawn, or zoomed (Windows only).r�rNr�)reZnewstaterrr�wm_state�szWm.wm_statecCs|j�dd|j|�S)zSet the title of this widget.r��titler�r{rrr�wm_title�szWm.wm_titlecCs|j�dd|j|�S)z_Instruct the window manager that this widget is transient
        with regard to widget MASTER.r��	transientr�)rer�rrr�wm_transient�szWm.wm_transientcCs|j�dd|j�S)z�Withdraw this widget from the screen such that it is unmapped
        and forgotten by the window manager. Re-draw it with wm_deiconify.r��withdrawr�r�rrr�wm_withdraw�szWm.wm_withdraw)NNNN)N)N)N)N)NNNN)N)NN)N)N)F)NN)N)NN)NN)N)N)NN)NN)N)N)N)N)BrArBrCrkr�r�r�r�r�r�rr�rrrrrrrrr	rr
r2rr�rrrrrrrrrrrrrrrrr!r r$r"r&r%r(r'r+r)r-r,r/r.r1r0r2rNr4r3r6r5r8r7rrrrr��s��





�

















r�c@sNeZdZdZdZddd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�ZdS)rozzToplevel widget of Tk which represents mostly the main window
    of an application. It has an associated Tcl interpreter.r�Nrrc

Cs�d|_i|_d|_d|_|dkrZddl}|j�tjd�}|j�	|�\}}|dkrZ||}d}	t
�||||	t|||�|_|r�|�
�tjjs�|�||�dS)a@Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will
        be created. BASENAME will be used for the identification of the profile file (see
        readprofile).
        It is constructed from sys.argv[0] without extensions if None is given. CLASSNAME
        is the name of the widget class.NFr)z.pyz.pyc)r�r"�	_tkloadedr2�os�path�basenamer��argv�splitextr��create�wantobjects�_loadtk�flags�ignore_environment�readprofile)
re�
screenName�baseNamer	�useTk�syncZuser:Zext�interactiverrrr��s zTk.__init__cCs|js|j��|��dSr�)r9r2�loadtkrAr�rrrrJ�s
z	Tk.loadtkcCs�d|_|j�d�}|tjkr.tdtj|f��t|j�d��}|tjkrZtdtj|f��|jdkrjg|_|j�	dt
�|j�	dt�|j�d�|j�d�t
r�ts�|a|�d|j�dS)	NT�
tk_versionz4tk.h version (%s) doesn't match libtk.a version (%s)�tcl_versionz6tcl.h version (%s) doesn't match libtcl.a version (%s)Ztkerror�exit�WM_DELETE_WINDOW)r9r2r�r��
TK_VERSIONr/r�TCL_VERSIONr�r�ruryrcrlrmr,r�)rerKrLrrrrA�s(
�
�
z
Tk._loadtkcCsJt|j���D]}|��q|j�d|j�t�|�trFt	|krFda	dS)zhDestroy this and all descendants widgets. This will
        end the application of this Tcl interpreter.r�N)
rr"�valuesr�r2r�r�r�rlrm�rer'rrrr�	s

z
Tk.destroyc
Cs�ddl}d|jkr|jd}n|j}|j�|d|�}|j�|d|�}|j�|d|�}|j�|d|�}d|i}	td|	�|j�|�r�|j�d|�|j�|�r�tt	|��
�|	�|j�|�r�|j�d|�|j�|�r�tt	|��
�|	�dS)	z�Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into
        the Tcl Interpreter and calls exec on the contents of BASENAME.py and
        CLASSNAME.py if such a file exists in the home directory.rN�HOMEz.%s.tclz.%s.pyrezfrom tkinter import *�source)r:�environ�curdirr;r�exec�isfiler2r��open�read)
rerFr	r:�homeZ	class_tclZclass_pyZbase_tclZbase_py�dirrrrrD	s$

zTk.readprofilecCs:ddl}tdtjd�|t_|t_|t_|�|||�dS)z�Report callback exception on sys.stderr.

        Applications may want to override this internal function, and
        should when sys.stderr is None.rNzException in Tkinter callback)�file)�	tracebackr$r��stderr�	last_type�
last_value�last_traceback�print_exception)rer�r�r�r^rrrr�$	szTk.report_callback_exceptioncCst|j|�S)z3Delegate attribute access to the interpreter object)r`r2)re�attrrrr�__getattr__0	szTk.__getattr__)NNrorrN)rArBrCrkr�r�rJrAr�rDr�rerrrrro�s�

rocCst||||�Sr�)ro)rErFr	rGrrr�TclC	srfc@sTeZdZdZifdd�ZeZZZdd�ZeZ	dd�Z
e
Zej
ZZ
ejZZdS)	�PackzQGeometry manager Pack.

    Base class to use the methods pack_* in every widget.cKs$|j�dd|jf|�||��dS)a(Pack a widget in the parent widget. Use as options:
        after=widget - pack it after you have packed widget
        anchor=NSEW (or subset) - position widget according to
                                  given direction
        before=widget - pack it before you will pack widget
        expand=bool - expand widget if parent size grows
        fill=NONE or X or Y or BOTH - fill widget if widget grows
        in=master - use master to contain this widget
        in_=master - see 'in' option description
        ipadx=amount - add internal padding in x direction
        ipady=amount - add internal padding in y direction
        padx=amount - add padding in x direction
        pady=amount - add padding in y direction
        side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.
        r�r�N�r2r�r�r�r�rrr�pack_configureL	s


��zPack.pack_configurecCs|j�dd|j�dS)z:Unmap this widget and do not use it for the packing order.r�rNr�r�rrr�pack_forgetb	szPack.pack_forgetcCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)zEReturn information about the packing options
        for this widget.r�r|�in�r7r2r�r�r��re�drrr�	pack_infoh	szPack.pack_infoN)rArBrCrkrir�r�r�rjrror|r�r�r�r�r�rrrrrgG	s
rgc@sJeZdZdZifdd�ZeZZZdd�ZeZ	dd�Z
e
Zej
ZZ
dS)	�PlacezSGeometry manager Place.

    Base class to use the methods place_* in every widget.cKs$|j�dd|jf|�||��dS)a Place a widget in the parent widget. Use as options:
        in=master - master relative to which the widget is placed
        in_=master - see 'in' option description
        x=amount - locate anchor of this widget at position x of master
        y=amount - locate anchor of this widget at position y of master
        relx=amount - locate anchor of this widget between 0.0 and 1.0
                      relative to width of master (1.0 is right edge)
        rely=amount - locate anchor of this widget between 0.0 and 1.0
                      relative to height of master (1.0 is bottom edge)
        anchor=NSEW (or subset) - position anchor according to given direction
        width=amount - width of this widget in pixel
        height=amount - height of this widget in pixel
        relwidth=amount - width of this widget between 0.0 and 1.0
                          relative to width of master (1.0 is the same width
                          as the master)
        relheight=amount - height of this widget between 0.0 and 1.0
                           relative to height of master (1.0 is the same
                           height as the master)
        bordermode="inside" or "outside" - whether to take border width of
                                           master widget into account
        r�r�Nrhr�rrr�place_configurez	s


��zPlace.place_configurecCs|j�dd|j�dS)�Unmap this widget.r�rNr�r�rrr�place_forget�	szPlace.place_forgetcCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)zEReturn information about the placing options
        for this widget.r�r|rkrlrmrrr�
place_info�	szPlace.place_infoN)rArBrCrkrqr�r�r�rsrrtr|r�r�r�rrrrrpu	srpc@s�eZdZdZifdd�ZeZZZej	Z
Z	ejZZdd�Z
e
Zdd�Zdd	�ZeZejZZejZZejZZejZZejZZd
S)�GridzQGeometry manager Grid.

    Base class to use the methods grid_* in every widget.cKs$|j�dd|jf|�||��dS)aPosition a widget in the parent widget in a grid. Use as options:
        column=number - use cell identified with given column (starting with 0)
        columnspan=number - this widget will span several columns
        in=master - use master to contain this widget
        in_=master - see 'in' option description
        ipadx=amount - add internal padding in x direction
        ipady=amount - add internal padding in y direction
        padx=amount - add padding in x direction
        pady=amount - add padding in y direction
        row=number - use cell identified with given row (starting with 0)
        rowspan=number - this widget will span several rows
        sticky=NSEW - if cell is larger on which sides will this
                      widget stick to the cell boundary
        r�r�Nrhr�rrr�grid_configure�	s


��zGrid.grid_configurecCs|j�dd|j�dS)rrr�rNr�r�rrr�grid_forget�	szGrid.grid_forgetcCs|j�dd|j�dS)z0Unmap this widget but remember the grid options.r�r�Nr�r�rrr�grid_remove�	szGrid.grid_removecCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)zSReturn information about the options
        for positioning this widget in a grid.r�r|rkrlrmrrr�	grid_info�	szGrid.grid_infoN)rArBrCrkrvr�r�r�r�r�r�r�r�rwrrxryr|r�r�r�r�r�r�r�r�r�r�rrrrru�	s





ruc@s:eZdZdZdd�Ziidfdd�Zdd�Zdd	d
�ZdS)
�
BaseWidgetzInternal class.cCs�|s
t�}||_|j|_d}d|kr2|d}|d=|s�|jj��}|jdkrRi|_|j�|d�d}||j|<|dkr�d|f}nd||f}||_|j	dkr�d||_	n|j	d||_	i|_
|j|jj
kr�|jj
|j��||jj
|j<dS)z6Internal function. Sets up information about children.NrYrrz!%sz!%s%dr�)rrr�r2r�rArr�r�r�r�r"r�)rer�r&rY�countrrr�_setup�	s2


zBaseWidget._setuprc	Cs�|rt||f�}||_t�|||�|jdkr4g|_dd�|��D�}|D]\}}||=qJ|j�||jf||�	|��|D]\}}|�
||�q~dS)zdConstruct a widget with the parent widget MASTER, a name WIDGETNAME
        and appropriate options.NcSs"g|]\}}t|t�r||f�qSr)rr rIrrrr�	
s
z'BaseWidget.__init__.<locals>.<listcomp>)r+�
widgetNamerzr|r�r%r2r�r�r�r�)	rer�r}r&r��extra�classesr)r*rrrr�
s
�zBaseWidget.__init__cCsTt|j���D]}|��q|j�d|j�|j|jjkrF|jj|j=t	�|�dS)z)Destroy this and all descendants widgets.r�N)
rr"rQr�r2r�r�r�r�r�rRrrrr�
s
zBaseWidget.destroycCs|j�|j|f|�Sr�r�)rerYr�rrr�_do
szBaseWidget._doN)r)rArBrCrkr|r�r�r�rrrrrz�	s
rzc@seZdZdZdS)�WidgetzxInternal class.

    Base class for a widget which can be positioned with the geometry managers
    Pack, Place or Grid.N)rArBrCrkrrrrr�
sr�c@seZdZdZdifdd�ZdS)�Toplevelz"Toplevel widget, e.g. for dialogs.Nc	Ks�|rt||f�}d}dD]L}||kr||}|ddkrJd|dd�}nd|}|||f}||=qt�||d|i|�|��}|�|���|�|���|�d|j�dS)	a%Construct a toplevel widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, class,
        colormap, container, cursor, height, highlightbackground,
        highlightcolor, highlightthickness, menu, relief, screen, takefocus,
        use, visual, width.r)rI�class_r'rVZcolormaprr�r-NrSrN)r+rzr�r~rr3r,r�)	rer�r&r�r~Zwmkeyr��optrqrrrr�)
s zToplevel.__init__�rArBrCrkr�rrrrr�&
sr�c@s.eZdZdZdifdd�Zdd�Zdd�ZdS)	rDzButton widget.NcKst�||d||�dS)aUConstruct a button widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, activeforeground, anchor,
            background, bitmap, borderwidth, cursor,
            disabledforeground, font, foreground
            highlightbackground, highlightcolor,
            highlightthickness, image, justify,
            padx, pady, relief, repeatdelay,
            repeatinterval, takefocus, text,
            textvariable, underline, wraplength

        WIDGET-SPECIFIC OPTIONS

            command, compound, default, height,
            overrelief, state, width
        ZbuttonN�r�r��rer�r&r�rrrr�G
szButton.__init__cCs|j�|jd�dS)a_Flash the button.

        This is accomplished by redisplaying
        the button several times, alternating between active and
        normal colors. At the end of the flash the button is left
        in the same normal/active state as when the command was
        invoked. This command is ignored if the button's state is
        disabled.
        �flashNr�r�rrrr�\
s
zButton.flashcCs|j�|jd�S)aInvoke the command associated with the button.

        The return value is the return value from the command,
        or an empty string if there is no command associated with
        the button. This command is ignored if the button's state
        is disabled.
        �invoker�r�rrrr�h
sz
Button.invoke)rArBrCrkr�r�r�rrrrrDD
srDc@seZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zdwd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dxdd�Zdydd�Zdzdd�Zd{dd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!d?d@�Z"dAdB�Z#d|dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+dSdT�Z,dUdV�Z-d}dWdX�Z.e.Z/dYdZ�Z0e0Z1d[d\�Z2d~d^d_�Z3ifd`da�Z4dbdc�Z5e5Z6Z7ddde�Z8dfdg�Z9ddidj�Z:dkdl�Z;dmdn�Z<dodp�Z=dqdr�Z>dsdt�Z?dudv�Z@dS)��Canvasz?Canvas widget to display graphical elements like lines or text.NcKst�||d||�dS)aConstruct a canvas widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, closeenough,
        confine, cursor, height, highlightbackground, highlightcolor,
        highlightthickness, insertbackground, insertborderwidth,
        insertofftime, insertontime, insertwidth, offset, relief,
        scrollregion, selectbackground, selectborderwidth, selectforeground,
        state, takefocus, width, xscrollcommand, xscrollincrement,
        yscrollcommand, yscrollincrement.ZcanvasNr�r�rrrr�v
s
zCanvas.__init__cGs|j�|jdf|�dS)r�addtagNr�r�rrrr��
sz
Canvas.addtagcCs|�|d|�dS)z*Add tag NEWTAG to all items above TAGORID.�aboveN�r��re�newtag�tagOrIdrrr�addtag_above�
szCanvas.addtag_abovecCs|�|d�dS)zAdd tag NEWTAG to all items.rtNr�)rer�rrr�
addtag_all�
szCanvas.addtag_allcCs|�|d|�dS)z*Add tag NEWTAG to all items below TAGORID.�belowNr�r�rrr�addtag_below�
szCanvas.addtag_belowcCs|�|d||||�dS)z�Add tag NEWTAG to item which is closest to pixel at X, Y.
        If several match take the top-most.
        All items closer than HALO are considered overlapping (all are
        closests). If START is specified the next below this tag is taken.�closestNr�)rer�rUrV�halo�startrrr�addtag_closest�
szCanvas.addtag_closestcCs|�|d||||�dS)zLAdd tag NEWTAG to all items in the rectangle defined
        by X1,Y1,X2,Y2.�enclosedNr��rer��x1�y1�x2�y2rrr�addtag_enclosed�
szCanvas.addtag_enclosedcCs|�|d||||�dS)zWAdd tag NEWTAG to all items which overlap the rectangle
        defined by X1,Y1,X2,Y2.�overlappingNr�r�rrr�addtag_overlapping�
szCanvas.addtag_overlappingcCs|�|d|�dS)z)Add tag NEWTAG to all items with TAGORID.�withtagNr�r�rrr�addtag_withtag�
szCanvas.addtag_withtagcGs |�|j�|jdf|��pdS)z|Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
        which encloses all items with tags specified as arguments.r�Nr@r�rrrr��
s
��zCanvas.bboxcCs(|j�|jd||d�|r$|�|�dS)zbUnbind for all items with TAGORID for event SEQUENCE  the
        function identified with FUNCID.rorZNrr)rer�rkrmrrr�
tag_unbind�
szCanvas.tag_unbindcCs|�|jd|f|||�S)a&Bind to all items with TAGORID at event SEQUENCE a call to function FUNC.

        An additional boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or whether it will
        replace the previous function. See bind for the return value.rorp)rer�rkr�r�rrr�tag_bind�
s
�zCanvas.tag_bindcCs|j�|j�|jd||��S)zrReturn the canvas x coordinate of pixel position SCREENX rounded
        to nearest multiple of GRIDSPACING units.�canvasxr.)reZscreenx�gridspacingrrrr��
s�zCanvas.canvasxcCs|j�|j�|jd||��S)zrReturn the canvas y coordinate of pixel position SCREENY rounded
        to nearest multiple of GRIDSPACING units.�canvasyr.)reZscreenyr�rrrr��
s�zCanvas.canvasycs,�fdd��j��j��jdf|��D�S)z8Return a list of coordinates for the item given in ARGS.csg|]}�j�|��qSr)r2r�r�r�rrr��
sz!Canvas.coords.<locals>.<listcomp>�coordsrgr�rr�rr��
s

��z
Canvas.coordsc	Cs\t|�}|d}t|ttf�r,|dd�}ni}|j�|jj|jd|f||�||����S)rrNr?)	rrrrr2r�r�r�r�)re�itemTyper�r�r&rrr�_create�
s��zCanvas._createcOs|�d||�S)z6Create arc shaped region with coordinates x1,y1,x2,y2.Zarc�r�r�rrr�
create_arc�
szCanvas.create_arccOs|�d||�S)z%Create bitmap with coordinates x1,y1.rr�r�rrr�
create_bitmap�
szCanvas.create_bitmapcOs|�d||�S)z)Create image item with coordinates x1,y1.r�r�r�rrr�create_image�
szCanvas.create_imagecOs|�d||�S)z-Create line with coordinates x1,y1,...,xn,yn.�liner�r�rrr�create_line�
szCanvas.create_linecOs|�d||�S)z)Create oval with coordinates x1,y1,x2,y2.Zovalr�r�rrr�create_oval�
szCanvas.create_ovalcOs|�d||�S)z0Create polygon with coordinates x1,y1,...,xn,yn.Zpolygonr�r�rrr�create_polygon�
szCanvas.create_polygoncOs|�d||�S)z.Create rectangle with coordinates x1,y1,x2,y2.Z	rectangler�r�rrr�create_rectangle�
szCanvas.create_rectanglecOs|�d||�S)z#Create text with coordinates x1,y1.�textr�r�rrr�create_text�
szCanvas.create_textcOs|�d||�S)z+Create window with coordinates x1,y1,x2,y2.r�r�r�rrr�
create_window�
szCanvas.create_windowcGs|j�|jdf|�dS)z�Delete characters of text items identified by tag or id in ARGS (possibly
        several times) from FIRST to LAST character (including).�dcharsNr�r�rrrr�sz
Canvas.dcharscGs|j�|jdf|�dS)z<Delete items identified by all tag or ids contained in ARGS.r�Nr�r�rrrr�sz
Canvas.deletecGs|j�|jdf|�dS)ziDelete tag or id given as last arguments in ARGS from items
        identified by first argument in ARGS.�dtagNr�r�rrrr�	szCanvas.dtagcGs |�|j�|jdf|��pdS)r�findrr@r�rrrr�s
��zCanvas.findcCs|�d|�S)zReturn items above TAGORID.r��r��rer�rrr�
find_aboveszCanvas.find_abovecCs
|�d�S)zReturn all items.rtr�r�rrr�find_allszCanvas.find_allcCs|�d|�S)zReturn all items below TAGORID.r�r�r�rrr�
find_belowszCanvas.find_belowcCs|�d||||�S)z�Return item which is closest to pixel at X, Y.
        If several match take the top-most.
        All items closer than HALO are considered overlapping (all are
        closest). If START is specified the next below this tag is taken.r�r�)rerUrVr�r�rrr�find_closestszCanvas.find_closestcCs|�d||||�S)z=Return all items in rectangle defined
        by X1,Y1,X2,Y2.r�r��rer�r�r�r�rrr�
find_enclosed&szCanvas.find_enclosedcCs|�d||||�S)zLReturn all items which overlap the rectangle
        defined by X1,Y1,X2,Y2.r�r�r�rrr�find_overlapping+szCanvas.find_overlappingcCs|�d|�S)zReturn all items with TAGORID.r�r�r�rrr�find_withtag0szCanvas.find_withtagcGs|j�|jdf|�S)z.Set focus to the first item specified in ARGS.rTr�r�rrrrT4szCanvas.focuscGs|j�|j�|jdf|��S)z=Return tags associated with the first item specified in ARGS.�gettagsrgr�rrrr�8s�zCanvas.gettagscGs|j�|jdf|�dS)zdSet cursor at position POS in the item identified by TAGORID.
        In ARGS TAGORID must be first.�icursorNr�r�rrrr�=szCanvas.icursorcGs|j�|j�|jdf|��S)z?Return position of cursor as integer in item specified in ARGS.r�r r�rrrr�BszCanvas.indexcGs|j�|jdf|�dS)zSInsert TEXT in item TAGORID at position POS. ARGS must
        be TAGORID POS TEXT.�insertNr�r�rrrr�Fsz
Canvas.insertcCs|j�|jdf|d|f�S)z9Return the resource value for an OPTION for item TAGORID.�itemcgetr-r�)rer�rrrrr�Ks�zCanvas.itemcgetcKs|�d|f||�S)z�Configure resources of an item TAGORID.

        The values for resources are specified as keyword
        arguments. To get an overview about
        the allowed keyword arguments call the method without arguments.
        �
itemconfigurer��rer�r&r�rrrr�PszCanvas.itemconfigurecGs|j�|jdf|�dS)zJLower an item TAGORID given in ARGS
        (optional below another item).rNr�r�rrr�	tag_lower_szCanvas.tag_lowercGs|j�|jdf|�dS)z#Move an item TAGORID given in ARGS.�moveNr�r�rrrr�fszCanvas.moverZcCs|j�|jd|||�dS)a}Move the items given by TAGORID in the canvas coordinate
        space so that the first coordinate pair of the bottommost
        item with tag TAGORID is located at position (X,Y).
        X and Y may be the empty string, in which case the
        corresponding coordinate will be unchanged. All items matching
        TAGORID remain in the same positions relative to each other.r�Nr�)rer�rUrVrrrr�jsz
Canvas.movetocKs|j�|jdf|�||��S)z�Print the contents of the canvas to a postscript
        file. Valid options: colormap, colormode, file, fontmap,
        height, pageanchor, pageheight, pagewidth, pagex, pagey,
        rotate, width, x, y.�
postscriptrhr�rrrr�ss
�zCanvas.postscriptcGs|j�|jdf|�dS)zJRaise an item TAGORID given in ARGS
        (optional above another item).rNr�r�rrr�	tag_raise{szCanvas.tag_raisecGs|j�|jdf|�dS)z9Scale item TAGORID with XORIGIN, YORIGIN, XSCALE, YSCALE.�scaleNr�r�rrrr��szCanvas.scalecCs|j�|jdd||�dS�z&Remember the current X, Y coordinates.�scan�markNr�r�rrr�	scan_mark�szCanvas.scan_mark�
cCs|j�|jdd|||�dS)z�Adjust the view of the canvas to GAIN times the
        difference between X and Y and the coordinates given in
        scan_mark.r��dragtoNr�)rerUrVZgainrrr�scan_dragto�szCanvas.scan_dragtocCs|j�|jdd||�dS)zLAdjust the end of the selection near the cursor of an item TAGORID to index.�select�adjustNr��rer�r�rrr�
select_adjust�szCanvas.select_adjustcCs|j�|jdd�dS)�,Clear the selection if it is in this widget.r�r�Nr�r�rrr�select_clear�szCanvas.select_clearcCs|j�|jdd||�dS)z:Set the fixed end of a selection in item TAGORID to INDEX.r��fromNr�r�rrr�select_from�szCanvas.select_fromcCs|j�|jdd�pdS)z(Return the item which has the selection.r�rNr�r�rrr�select_item�szCanvas.select_itemcCs|j�|jdd||�dS)z=Set the variable end of a selection in item TAGORID to INDEX.r��toNr�r�rrr�	select_to�szCanvas.select_tocCs|j�|jd|�pdS)z$Return the type of the item TAGORID.r Nr�r�rrrr �szCanvas.type)NN)N)NNN)N)N)NN)N)rZrZ)r�)ArArBrCrkr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rTr�r�r�r�r�r��
itemconfigr�rr�r�r�r�r�rr�r�r�r�r�r�r�r�r rrrrr�s
sz


	



	
	
r�c@sFeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�Checkbuttonz7Checkbutton widget which is either in on- or off-state.NcKst�||d||�dS)aConstruct a checkbutton widget with the parent MASTER.

        Valid resource names: activebackground, activeforeground, anchor,
        background, bd, bg, bitmap, borderwidth, command, cursor,
        disabledforeground, fg, font, foreground, height,
        highlightbackground, highlightcolor, highlightthickness, image,
        indicatoron, justify, offvalue, onvalue, padx, pady, relief,
        selectcolor, selectimage, state, takefocus, text, textvariable,
        underline, variable, width, wraplength.�checkbuttonNr�r�rrrr��s
zCheckbutton.__init__cCs|j�|jd�dS�zPut the button in off-state.�deselectNr�r�rrrr��szCheckbutton.deselectcCs|j�|jd�dS�zFlash the button.r�Nr�r�rrrr��szCheckbutton.flashcCs|j�|jd�S�z<Toggle the button and invoke a command if given as resource.r�r�r�rrrr��szCheckbutton.invokecCs|j�|jd�dS�zPut the button in on-state.r�Nr�r�rrrr��szCheckbutton.selectcCs|j�|jd�dS)zToggle the button.�toggleNr�r�rrrr��szCheckbutton.toggle)
rArBrCrkr�r�r�r�r�r�rrrrr��sr�c@s�eZdZdZdifdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZeZ
dd�ZeZdd�ZeZdd�ZeZdd�ZeZdd�ZeZdS) �Entryz1Entry widget which allows displaying simple text.NcKst�||d||�dS)aConstruct an entry widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, cursor,
        exportselection, fg, font, foreground, highlightbackground,
        highlightcolor, highlightthickness, insertbackground,
        insertborderwidth, insertofftime, insertontime, insertwidth,
        invalidcommand, invcmd, justify, relief, selectbackground,
        selectborderwidth, selectforeground, show, state, takefocus,
        textvariable, validate, validatecommand, vcmd, width,
        xscrollcommand.�entryNr�r�rrrr��szEntry.__init__cCs|j�|jd||�dS)z.Delete text from FIRST to LAST (not included).r�Nr��re�firstZlastrrrr��szEntry.deletecCs|j�|jd�S)zReturn the text.r�r�r�rrrr��sz	Entry.getcCs|j�|jd|�dS)zInsert cursor at INDEX.r�Nr��rer�rrrr��sz
Entry.icursorcCs|j�|j�|jd|��S)zReturn position of cursor.r�r r�rrrr��s
�zEntry.indexcCs|j�|jd||�dS)zInsert STRING at INDEX.r�Nr�)rer�r�rrrr��szEntry.insertcCs|j�|jdd|�dSr�r�r]rrrr��szEntry.scan_markcCs|j�|jdd|�dS)z�Adjust the view of the canvas to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark.r�r�Nr�r]rrrr��szEntry.scan_dragtocCs|j�|jdd|�dS)z9Adjust the end of the selection near the cursor to INDEX.rr�Nr�r�rrr�selection_adjust�szEntry.selection_adjustcCs|j�|jdd�dS)r�rr�Nr�r�rrrr
szEntry.selection_clearcCs|j�|jdd|�dS)�*Set the fixed end of a selection to INDEX.rr�Nr�r�rrr�selection_fromszEntry.selection_fromcCs|j�|j�|jdd��S)zSReturn True if there are characters selected in the entry, False
        otherwise.r�presentr)r�rrr�selection_presents�zEntry.selection_presentcCs|j�|jdd||�dS)�3Set the selection from START to END (not included).r�rangeNr��rer��endrrr�selection_rangeszEntry.selection_rangecCs|j�|jdd|�dS)�-Set the variable end of a selection to INDEX.rr�Nr�r�rrr�selection_toszEntry.selection_to)N)rArBrCrkr�r�r�r�r�r�r�r�r�r�r
r�r�r�r�Zselect_presentr�Zselect_ranger�r�rrrrr��s*
r�c@seZdZdZdifdd�ZdS)�FramezFFrame widget which may contain other widgets and can have a 3D border.NcKs^t||f�}d}d|kr,d|df}|d=nd|krFd|df}|d=t�||d|i|�dS)aConstruct a frame widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, class,
        colormap, container, cursor, height, highlightbackground,
        highlightcolor, highlightthickness, relief, takefocus, visual, width.rr�z-classr'rN)r+r�r�)rer�r&r�r~rrrr�&szFrame.__init__r�rrrrr�#sr�c@seZdZdZdifdd�ZdS)�Labelz0Label widget which can display text and bitmaps.NcKst�||d||�dS)a�Construct a label widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, activeforeground, anchor,
            background, bitmap, borderwidth, cursor,
            disabledforeground, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, image, justify,
            padx, pady, relief, takefocus, text,
            textvariable, underline, wraplength

        WIDGET-SPECIFIC OPTIONS

            height, state, width

        �labelNr�r�rrrr�:szLabel.__init__r�rrrrr�7sr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zd)dd�Zd*d
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZeZd+dd�ZeZdd �ZeZd,d!d"�ZeZd#d$�Zd%d&�Zd-d'd(�ZeZdS).�Listboxz3Listbox widget which can display a list of strings.NcKst�||d||�dS)a�Construct a listbox widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, cursor,
        exportselection, fg, font, foreground, height, highlightbackground,
        highlightcolor, highlightthickness, relief, selectbackground,
        selectborderwidth, selectforeground, selectmode, setgrid, takefocus,
        width, xscrollcommand, yscrollcommand, listvariable.ZlistboxNr�r�rrrr�RszListbox.__init__cCs|j�|jd|�dS)z"Activate item identified by INDEX.�activateNr�r�rrrr\szListbox.activatecCs|�|j�|jd|��pdS)zxReturn a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
        which encloses the item identified by the given index.r�Nr@r�rrrr�`szListbox.bboxcCs|�|j�|jd��pdS)z.Return the indices of currently selected item.�curselectionrr@r�rrrreszListbox.curselectioncCs|j�|jd||�dS)z+Delete items from FIRST to LAST (included).r�Nr�r�rrrr�iszListbox.deletecCs:|dk	r$|j�|j�|jd||��S|j�|jd|�SdS)z0Get list of items from FIRST to LAST (included).Nr�rgr�rrrr�ms�zListbox.getcCs*|j�|jd|�}|dkrdS|j�|�S)z+Return index of item identified with INDEX.r�r�N�r2r�r�r��rer�rgrrrr�usz
Listbox.indexcGs|j�|jd|f|�dS)zInsert ELEMENTS at INDEX.r�Nr�)rer��elementsrrrr�{szListbox.insertcCs|j�|j�|jd|��S)z5Get index of item which is nearest to y coordinate Y.�nearestr )rerVrrrrs
�zListbox.nearestcCs|j�|jdd||�dSr�r�r�rrrr��szListbox.scan_markcCs|j�|jdd||�dS)z�Adjust the view of the listbox to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark.r�r�Nr�r�rrrr��szListbox.scan_dragtocCs|j�|jd|�dS)z"Scroll such that INDEX is visible.�seeNr�r�rrrr�szListbox.seecCs|j�|jdd|�dS)z-Set the fixed end oft the selection to INDEX.rr�Nr�r�rrr�selection_anchor�szListbox.selection_anchorcCs|j�|jdd||�dS)z2Clear the selection from FIRST to LAST (included).rr�Nr�r�rrrr
�s
�zListbox.selection_clearcCs|j�|j�|jdd|��S)z.Return True if INDEX is part of the selection.rZincludesr)r�rrr�selection_includes�s�zListbox.selection_includescCs|j�|jdd||�dS)ziSet the selection from FIRST to LAST (included) without
        changing the currently selected elements.rr�Nr�r�rrr�
selection_set�szListbox.selection_setcCs|j�|j�|jd��S)z-Return the number of elements in the listbox.r�r r�rrrr��szListbox.sizecCs|j�|jdf|d|f�S)z4Return the resource value for an ITEM and an OPTION.r�r-r��rer�rrrrr��s�zListbox.itemcgetcKs|�d|f||�S)a9Configure resources of an ITEM.

        The values for resources are specified as keyword arguments.
        To get an overview about the allowed keyword arguments
        call the method without arguments.
        Valid resource names: background, bg, foreground, fg,
        selectbackground, selectforeground.r�r�r�rrrr��szListbox.itemconfigure)N)N)N)N)N)rArBrCrkr�rr�rr�r�r�r�rr�r�rrZ
select_anchorr
r�rZselect_includesr	Z
select_setr�r�r�r�rrrrr�Os2






r�c@seZdZdZdifdd�Zd6dd�Zdd	�Zifd
d�Zifdd
�Zifdd�Z	ifdd�Z
ifdd�Zifdd�Zifdd�Z
ifdd�Zifdd�Zifdd�Zifdd�Zifd d!�Zd7d"d#�Zd$d%�Zd8d&d'�ZeZd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�ZdS)9�MenuzPMenu widget which allows displaying menu bars, pull-down menus and pop-up menus.NcKst�||d||�dS)aAConstruct menu widget with the parent MASTER.

        Valid resource names: activebackground, activeborderwidth,
        activeforeground, background, bd, bg, borderwidth, cursor,
        disabledforeground, fg, font, foreground, postcommand, relief,
        selectcolor, takefocus, tearoff, tearoffcommand, title, type.�menuNr�r�rrrr��sz
Menu.__init__rZcCs|j�d|j|||�dS)z/Post the menu at position X,Y with entry ENTRY.�tk_popupNr�)rerUrVr�rrrr
�sz
Menu.tk_popupcCs|j�|jd|�dS)zActivate entry at INDEX.rNr�r�rrrr�sz
Menu.activatecKs$|j�|jd|f|�||��dS)rr�Nrh)rer�r&r�rrrr��s
�zMenu.addcKs|�d|p|�dS)zAdd hierarchical menu item.�cascadeN�r�r�rrr�add_cascade�szMenu.add_cascadecKs|�d|p|�dS)zAdd checkbutton menu item.r�Nrr�rrr�add_checkbutton�szMenu.add_checkbuttoncKs|�d|p|�dS)zAdd command menu item.rNrr�rrr�add_command�szMenu.add_commandcKs|�d|p|�dS)zAddd radio menu item.�radiobuttonNrr�rrr�add_radiobutton�szMenu.add_radiobuttoncKs|�d|p|�dS)zAdd separator.�	separatorNrr�rrr�
add_separator�szMenu.add_separatorcKs&|j�|jd||f|�||��dS)rr�Nrh)rer�r�r&r�rrrr��s
�zMenu.insertcKs|�|d|p|�dS)z$Add hierarchical menu item at INDEX.rN�r�r�rrr�insert_cascade�szMenu.insert_cascadecKs|�|d|p|�dS)z#Add checkbutton menu item at INDEX.r�Nrr�rrr�insert_checkbutton�szMenu.insert_checkbuttoncKs|�|d|p|�dS)zAdd command menu item at INDEX.rNrr�rrr�insert_command�szMenu.insert_commandcKs|�|d|p|�dS)zAddd radio menu item at INDEX.rNrr�rrr�insert_radiobutton
szMenu.insert_radiobuttoncKs|�|d|p|�dS)zAdd separator at INDEX.rNrr�rrr�insert_separator
szMenu.insert_separatorcCs�|dkr|}|�|�|�|�}}|dks2|dkr:d\}}t||d�D]0}d|�|�krHt|�|d��}|rH|�|�qH|j�|jd||�dS)z7Delete menu items between INDEX1 and INDEX2 (included).N)rrrrr�)	r�r��entryconfigr�	entrycgetr�r2r�r�)re�index1�index2Z
num_index1Z
num_index2rgr'rrrr�	
szMenu.deletecCs|j�|jd|d|�S)z=Return the resource value of a menu item for OPTION at INDEX.rr-r�r
rrrr
szMenu.entrycgetcKs|�d|f||�S)zConfigure a menu item at INDEX.�entryconfigurer�r�rrrr!
szMenu.entryconfigurecCs*|j�|jd|�}|dkrdS|j�|�S)z4Return the index of a menu item identified by INDEX.r�r�Nrrrrrr�#
sz
Menu.indexcCs|j�|jd|�S)zRInvoke a menu item identified by INDEX and execute
        the associated command.r�r�r�rrrr�)
szMenu.invokecCs|j�|jd||�dS)zDisplay a menu at position X,Y.�postNr�r�rrrr".
sz	Menu.postcCs|j�|jd|�S)z*Return the type of the menu item at INDEX.r r�r�rrrr 2
sz	Menu.typecCs|j�|jd�dS)z
Unmap a menu.�unpostNr�r�rrrr#6
szMenu.unpostcCs|j�|j�|jd|��S)zNReturn the x-position of the leftmost pixel of the menu item
        at INDEX.�	xpositionr r�rrrr$:
szMenu.xpositioncCs|j�|j�|jd|��S)zEReturn the y-position of the topmost pixel of the menu item at INDEX.�	ypositionr r�rrrr%?
s
�zMenu.yposition)rZ)N)N)rArBrCrkr�r
rr�rrrrrr�rrrrrr�rr!rr�r�r"r r#r$r%rrrrr�s6	


rc@seZdZdZdifdd�ZdS)�
Menubuttonz(Menubutton widget, obsolete since Tk8.0.NcKst�||d||�dS)N�
menubuttonr�r�rrrr�H
szMenubutton.__init__r�rrrrr&E
sr&c@seZdZdZdifdd�ZdS)�MessagezKMessage widget to display multiline text. Obsolete since Label does it too.NcKst�||d||�dS)N�messager�r�rrrr�O
szMessage.__init__r�rrrrr(L
sr(c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�RadiobuttonzGRadiobutton widget which shows only one of several buttons in on-state.NcKst�||d||�dS)a�Construct a radiobutton widget with the parent MASTER.

        Valid resource names: activebackground, activeforeground, anchor,
        background, bd, bg, bitmap, borderwidth, command, cursor,
        disabledforeground, fg, font, foreground, height,
        highlightbackground, highlightcolor, highlightthickness, image,
        indicatoron, justify, padx, pady, relief, selectcolor, selectimage,
        state, takefocus, text, textvariable, underline, value, variable,
        width, wraplength.rNr�r�rrrr�V
s
zRadiobutton.__init__cCs|j�|jd�dSr�r�r�rrrr�b
szRadiobutton.deselectcCs|j�|jd�dSr�r�r�rrrr�g
szRadiobutton.flashcCs|j�|jd�Sr�r�r�rrrr�k
szRadiobutton.invokecCs|j�|jd�dSr�r�r�rrrr�o
szRadiobutton.select)	rArBrCrkr�r�r�r�r�rrrrr*S
sr*c@s@eZdZdZdifdd�Zdd�Zdd�Zd
d	d
�Zdd�ZdS)�Scalez1Scale widget which can display a numerical scale.NcKst�||d||�dS)a�Construct a scale widget with the parent MASTER.

        Valid resource names: activebackground, background, bigincrement, bd,
        bg, borderwidth, command, cursor, digits, fg, font, foreground, from,
        highlightbackground, highlightcolor, highlightthickness, label,
        length, orient, relief, repeatdelay, repeatinterval, resolution,
        showvalue, sliderlength, sliderrelief, state, takefocus,
        tickinterval, to, troughcolor, variable, width.r�Nr�r�rrrr�w
s	zScale.__init__c
CsJ|j�|jd�}z|j�|�WStttfk
rD|j�|�YSXdS)z*Get the current value as integer or float.r�N)r2r�r�r�rvr#r�r�r�rrrr��
s
z	Scale.getcCs|j�|jd|�dS)zSet the value to VALUE.r�Nr�r�rrrr��
sz	Scale.setcCs|�|j�|jd|��S)z�Return a tuple (X,Y) of the point along the centerline of the
        trough that corresponds to VALUE or the current value if None is
        given.r�r@r�rrrr��
szScale.coordscCs|j�|jd||�S)zcReturn where the point X,Y lies. Valid return values are "slider",
        "though1" and "though2".�identifyr�r�rrrr,�
szScale.identify)N)	rArBrCrkr�r�r�r�r,rrrrr+t
s
r+c@sPeZdZdZdifdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�	Scrollbarz?Scrollbar widget which displays a slider at a certain position.NcKst�||d||�dS)alConstruct a scrollbar widget with the parent MASTER.

        Valid resource names: activebackground, activerelief,
        background, bd, bg, borderwidth, command, cursor,
        elementborderwidth, highlightbackground,
        highlightcolor, highlightthickness, jump, orient,
        relief, repeatdelay, repeatinterval, takefocus,
        troughcolor, width.Z	scrollbarNr�r�rrrr��
s	zScrollbar.__init__cCs|j�|jd|�pdS)a�Marks the element indicated by index as active.
        The only index values understood by this method are "arrow1",
        "slider", or "arrow2".  If any other value is specified then no
        element of the scrollbar will be active.  If index is not specified,
        the method returns the name of the element that is currently active,
        or None if no element is active.rNr�r�rrrr�
szScrollbar.activatecCs|j�|j�|jd||��S)znReturn the fractional change of the scrollbar setting if it
        would be moved by DELTAX or DELTAY pixels.rPr.)reZdeltaxZdeltayrrrrP�
s�zScrollbar.deltacCs|j�|j�|jd||��S)zRReturn the fractional value which corresponds to a slider
        position of X,Y.r�r.r�rrrr��
szScrollbar.fractioncCs|j�|jd||�S)zYReturn the element under position X,Y as one of
        "arrow1","slider","arrow2" or "".r,r�r�rrrr,�
szScrollbar.identifycCs|�|j�|jd��S)zZReturn the current fractional values (upper and lower end)
        of the slider position.r�)r|r2r�r�r�rrrr��
sz
Scrollbar.getcCs|j�|jd||�dS)ziSet the fractional values of the slider position (upper and
        lower ends as value between 0 and 1).r�Nr�r�rrrr��
sz
Scrollbar.set)N)rArBrCrkr�rrPr�r,r�r�rrrrr-�
s
	r-c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdkdd�Zdld
d�Z	dd�Z
dmdd�Zdd�Zdndd�Z
dd�Zdd�Zdd�Zdd�Zdodd �Zd!d"�Zdpd#d$�Zifd%d&�Zd'd(�Zd)d*�Zd+d,�Zdqd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zifd9d:�Zd;d<�Z d=d>�Z!d?d@�Z"dAdB�Z#drdCdD�Z$dEdF�Z%dGdH�Z&dsdIdJ�Z'dtdKdL�Z(dMdN�Z)dudOdP�Z*e*Z+dQdR�Z,dvdSdT�Z-dwdUdV�Z.dxdWdX�Z/dydYdZ�Z0dzd[d\�Z1d]d^�Z2d{d_d`�Z3dadb�Z4d|dcdd�Z5e5Z6ifdedf�Z7dgdh�Z8didj�Z9dS)}�Textz4Text widget which can display text in various forms.NcKst�||d||�dS)a�Construct a text widget with the parent MASTER.

        STANDARD OPTIONS

            background, borderwidth, cursor,
            exportselection, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, insertbackground,
            insertborderwidth, insertofftime,
            insertontime, insertwidth, padx, pady,
            relief, selectbackground,
            selectborderwidth, selectforeground,
            setgrid, takefocus,
            xscrollcommand, yscrollcommand,

        WIDGET-SPECIFIC OPTIONS

            autoseparators, height, maxundo,
            spacing1, spacing2, spacing3,
            state, tabs, undo, width, wrap,

        r�Nr�r�rrrr��
sz
Text.__init__cCs|�|j�|jd|��pdS)z�Return a tuple of (x,y,width,height) which gives the bounding
        box of the visible part of the character at the given index.r�Nr@r�rrrr��
s
��z	Text.bboxc	Cs|j�|j�|jd|||��S)z�Return whether between index INDEX1 and index INDEX2 the
        relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=.�comparer))rer�opr rrrr/�
s�zText.comparecGsVdd�|D�}|||g7}|jj|jdf|��p2d}|dk	rNt|�dkrN|fS|SdS)a�Counts the number of relevant things between the two indices.
        If index1 is after index2, the result will be a negative number
        (and this holds for each of the possible options).

        The actual items which are counted depends on the options given by
        args. The result is a list of integers, one for the result of each
        counting option given. Valid counting options are "chars",
        "displaychars", "displayindices", "displaylines", "indices",
        "lines", "xpixels" and "ypixels". There is an additional possible
        option "update", which if given then all subsequent options ensure
        that any possible out of date information is recalculated.cSsg|]}|�d�sd|�qS)r-r�)�
startswith)rJ�argrrrr�s
zText.count.<locals>.<listcomp>r{N�)r2r�r�r)rerr r�rrrrr{�
sz
Text.countcCs6|dkr |j�|j�|jd��S|j�|jd|�dS)zjTurn on the internal consistency checks of the B-Tree inside the text
        widget according to BOOLEAN.N�debugr)r�rrrr4	sz
Text.debugcCs|j�|jd||�dS)z?Delete the characters between INDEX1 and INDEX2 (not included).r�Nr��rerr rrrr�szText.deletecCs|�|j�|jd|��S)z�Return tuple (x,y,width,height,baseline) giving the bounding box
        and baseline position of the visible part of the line containing
        the character at INDEX.�	dlineinfor@r�rrrr6szText.dlineinfoc
	Ks�g}d}d}|s$g}|fdd�}|}zzt|t�s>|�|�}}|d|g7}|D]}	||	rN|�d|	�qN|�|�|r�|�|�|jj|jdf|��|W�S|r�|�|�XdS)a�Return the contents of the widget between index1 and index2.

        The type of contents returned in filtered based on the keyword
        parameters; if 'all', 'image', 'mark', 'tag', 'text', or 'window' are
        given and true, then the corresponding items are returned. The result
        is a list of triples of the form (key, value, index). If none of the
        keywords are true then 'all' is used by default.

        If the 'command' argument is given, it is called once for each element
        of the list of triples, with the values of each triple serving as the
        arguments to the function. In this case the list is not returned.NcSs|�|||f�dSr�)rc)r6r
r�r$rrr�
append_triple/sz Text.dump.<locals>.append_triplez-commandr-�dump)r�rrr�rcr2r�r�)
rerr rr�r�Z	func_namer$r7r6rrrr8s*


z	Text.dumpcGs|jj|jdf|��S)arInternal method

        This method controls the undo mechanism and
        the modified flag. The exact behavior of the
        command depends on the option argument that
        follows the edit argument. The following forms
        of the command are currently supported:

        edit_modified, edit_redo, edit_reset, edit_separator
        and edit_undo

        �editr�r�rrrr9Bs
z	Text.editcCs|�d|�S)a;Get or Set the modified flag

        If arg is not specified, returns the modified
        flag of the widget. The insert, delete, edit undo and
        edit redo commands or the user can set or clear the
        modified flag. If boolean is specified, sets the
        modified flag of the widget to arg.
        Zmodified�r9)rer2rrr�
edit_modifiedQs	zText.edit_modifiedcCs
|�d�S)aRedo the last undone edit

        When the undo option is true, reapplies the last
        undone edits provided no other edits were done since
        then. Generates an error when the redo stack is empty.
        Does nothing when the undo option is false.
        Zredor:r�rrr�	edit_redo\szText.edit_redocCs
|�d�S)z(Clears the undo and redo stacks
        �resetr:r�rrr�
edit_resetfszText.edit_resetcCs
|�d�S)znInserts a separator (boundary) on the undo stack.

        Does nothing when the undo option is false
        rr:r�rrr�edit_separatorkszText.edit_separatorcCs
|�d�S)aDUndoes the last edit action

        If the undo option is true. An edit action is defined
        as all the insert and delete commands that are recorded
        on the undo stack in between two separators. Generates
        an error when the undo stack is empty. Does nothing
        when the undo option is false
        Zundor:r�rrr�	edit_undors	zText.edit_undocCs|j�|jd||�S)z5Return the text from INDEX1 to INDEX2 (not included).r�r�r5rrrr�}szText.getcCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)z9Return the value of OPTION of an embedded image at INDEX.Nrr-rr�r�r�r�r
rrr�
image_cget�s
zText.image_cgetcKs|�dd|f||�S)z%Configure an embedded image at INDEX.r�r�r�r�rrr�image_configure�szText.image_configurecKs"|jj|jdd|f|�||���S)z"Create an embedded image at INDEX.r�r?rhr�rrr�image_create�s�
�zText.image_createcCs|j�|jdd�S)z3Return all names of embedded images in this widget.r�r�r�r�rrrr��szText.image_namescCst|j�|jd|��S)z1Return the index in the form line.char for INDEX.r�)rr2r�r�r�rrrr��sz
Text.indexcGs|j�|jd||f|�dS)z�Insert CHARS before the characters at INDEX. An additional
        tag can be given in ARGS. Additional CHARS and tags can follow in ARGS.r�Nr�)rer��charsr�rrrr��szText.insertcCs|j�|jdd||f�S)z�Change the gravity of a mark MARKNAME to DIRECTION (LEFT or RIGHT).
        Return the current value if None is given for DIRECTION.r�Zgravityr�)re�markName�	directionrrr�mark_gravity�s�zText.mark_gravitycCs|j�|j�|jdd��S)zReturn all mark names.r�r�rgr�rrr�
mark_names�s
�zText.mark_namescCs|j�|jdd||�dS)z0Set mark MARKNAME before the character at INDEX.r�r�Nr�)rerEr�rrr�mark_set�sz
Text.mark_setcGs|j�|jddf|�dS)zDelete all marks in MARKNAMES.r�ZunsetNr�)reZ	markNamesrrr�
mark_unset�szText.mark_unsetcCs|j�|jdd|�pdS)z-Return the name of the next mark after INDEX.r��nextNr�r�rrr�	mark_next�szText.mark_nextcCs|j�|jdd|�pdS)z2Return the name of the previous mark before INDEX.r�ZpreviousNr�r�rrr�
mark_previous�szText.mark_previouscKs&|jj|jdd|f|�||���dS)aCreates a peer text widget with the given newPathName, and any
        optional standard configuration options. By default the peer will
        have the same start and end line as the parent widget, but
        these can be overridden with the standard configuration options.�peerr?Nrh)reZnewPathNamer&r�rrr�peer_create�s
�zText.peer_createcCs|j�|j�|jdd��S)zYReturns a list of peers of this widget (this does not include
        the widget itself).rNr�rgr�rrr�
peer_names�szText.peer_namescGs |jj|jd|||f|��dS)z�Replaces the range of characters between index1 and index2 with
        the given characters and tags specified by args.

        See the method insert for some more information about args, and the
        method delete for information about the indices.rNr�)rerr rDr�rrrr�szText.replacecCs|j�|jdd||�dSr�r�r�rrrr��szText.scan_markcCs|j�|jdd||�dS)z~Adjust the view of the text to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark.r�r�Nr�r�rrrr��szText.scan_dragtocCs�|jdg}|r|�d�|r&|�d�|r4|�d�|rB|�d�|rP|�d�|
r^|�d�|	rv|�d�|�|	�|r�|d	d
kr�|�d�|�|�|�|�|r�|�|�t|j�t|���S)z�Search PATTERN beginning from INDEX until STOPINDEX.
        Return the index of the first character of a match or an
        empty string.rz	-forwardsz
-backwardsz-exactz-regexpz-nocasez-elidez-countrr-r�)r�rcrr2r�r)rerr�Z	stopindexZforwardsZ	backwards�exactZregexpZnocaser{Zelider�rrrr�s.












zText.searchcCs|j�|jd|�dS)z3Scroll such that the character at INDEX is visible.rNr�r�rrrr�szText.seecGs |j�|jdd||f|�dS)z|Add tag TAGNAME to all characters between INDEX1 and index2 in ARGS.
        Additional pairs of indices may follow in ARGS.�tagr�Nr�)re�tagNamerr�rrr�tag_add�s�zText.tag_addcCs*|j�|jdd||d�|r&|�|�dS)zgUnbind for all characters with TAGNAME for event SEQUENCE  the
        function identified with FUNCID.rRrorZNrr)rerSrkrmrrrr��szText.tag_unbindcCs|�|jdd|f|||�S)a+Bind to all characters with TAGNAME at event SEQUENCE a call to function FUNC.

        An additional boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or whether it will
        replace the previous function. See bind for the return value.rRrorp)rerSrkr�r�rrrr�s
�z
Text.tag_bindcCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)z+Return the value of OPTION for tag TAGNAME.Nrr-rr�rRr�r�)rerSrrrr�tag_cget	s
z
Text.tag_cgetcKs|�dd|f||�S)zConfigure a tag TAGNAME.rRr�r�)rerSr&r�rrr�
tag_configureszText.tag_configurecGs|j�|jddf|�dS)zDelete all tags in TAGNAMES.rRr�Nr�)reZtagNamesrrr�
tag_deleteszText.tag_deletecCs|j�|jdd||�dS)z`Change the priority of tag TAGNAME such that it is lower
        than the priority of BELOWTHIS.rRrNr�)rerSrrrrr�szText.tag_lowercCs|j�|j�|jdd|��S)zReturn a list of all tag names.rRr�rgr�rrr�	tag_names s�zText.tag_namesc
Cs |j�|j�|jdd|||��S)z�Return a list of start and end index for the first sequence of
        characters between INDEX1 and INDEX2 which all have tag TAGNAME.
        The text is searched forward from INDEX1.rRZ	nextrangerg�rerSrr rrr�
tag_nextrange%s�zText.tag_nextrangec
Cs |j�|j�|jdd|||��S)z�Return a list of start and end index for the first sequence of
        characters between INDEX1 and INDEX2 which all have tag TAGNAME.
        The text is searched backwards from INDEX1.rRZ	prevrangergrYrrr�
tag_prevrange,s�zText.tag_prevrangecCs|j�|jdd||�dS)zaChange the priority of tag TAGNAME such that it is higher
        than the priority of ABOVETHIS.rRrNr�)rerSrrrrr�3s�zText.tag_raisecCs|j�|j�|jdd|��S)z7Return a list of ranges of text which have tag TAGNAME.rRZrangesrg)rerSrrr�
tag_ranges9s�zText.tag_rangescCs|j�|jdd|||�dS)zARemove tag TAGNAME from all characters between INDEX1 and INDEX2.rRr�Nr�rYrrr�
tag_remove>s�zText.tag_removecCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)z:Return the value of OPTION of an embedded window at INDEX.Nrr-rr�r�r�r�r
rrr�window_cgetCs
zText.window_cgetcKs|�dd|f||�S)z&Configure an embedded window at INDEX.r�r�r�r�rrr�window_configureKszText.window_configurecKs&|j�|jdd|f|�||��dS)zCreate a window at INDEX.r�r?Nrhr�rrr�
window_createQs

��zText.window_createcCs|j�|j�|jdd��S)z4Return all names of embedded windows in this widget.r�r�rgr�rrr�window_namesWs�zText.window_namescGs|j�|jddf|�dS)zObsolete function, use see.r�z
-pickplaceNr�)rerprrr�yview_pickplace\szText.yview_pickplace)N)N)NN)N)N)N)N)NNNNNNNN)N)N)N)N)N)N)N)N)N)N):rArBrCrkr�r�r/r{r4r�r6r8r9r;r<r>r?r@r�rArBrCr�r�r�rGrHrIrJrLrMrOrPrr�r�rrrTr�r�rUrVZ
tag_configrWr�rXrZr[r�r\r]r^r_Z
window_configr`rarbrrrrr.�
s~


(




�


	







r.c@s"eZdZdZddd�Zdd�ZdS)�_setitz>Internal class. It wraps the command in the widget OptionMenu.NcCs||_||_||_dSr�)�
_setit__value�_setit__var�_setit__callback)re�varr
r�rrrr�dsz_setit.__init__cGs*|j�|j�|jr&|j|jf|��dSr�)rer�rdrfr�rrrr�isz_setit.__call__)Nr�rrrrrcas
rcc@s(eZdZdZdd�Zdd�Zdd�ZdS)	�
OptionMenuz?OptionMenu which allows the user to select a value from a menu.c
Os�d|dtddd�}t�||d|�d|_t|ddd	�}|_|j|_|�d
�}d
|kr\|d
=|rtt	dt
t|����|j|t
|||�d�|D]}	|j|	t
||	|�d�q�||d<d
S)z�Construct an optionmenu widget with the parent MASTER, with
        the resource textvariable set to VARIABLE, the initially selected
        value VALUE, the other menu values VALUES and an additional
        keyword argument command.r,rr')ZborderwidthZtextvariableZindicatoronZreliefr�Zhighlightthicknessr'Z
tk_optionMenurr)rYZtearoffrzunknown option -)r�rN)ZRAISEDr�r�r}r�_OptionMenu__menur�Zmenunamer�r�rKr0rrc)
rer�r�r
rQ�kwargsr�rr�r*rrrr�rs.�

�
�zOptionMenu.__init__cCs|dkr|jSt�||�S)Nr)rir�r�r�rrrr��szOptionMenu.__getitem__cCst�|�d|_dS)z,Destroy this widget and the associated menu.N)r&r�rir�rrrr��s
zOptionMenu.destroyN)rArBrCrkr�r�r�rrrrrhosrhc@sheZdZdZdZdidfdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
e
Zdd�Zdd�Z
dd�ZdS)�ImagezBase class for images.rNc	Ks�d|_|std�}t|d|�|_|s>tjd7_dtjf}|rT|rTt||f�}n|r\|}d}|��D]*\}}t|�r�|�	|�}|d||f}qh|j�
dd||f|�||_dS)	Nzcreate imager2rz	pyimage%rrr-r�r?)rYrrr`r2rk�_last_idr+r%r�r�r�)	reZimgtyperYr&r�r�r�r)r*rrrr��s$
zImage.__init__cCs|jSr�)rYr�rrrrF��z
Image.__str__cCs6|jr2z|j�dd|j�Wntk
r0YnXdS)Nr�r�)rYr2r�r�r�rrrr��s
z
Image.__del__cCs|j�|jdd||�dS�Nr�r-�r2r�rYr�rrrr��szImage.__setitem__cCs|j�|jdd|�Srnror�rrrr��szImage.__getitem__cKsvd}t|���D]J\}}|dk	r|ddkr8|dd�}t|�rJ|�|�}|d||f}q|j�|jdf|�dS)zConfigure the image.rNrr�r-r�)r+r%r�r�r2r�rY)rer�rr)r*rrrr��s
zImage.configurecCs|j�|j�dd|j��S)zReturn the height of the image.r�rX�r2r�r�rYr�rrrrX�s�zImage.heightcCs|j�dd|j�S)z7Return the type of the image, e.g. "photo" or "bitmap".r�r ror�rrrr �sz
Image.typecCs|j�|j�dd|j��S)zReturn the width of the image.r�rWrpr�rrrrW�s�zImage.width)rArBrCrkrlr�rFr�r�r�r�r�rXr rWrrrrrk�srkc@s�eZdZdZdidfdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	ddd�Z
dd�Zddd�Zddd�Z
dd�Zdd�ZdS) �
PhotoImagez=Widget which can display images in PGM, PPM, GIF, PNG format.NcKstj|d|||f|�dS)ztCreate an image with NAME.

        Valid resource names: data, format, file, gamma, height, palette,
        width.ZphotoN�rkr��rerYr&r�r�rrrr��szPhotoImage.__init__cCs|j�|jd�dS)zDisplay a transparent image.�blankNror�rrrrt�szPhotoImage.blankcCs|j�|jdd|�S)zReturn the value of OPTION.r�r-ro)rerrrrr��szPhotoImage.cgetcCs|j�|jdd|�S)Nr�r-ror�rrrr��szPhotoImage.__getitem__cCs"t|jd�}|j�|d|j�|S)z;Return a new PhotoImage with the same image as this widget.r��copy�rqr2r�rY)re�	destImagerrrru�szPhotoImage.copyrZcCs4t|jd�}|dkr|}|j�|d|jd||�|S)z�Return a new PhotoImage with the same image as this widget
        but zoom it with a factor of x in the X direction and y in the Y
        direction.  If y is not given, the default value is the same as x.
        r�rZruz-zoomrv�rerUrVrwrrr�zoom�s
zPhotoImage.zoomcCs4t|jd�}|dkr|}|j�|d|jd||�|S)z�Return a new PhotoImage based on the same image as this widget
        but use only every Xth or Yth pixel.  If y is not given, the
        default value is the same as x.
        r�rZruz
-subsamplervrxrrr�	subsample�s
zPhotoImage.subsamplecCs|j�|jd||�S)z8Return the color (red, green, blue) of the pixel at X,Y.r�ror�rrrr�	szPhotoImage.getcCsH|jd|f}|r8|ddkr(|dd�}|dt|�}|j�|�dS)zzPut row formatted colors to image starting from
        position TO, e.g. image.put("{red green} {blue yellow}", to=(4,6))�putr�-torN)r|�rYrr2r�)rer�r�r�rrrr{
szPhotoImage.putcCs@|jd|f}|r|d|f}|r0|dt|�}|j�|�dS)zRWrite image to file FILENAME in FORMAT starting from
        position FROM_COORDS.�writez-format)z-fromNr})re�filename�formatZfrom_coordsr�rrrr~szPhotoImage.writec	Cs|j�|j�|jdd||��S)z/Return True if the pixel at x,y is transparent.�transparencyr�)r2r�r�rYr�rrr�transparency_get"s�zPhotoImage.transparency_getcCs|j�|jdd|||�dS)z)Set the transparency of the pixel at x,y.r�r�Nro)rerUrVr�rrr�transparency_set'szPhotoImage.transparency_set)rZ)rZ)N)NN)rArBrCrkr�rtr�r�ruryrzr�r{r~r�r�rrrrrq�s






rqc@s eZdZdZdidfdd�ZdS)�BitmapImagez.Widget which can display images in XBM format.NcKstj|d|||f|�dS)zqCreate a bitmap with NAME.

        Valid resource names: background, data, file, foreground, maskdata, maskfile.rNrrrsrrrr�/szBitmapImage.__init__r�rrrrr�,sr�cCstd�j}|�|�dd��S)Nzuse image_names()r�r��rrr2r.r��r2rrrr�6s
r�cCstd�j}|�|�dd��S)Nzuse image_types()r�r�r�r�rrrr�;s
r�c@s�eZdZdZdifdd�Zdd�Zd+dd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd,d!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�ZdS)-�Spinboxzspinbox widget.NcKst�||d||�dS)a�Construct a spinbox widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, background, borderwidth,
            cursor, exportselection, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, insertbackground,
            insertborderwidth, insertofftime,
            insertontime, insertwidth, justify, relief,
            repeatdelay, repeatinterval,
            selectbackground, selectborderwidth
            selectforeground, takefocus, textvariable
            xscrollcommand.

        WIDGET-SPECIFIC OPTIONS

            buttonbackground, buttoncursor,
            buttondownrelief, buttonuprelief,
            command, disabledbackground,
            disabledforeground, format, from,
            invalidcommand, increment,
            readonlybackground, state, to,
            validate, validatecommand values,
            width, wrap,
        ZspinboxNr�r�rrrr�CszSpinbox.__init__cCs|�|j�|jd|��pdS)a�Return a tuple of X1,Y1,X2,Y2 coordinates for a
        rectangle which encloses the character given by index.

        The first two elements of the list give the x and y
        coordinates of the upper-left corner of the screen
        area covered by the character (in pixels relative
        to the widget) and the last two elements give the
        width and height of the character, in pixels. The
        bounding box may refer to a region outside the
        visible area of the window.
        r�Nr@r�rrrr�`szSpinbox.bboxcCs|j�|jd||�S)aWDelete one or more elements of the spinbox.

        First is the index of the first character to delete,
        and last is the index of the character just after
        the last one to delete. If last isn't specified it
        defaults to first+1, i.e. a single character is
        deleted.  This command returns an empty string.
        r�r�r�rrrr�ns	zSpinbox.deletecCs|j�|jd�S)zReturns the spinbox's stringr�r�r�rrrr�yszSpinbox.getcCs|j�|jd|�S)z�Alter the position of the insertion cursor.

        The insertion cursor will be displayed just before
        the character given by index. Returns an empty string
        r�r�r�rrrr�}szSpinbox.icursorcCs|j�|jd||�S)z{Returns the name of the widget at position x, y

        Return value is one of: none, buttondown, buttonup, entry
        r,r�r�rrrr,�szSpinbox.identifycCs|j�|jd|�S)z;Returns the numerical index corresponding to index
        r�r�r�rrrr��sz
Spinbox.indexcCs|j�|jd||�S)zDInsert string s at index

         Returns an empty string.
        r�r�)rer�rfrrrr��szSpinbox.insertcCs|j�|jd|�S)z�Causes the specified element to be invoked

        The element could be buttondown or buttonup
        triggering the action associated with it.
        r�r��re�elementrrrr��szSpinbox.invokecGs |�|j�|jdf|��pdS)rr�rr@r�rrrr��s
��zSpinbox.scancCs|�d|�S)z�Records x and the current view in the spinbox window;

        used in conjunction with later scan dragto commands.
        Typically this command is associated with a mouse button
        press in the widget. It returns an empty string.
        r��r�r]rrrr��szSpinbox.scan_markcCs|�d|�S)a�Compute the difference between the given x argument
        and the x argument to the last scan mark command

        It then adjusts the view left or right by 10 times the
        difference in x-coordinates. This command is typically
        associated with mouse motion events in the widget, to
        produce the effect of dragging the spinbox at high speed
        through the window. The return value is an empty string.
        r�r�r]rrrr��s
zSpinbox.scan_dragtocGs |�|j�|jdf|��pdS)rrrr@r�rrrr�s
��zSpinbox.selectioncCs|�d|�S)a�Locate the end of the selection nearest to the character
        given by index,

        Then adjust that end of the selection to be at index
        (i.e including but not going beyond index). The other
        end of the selection is made the anchor point for future
        select to commands. If the selection isn't currently in
        the spinbox, then a new selection is created to include
        the characters between index and the most recent selection
        anchor point, inclusive.
        r��rr�rrrr��szSpinbox.selection_adjustcCs
|�d�S)zsClear the selection

        If the selection isn't in this widget then the
        command has no effect.
        r�r�r�rrrr
�szSpinbox.selection_clearcCs|j�|jdd|�S)z�Sets or gets the currently selected element.

        If a spinbutton element is specified, it will be
        displayed depressed.
        rr�r�r�rrr�selection_element�szSpinbox.selection_elementcCs|�d|�dS)r�r�Nr�r�rrrr��szSpinbox.selection_fromcCs|j�|j�|jdd��S)zUReturn True if there are characters selected in the spinbox, False
        otherwise.rr�r)r�rrrr��s�zSpinbox.selection_presentcCs|�d||�dS)r�r�Nr�r�rrrr��szSpinbox.selection_rangecCs|�d|�dS)r�r�Nr�r�rrrr��szSpinbox.selection_to)N)N)rArBrCrkr�r�r�r�r�r,r�r�r�r�r�r�rr�r
r�r�r�r�r�rrrrr�@s*
	
r�c@seZdZdZdifdd�ZdS)�
LabelFramezlabelframe widget.NcKst�||d||�dS)a�Construct a labelframe widget with the parent MASTER.

        STANDARD OPTIONS

            borderwidth, cursor, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, padx, pady, relief,
            takefocus, text

        WIDGET-SPECIFIC OPTIONS

            background, class, colormap, container,
            height, labelanchor, labelwidget,
            visual, width
        Z
labelframeNr�r�rrrr��szLabelFrame.__init__r�rrrrr��sr�c@s�eZdZdZdifdd�Zdd�Zdd�ZeZd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd!dd�ZeZdd �ZdS)"�PanedWindowzpanedwindow widget.NcKst�||d||�dS)aTConstruct a panedwindow widget with the parent MASTER.

        STANDARD OPTIONS

            background, borderwidth, cursor, height,
            orient, relief, width

        WIDGET-SPECIFIC OPTIONS

            handlepad, handlesize, opaqueresize,
            sashcursor, sashpad, sashrelief,
            sashwidth, showhandle,
        ZpanedwindowNr�r�rrrr�
szPanedWindow.__init__cKs"|j�|jd|f|�|��dS)a+Add a child widget to the panedwindow in a new pane.

        The child argument is the name of the child widget
        followed by pairs of arguments that specify how to
        manage the windows. The possible options and values
        are the ones accepted by the paneconfigure method.
        r�Nrh)rer%r�rrrr�szPanedWindow.addcCs|j�|jd|�dS)z�Remove the pane containing child from the panedwindow

        All geometry management options for child will be forgotten.
        rNr�)rer%rrrr�'szPanedWindow.removecCs|j�|jd||�S)a�Identify the panedwindow component at point x, y

        If the point is over a sash or a sash handle, the result
        is a two element list containing the index of the sash or
        handle, and a word indicating whether it is over a sash
        or a handle, such as {0 sash} or {2 handle}. If the point
        is over any other part of the panedwindow, the result is
        an empty list.
        r,r�r�rrrr,0s
zPanedWindow.identifycGs |�|j�|jdf|��pdS)r�proxyrr@r�rrrr�<s
��zPanedWindow.proxycCs
|�d�S)zBReturn the x and y pair of the most recent proxy location
        �coord�r�r�rrr�proxy_coordAszPanedWindow.proxy_coordcCs
|�d�S)z+Remove the proxy from the display.
        rr�r�rrr�proxy_forgetFszPanedWindow.proxy_forgetcCs|�d||�S)z:Place the proxy at the given x and y coordinates.
        r�r�r�rrr�proxy_placeKszPanedWindow.proxy_placecGs |�|j�|jdf|��pdS)r�sashrr@r�rrrr�Ps
��zPanedWindow.sashcCs|�d|�S)aAReturn the current x and y pair for the sash given by index.

        Index must be an integer between 0 and 1 less than the
        number of panes in the panedwindow. The coordinates given are
        those of the top left corner of the region containing the sash.
        pathName sash dragto index x y This command computes the
        difference between the given coordinates and the coordinates
        given to the last sash coord command for the given sash. It then
        moves that sash the computed difference. The return value is the
        empty string.
        r��r�r�rrr�
sash_coordUszPanedWindow.sash_coordcCs|�d|�S)zRecords x and y for the sash given by index;

        Used in conjunction with later dragto commands to move the sash.
        r�r�r�rrr�	sash_markcszPanedWindow.sash_markcCs|�d|||�S)z?Place the sash given by index at the given coordinates
        r�r�)rer�rUrVrrr�
sash_placejszPanedWindow.sash_placecCs|j�|jdf|d|f�S)zwQuery a management option for window.

        Option may be any value allowed by the paneconfigure subcommand
        �panecgetr-r�)rer%rrrrr�os�zPanedWindow.panecgetcKsd|dkr|s|�|jd|�St|t�r@|s@|�|jd|d|�S|j�|jd|f|�||��dS)a�
Query or modify the management options for window.

        If no option is specified, returns a list describing all
        of the available options for pathName.  If option is
        specified with no value, then the command returns a list
        describing the one named option (this list will be identical
        to the corresponding sublist of the value returned if no
        option is specified). If one or more option-value pairs are
        specified, then the command modifies the given widget
        option(s) to have the given value(s); in this case the
        command returns an empty string. The following options
        are supported:

        after window
            Insert the window after the window specified. window
            should be the name of a window already managed by pathName.
        before window
            Insert the window before the window specified. window
            should be the name of a window already managed by pathName.
        height size
            Specify a height for the window. The height will be the
            outer dimension of the window including its border, if
            any. If size is an empty string, or if -height is not
            specified, then the height requested internally by the
            window will be used initially; the height may later be
            adjusted by the movement of sashes in the panedwindow.
            Size may be any value accepted by Tk_GetPixels.
        minsize n
            Specifies that the size of the window cannot be made
            less than n. This constraint only affects the size of
            the widget in the paned dimension -- the x dimension
            for horizontal panedwindows, the y dimension for
            vertical panedwindows. May be any value accepted by
            Tk_GetPixels.
        padx n
            Specifies a non-negative value indicating how much
            extra space to leave on each side of the window in
            the X-direction. The value may have any of the forms
            accepted by Tk_GetPixels.
        pady n
            Specifies a non-negative value indicating how much
            extra space to leave on each side of the window in
            the Y-direction. The value may have any of the forms
            accepted by Tk_GetPixels.
        sticky style
            If a window's pane is larger than the requested
            dimensions of the window, this option may be used
            to position (or stretch) the window within its pane.
            Style is a string that contains zero or more of the
            characters n, s, e or w. The string can optionally
            contains spaces or commas, but they are ignored. Each
            letter refers to a side (north, south, east, or west)
            that the window will "stick" to. If both n and s
            (or e and w) are specified, the window will be
            stretched to fill the entire height (or width) of
            its cavity.
        width size
            Specify a width for the window. The width will be
            the outer dimension of the window including its
            border, if any. If size is an empty string, or
            if -width is not specified, then the width requested
            internally by the window will be used initially; the
            width may later be adjusted by the movement of sashes
            in the panedwindow. Size may be any value accepted by
            Tk_GetPixels.

        N�
paneconfigurer-)r�r�rrr�r2r�r�r�rrrr�wsD�
�zPanedWindow.paneconfigurecCs|j�|j�|jd��S)z+Returns an ordered list of the child panes.�panesrgr�rrrr��szPanedWindow.panes)N)rArBrCrkr�r�r�rr,r�r�r�r�r�r�r�r�r�r�Z
paneconfigr�rrrrr�
s$

Lr�cCs�t�}dt}|d7}t||d�}|��t|d|fdd�d�}|��||_t|d|jd�}|��|��|��|�	�|�
�dS)	NzThis is Tcl/Tk version %su
This should be a cedilla: ç�r�z	Click me!cSs|jjd|jdd�S)Nz[%s]r�r�)�testr�)rqrrr�<lambda>�s�z_test.<locals>.<lambda>)r�rZQUIT)ro�
TclVersionr�r�rDr�r�rr!rr�)rqr�r�r�rzrrr�_test�s 
�r��__main__)TN)N)r)r)NNror)Vrk�enumr�r�r�Ztkinter.constants�rer@�floatrOZ	TkVersionrPr�ZREADABLEZWRITABLEZ	EXCEPTION�compiler�ASCIIrr
rrr"r+r7r�Enumr8rGrlrmrnrrruryr�rzr�r�r�r�r�rar�r�r�r�r�r�r�r�rorfrgrprurzr�r�rDr�r�r�r�r�r�rr&r(r*r+r-r.rcrhrkrqr�r�r�r�r�r�r�rArrrr�<module>s� 





,R

	6

q2~
.37?/8$Vt!'2'BT
3C
PK�(�Z��00+__pycache__/filedialog.cpython-38.opt-1.pycnu�[���U

e5d�8�@sdZddlTddlmZddlmZddlmZddlZddlZiZ	Gdd�d�Z
Gd	d
�d
e
�ZGdd�de
�ZGd
d�dej�Z
Gdd�de
�ZGdd�de
�ZGdd�dej�Zdd�Zdd�Zdd�Zd(dd�Zd)dd�Zd*d!d"�Zd#d$�Zd%d&�Zed'k�re�dS)+aUFile selection dialog classes.

Classes:

- FileDialog
- LoadFileDialog
- SaveFileDialog

This module also presents tk common file dialogues, it provides interfaces
to the native file dialogues available in Tk 4.2 and newer, and the
directory dialogue available in Tk 8.3 and newer.
These interfaces were written by Fredrik Lundh, May 1997.
�)�*)�Dialog)�commondialog)�
_setup_dialogNc@s�eZdZdZdZd$dd�Zejdddfdd	�Zd%d
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd&dd�Zdd�Zdd�Zd'dd�Zd d!�Zd"d#�ZdS)(�
FileDialoga�Standard file selection dialog -- no checks on selected file.

    Usage:

        d = FileDialog(master)
        fname = d.go(dir_or_file, pattern, default, key)
        if fname is None: ...canceled...
        else: ...open file...

    All arguments to go() are optional.

    The 'key' argument specifies a key in the global dictionary
    'dialogstates', which keeps track of the values for the directory
    and pattern arguments, overriding the values passed in (it does
    not keep track of the default argument!).  If no key is specified,
    the dialog keeps no memory of previous state.  Note that memory is
    kept even when the dialog is canceled.  (All this emulates the
    behavior of the Macintosh file selection dialogs.)

    zFile Selection DialogNcCs�|dkr|j}||_d|_t|�|_|j�|�|j�|�t|j�t|j�|_|jj	t
td�t|j�|_
|j
j	t
td�|j
�d|j�t|j�|_|jj	ttd�|j�d|j�t|j�|_|jj	ttd�t|j�|_|jj	ttd�t|jd|jdfd�|_|jj	tttd�|j��}|j�|dd�|dd��|j�d	|j�|j�d
|j�|jj|jdfd�t|j�|_ |j j	t!td�t|jd|j dfd�|_"|j"j	t!ttd�|j j|j"dfd�|j"��}|j"�|dd�|dd��|j"�d	|j#�|j"�d
|j$�t%|jd
|j&d�|_'|j'j	t!d�t%|jd|jd�|_(|j(j	t!td�t%|jd|j)d�|_*|j*j	td�|j�+d|j)�|j�d|j)�|j�d|j)�dS)N)�side�fillz<Return>)�expandrr�set)ZexportselectionZyscrollcommand)rr	r�z<ButtonRelease-1>z<Double-ButtonRelease-1>Zyview)�commandZOK)�textr)rZFilter)rr	�CancelZWM_DELETE_WINDOWz<Alt-w>z<Alt-W>),�title�master�	directoryZToplevel�topZiconnamerZFrameZbotframeZpackZBOTTOM�XZEntry�	selectionZbind�ok_event�filterZTOP�filter_commandZmidframeZYESZBOTHZ	ScrollbarZfilesbarZRIGHT�YZListbox�filesZbindtags�files_select_event�files_double_eventZconfigZdirsbarZLEFT�dirs�dirs_select_event�dirs_double_eventZButton�
ok_commandZ	ok_buttonZ
filter_button�cancel_commandZ
cancel_buttonZprotocol)�selfrrZbtags�r"�*/usr/lib64/python3.8/tkinter/filedialog.py�__init__4st

�
 �
 ���zFileDialog.__init__r�cCs�|r|tkrt|\|_}n2tj�|�}tj�|�r<||_ntj�|�\|_}|�|j|�|�|�|�	�|j
��|j�
�|j��d|_|j��|r�|��\}}|jr�tj�|j�}||ft|<|j��|jS�N)�dialogstatesr�os�path�
expanduser�isdir�split�
set_filter�
set_selectionrrZ	focus_setrZwait_visibilityZgrab_set�howrZmainloop�
get_filter�dirnameZdestroy)r!Zdir_or_file�pattern�default�keyrr"r"r#�gots*





z
FileDialog.gocCs||_|j��dSr&)r/r�quit)r!r/r"r"r#r6�szFileDialog.quitcCs|��dSr&)r�r!�eventr"r"r#r�szFileDialog.dirs_double_eventcCs@|��\}}|j�d�}tj�tj�|j|��}|�||�dS�NZactive)	r0r�getr(r)�normpath�joinrr-)r!r8�dir�patZsubdirr"r"r#r�szFileDialog.dirs_select_eventcCs|��dSr&�rr7r"r"r#r�szFileDialog.files_double_eventcCs|j�d�}|�|�dSr9)rr:r.)r!r8�filer"r"r#r�szFileDialog.files_select_eventcCs|��dSr&r?r7r"r"r#r�szFileDialog.ok_eventcCs|�|���dSr&)r6�
get_selection�r!r"r"r#r�szFileDialog.ok_commandcCs&|��\}}zt�|�}Wn tk
r:|j��YdSX||_|�||�|��tj	g}g}|D]@}tj
�||�}tj
�|�r�|�
|�qft�||�rf|�
|�qf|j�dt�|D]}|j�t|�q�|j�dt�|D]}|j�t|�q�tj
�|���\}	}
|
tjk�rd}
|�|
�dS)Nrr%)r0r(�listdir�OSErrorr�bellrr-�sort�pardirr)r<r+�append�fnmatchr�delete�END�insertrr,rA�curdirr.)r!r8r=r>�namesZsubdirsZ
matchingfiles�name�fullname�head�tailr"r"r#r�s6
zFileDialog.filter_commandcCsN|j��}tj�|�}|dd�tjks4tj�|�rBtj�|d�}tj�|�S)N���r)	rr:r(r)r*�sepr+r<r,)r!rr"r"r#r0�s

zFileDialog.get_filtercCs|j��}tj�|�}|Sr&)rr:r(r)r*�r!r@r"r"r#rA�s
zFileDialog.get_selectioncCs|��dSr&)r6r7r"r"r#r �szFileDialog.cancel_commandcCs�tj�|�sPzt��}Wntk
r0d}YnX|rPtj�||�}tj�|�}|j�dt	�|j�
t	tj�|pttj|pzd��dS)Nrr)r(r)�isabs�getcwdrDr<r;rrJrKrLrM)r!r=r>�pwdr"r"r#r-�s
zFileDialog.set_filtercCs,|j�dt�|j�ttj�|j|��dS)Nr)rrJrKrLr(r)r<rrUr"r"r#r.�szFileDialog.set_selection)N)N)N)N)�__name__�
__module__�__qualname__�__doc__rr$r(rMr5r6rrrrrrrr0rAr r-r.r"r"r"r#rs"
@


rc@seZdZdZdZdd�ZdS)�LoadFileDialogz8File selection dialog which checks that the file exists.zLoad File Selection DialogcCs.|��}tj�|�s |j��n
|�|�dSr&)rAr(r)�isfilerrEr6rUr"r"r#r�szLoadFileDialog.ok_commandN�rYrZr[r\rrr"r"r"r#r]�sr]c@seZdZdZdZdd�ZdS)�SaveFileDialogz@File selection dialog which checks that the file may be created.zSave File Selection DialogcCs�|��}tj�|�rZtj�|�r.|j��dSt|jdd|fdddd�}|j	dkr�dSn*tj�
|�\}}tj�|�s�|j��dS|�|�dS)Nz Overwrite Existing File QuestionzOverwrite existing file %r?Z	questheadr)ZYesr)rr
Zbitmapr3Zstringsr)rAr(r)�existsr+rrErrZnumr,r6)r!r@�drQrRr"r"r#r�s&
�

zSaveFileDialog.ok_commandNr_r"r"r"r#r`�sr`c@seZdZdd�Zdd�ZdS)�_DialogcCs2zt|jd�|jd<Wntk
r,YnXdS)N�	filetypes)�tuple�options�KeyErrorrBr"r"r#�_fixoptions,sz_Dialog._fixoptionscCsR|rHz
|j}Wntk
r"YnXtj�|�\}}||jd<||jd<||_|S)N�
initialdirZinitialfile)�string�AttributeErrorr(r)r,rf�filename�r!�widget�resultr)r@r"r"r#�
_fixresult3s


z_Dialog._fixresultN)rYrZr[rhrpr"r"r"r#rc*srcc@seZdZdZdZdd�ZdS)�Open�Ask for a filename to openZtk_getOpenFilecCsxt|t�rBtdd�|D��}|r>tj�|d�\}}||jd<|S|j��sjd|jkrj|�||j�	|��St
�|||�S)NcSsg|]}t|d|��qS)rj)�getattr)�.0�rr"r"r#�
<listcomp>Nsz#Open._fixresult.<locals>.<listcomp>rri�multiple)�
isinstancerer(r)r,rfZtkZwantobjectsrpZ	splitlistrcrmr"r"r#rpKs

zOpen._fixresultN�rYrZr[r\rrpr"r"r"r#rqFsrqc@seZdZdZdZdS)�SaveAs�Ask for a filename to save asZtk_getSaveFileN)rYrZr[r\rr"r"r"r#rzZsrzc@seZdZdZdZdd�ZdS)�	DirectoryzAsk for a directoryZtk_chooseDirectorycCs8|r.z
|j}Wntk
r"YnX||jd<||_|S)Nri)rjrkrfr)r!rnror"r"r#rpfs

zDirectory._fixresultNryr"r"r"r#r|asr|cKstf|���S)rr�rq�show�rfr"r"r#�askopenfilenamewsr�cKstf|���S)r{)rzr~rr"r"r#�asksaveasfilename}sr�cKsd|d<tf|���S)ztAsk for multiple filenames to open

    Returns a list of filenames or empty list if
    cancel button selected
    rrwr}rr"r"r#�askopenfilenames�sr�rucKs tf|���}|rt||�SdS)z8Ask for a filename to open, and returned the opened fileN)rqr~�open��moderfrlr"r"r#�askopenfile�s
r�cKs4tf|�}|r0g}|D]}|�t||��q|}|S)z�Ask for multiple filenames and return the open file
    objects

    returns a list of open file objects or an empty list if
    cancel selected
    )r�rHr�)r�rfrZofilesrlr"r"r#�askopenfiles�s
r��wcKs tf|���}|rt||�SdS)z;Ask for a filename to save as, and returned the opened fileN)rzr~r�r�r"r"r#�
asksaveasfile�s
r�cKstf|���S)z-Ask for a directory, and return the file name)r|r~rr"r"r#�askdirectory�sr�c
	Cs�t�}|��t|�}|jdd�}t|�}|jdd�}t||�d}ddl}z&ddl}|�|j	d�|�
|j�}Wntt
fk
r�YnXtdgd�}zt|d	�}|��Wn$td
�t|��d�YnXtd|�|��t�}	td
|	�|��dS)zSimple test program.�test)r4zutf-8rNr%)z	all filesr)rdruzCould not open File: rr�Zsaveas)ZTkZwithdrawr]r5r`�print�sys�locale�	setlocale�LC_ALL�nl_langinfo�CODESET�ImportErrorrkr�r��close�exc_info�encoder�)
�root�fdZloadfileZsavefile�encr�r�Zopenfilename�fpZsaveasfilenamer"r"r#r��s2

r��__main__)ru)ru)r�)r\ZtkinterZtkinter.dialogrrZtkinter.simpledialogrr(rIr'rr]r`rcrqrzr|r�r�r�r�r�r�r�r�rYr"r"r"r#�<module>s2I9
	

	,
PK�(�Z`��Nx�x�)__pycache__/__init__.cpython-38.opt-2.pycnu�[���U

e5d͕�@s�ddlZddlZddlZejZddlTddlZdZeej�Z	eej
�ZejZej
Z
ejZe�d�Ze�dej�Zdd�Zdd	�Zd
d�Zz
ejZWnek
r�YnXdd
�Zz
ejZWnek
r�YnXdxdd�ZGdd�deej�ZGdd�d�Zdadadd�Zdydd�Z dd�Z!dzdd�Z"da#Gdd�d�Z$Gdd �d e$�Z%Gd!d"�d"e$�Z&Gd#d$�d$e$�Z'Gd%d&�d&e$�Z(d{d'd(�Z)e*Z+eZ,d)d*�Z-Gd+d,�d,�Z.Gd-d.�d.�Z/Gd/d0�d0�Z0Gd1d2�d2�Z1Gd3d4�d4�Z2Gd5d6�d6e.e2�Z3d|d7d8�Z4Gd9d:�d:�Z5Gd;d<�d<�Z6Gd=d>�d>�Z7Gd?d@�d@e.�Z8GdAdB�dBe8e5e6e7�Z9GdCdD�dDe8e2�Z:GdEdF�dFe9�Z;GdGdH�dHe9e0e1�Z<GdIdJ�dJe9�Z=GdKdL�dLe9e0�Z>GdMdN�dNe9�Z?GdOdP�dPe9�Z@GdQdR�dRe9e0e1�ZAGdSdT�dTe9�ZBGdUdV�dVe9�ZCGdWdX�dXe9�ZDGdYdZ�dZe9�ZEGd[d\�d\e9�ZFGd]d^�d^e9�ZGGd_d`�d`e9e0e1�ZHGdadb�db�ZIGdcdd�ddeC�ZJGdedf�df�ZKGdgdh�dheK�ZLGdidj�djeK�ZMdkdl�ZNdmdn�ZOGdodp�dpe9e0�ZPGdqdr�dre9�ZQGdsdt�dte9�ZRdudv�ZSeTdwk�r�eS�dS)}�N)�*�z([\\{}])z([\s])cCsd�tt|��S)N� )�join�map�
_stringify��value�r
�(/usr/lib64/python3.8/tkinter/__init__.py�_join8srcCs�t|ttf�rHt|�dkr:t|d�}t�|�rFd|}q�dt|�}ntt|�}|sZd}nbt�|�r�t�	d|�}|�
dd�}t�	d|�}|ddkr�d	|}n|ddks�t�|�r�d|}|S)
Nrrz{%s}z{}z\\\1�
z\n�"�\)�
isinstance�list�tuple�lenr�	_magic_re�searchr�str�sub�replace�	_space_rerr
r
rr=s$



rcCs@d}|D]2}t|ttf�r(|t|�}q|dk	r||f}q|S)Nr
)rrr�_flatten)�seq�res�itemr
r
rrVsrcCs�t|t�r|St|td�tf�r$|Si}t|�D]^}z|�|�Wq0ttfk
r�}z(td|�|�	�D]\}}|||<qjW5d}~XYq0Xq0|SdS)Nz_cnfmerge: fallback due to:)
r�dict�typerr�update�AttributeError�	TypeError�print�items)Zcnfs�cnf�c�msg�k�vr
r
r�	_cnfmergees

r*Tc	Csz|�|�}t|�drtd��t|�}i}t||�D]@\}}t|�}|r`|ddkr`|dd�}|rl||�}|||<q4|S)N�zNTcl list representing a dict is expected to contain an even number of elementsr�-r)�	splitlistr�RuntimeError�iter�zipr)	�tkr)Z	cut_minus�conv�t�itr�keyr	r
r
r�
_splitdict{s

r6c@s�eZdZdZeZdZdZeZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)e*j+Z+d&S)'�	EventType�2�3�4�5�6�7�8�9Z10Z11Z12Z13Z14Z15Z16Z17Z18Z19Z20Z21Z22Z23Z24Z25Z26Z27Z28Z29Z30Z31Z32Z33Z34Z35Z36Z37Z38N),�__name__�
__module__�__qualname__ZKeyPressZKeyZ
KeyReleaseZButtonPress�ButtonZ
ButtonReleaseZMotionZEnterZLeaveZFocusInZFocusOutZKeymapZExposeZGraphicsExposeZNoExposeZ
VisibilityZCreateZDestroyZUnmapZMapZ
MapRequestZReparentZ	ConfigureZConfigureRequestZGravityZ
ResizeRequestZ	CirculateZCirculateRequestZPropertyZSelectionClearZSelectionRequestZ	SelectionZColormapZ
ClientMessage�MappingZVirtualEventZActivateZ
DeactivateZ
MouseWheelr�__str__r
r
r
rr7�sPr7c@seZdZdd�ZdS)�Eventcsdd�|j��D��|js"�d=n|jdkr:t|j��d<t|dd�sL�d=|jdkr^�d=n|t|jt�r�|j}d	}g}t|�D]\}}|d
|>@r�|�	|�q�|d
t
|�>d
@}|s�|s�|�	t|��d�|��d<|j
dkr�d=d
}dt|jd|j�d��fdd�|D��fS)NcSsi|]\}}|dkr||�qS)�??r
��.0r(r)r
r
r�
<dictcomp>�sz"Event.__repr__.<locals>.<dictcomp>�charrG�
send_eventTr�state)
ZShiftZLockZControlZMod1ZMod2ZMod3ZMod4ZMod5ZButton1ZButton2ZButton3ZButton4ZButton5r�|�delta)rLrM�keysym�keycoderK�numrO�focus�x�y�width�heightz<%s event%s>�name�c3s&|]}|�krd|�|fVqdS)z %s=%sNr
)rIr(�Zattrsr
r�	<genexpr>
sz!Event.__repr__.<locals>.<genexpr>)�__dict__r$rK�repr�getattrrMr�int�	enumerate�appendr�hexrrOr)�selfrMZmods�s�i�n�keysr
rZr�__repr__�s6


�zEvent.__repr__N)r@rArBrhr
r
r
rrF�s+rFcCsdadabdS)NF)�_support_default_root�
_default_rootr
r
r
r�
NoDefaultRootsrkcCs.tstd��ts*|r$td|�d���t�}tS)NzINo master specified and tkinter is configured to not support default rootz
Too early to z: no default root window)rir.rj�Tk)�what�rootr
r
r�_get_default_root#srocCsdS�Nr
)�errr
r
r�_tkerror/srrcCs.zt|�}Wntk
r YnXt|��dSrp)r_�
ValueError�
SystemExit)�coder
r
r�_exit4s
rvc@s�eZdZdZdZdZddd�Zdd�Zdd�Zd	d
�Z	e	Z
dd�Zd
d�Zdd�Z
dd�Zdd�Zdd�ZeZdd�Zdd�Zdd�ZdS)�VariablerYNcCs�|dk	rt|t�std��|s&td�}|��|_|j|_|rD||_ndtt	�|_t	d7a	|dk	rn|�
|�n&|j�|j�dd|j��s�|�
|j
�dS)Nzname must be a stringzcreate variable�PY_VARr�info�exists)rrr"ro�_rootr1�_tk�_namer]�_varnum�
initialize�
getboolean�call�_default�rc�masterr	rXr
r
r�__init__Is

zVariable.__init__cCsb|jdkrdS|j�|j�dd|j��r6|j�|j�|jdk	r^|jD]}|j�|�qFd|_dS)Nryrz)r|r�r�r}Zglobalunsetvar�_tclCommands�
deletecommand�rcrXr
r
r�__del__gs


zVariable.__del__cCs|jSrp)r}�rcr
r
rrEsszVariable.__str__cCs|j�|j|�Srp)r|�globalsetvarr}�rcr	r
r
r�setwszVariable.setcCs|j�|j�Srp)r|�globalgetvarr}r�r
r
r�get}szVariable.getcCs�t|d|j�j}tt|��}z
|j}Wntk
r:YnXz||j}Wntk
r^YnX|j�	||�|j
dkr~g|_
|j
�|�|Srp)�CallWrapperr{�__call__r]�id�__func__r!r@r|�
createcommandr�ra)rc�callback�f�cbnamer
r
r�	_register�s

zVariable._registercCs(|�|�}|j�ddd|j||f�|S)N�trace�add�variable�r�r|r�r}�rc�moder�r�r
r
r�	trace_add�s

�zVariable.trace_addcCsx|j�ddd|j||�|��D] \}}|j�|�d|kr qtq |j�|�z|j�|�Wntk
rrYnXdS)Nr��remover�r)	r|r�r}�
trace_infor-r�r�r�rs�rcr�r��mZcar
r
r�trace_remove�s�zVariable.trace_removec
s4|jj��fdd�t��|j�ddd|j���D�S)Ncsg|]\}}�|�|f�qSr
r
rH�r-r
r�
<listcomp>�sz'Variable.trace_info.<locals>.<listcomp>r�ryr�)r|r-rr�r}r�r
r�rr��s�zVariable.trace_infocCs$|�|�}|j�dd|j||�|S)Nr�r�r�r�r
r
r�trace_variable�s
zVariable.trace_variablecCs�|j�dd|j||�|j�|�d}|��D] \}}|j�|�d|kr.q�q.|j�|�z|j�|�Wntk
r�YnXdS)Nr�Zvdeleter)	r|r�r}r-r�r�r�r�rsr�r
r
r�
trace_vdelete�s
zVariable.trace_vdeletecs(�fdd��j��j�dd�j��D�S)Ncsg|]}�j�|��qSr
)r|r-�rIrTr�r
rr��sz(Variable.trace_vinfo.<locals>.<listcomp>r�Zvinfo)r|r-r�r}r�r
r�r�trace_vinfo�s�zVariable.trace_vinfocCs6t|t�stS|j|jko4|jj|jjko4|j|jkSrp)rrw�NotImplementedr}�	__class__r@r|)rc�otherr
r
r�__eq__�s
�
�zVariable.__eq__)NNN)r@rArBr�r|r�r�r�rEr�rr�r�r�r�r�r�r�r�r�r�r
r
r
rrw@s$

rwc@s"eZdZdZddd�Zdd�ZdS)�	StringVarrYNcCst�||||�dSrp�rwr�r�r
r
rr��s
zStringVar.__init__cCs$|j�|j�}t|t�r|St|�Srp)r|r�r}rrr�r
r
rr�s
z
StringVar.get)NNN�r@rArBr�r�r�r
r
r
rr��s
r�c@s"eZdZdZddd�Zdd�ZdS)�IntVarrNcCst�||||�dSrpr�r�r
r
rr�s
zIntVar.__init__c	CsJ|j�|j�}z|j�|�WSttfk
rDt|j�|��YSXdSrp)r|r�r}�getintr"�TclErrorr_�	getdoubler�r
r
rr�s
z
IntVar.get)NNNr�r
r
r
rr�
s
r�c@s"eZdZdZddd�Zdd�ZdS)�	DoubleVargNcCst�||||�dSrpr�r�r
r
rr�*s
zDoubleVar.__init__cCs|j�|j�|j��Srp)r|r�r�r}r�r
r
rr�6sz
DoubleVar.get)NNNr�r
r
r
rr�&s
r�c@s.eZdZdZd	dd�Zdd�ZeZdd�ZdS)
�
BooleanVarFNcCst�||||�dSrpr�r�r
r
rr�?s
zBooleanVar.__init__cCs|j�|j|j�|��Srp)r|r�r}r�r�r
r
rr�KszBooleanVar.setcCs:z|j�|j�|j��WStk
r4td��YnXdS�N� invalid literal for getboolean())r|r�r�r}r�rsr�r
r
rr�QszBooleanVar.get)NNN)r@rArBr�r�r�rr�r
r
r
rr�;s

r�cCstd�j�|�dS)Nzrun the main loop)ror1�mainloop)rfr
r
rr�Ysr�cCs4ztd�j�|�WStk
r.td��YnXdS)Nzuse getboolean()r�)ror1r�r�rs�rdr
r
rr�csr�c@s�eZdZdZdZdd�Zdd�Z�d0dd�Zdd	�Zd
d�Z	�d1d
d�Z
e
Z�d2dd�Z�d3dd�Z
�d4dd�Z�d5dd�Zdd�Zdd�Zdd�Zdd�ZeZd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Z�d6d.d/�Zd0d1�Zd2d3�Z�d7d5d6�Zd7d8�Z d9d:�Z!d;d<�Z"d=d>�Z#d?d@�Z$dAdB�Z%dCdD�Z&dEdF�Z'�d8dGdH�Z(dIdJ�Z)dKdL�Z*�d9dMdN�Z+dOdP�Z,dQdR�Z-dSdT�Z.dUdV�Z/dWdX�Z0dYdZ�Z1�d:d[d\�Z2�d;d]d^�Z3e3Z4�d<d_d`�Z5�d=dadb�Z6dcdd�Z7dedf�Z8dgdh�Z9didj�Z:�d>dkdl�Z;dmdn�Z<dodp�Z=dqdr�Z>dsdt�Z?dudv�Z@dwdx�ZA�d?dydz�ZBd{d|�ZCd}d~�ZDdd��ZEd�d��ZF�d@d�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]�dAd�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��Zed�dÄZfd�dńZgd�dDŽZhd�dɄZi�dBd�d˄Zj�dCd�d΄Zk�dDd�dЄZl�dEd�d҄Zm�dFd�dԄZnd�dքZo�dGd�d؄Zpd�dڄZq�dHd�d܄Zrd�dބZsd�d�Ztd�d�Zud�d�Zvd�d�Zwexd�d��Zy�dId�d�Zzd�d�Z{e{Z|�dJd�d�Z}e}Z~d�d�Zd�Z�d�e��Z�d�d�Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��dKd�d��Z�e�Z�d��d�Z�e�Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d	gZ�e�f�d
�d�Z�e�Z��d�d
�Z�e�Z��d�d�Z��dL�d�d�Z�e�Z��dM�d�d�Z�e�Z��d�d�Z��d�d�Z�if�d�d�Z�e�Z��d�d�Z�e�f�d�d�Z�if�d�d�Z�e�Z��d �d!�Z�e�Z��dN�d"�d#�Z��d$�d%�Z��d&�d'�Z��d(�d)�Z��dO�d*�d+�Z��d,�d-�Z��d.�d/�Z�dS(P�MiscNcCs,|jdk	r(|jD]}|j�|�qd|_dSrp)r�r1r�r�r
r
r�destroyxs

zMisc.destroycCs6|j�|�z|j�|�Wntk
r0YnXdSrp)r1r�r�r�rsr�r
r
rr��s
zMisc.deletecommandcCs|j�|j�dd|��S)Nr��tk_strictMotif)r1r�r��rc�booleanr
r
rr��s
�zMisc.tk_strictMotifcCs|j�d�dS)N�	tk_bisque�r1r�r�r
r
rr��szMisc.tk_bisquecOs(|j�dt|�tt|�����dS)N)�
tk_setPalette)r1r�rrr$�rc�args�kwr
r
rr��s
��zMisc.tk_setPaletterxcCs|j�dd|�dS)N�tkwaitr�r�r�r
r
r�
wait_variable�szMisc.wait_variablecCs"|dkr|}|j�dd|j�dS)Nr��window�r1r��_w�rcr�r
r
r�wait_window�szMisc.wait_windowcCs"|dkr|}|j�dd|j�dS)Nr�Z
visibilityr�r�r
r
r�wait_visibility�szMisc.wait_visibility�1cCs|j�||�dSrp)r1�setvar)rcrXr	r
r
rr��szMisc.setvarcCs|j�|�Srp)r1�getvarr�r
r
rr��szMisc.getvarc
CsBz|j�|�WStk
r<}ztt|���W5d}~XYnXdSrp)r1r�r�rsr�rcrd�excr
r
rr��szMisc.getintc
CsBz|j�|�WStk
r<}ztt|���W5d}~XYnXdSrp)r1r�r�rsrr�r
r
rr��szMisc.getdoublecCs0z|j�|�WStk
r*td��YnXdSr�)r1r�r�rs)rcrdr
r
rr��szMisc.getbooleancCs|j�d|j�dS�NrSr�r�r
r
r�	focus_set�szMisc.focus_setcCs|j�dd|j�dS)NrSz-forcer�r�r
r
r�focus_force�szMisc.focus_forcecCs&|j�d�}|dks|sdS|�|�S)NrS�none)r1r��
_nametowidgetr�r
r
r�	focus_get�szMisc.focus_getcCs,|j�dd|j�}|dks|s"dS|�|�S)NrS�
-displayofr��r1r�r�r�r�r
r
r�focus_displayof�szMisc.focus_displayofcCs,|j�dd|j�}|dks|s"dS|�|�S)NrSz-lastforr�r�r�r
r
r�
focus_lastforszMisc.focus_lastforcCs|j�d�dS)N�tk_focusFollowsMouser�r�r
r
rr�szMisc.tk_focusFollowsMousecCs"|j�d|j�}|sdS|�|�S)N�tk_focusNextr�r�r
r
rr�
s	zMisc.tk_focusNextcCs"|j�d|j�}|sdS|�|�S)N�tk_focusPrevr�r�r
r
rr�szMisc.tk_focusPrevcsN�s�j�d|�dS����fdd�}�j|_��|���j�d|��SdS)N�aftercs8z���W5z����Wntk
r0YnXXdSrp)r�r�r
�r��funcrXrcr
r�callit,szMisc.after.<locals>.callit)r1r�r@r�)rcZmsr�r�r�r
r�rr� s
z
Misc.aftercGs|jd|f|��S)NZidle)r�)rcr�r�r
r
r�
after_idle8szMisc.after_idlecCsd|std��z.|j�dd|�}|j�|�d}|�|�Wntk
rNYnX|j�dd|�dS)Nz?id must be a valid identifier returned from after or after_idler�ryrZcancel)rsr1r�r-r�r�)rcr��dataZscriptr
r
r�after_cancel@szMisc.after_cancelrcCs|j�d|�|��dS)N)�bell)r1r��
_displayof�rc�	displayofr
r
rr�Qsz	Misc.bellcKsdd|krN|jdkrNz d|d<|j�d|�|��WStk
rL|d=YnX|j�d|�|��S)Nr�x11�UTF8_STRING)�	clipboardr�)�_windowingsystemr1r��_optionsr��rcr�r
r
r�
clipboard_getVszMisc.clipboard_getcKs,d|kr|j|d<|j�d|�|��dS)Nr�)r��clear�r�r1r�r�r�r
r
r�clipboard_clearms
zMisc.clipboard_clearcKs4d|kr|j|d<|j�d|�|�d|f�dS)Nr�)r�ra�--r�)rc�stringr�r
r
r�clipboard_appendus

�zMisc.clipboard_appendcCs$|j�dd|j�}|sdS|�|�S)N�grabZcurrentr�r�r
r
r�grab_current�szMisc.grab_currentcCs|j�dd|j�dS)Nr��releaser�r�r
r
r�grab_release�szMisc.grab_releasecCs|j�dd|j�dS)Nr�r�r�r�r
r
r�grab_set�sz
Misc.grab_setcCs|j�ddd|j�dS)Nr�r�z-globalr�r�r
r
r�grab_set_global�szMisc.grab_set_globalcCs"|j�dd|j�}|dkrd}|S)Nr��statusr�r�)rcr�r
r
r�grab_status�szMisc.grab_statuscCs|j�dd|||�dS)N�optionr�r�)rc�patternr	�priorityr
r
r�
option_add�szMisc.option_addcCs|j�dd�dS)Nrr�r�r�r
r
r�option_clear�szMisc.option_clearcCs|j�dd|j||�S)Nrr�r�)rcrX�	classNamer
r
r�
option_get�szMisc.option_getcCs|j�dd||�dS)NrZreadfiler�)rcZfileNamerr
r
r�option_readfile�szMisc.option_readfilecKs,d|kr|j|d<|j�d|�|��dS)Nr�)�	selectionr�r�r�r
r
r�selection_clear�s
zMisc.selection_clearcKsvd|kr|j|d<d|kr`|jdkr`z d|d<|j�d|�|��WStk
r^|d=YnX|j�d|�|��S)Nr�rr�r�)r	r�)r�r�r1r�r�r�r�r
r
r�
selection_get�s	
zMisc.selection_getcKs.|�|�}|j�d|�|�|j|f�dS)N)r	Zhandle)r�r1r�r�r�)rc�commandr�rXr
r
r�selection_handle�s
�zMisc.selection_handlecKs"|j�d|�|�|jf�dS)N�r	Zown)r1r�r�r�r�r
r
r�
selection_own�s
��zMisc.selection_owncKs:d|kr|j|d<|j�d|�|��}|s0dS|�|�S)Nr�r)r�r1r�r�r�)rcr�rXr
r
r�selection_own_get�s
zMisc.selection_own_getcGs|j�d||f|�S)N�sendr�)rcZinterp�cmdr�r
r
rr�sz	Misc.sendcCs|j�d|j|�dS�N�lowerr�)rc�	belowThisr
r
rr�sz
Misc.lowercCs|j�d|j|�dS�N�raiser�)rc�	aboveThisr
r
r�tkraiseszMisc.tkraisecCs(d|�|�|f}|j�|j�|��S)N)�winfoZatom)r�r1r�r�)rcrXr�r�r
r
r�
winfo_atomszMisc.winfo_atomcCs d|�|�|f}|j�|�S)N)rZatomname�r�r1r��rcr�r�r�r
r
r�winfo_atomnames��zMisc.winfo_atomnamecCs|j�|j�dd|j��S)NrZcells�r1r�r�r�r�r
r
r�winfo_cellss�zMisc.winfo_cellsc	CsRg}|j�|j�dd|j��D].}z|�|�|��Wqtk
rJYqXq|S)Nr�children)r1r-r�r�rar��KeyError)rc�result�childr
r
r�winfo_childrens�zMisc.winfo_childrencCs|j�dd|j�S)Nr�classr�r�r
r
r�winfo_class#szMisc.winfo_classcCs|j�|j�dd|j��S)NrZcolormapfull�r1r�r�r�r�r
r
r�winfo_colormapfull's�zMisc.winfo_colormapfullcCs4d|�|�||f}|j�|�}|s*dS|�|�S)N)rZ
containing)r�r1r�r�)rcZrootXZrootYr�r�rXr
r
r�winfo_containing,s��zMisc.winfo_containingcCs|j�|j�dd|j��S)NrZdepthrr�r
r
r�winfo_depth4szMisc.winfo_depthcCs|j�|j�dd|j��S)Nrrzrr�r
r
r�winfo_exists8s�zMisc.winfo_existscCs|j�|j�dd|j|��S)NrZfpixels�r1r�r�r��rc�numberr
r
r�
winfo_fpixels=s�zMisc.winfo_fpixelscCs|j�dd|j�S)Nr�geometryr�r�r
r
r�winfo_geometryCszMisc.winfo_geometrycCs|j�|j�dd|j��S)NrrWrr�r
r
r�winfo_heightGs�zMisc.winfo_heightcCst|j�dd|j�d�S)Nrr�r)r_r1r�r�r�r
r
r�winfo_idLsz
Misc.winfo_idcCs"d|�|�}|j�|j�|��S)N)rZinterps)r�r1r-r�)rcr�r�r
r
r�
winfo_interpsPszMisc.winfo_interpscCs|j�|j�dd|j��S)NrZismappedrr�r
r
r�winfo_ismappedUs�zMisc.winfo_ismappedcCs|j�dd|j�S)NrZmanagerr�r�r
r
r�
winfo_managerZszMisc.winfo_managercCs|j�dd|j�S)NrrXr�r�r
r
r�
winfo_name^szMisc.winfo_namecCs|j�dd|j�S)Nr�parentr�r�r
r
r�winfo_parentbszMisc.winfo_parentcCs d|�|�|f}|j�|�S)N)r�pathnamerrr
r
r�winfo_pathnamefs��zMisc.winfo_pathnamecCs|j�|j�dd|j|��S)NrZpixelsrr.r
r
r�winfo_pixelsls�zMisc.winfo_pixelscCs|j�|j�dd|j��S)NrZpointerxrr�r
r
r�winfo_pointerxqs�zMisc.winfo_pointerxcCs|�|j�dd|j��S)NrZ	pointerxy��_getintsr1r�r�r�r
r
r�winfo_pointerxyvs�zMisc.winfo_pointerxycCs|j�|j�dd|j��S)NrZpointeryrr�r
r
r�winfo_pointery{s�zMisc.winfo_pointerycCs|j�|j�dd|j��S)NrZ	reqheightrr�r
r
r�winfo_reqheight�s�zMisc.winfo_reqheightcCs|j�|j�dd|j��S)NrZreqwidthrr�r
r
r�winfo_reqwidth�s�zMisc.winfo_reqwidthcCs|�|j�dd|j|��S)NrZrgbr?)rcZcolorr
r
r�	winfo_rgb�s�zMisc.winfo_rgbcCs|j�|j�dd|j��S)NrZrootxrr�r
r
r�winfo_rootx�s�zMisc.winfo_rootxcCs|j�|j�dd|j��S)NrZrootyrr�r
r
r�winfo_rooty�s�zMisc.winfo_rootycCs|j�dd|j�S)Nr�screenr�r�r
r
r�winfo_screen�szMisc.winfo_screencCs|j�|j�dd|j��S)NrZscreencellsrr�r
r
r�winfo_screencells�s�zMisc.winfo_screencellscCs|j�|j�dd|j��S)NrZscreendepthrr�r
r
r�winfo_screendepth�s�zMisc.winfo_screendepthcCs|j�|j�dd|j��S)NrZscreenheightrr�r
r
r�winfo_screenheight�s�zMisc.winfo_screenheightcCs|j�|j�dd|j��S)NrZscreenmmheightrr�r
r
r�winfo_screenmmheight�s�zMisc.winfo_screenmmheightcCs|j�|j�dd|j��S)NrZ
screenmmwidthrr�r
r
r�winfo_screenmmwidth�s�zMisc.winfo_screenmmwidthcCs|j�dd|j�S)NrZscreenvisualr�r�r
r
r�winfo_screenvisual�szMisc.winfo_screenvisualcCs|j�|j�dd|j��S)NrZscreenwidthrr�r
r
r�winfo_screenwidth�s�zMisc.winfo_screenwidthcCs|j�dd|j�S)NrZserverr�r�r
r
r�winfo_server�szMisc.winfo_servercCs|�|j�dd|j��S)Nr�toplevel)r�r1r�r�r�r
r
r�winfo_toplevel�s

�zMisc.winfo_toplevelcCs|j�|j�dd|j��S)NrZviewablerr�r
r
r�winfo_viewable�s�zMisc.winfo_viewablecCs|j�dd|j�S)Nr�visualr�r�r
r
r�winfo_visual�szMisc.winfo_visualcCs|j�dd|j�S)NrZvisualidr�r�r
r
r�winfo_visualid�szMisc.winfo_visualidFcsH�j�dd�j|rdnd�}�fdd��j�|�D�}�fdd�|D�S)NrZvisualsavailable�
includeidscsg|]}�j�|��qSr
)r1r-r�r�r
rr��sz/Misc.winfo_visualsavailable.<locals>.<listcomp>csg|]}��|��qSr
)�_Misc__winfo_parseitemr�r�r
rr��s)r1r�r�r-)rcrXr�r
r�r�winfo_visualsavailable�s

�zMisc.winfo_visualsavailablecCs$|dd�tt|j|dd���S)Nr)rr�_Misc__winfo_getint)rcr3r
r
rZ__winfo_parseitem�szMisc.__winfo_parseitemcCs
t|d�S)Nr)r_�rcrTr
r
rZ__winfo_getint�szMisc.__winfo_getintcCs|j�|j�dd|j��S)NrZvrootheightrr�r
r
r�winfo_vrootheight�s�zMisc.winfo_vrootheightcCs|j�|j�dd|j��S)NrZ
vrootwidthrr�r
r
r�winfo_vrootwidth�s�zMisc.winfo_vrootwidthcCs|j�|j�dd|j��S)NrZvrootxrr�r
r
r�winfo_vrootxs�zMisc.winfo_vrootxcCs|j�|j�dd|j��S)NrZvrootyrr�r
r
r�winfo_vrooty	s�zMisc.winfo_vrootycCs|j�|j�dd|j��S)NrrVrr�r
r
r�winfo_widths�zMisc.winfo_widthcCs|j�|j�dd|j��S)NrrTrr�r
r
r�winfo_xs�zMisc.winfo_xcCs|j�|j�dd|j��S)NrrUrr�r
r
r�winfo_ys�zMisc.winfo_ycCs|j�d�dS)Nr r�r�r
r
rr  szMisc.updatecCs|j�dd�dS)Nr Z	idletasksr�r�r
r
r�update_idletasks$szMisc.update_idletaskscCs6|dkr |j�|j�d|j��S|j�d|j|�dS)N�bindtags�r1r-r�r�)rcZtagListr
r
rre*s
�z
Misc.bindtagsrcCs�t|t�r |j�|||f�nn|rd|�||j|�}d|r>dp@d||jf}|j�|||f�|S|rz|j�||f�S|j�|j�|��SdS)Nz"%sif {"[%s %s]" == "break"} break
�+rY)rrr1r�r��_substitute�_subst_format_strr-)rcrm�sequencer�r��needcleanup�funcidrr
r
r�_bind7s"

�
��z
Misc._bindcCs|�d|jf|||�S�N�bind�rmr��rcrjr�r�r
r
rroIs'z	Misc.bindcCs&|j�d|j|d�|r"|�|�dS�NrorY�r1r�r�r�)rcrjrlr
r
r�unbindrszMisc.unbindcCs|�d|||d�S)N)ro�allr�rmrqr
r
r�bind_allysz
Misc.bind_allcCs|j�dd|d�dS)NrorurYr�)rcrjr
r
r�
unbind_all�szMisc.unbind_allcCs|�d|f|||d�S)Nrorrv)rcrrjr�r�r
r
r�
bind_class�szMisc.bind_classcCs|j�d||d�dSrrr�)rcrrjr
r
r�unbind_class�szMisc.unbind_classcCs|j�|�dSrp)r1r�)rcrfr
r
rr��sz
Misc.mainloopcCs|j��dSrp)r1�quitr�r
r
rr{�sz	Misc.quitcCs"|rtt|jj|j�|���SdSrp)rrr1r�r-�rcr�r
r
rr@�sz
Misc._getintscCs"|rtt|jj|j�|���SdSrp)rrr1r�r-r|r
r
r�_getdoubles�szMisc._getdoublescCs|r|j�|�SdSrp)r1r�r|r
r
r�_getboolean�szMisc._getbooleancCs"|rd|fS|dkrd|jfSdS)Nr�r
�r�r�r
r
rr��s

zMisc._displayofcCsBz|��jWStk
r<|j�dd�}|��_|YSXdS)Nr1Zwindowingsystem)r{Z_windowingsystem_cachedr!r1r�)rcZwsr
r
rr��s�zMisc._windowingsystemcCs�|rt||f�}nt|�}d}|��D]�\}}|dk	r&|ddkrN|dd�}t|�rb|�|�}n^t|ttf�r�g}|D]<}t|t�r�|�t	|��qxt|t	�r�|�t
|��qxq�qxd�|�}|d||f}q&|S)Nr
����_rr,)r*r$�callabler�rrrr_rarrr)rcr%r�rr(r)Znvrr
r
rr��s*


z
Misc._optionscCsNt|��d�}|}|ds.|��}|dd�}|D]}|s>qJ|j|}q2|S)N�.rr)r�splitr{r!)rcrX�wrfr
r
r�nametowidget�szMisc.nametowidgetcCs�t|||�j}tt|��}z
|j}Wntk
r8YnXz||j}Wntk
r\YnX|j�||�|r�|j	dkr�g|_	|j	�
|�|Srp)r�r�r]r�r�r!r@r1r�r�ra)rcr��substrkr�rXr
r
rr��s 

zMisc._registercCs|}|jr|j}q|Srp�r�)rcr�r
r
rr{sz
Misc._root)z%#z%bz%fz%hz%kz%sz%tz%wz%xz%yz%Az%Ez%Kz%Nz%Wz%Tz%Xz%Yz%Drcs�t|�t|j�kr|S|jj}|jj��fdd�}|\}}}}}}	}
}}}
}}}}}}}}}t�}�|�|_||�|_z||�|_Wnt	k
r�YnX||�|_
||�|_||	�|_||
�|_
||�|_||�|_||
�|_||_z||�|_Wnt	k
�r
YnX||_||�|_zt|�|_Wntk
�rF||_YnXz|�|�|_Wntk
�rt||_YnX||�|_||�|_z�|�|_Wn tt	fk
�r�d|_YnX|fS)Nc	s,z
�|�WSttfk
r&|YSXdSrp)rsr�r��r�r
r�getint_events
z&Misc._substitute.<locals>.getint_eventr)r�
_subst_formatr1r�r�rF�serialrRrSr�rWrQrM�timerVrTrUrKrLrPZ
keysym_numr7rrsr��widgetr"Zx_rootZy_rootrO)rcr�r�r�Znsign�br��hr(rdr3r�rTrU�A�E�K�N�W�T�X�Y�D�er
r�rrhsT*











zMisc._substitutecCs(t��\}}}|��}|�|||�dSrp)�sys�exc_infor{�report_callback_exception)rcr��val�tbrnr
r
r�_report_exceptionHszMisc._report_exceptioncGs\i}|j�|jj|��D]>}|j�|�}|ddd�f|dd�||ddd�<q|S�Nrr�r1r-r�)rcr�r%rTr
r
r�
_getconfigureNs
0zMisc._getconfigurecGs2|j�|jj|��}|ddd�f|dd�Sr�r�)rcr�rTr
r
r�_getconfigure1VszMisc._getconfigure1cCs�|rt||f�}n|rt|�}|dkr:|�t|j|f��St|t�r^|�t|j|d|f��S|j�t|j|f�|�	|��dS)Nr,)
r*r�rr�rrr�r1r�r�)rcrr%r�r
r
r�
_configureZs
zMisc._configurecKs|�d||�S)N�	configure�r��rcr%r�r
r
rr�gszMisc.configurecCs|j�|jdd|�S�N�cgetr,r��rcr5r
r
rr�rsz	Misc.cgetcCs|�||i�dSrp)r��rcr5r	r
r
r�__setitem__xszMisc.__setitem__cs*|jj��fdd��|j�|jd��D�S)Ncs g|]}�|�ddd��qS)rrNr
r�r�r
rr�~szMisc.keys.<locals>.<listcomp>r�rfr�r
r�rrg{s
�z	Misc.keyscCs|jSrprr�r
r
rrE�szMisc.__str__cCsd|jj|jj|jfS)Nz<%s.%s object %s>)r�rArBr�r�r
r
rrh�s
�z
Misc.__repr__�_noarg_cCs:|tjkr"|�|j�dd|j��S|j�dd|j|�dS)N�pack�	propagate�r�r�r~r1r�r��rc�flagr
r
r�pack_propagate�s

�zMisc.pack_propagatecs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr
�r�r�r�r
rr��sz$Misc.pack_slaves.<locals>.<listcomp>r��slavesrfr�r
r�r�pack_slaves�s

��zMisc.pack_slavescs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr
r�r�r�r
rr��sz%Misc.place_slaves.<locals>.<listcomp>�placer�rfr�r
r�r�place_slaves�s
���zMisc.place_slavescCs|j�dd|j|�dS)N�grid�anchorr�)rcr�r
r
r�grid_anchor�szMisc.grid_anchorcCsZdd|jf}|dk	r(|dk	r(|||f}|dk	rD|dk	rD|||f}|�|jj|��pXdS)Nr��bbox)r�r@r1r�)rc�column�rowZcol2Zrow2r�r
r
r�	grid_bbox�szMisc.grid_bboxc	Csht|ttjf�rdz:t|�}|s$WdSd|kr:|j�|�WS|j�|�WSWnttfk
rbYnX|S)Nr�)	rr�_tkinterZTcl_Objr1r�r�rsr�)rcr	Zsvaluer
r
r�_gridconvvalue�szMisc._gridconvvaluecCs�t|t�rJ|sJ|dd�dkr*|dd�}|dd�dkrBd|}|f}n|�||�}|s|t|j|j�d||j|�|jd�S|j�d||j|f|�}t|�dkr�|�|�SdS)Nr�r�rr,r�)r2)	rrr�r6r1r�r�r�r)rcr�indexr%r��optionsrr
r
r�_grid_configure�s(���zMisc._grid_configurecKs|�d|||�S)N�columnconfigure�r��rcr�r%r�r
r
r�grid_columnconfigure�szMisc.grid_columnconfigurec	Cs |�|j�dd|j||��pdS)Nr��locationr?�rcrTrUr
r
r�
grid_location�s���zMisc.grid_locationcCs:|tjkr"|�|j�dd|j��S|j�dd|j|�dS)Nr�r�r�r�r
r
r�grid_propagates

�zMisc.grid_propagatecKs|�d|||�S)N�rowconfigurer�r�r
r
r�grid_rowconfigureszMisc.grid_rowconfigurecCs|�|j�dd|j��pdS)Nr��sizer?r�r
r
r�	grid_sizes
��zMisc.grid_sizecsZd}|dk	r|d|f}|dk	r,|d|f}�fdd��j��j�dd�jf|��D�S)Nr
z-rowz-columncsg|]}��|��qSr
r�r�r�r
rr�(sz$Misc.grid_slaves.<locals>.<listcomp>r�r�rf)rcr�r�r�r
r�r�grid_slaves s
��zMisc.grid_slavescGsdd|f|}|j�|�dS)N�eventr�r��rc�virtual�	sequencesr�r
r
r�	event_add/szMisc.event_addcGsdd|f|}|j�|�dS)Nr��deleter�r�r
r
r�event_delete6szMisc.event_deletecKsDdd|j|f}|��D]\}}|d|t|�f}q|j�|�dS)Nr�Zgenerate�-%s)r�r$rr1r�)rcrjr�r�r(r)r
r
r�event_generate;szMisc.event_generatecCs|j�|j�dd|��S)Nr�ryr�)rcr�r
r
r�
event_infoDs�zMisc.event_infocCs|j�|j�dd��S�N�image�namesr�r�r
r
r�image_namesLszMisc.image_namescCs|j�|j�dd��S)Nr��typesr�r�r
r
r�image_typesPszMisc.image_types)N)rx)N)N)rxr�)rx)N)r)N)N)N)N)r)r)r)r)r)F)N)r)NNN)N)NNN)NNN)r)N)Nr)N)N)NNNN)NN)N)�r@rArB�_last_child_idsr�r�r�r�r�r�r�Zwaitvarr�r�r�r�r�r�r�r�rSr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr
rr
rrrrr�liftrrr r%r'r)r*r+r,r0r2r3r4r5r6r7r8r:r<r=r>rArBrCrDrErFrGrIrJrKrLrMrNrOrPrQrSrTrVrWrZrYr[r]r^r_r`rarbrcr rdrermrortrwrxryrzr�r{r@r}r~r��propertyr�r�r�r�r��registerr{r�rrirhr�r�r�r�r��configr��__getitem__r�rgrErhr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r
r
r
rr�msN
		


)

	
=
	



	r�c@seZdZdd�Zdd�ZdS)r�cCs||_||_||_dSrp)r�r�r�)rcr�r�r�r
r
rr�YszCallWrapper.__init__cGsLz|jr|j|�}|j|�WStk
r2�Yn|j��YnXdSrp)r�r�rtr�r��rcr�r
r
rr�_s
zCallWrapper.__call__N�r@rArBr�r�r
r
r
rr�Usr�c@s$eZdZdd�Zdd�Zdd�ZdS)�XViewcGs(|jj|jdf|��}|s$|�|�SdS)N�xview�r1r�r�r}�rcr�rr
r
rr�oszXView.xviewcCs|j�|jdd|�dS)Nr��movetor��rc�fractionr
r
r�xview_movetouszXView.xview_movetocCs|j�|jdd||�dS)Nr��scrollr��rcr/rmr
r
r�xview_scrollzszXView.xview_scrollN)r@rArBr�r�r�r
r
r
rr�ksr�c@s$eZdZdd�Zdd�Zdd�ZdS)�YViewcGs(|jj|jdf|��}|s$|�|�SdS)N�yviewr�r�r
r
rr��szYView.yviewcCs|j�|jdd|�dS)Nr�r�r�r�r
r
r�yview_moveto�szYView.yview_movetocCs|j�|jdd||�dS)Nr�r�r�r�r
r
r�yview_scroll�szYView.yview_scrollN)r@rArBr�r�r�r
r
r
rr��sr�c@s�eZdZdAdd�ZeZdd�ZeZdBdd�ZeZdd	�Z	e	Z
dCd
d�ZeZdd
�Z
e
ZdDdd�ZeZdd�ZeZdd�ZeZdEdd�ZeZdFdd�ZeZdGdd�ZeZdHdd�ZeZdd�ZeZdIdd�ZeZ dJd d!�Z!e!Z"dKd#d$�Z#e#Z$dLd%d&�Z%e%Z&dMd'd(�Z'e'Z(d)d*�Z)e)Z*dNd+d,�Z+e+Z,dOd-d.�Z-e-Z.dPd/d0�Z/e/Z0dQd1d2�Z1e1Z2dRd3d4�Z3e3Z4dSd5d6�Z5e5Z6dTd7d8�Z7e7Z8dUd9d:�Z9e9Z:dVd;d<�Z;e;Z<dWd=d>�Z=e=Z>d?d@�Z?e?Z@dS)X�WmNcCs |�|j�dd|j||||��S)N�wm�aspectr?)rcZminNumerZminDenomZmaxNumerZmaxDenomr
r
r�	wm_aspect�s��zWm.wm_aspectcGsdd|jf|}|j�|�S)Nr��
attributes)r�r1r�r�r
r
r�
wm_attributes�szWm.wm_attributescCs|j�dd|j|�S)Nr��clientr�r�r
r
r�	wm_client�szWm.wm_clientcsZt|�dkr|f}dd�jf|}|r4�j�|�n"�fdd��j��j�|��D�SdS)Nrr��colormapwindowscsg|]}��|��qSr
r�r�r�r
rr��s�z)Wm.wm_colormapwindows.<locals>.<listcomp>)rr�r1r�r-)rcZwlistr�r
r�r�wm_colormapwindows�s
�zWm.wm_colormapwindowscCs|j�dd|j|�S)Nr�rr�r�r
r
r�
wm_command�sz
Wm.wm_commandcCs|j�dd|j�S)Nr��	deiconifyr�r�r
r
r�wm_deiconify�szWm.wm_deiconifycCs|j�dd|j|�S)Nr��
focusmodelr�)rcZmodelr
r
r�
wm_focusmodel�szWm.wm_focusmodelcCs|j�dd|�dS)Nr��forgetr�r�r
r
r�	wm_forget�szWm.wm_forgetcCs|j�dd|j�S)Nr��framer�r�r
r
r�wm_frame�szWm.wm_framecCs|j�dd|j|�S)Nr�r1r�)rcZnewGeometryr
r
r�wm_geometry�szWm.wm_geometrycCs |�|j�dd|j||||��S)Nr�r�r?)rcZ	baseWidthZ
baseHeightZwidthIncZ	heightIncr
r
r�wm_grids
�z
Wm.wm_gridcCs|j�dd|j|�S)Nr��groupr��rcZpathNamer
r
r�wm_group
szWm.wm_groupcCs2|r|j�dd|jd|�S|j�dd|j|�SdS)Nr��
iconbitmap�-defaultr�)rc�bitmap�defaultr
r
r�
wm_iconbitmaps	zWm.wm_iconbitmapcCs|j�dd|j�S)Nr��iconifyr�r�r
r
r�
wm_iconify$sz
Wm.wm_iconifycCs|j�dd|j|�S)Nr��iconmaskr�)rcrr
r
r�wm_iconmask*szWm.wm_iconmaskcCs|j�dd|j|�S)Nr��iconnamer�)rcZnewNamer
r
r�wm_iconname1szWm.wm_iconnameFcGs<|r |jjdd|jdf|��n|jjdd|jf|��dS)Nr��	iconphotorr�)rcrr�r
r
r�wm_iconphoto8szWm.wm_iconphotoc	Cs|�|j�dd|j||��S)Nr��iconpositionr?r�r
r
r�wm_iconpositionSs
�zWm.wm_iconpositioncCs|j�dd|j|�S)Nr��
iconwindowr�rr
r
r�
wm_iconwindow[szWm.wm_iconwindowcCs|j�dd|�dS)Nr��manager�)rcr�r
r
r�	wm_managebszWm.wm_managec	Cs|�|j�dd|j||��S)Nr��maxsizer?�rcrVrWr
r
r�
wm_maxsizejs
�z
Wm.wm_maxsizec	Cs|�|j�dd|j||��S)Nr��minsizer?r&r
r
r�
wm_minsizess
�z
Wm.wm_minsizecCs|�|j�dd|j|��S)Nr��overrideredirect)r~r1r�r�r�r
r
r�wm_overrideredirect|s
�zWm.wm_overrideredirectcCs|j�dd|j|�S)Nr��positionfromr��rcZwhor
r
r�wm_positionfrom�szWm.wm_positionfromcCs.t|�r|�|�}n|}|j�dd|j||�S)Nr��protocol)r�r�r1r�r�)rcrXr�rr
r
r�wm_protocol�s�zWm.wm_protocolcCs|j�dd|j||�S)Nr��	resizabler�r&r
r
r�wm_resizable�szWm.wm_resizablecCs|j�dd|j|�S)Nr��sizefromr�r-r
r
r�wm_sizefrom�szWm.wm_sizefromcCs|j�dd|j|�S)Nr�rMr�)rcZnewstater
r
r�wm_state�szWm.wm_statecCs|j�dd|j|�S)Nr��titler�r|r
r
r�wm_title�szWm.wm_titlecCs|j�dd|j|�S)Nr��	transientr�)rcr�r
r
r�wm_transient�szWm.wm_transientcCs|j�dd|j�S)Nr��withdrawr�r�r
r
r�wm_withdraw�szWm.wm_withdraw)NNNN)N)N)N)N)NNNN)N)NN)N)N)F)NN)N)NN)NN)N)N)NN)NN)N)N)N)N)Ar@rArBr�r�r�r�rrrrrrrrrrr
r	rrr
r1rr�rrrrrrrrrrrrr rr"r!r$r#r'r%r)r(r+r*r.r,r0r/r2r1r4r3r5rMr7r6r9r8r;r:r
r
r
rr��s��





�

















r�c@sJeZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�Zdd�Z	dd�Z
dS)rlr�Nrrc

Cs�d|_i|_d|_d|_|dkrZddl}|j�tjd�}|j�	|�\}}|dkrZ||}d}	t
�||||	t|||�|_|r�|�
�tjjs�|�||�dS)NFr)z.pyz.pyc)r�r!�	_tkloadedr1�os�path�basenamer��argv�splitextr��create�wantobjects�_loadtk�flags�ignore_environment�readprofile)
rc�
screenName�baseNamer�useTk�syncZuser=Zext�interactiver
r
rr��s zTk.__init__cCs|js|j��|��dSrp)r<r1�loadtkrDr�r
r
rrM�s
z	Tk.loadtkcCs�d|_|j�d�}|tjkr.tdtj|f��t|j�d��}|tjkrZtdtj|f��|jdkrjg|_|j�	dt
�|j�	dt�|j�d�|j�d�t
r�ts�|a|�d|j�dS)	NT�
tk_versionz4tk.h version (%s) doesn't match libtk.a version (%s)�tcl_versionz6tcl.h version (%s) doesn't match libtcl.a version (%s)Ztkerror�exit�WM_DELETE_WINDOW)r<r1r�r��
TK_VERSIONr.r�TCL_VERSIONr�r�rrrvrarirjr/r�)rcrNrOr
r
rrD�s(
�
�
z
Tk._loadtkcCsJt|j���D]}|��q|j�d|j�t�|�trFt	|krFda	dS�Nr�)
rr!�valuesr�r1r�r�r�rirj�rcr&r
r
rr�	s

z
Tk.destroyc
Cs�ddl}d|jkr|jd}n|j}|j�|d|�}|j�|d|�}|j�|d|�}|j�|d|�}d|i}	td|	�|j�|�r�|j�d|�|j�|�r�tt	|��
�|	�|j�|�r�|j�d|�|j�|�r�tt	|��
�|	�dS)Nr�HOMEz.%s.tclz.%s.pyrczfrom tkinter import *�source)r=�environ�curdirr>r�exec�isfiler1r��open�read)
rcrIrr=�homeZ	class_tclZclass_pyZbase_tclZbase_py�dirr
r
rrG	s$

zTk.readprofilecCs:ddl}tdtjd�|t_|t_|t_|�|||�dS)NrzException in Tkinter callback)�file)�	tracebackr#r��stderr�	last_type�
last_value�last_traceback�print_exception)rcr�r�r�rbr
r
rr�$	szTk.report_callback_exceptioncCst|j|�Srp)r^r1)rc�attrr
r
r�__getattr__0	szTk.__getattr__)NNrlrrN)r@rArBr�r�rMrDr�rGr�rir
r
r
rrl�s�

rlcCst||||�Srp)rl)rHrIrrJr
r
r�TclC	srjc@sPeZdZifdd�ZeZZZdd�ZeZdd�Z	e	Z
ejZ
ZejZZdS)�PackcKs$|j�dd|jf|�||��dS)Nr�r��r1r�r�r�r�r
r
r�pack_configureL	s


��zPack.pack_configurecCs|j�dd|j�dS)Nr�r	r�r�r
r
r�pack_forgetb	szPack.pack_forgetcCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)Nr�ry�in�r6r1r�r�r��rc�dr
r
r�	pack_infoh	szPack.pack_infoN)r@rArBrmr�r�r�rnr	rsryr�r�r�r�r�r
r
r
rrkG	s
rkc@sFeZdZifdd�ZeZZZdd�ZeZdd�Z	e	Z
ejZ
ZdS)�PlacecKs$|j�dd|jf|�||��dS)Nr�r�rlr�r
r
r�place_configurez	s


��zPlace.place_configurecCs|j�dd|j�dS)Nr�r	r�r�r
r
r�place_forget�	szPlace.place_forgetcCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)Nr�ryrorprqr
r
r�
place_info�	szPlace.place_infoN)r@rArBrur�r�r�rvr	rwryr�r�r�r
r
r
rrtu	srtc@s�eZdZifdd�ZeZZZejZ	Zej
ZZ
dd�ZeZ
dd�Zdd�ZeZejZZejZZejZZejZZejZZd	S)
�GridcKs$|j�dd|jf|�||��dS)Nr�r�rlr�r
r
r�grid_configure�	s


��zGrid.grid_configurecCs|j�dd|j�dS)Nr�r	r�r�r
r
r�grid_forget�	szGrid.grid_forgetcCs|j�dd|j�dS)Nr�r�r�r�r
r
r�grid_remove�	szGrid.grid_removecCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)Nr�ryrorprqr
r
r�	grid_info�	szGrid.grid_infoN)r@rArBryr�r�r�r�r�r�r�r�rzr	r{r|ryr�r�r�r�r�r�r�r�r�r�r
r
r
rrx�	s





rxc@s6eZdZdd�Ziidfdd�Zdd�Zddd	�Zd
S)�
BaseWidgetcCs�|s
t�}||_|j|_d}d|kr2|d}|d=|s�|jj��}|jdkrRi|_|j�|d�d}||j|<|dkr�d|f}nd||f}||_|j	dkr�d||_	n|j	d||_	i|_
|j|jj
kr�|jj
|j��||jj
|j<dS)NrXrrz!%sz!%s%dr�)ror�r1r�r@rr�r�r}r�r!r�)rcr�r%rX�countr
r
r�_setup�	s2


zBaseWidget._setupr
c	Cs�|rt||f�}||_t�|||�|jdkr4g|_dd�|��D�}|D]\}}||=qJ|j�||jf||�	|��|D]\}}|�
||�q~dS)NcSs"g|]\}}t|t�r||f�qSr
)rrrHr
r
rr�	
s
z'BaseWidget.__init__.<locals>.<listcomp>)r*�
widgetNamer}rr�r$r1r�r�r�r�)	rcr�r�r%r��extra�classesr(r)r
r
rr�
s
�zBaseWidget.__init__cCsTt|j���D]}|��q|j�d|j�|j|jjkrF|jj|j=t	�|�dSrT)
rr!rUr�r1r�r�r}r�r�rVr
r
rr�
s
zBaseWidget.destroycCs|j�|j|f|�Srpr�)rcrXr�r
r
r�_do
szBaseWidget._doN)r
)r@rArBrr�r�r�r
r
r
rr}�	sr}c@seZdZdS)�WidgetN)r@rArBr
r
r
rr�
sr�c@seZdZdifdd�ZdS)�ToplevelNc	Ks�|rt||f�}d}dD]L}||kr||}|ddkrJd|dd�}nd|}|||f}||=qt�||d|i|�|��}|�|���|�|���|�d|j�dS)Nr
)rH�class_r&rUZcolormapr�r�r,rRrQ)r*r}r�r{rr6r/r�)	rcr�r%r�r�Zwmkeyr��optrnr
r
rr�)
s zToplevel.__init__�r@rArBr�r
r
r
rr�&
sr�c@s*eZdZdifdd�Zdd�Zdd�ZdS)rCNcKst�||d||�dS)NZbutton�r�r��rcr�r%r�r
r
rr�G
szButton.__init__cCs|j�|jd�dS�N�flashr�r�r
r
rr�\
s
zButton.flashcCs|j�|jd�S�N�invoker�r�r
r
rr�h
sz
Button.invoke)r@rArBr�r�r�r
r
r
rrCD
srCc@seZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zdvdd
�Zdd�Z	dd�Z
dd�Zdd�Zdwdd�Z
dxdd�Zdydd�Zdzdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Z d>d?�Z!d@dA�Z"d{dBdC�Z#dDdE�Z$dFdG�Z%dHdI�Z&dJdK�Z'dLdM�Z(dNdO�Z)dPdQ�Z*dRdS�Z+dTdU�Z,d|dVdW�Z-e-Z.dXdY�Z/e/Z0dZd[�Z1d}d]d^�Z2ifd_d`�Z3dadb�Z4e4Z5Z6dcdd�Z7dedf�Z8d~dhdi�Z9djdk�Z:dldm�Z;dndo�Z<dpdq�Z=drds�Z>dtdu�Z?dS)�CanvasNcKst�||d||�dS)NZcanvasr�r�r
r
rr�v
s
zCanvas.__init__cGs|j�|jdf|�dS)N�addtagr�r�r
r
rr��
sz
Canvas.addtagcCs|�|d|�dS�NZabove�r��rc�newtag�tagOrIdr
r
r�addtag_above�
szCanvas.addtag_abovecCs|�|d�dS�Nrur�)rcr�r
r
r�
addtag_all�
szCanvas.addtag_allcCs|�|d|�dS�NZbelowr�r�r
r
r�addtag_below�
szCanvas.addtag_belowcCs|�|d||||�dS�NZclosestr�)rcr�rTrU�halo�startr
r
r�addtag_closest�
szCanvas.addtag_closestcCs|�|d||||�dS�NZenclosedr��rcr��x1�y1�x2�y2r
r
r�addtag_enclosed�
szCanvas.addtag_enclosedcCs|�|d||||�dS�NZoverlappingr�r�r
r
r�addtag_overlapping�
szCanvas.addtag_overlappingcCs|�|d|�dS�NZwithtagr�r�r
r
r�addtag_withtag�
szCanvas.addtag_withtagcGs |�|j�|jdf|��pdS�Nr�r?r�r
r
rr��
s
��zCanvas.bboxcCs(|j�|jd||d�|r$|�|�dSrrrs)rcr�rjrlr
r
r�
tag_unbind�
szCanvas.tag_unbindcCs|�|jd|f|||�Srnrp)rcr�rjr�r�r
r
r�tag_bind�
s
�zCanvas.tag_bindcCs|j�|j�|jd||��S)N�canvasxr-)rcZscreenx�gridspacingr
r
rr��
s�zCanvas.canvasxcCs|j�|j�|jd||��S)N�canvasyr-)rcZscreenyr�r
r
rr��
s�zCanvas.canvasycs,�fdd��j��j��jdf|��D�S)Ncsg|]}�j�|��qSr
)r1r�r�r�r
rr��
sz!Canvas.coords.<locals>.<listcomp>�coordsrfr�r
r�rr��
s

��z
Canvas.coordsc	Cs\t|�}|d}t|ttf�r,|dd�}ni}|j�|jj|jd|f||�||����S)Nr�rB)	rrrrr1r�r�r�r�)rc�itemTyper�r�r%r
r
r�_create�
s��zCanvas._createcOs|�d||�S)NZarc�r�r�r
r
r�
create_arc�
szCanvas.create_arccOs|�d||�S�Nrr�r�r
r
r�
create_bitmap�
szCanvas.create_bitmapcOs|�d||�S)Nr�r�r�r
r
r�create_image�
szCanvas.create_imagecOs|�d||�S)N�liner�r�r
r
r�create_line�
szCanvas.create_linecOs|�d||�S)NZovalr�r�r
r
r�create_oval�
szCanvas.create_ovalcOs|�d||�S)NZpolygonr�r�r
r
r�create_polygon�
szCanvas.create_polygoncOs|�d||�S)NZ	rectangler�r�r
r
r�create_rectangle�
szCanvas.create_rectanglecOs|�d||�S�N�textr�r�r
r
r�create_text�
szCanvas.create_textcOs|�d||�S)Nr�r�r�r
r
r�
create_window�
szCanvas.create_windowcGs|j�|jdf|�dS)N�dcharsr�r�r
r
rr�sz
Canvas.dcharscGs|j�|jdf|�dS�Nr�r�r�r
r
rr�sz
Canvas.deletecGs|j�|jdf|�dS)N�dtagr�r�r
r
rr�	szCanvas.dtagcGs |�|j�|jdf|��pdS)N�findr
r?r�r
r
rr�s
��zCanvas.findcCs|�d|�Sr��r��rcr�r
r
r�
find_aboveszCanvas.find_abovecCs
|�d�Sr�r�r�r
r
r�find_allszCanvas.find_allcCs|�d|�Sr�r�r�r
r
r�
find_belowszCanvas.find_belowcCs|�d||||�Sr�r�)rcrTrUr�r�r
r
r�find_closestszCanvas.find_closestcCs|�d||||�Sr�r��rcr�r�r�r�r
r
r�
find_enclosed&szCanvas.find_enclosedcCs|�d||||�Sr�r�r�r
r
r�find_overlapping+szCanvas.find_overlappingcCs|�d|�Sr�r�r�r
r
r�find_withtag0szCanvas.find_withtagcGs|j�|jdf|�Sr�r�r�r
r
rrS4szCanvas.focuscGs|j�|j�|jdf|��S)N�gettagsrfr�r
r
rr�8s�zCanvas.gettagscGs|j�|jdf|�dS�N�icursorr�r�r
r
rr�=szCanvas.icursorcGs|j�|j�|jdf|��S�Nr�rr�r
r
rr�BszCanvas.indexcGs|j�|jdf|�dS�N�insertr�r�r
r
rr�Fsz
Canvas.insertcCs|j�|jdf|d|f�S�N�itemcgetr,r�)rcr�rr
r
rr�Ks�zCanvas.itemcgetcKs|�d|f||�S�N�
itemconfigurer��rcr�r%r�r
r
rr�PszCanvas.itemconfigurecGs|j�|jdf|�dSrr�r�r
r
r�	tag_lower_szCanvas.tag_lowercGs|j�|jdf|�dS)N�mover�r�r
r
rr�fszCanvas.moverYcCs|j�|jd|||�dS)Nr�r�)rcr�rTrUr
r
rr�jsz
Canvas.movetocKs|j�|jdf|�||��S)N�
postscriptrlr�r
r
rr�ss
�zCanvas.postscriptcGs|j�|jdf|�dSrr�r�r
r
r�	tag_raise{szCanvas.tag_raisecGs|j�|jdf|�dS�N�scaler�r�r
r
rr��szCanvas.scalecCs|j�|jdd||�dS�N�scan�markr�r�r
r
r�	scan_mark�szCanvas.scan_mark�
cCs|j�|jdd|||�dS�Nr��dragtor�)rcrTrUZgainr
r
r�scan_dragto�szCanvas.scan_dragtocCs|j�|jdd||�dS)N�select�adjustr��rcr�r�r
r
r�
select_adjust�szCanvas.select_adjustcCs|j�|jdd�dS)Nr�r�r�r�r
r
r�select_clear�szCanvas.select_clearcCs|j�|jdd||�dS)Nr��fromr�r�r
r
r�select_from�szCanvas.select_fromcCs|j�|jdd�pdS)Nr�rr�r�r
r
r�select_item�szCanvas.select_itemcCs|j�|jdd||�dS)Nr��tor�r�r
r
r�	select_to�szCanvas.select_tocCs|j�|jd|�pdS�Nrr�r�r
r
rr�szCanvas.type)NN)N)NNN)N)N)NN)N)rYrY)r�)@r@rArBr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rSr�r�r�r�r�r��
itemconfigr�rr�r�r�r�r�rr�r�r�r�r�r�r�r�rr
r
r
rr�s
sx


	



	
	
r�c@sBeZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�ZdS)�CheckbuttonNcKst�||d||�dS�NZcheckbuttonr�r�r
r
rr��s
zCheckbutton.__init__cCs|j�|jd�dS�N�deselectr�r�r
r
rr��szCheckbutton.deselectcCs|j�|jd�dSr�r�r�r
r
rr��szCheckbutton.flashcCs|j�|jd�Sr�r�r�r
r
rr��szCheckbutton.invokecCs|j�|jd�dS�Nr�r�r�r
r
rr��szCheckbutton.selectcCs|j�|jd�dS)N�toggler�r�r
r
rr��szCheckbutton.toggle)	r@rArBr�r�r�r�r�r�r
r
r
rr��sr�c@s�eZdZdifdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�ZeZdd�Z
e
Zdd�ZeZdd�ZeZdd�ZeZdd�ZeZdS)�EntryNcKst�||d||�dS)N�entryr�r�r
r
rr��szEntry.__init__cCs|j�|jd||�dSr�r��rc�firstZlastr
r
rr��szEntry.deletecCs|j�|jd�S�Nr�r�r�r
r
rr��sz	Entry.getcCs|j�|jd|�dSr�r��rcr�r
r
rr��sz
Entry.icursorcCs|j�|j�|jd|��Sr�rr�r
r
rr��s
�zEntry.indexcCs|j�|jd||�dSr�r�)rcr�r�r
r
rr��szEntry.insertcCs|j�|jdd|�dSr�r�r\r
r
rr��szEntry.scan_markcCs|j�|jdd|�dSr�r�r\r
r
rr��szEntry.scan_dragtocCs|j�|jdd|�dS)Nr	r�r�r�r
r
r�selection_adjust�szEntry.selection_adjustcCs|j�|jdd�dS�Nr	r�r�r�r
r
rr
szEntry.selection_clearcCs|j�|jdd|�dS)Nr	r�r�r�r
r
r�selection_fromszEntry.selection_fromcCs|j�|j�|jdd��S�Nr	Zpresentr(r�r
r
r�selection_presents�zEntry.selection_presentcCs|j�|jdd||�dS)Nr	�ranger��rcr��endr
r
r�selection_rangeszEntry.selection_rangecCs|j�|jdd|�dS)Nr	r�r�r�r
r
r�selection_toszEntry.selection_to)N)r@rArBr�r�r�r�r�r�r�r�rr�r
r�rr�rZselect_presentrZselect_ranger	r�r
r
r
rr��s(
r�c@seZdZdifdd�ZdS)�FrameNcKs^t||f�}d}d|kr,d|df}|d=nd|krFd|df}|d=t�||d|i|�dS)Nr
r�z-classr&r)r*r�r�)rcr�r%r�r�r
r
rr�&szFrame.__init__r�r
r
r
rr
#sr
c@seZdZdifdd�ZdS)�LabelNcKst�||d||�dS)N�labelr�r�r
r
rr�:szLabel.__init__r�r
r
r
rr7src@s�eZdZdifdd�Zdd�Zdd�Zdd	�Zd(d
d�Zd)dd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZeZd*dd�ZeZdd�ZeZd+d d!�ZeZd"d#�Zd$d%�Zd,d&d'�ZeZdS)-�ListboxNcKst�||d||�dS)NZlistboxr�r�r
r
rr�RszListbox.__init__cCs|j�|jd|�dS�N�activater�r�r
r
rr\szListbox.activatecCs|�|j�|jd|��pdSr�r?r�r
r
rr�`szListbox.bboxcCs|�|j�|jd��pdS)N�curselectionr
r?r�r
r
rreszListbox.curselectioncCs|j�|jd||�dSr�r�r�r
r
rr�iszListbox.deletecCs:|dk	r$|j�|j�|jd||��S|j�|jd|�SdSr�rfr�r
r
rr�ms�zListbox.getcCs*|j�|jd|�}|dkrdS|j�|�S�Nr�r��r1r�r�r��rcr�rer
r
rr�usz
Listbox.indexcGs|j�|jd|f|�dSr�r�)rcr��elementsr
r
rr�{szListbox.insertcCs|j�|j�|jd|��S)N�nearestr)rcrUr
r
rrs
�zListbox.nearestcCs|j�|jdd||�dSr�r�r�r
r
rr��szListbox.scan_markcCs|j�|jdd||�dSr�r�r�r
r
rr��szListbox.scan_dragtocCs|j�|jd|�dS�N�seer�r�r
r
rr�szListbox.seecCs|j�|jdd|�dS)Nr	r�r�r�r
r
r�selection_anchor�szListbox.selection_anchorcCs|j�|jdd||�dSrr�r�r
r
rr
�s
�zListbox.selection_clearcCs|j�|j�|jdd|��S)Nr	Zincludesr(r�r
r
r�selection_includes�s�zListbox.selection_includescCs|j�|jdd||�dS)Nr	r�r�r�r
r
r�
selection_set�szListbox.selection_setcCs|j�|j�|jd��S)Nr�rr�r
r
rr��szListbox.sizecCs|j�|jdf|d|f�Sr�r��rcr�rr
r
rr��s�zListbox.itemcgetcKs|�d|f||�Sr�r�r�r
r
rr��szListbox.itemconfigure)N)N)N)N)N)r@rArBr�rr�rr�r�r�r�rr�r�rrZ
select_anchorr
r�rZselect_includesrZ
select_setr�r�r�r�r
r
r
rr
Os0






r
c@seZdZdifdd�Zd5dd�Zdd�Zifd	d
�Zifdd�Zifd
d�Zifdd�Z	ifdd�Z
ifdd�Zifdd�Zifdd�Z
ifdd�Zifdd�Zifdd�Zifdd �Zd6d!d"�Zd#d$�Zd7d%d&�ZeZd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�ZdS)8�MenuNcKst�||d||�dS�N�menur�r�r
r
rr��sz
Menu.__init__rYcCs|j�d|j|||�dS)N�tk_popupr�)rcrTrUr�r
r
rr�sz
Menu.tk_popupcCs|j�|jd|�dSrr�r�r
r
rr�sz
Menu.activatecKs$|j�|jd|f|�||��dS�Nr�rl)rcr�r%r�r
r
rr��s
�zMenu.addcKs|�d|p|�dS�NZcascade�r�r�r
r
r�add_cascade�szMenu.add_cascadecKs|�d|p|�dSr�r"r�r
r
r�add_checkbutton�szMenu.add_checkbuttoncKs|�d|p|�dS�Nrr"r�r
r
r�add_command�szMenu.add_commandcKs|�d|p|�dS�NZradiobuttonr"r�r
r
r�add_radiobutton�szMenu.add_radiobuttoncKs|�d|p|�dS�NZ	separatorr"r�r
r
r�
add_separator�szMenu.add_separatorcKs&|j�|jd||f|�||��dSr�rl)rcr�r�r%r�r
r
rr��s
�zMenu.insertcKs|�|d|p|�dSr!�r�r�r
r
r�insert_cascade�szMenu.insert_cascadecKs|�|d|p|�dSr�r+r�r
r
r�insert_checkbutton�szMenu.insert_checkbuttoncKs|�|d|p|�dSr%r+r�r
r
r�insert_command�szMenu.insert_commandcKs|�|d|p|�dSr'r+r�r
r
r�insert_radiobutton
szMenu.insert_radiobuttoncKs|�|d|p|�dSr)r+r�r
r
r�insert_separator
szMenu.insert_separatorcCs�|dkr|}|�|�|�|�}}|dks2|dkr:d\}}t||d�D]0}d|�|�krHt|�|d��}|rH|�|�qH|j�|jd||�dS)N)rr�rrr�)	r�r�entryconfigr�	entrycgetr�r1r�r�)rc�index1�index2Z
num_index1Z
num_index2rer&r
r
rr�	
szMenu.deletecCs|j�|jd|d|�S)Nr2r,r�rr
r
rr2
szMenu.entrycgetcKs|�d|f||�S)N�entryconfigurer�r�r
r
rr5
szMenu.entryconfigurecCs*|j�|jd|�}|dkrdS|j�|�Srrrr
r
rr�#
sz
Menu.indexcCs|j�|jd|�Sr�r�r�r
r
rr�)
szMenu.invokecCs|j�|jd||�dS)N�postr�r�r
r
rr6.
sz	Menu.postcCs|j�|jd|�Sr�r�r�r
r
rr2
sz	Menu.typecCs|j�|jd�dS)N�unpostr�r�r
r
rr76
szMenu.unpostcCs|j�|j�|jd|��S)N�	xpositionrr�r
r
rr8:
szMenu.xpositioncCs|j�|j�|jd|��S)N�	ypositionrr�r
r
rr9?
s
�zMenu.yposition)rY)N)N)r@rArBr�rrr�r#r$r&r(r*r�r,r-r.r/r0r�r2r5r1r�r�r6rr7r8r9r
r
r
rr�s4	


rc@seZdZdifdd�ZdS)�
MenubuttonNcKst�||d||�dS)N�
menubuttonr�r�r
r
rr�H
szMenubutton.__init__r�r
r
r
rr:E
sr:c@seZdZdifdd�ZdS)�MessageNcKst�||d||�dS)N�messager�r�r
r
rr�O
szMessage.__init__r�r
r
r
rr<L
sr<c@s:eZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�RadiobuttonNcKst�||d||�dSr'r�r�r
r
rr�V
s
zRadiobutton.__init__cCs|j�|jd�dSr�r�r�r
r
rr�b
szRadiobutton.deselectcCs|j�|jd�dSr�r�r�r
r
rr�g
szRadiobutton.flashcCs|j�|jd�Sr�r�r�r
r
rr�k
szRadiobutton.invokecCs|j�|jd�dSr�r�r�r
r
rr�o
szRadiobutton.select)r@rArBr�r�r�r�r�r
r
r
rr>S
s
r>c@s<eZdZdifdd�Zdd�Zdd�Zddd	�Zd
d�ZdS)
�ScaleNcKst�||d||�dSr�r�r�r
r
rr�w
s	zScale.__init__c
CsJ|j�|jd�}z|j�|�WStttfk
rD|j�|�YSXdSr�)r1r�r�r�rsr"r�r�r�r
r
rr��
s
z	Scale.getcCs|j�|jd|�dS�Nr�r�r�r
r
rr��
sz	Scale.setcCs|�|j�|jd|��S)Nr�r?r�r
r
rr��
szScale.coordscCs|j�|jd||�S�N�identifyr�r�r
r
rrB�
szScale.identify)N)r@rArBr�r�r�r�rBr
r
r
rr?t
s

r?c@sLeZdZdifdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�	ScrollbarNcKst�||d||�dS)NZ	scrollbarr�r�r
r
rr��
s	zScrollbar.__init__cCs|j�|jd|�pdSrr�r�r
r
rr�
szScrollbar.activatecCs|j�|j�|jd||��S)NrOr-)rcZdeltaxZdeltayr
r
rrO�
s�zScrollbar.deltacCs|j�|j�|jd||��S)Nr�r-r�r
r
rr��
szScrollbar.fractioncCs|j�|jd||�SrAr�r�r
r
rrB�
szScrollbar.identifycCs|�|j�|jd��Sr�)r}r1r�r�r�r
r
rr��
sz
Scrollbar.getcCs|j�|jd||�dSr@r�r�r
r
rr��
sz
Scrollbar.set)N)
r@rArBr�rrOr�rBr�r�r
r
r
rrC�
s
	rCc@s�eZdZdifdd�Zdd�Zdd�Zdd	�Zdjd
d�Zdkdd
�Zdd�Z	dldd�Z
dd�Zdmdd�Zdd�Z
dd�Zdd�Zdd�Zdndd�Zd d!�Zdod"d#�Zifd$d%�Zd&d'�Zd(d)�Zd*d+�Zdpd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zifd8d9�Zd:d;�Zd<d=�Z d>d?�Z!d@dA�Z"dqdBdC�Z#dDdE�Z$dFdG�Z%drdHdI�Z&dsdJdK�Z'dLdM�Z(dtdNdO�Z)e)Z*dPdQ�Z+dudRdS�Z,dvdTdU�Z-dwdVdW�Z.dxdXdY�Z/dydZd[�Z0d\d]�Z1dzd^d_�Z2d`da�Z3d{dbdc�Z4e4Z5ifddde�Z6dfdg�Z7dhdi�Z8dS)|�TextNcKst�||d||�dSr�r�r�r
r
rr��
sz
Text.__init__cCs|�|j�|jd|��pdSr�r?r�r
r
rr��
s
��z	Text.bboxc	Cs|j�|j�|jd|||��S)N�comparer()rcr3�opr4r
r
rrE�
s�zText.comparecGsVdd�|D�}|||g7}|jj|jdf|��p2d}|dk	rNt|�dkrN|fS|SdS)NcSsg|]}|�d�sd|�qS)r,r�)�
startswith)rI�argr
r
rr�s
zText.count.<locals>.<listcomp>r~�)r1r�r�r)rcr3r4r�rr
r
rr~�
sz
Text.countcCs6|dkr |j�|j�|jd��S|j�|jd|�dS)N�debugr(r�r
r
rrJ	sz
Text.debugcCs|j�|jd||�dSr�r��rcr3r4r
r
rr�szText.deletecCs|�|j�|jd|��S)N�	dlineinfor?r�r
r
rrLszText.dlineinfoc
	Ks�g}d}d}|s$g}|fdd�}|}zzt|t�s>|�|�}}|d|g7}|D]}	||	rN|�d|	�qN|�|�|r�|�|�|jj|jdf|��|W�S|r�|�|�XdS)NcSs|�|||f�dSrp)ra)r5r	r�r#r
r
r�
append_triple/sz Text.dump.<locals>.append_triplez-commandr,�dump)r�rrr�rar1r�r�)
rcr3r4rr�r�Z	func_namer#rMr5r
r
rrNs*


z	Text.dumpcGs|jj|jdf|��S)N�editr�r�r
r
rrOBs
z	Text.editcCs|�d|�S)NZmodified�rO)rcrHr
r
r�
edit_modifiedQs	zText.edit_modifiedcCs
|�d�S)NZredorPr�r
r
r�	edit_redo\szText.edit_redocCs
|�d�S)N�resetrPr�r
r
r�
edit_resetfszText.edit_resetcCs
|�d�Sr)rPr�r
r
r�edit_separatorkszText.edit_separatorcCs
|�d�S)NZundorPr�r
r
r�	edit_undors	zText.edit_undocCs|j�|jd||�Sr�r�rKr
r
rr�}szText.getcCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)Nrr,r�r�r�r�r�rr
r
r�
image_cget�s
zText.image_cgetcKs|�dd|f||�S)Nr�r�r�r�r
r
r�image_configure�szText.image_configurecKs"|jj|jdd|f|�||���S)Nr�rBrlr�r
r
r�image_create�s�
�zText.image_createcCs|j�|jdd�Sr�r�r�r
r
rr��szText.image_namescCst|j�|jd|��Sr�)rr1r�r�r�r
r
rr��sz
Text.indexcGs|j�|jd||f|�dSr�r�)rcr��charsr�r
r
rr��szText.insertcCs|j�|jdd||f�S)Nr�Zgravityr�)rc�markName�	directionr
r
r�mark_gravity�s�zText.mark_gravitycCs|j�|j�|jdd��S)Nr�r�rfr�r
r
r�
mark_names�s
�zText.mark_namescCs|j�|jdd||�dS)Nr�r�r�)rcr[r�r
r
r�mark_set�sz
Text.mark_setcGs|j�|jddf|�dS)Nr�Zunsetr�)rcZ	markNamesr
r
r�
mark_unset�szText.mark_unsetcCs|j�|jdd|�pdS)Nr��nextr�r�r
r
r�	mark_next�szText.mark_nextcCs|j�|jdd|�pdS)Nr�Zpreviousr�r�r
r
r�
mark_previous�szText.mark_previouscKs&|jj|jdd|f|�||���dS)N�peerrBrl)rcZnewPathNamer%r�r
r
r�peer_create�s
�zText.peer_createcCs|j�|j�|jdd��S)Nrdr�rfr�r
r
r�
peer_names�szText.peer_namescGs |jj|jd|||f|��dS)Nrr�)rcr3r4rZr�r
r
rr�szText.replacecCs|j�|jdd||�dSr�r�r�r
r
rr��szText.scan_markcCs|j�|jdd||�dSr�r�r�r
r
rr��szText.scan_dragtocCs�|jdg}|r|�d�|r&|�d�|r4|�d�|rB|�d�|rP|�d�|
r^|�d�|	rv|�d�|�|	�|r�|d	d
kr�|�d�|�|�|�|�|r�|�|�t|j�t|���S)Nrz	-forwardsz
-backwardsz-exactz-regexpz-nocasez-elidez-countrr,r�)r�rarr1r�r)rcrr�Z	stopindexZforwardsZ	backwards�exactZregexpZnocaser~Zelider�r
r
rr�s.












zText.searchcCs|j�|jd|�dSrr�r�r
r
rr�szText.seecGs |j�|jdd||f|�dS)N�tagr�r�)rc�tagNamer3r�r
r
r�tag_add�s�zText.tag_addcCs*|j�|jdd||d�|r&|�|�dS)NrhrorYrs)rcrirjrlr
r
rr��szText.tag_unbindcCs|�|jdd|f|||�S)Nrhrorp)rcrirjr�r�r
r
rr�s
�z
Text.tag_bindcCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)Nrr,r�r�rhr�r�)rcrirr
r
r�tag_cget	s
z
Text.tag_cgetcKs|�dd|f||�S)Nrhr�r�)rcrir%r�r
r
r�
tag_configureszText.tag_configurecGs|j�|jddf|�dS)Nrhr�r�)rcZtagNamesr
r
r�
tag_deleteszText.tag_deletecCs|j�|jdd||�dS)Nrhrr�)rcrirr
r
rr�szText.tag_lowercCs|j�|j�|jdd|��S)Nrhr�rfr�r
r
r�	tag_names s�zText.tag_namesc
Cs |j�|j�|jdd|||��S)NrhZ	nextrangerf�rcrir3r4r
r
r�
tag_nextrange%s�zText.tag_nextrangec
Cs |j�|j�|jdd|||��S)NrhZ	prevrangerfror
r
r�
tag_prevrange,s�zText.tag_prevrangecCs|j�|jdd||�dS)Nrhrr�)rcrirr
r
rr�3s�zText.tag_raisecCs|j�|j�|jdd|��S)NrhZrangesrf)rcrir
r
r�
tag_ranges9s�zText.tag_rangescCs|j�|jdd|||�dS)Nrhr�r�ror
r
r�
tag_remove>s�zText.tag_removecCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)Nrr,r�r�r�r�r�rr
r
r�window_cgetCs
zText.window_cgetcKs|�dd|f||�S)Nr�r�r�r�r
r
r�window_configureKszText.window_configurecKs&|j�|jdd|f|�||��dS)Nr�rBrlr�r
r
r�
window_createQs

��zText.window_createcCs|j�|j�|jdd��S)Nr�r�rfr�r
r
r�window_namesWs�zText.window_namescGs|j�|jddf|�dS)Nr�z
-pickplacer�)rcrmr
r
r�yview_pickplace\szText.yview_pickplace)N)N)NN)N)N)N)N)NNNNNNNN)N)N)N)N)N)N)N)N)N)N)9r@rArBr�r�rEr~rJr�rLrNrOrQrRrTrUrVr�rWrXrYr�r�r�r]r^r_r`rbrcrerfrr�r�rrrjr�r�rkrlZ
tag_configrmr�rnrprqr�rrrsrtruZ
window_configrvrwrxr
r
r
rrD�
s|


(




�


	







rDc@seZdZddd�Zdd�ZdS)�_setitNcCs||_||_||_dSrp)�
_setit__value�_setit__var�_setit__callback)rc�varr	r�r
r
rr�dsz_setit.__init__cGs*|j�|j�|jr&|j|jf|��dSrp)r{r�rzr|r�r
r
rr�isz_setit.__call__)Nr�r
r
r
rryas
ryc@s$eZdZdd�Zdd�Zdd�ZdS)�
OptionMenuc
Os�d|dtddd�}t�||d|�d|_t|ddd	�}|_|j|_|�d
�}d
|kr\|d
=|rtt	dt
t|����|j|t
|||�d�|D]}	|j|	t
||	|�d�q�||d<dS)
Nr+rr&)ZborderwidthZtextvariableZindicatoronZreliefr�Zhighlightthicknessr;Z
tk_optionMenurr)rXZtearoffrzunknown option -)rr)ZRAISEDr�r�r�r�_OptionMenu__menur�Zmenunamer�r�rar/r&ry)
rcr�r�r	rU�kwargsr�rr�r)r
r
rr�rs.�

�
�zOptionMenu.__init__cCs|dkr|jSt�||�Sr)rr�r�r�r
r
rr��szOptionMenu.__getitem__cCst�|�d|_dSrp)r:r�rr�r
r
rr��s
zOptionMenu.destroyN)r@rArBr�r�r�r
r
r
rr~osr~c@sdeZdZdZdidfdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	e	Z
dd�Zdd�Zdd�Z
dS)�ImagerNc	Ks�d|_|std�}t|d|�|_|s>tjd7_dtjf}|rT|rTt||f�}n|r\|}d}|��D]*\}}t|�r�|�	|�}|d||f}qh|j�
dd||f|�||_dS)	Nzcreate imager1rz	pyimage%rr
r,r�rB)rXror^r1r��_last_idr*r$r�r�r�)	rcZimgtyperXr%r�r�r�r(r)r
r
rr��s$
zImage.__init__cCs|jSrp)rXr�r
r
rrE��z
Image.__str__cCs6|jr2z|j�dd|j�Wntk
r0YnXdS)Nr�r�)rXr1r�r�r�r
r
rr��s
z
Image.__del__cCs|j�|jdd||�dS�Nr�r,�r1r�rXr�r
r
rr��szImage.__setitem__cCs|j�|jdd|�Sr�r�r�r
r
rr��szImage.__getitem__cKsvd}t|���D]J\}}|dk	r|ddkr8|dd�}t|�rJ|�|�}|d||f}q|j�|jdf|�dS)Nr
r�r�r,r�)r*r$r�r�r1r�rX)rcr�rr(r)r
r
rr��s
zImage.configurecCs|j�|j�dd|j��S)Nr�rW�r1r�r�rXr�r
r
rrW�s�zImage.heightcCs|j�dd|j�S)Nr�rr�r�r
r
rr�sz
Image.typecCs|j�|j�dd|j��S)Nr�rVr�r�r
r
rrV�s�zImage.width)r@rArBr�r�rEr�r�r�r�r�rWrrVr
r
r
rr��sr�c@s|eZdZdidfdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
d�Zddd�Z	dd�Z
ddd�Zddd�Zdd�Z
dd�ZdS)�
PhotoImageNcKstj|d|||f|�dS)NZphoto�r�r��rcrXr%r�r�r
r
rr��szPhotoImage.__init__cCs|j�|jd�dS)N�blankr�r�r
r
rr��szPhotoImage.blankcCs|j�|jdd|�Sr�r�)rcrr
r
rr��szPhotoImage.cgetcCs|j�|jdd|�Sr�r�r�r
r
rr��szPhotoImage.__getitem__cCs"t|jd�}|j�|d|j�|S)Nr��copy�r�r1r�rX)rc�	destImager
r
rr��szPhotoImage.copyrYcCs4t|jd�}|dkr|}|j�|d|jd||�|S)Nr�rYr�z-zoomr��rcrTrUr�r
r
r�zoom�s
zPhotoImage.zoomcCs4t|jd�}|dkr|}|j�|d|jd||�|S)Nr�rYr�z
-subsampler�r�r
r
r�	subsample�s
zPhotoImage.subsamplecCs|j�|jd||�Sr�r�r�r
r
rr�	szPhotoImage.getcCsH|jd|f}|r8|ddkr(|dd�}|dt|�}|j�|�dS)N�putr�-tor)r��rXrr1r�)rcr�r�r�r
r
rr�
szPhotoImage.putcCs@|jd|f}|r|d|f}|r0|dt|�}|j�|�dS)N�writez-format)z-fromr�)rc�filename�formatZfrom_coordsr�r
r
rr�szPhotoImage.writec	Cs|j�|j�|jdd||��S)N�transparencyr�)r1r�r�rXr�r
r
r�transparency_get"s�zPhotoImage.transparency_getcCs|j�|jdd|||�dS)Nr�r�r�)rcrTrUr�r
r
r�transparency_set'szPhotoImage.transparency_set)rY)rY)N)NN)r@rArBr�r�r�r�r�r�r�r�r�r�r�r�r
r
r
rr��s






r�c@seZdZdidfdd�ZdS)�BitmapImageNcKstj|d|||f|�dSr�r�r�r
r
rr�/szBitmapImage.__init__r�r
r
r
rr�,sr�cCstd�j}|�|�dd��S)Nzuse image_names()r�r��ror1r-r��r1r
r
rr�6s
r�cCstd�j}|�|�dd��S)Nzuse image_types()r�r�r�r�r
r
rr�;s
r�c@s�eZdZdifdd�Zdd�Zd*dd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd+d d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�ZdS),�SpinboxNcKst�||d||�dS)NZspinboxr�r�r
r
rr�CszSpinbox.__init__cCs|�|j�|jd|��pdSr�r?r�r
r
rr�`szSpinbox.bboxcCs|j�|jd||�Sr�r�r�r
r
rr�ns	zSpinbox.deletecCs|j�|jd�Sr�r�r�r
r
rr�yszSpinbox.getcCs|j�|jd|�Sr�r�r�r
r
rr�}szSpinbox.icursorcCs|j�|jd||�SrAr�r�r
r
rrB�szSpinbox.identifycCs|j�|jd|�Sr�r�r�r
r
rr��sz
Spinbox.indexcCs|j�|jd||�Sr�r�)rcr�rdr
r
rr��szSpinbox.insertcCs|j�|jd|�Sr�r��rc�elementr
r
rr��szSpinbox.invokecGs |�|j�|jdf|��pdS)Nr�r
r?r�r
r
rr��s
��zSpinbox.scancCs|�d|�S�Nr��r�r\r
r
rr��szSpinbox.scan_markcCs|�d|�S)Nr�r�r\r
r
rr��s
zSpinbox.scan_dragtocGs |�|j�|jdf|��pdS)Nr	r
r?r�r
r
rr	�s
��zSpinbox.selectioncCs|�d|�S)Nr��r	r�r
r
rr�szSpinbox.selection_adjustcCs
|�d�S)Nr�r�r�r
r
rr
�szSpinbox.selection_clearcCs|j�|jdd|�S)Nr	r�r�r�r
r
r�selection_element�szSpinbox.selection_elementcCs|�d|�dS)Nr�r�r�r
r
rr�szSpinbox.selection_fromcCs|j�|j�|jdd��Srr(r�r
r
rr�s�zSpinbox.selection_presentcCs|�d||�dS)Nrr�rr
r
rr�szSpinbox.selection_rangecCs|�d|�dS)Nr�r�r�r
r
rr	�szSpinbox.selection_to)N)N)r@rArBr�r�r�r�r�rBr�r�r�r�r�r�r	rr
r�rrrr	r
r
r
rr�@s(
	
r�c@seZdZdifdd�ZdS)�
LabelFrameNcKst�||d||�dS)NZ
labelframer�r�r
r
rr��szLabelFrame.__init__r�r
r
r
rr��sr�c@s�eZdZdifdd�Zdd�Zdd�ZeZdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd dd�ZeZdd�ZdS)!�PanedWindowNcKst�||d||�dS)NZpanedwindowr�r�r
r
rr�
szPanedWindow.__init__cKs"|j�|jd|f|�|��dSr rl)rcr$r�r
r
rr�szPanedWindow.addcCs|j�|jd|�dS�Nr	r�)rcr$r
r
rr�'szPanedWindow.removecCs|j�|jd||�SrAr�r�r
r
rrB0s
zPanedWindow.identifycGs |�|j�|jdf|��pdS)N�proxyr
r?r�r
r
rr�<s
��zPanedWindow.proxycCs
|�d�S�NZcoord�r�r�r
r
r�proxy_coordAszPanedWindow.proxy_coordcCs
|�d�Sr�r�r�r
r
r�proxy_forgetFszPanedWindow.proxy_forgetcCs|�d||�S�Nr�r�r�r
r
r�proxy_placeKszPanedWindow.proxy_placecGs |�|j�|jdf|��pdS)N�sashr
r?r�r
r
rr�Ps
��zPanedWindow.sashcCs|�d|�Sr��r�r�r
r
r�
sash_coordUszPanedWindow.sash_coordcCs|�d|�Sr�r�r�r
r
r�	sash_markcszPanedWindow.sash_markcCs|�d|||�Sr�r�)rcr�rTrUr
r
r�
sash_placejszPanedWindow.sash_placecCs|j�|jdf|d|f�S)N�panecgetr,r�)rcr$rr
r
rr�os�zPanedWindow.panecgetcKsd|dkr|s|�|jd|�St|t�r@|s@|�|jd|d|�S|j�|jd|f|�||��dS)N�
paneconfigurer,)r�r�rrr�r1r�r�r�r
r
rr�wsD�
�zPanedWindow.paneconfigurecCs|j�|j�|jd��S)N�panesrfr�r
r
rr��szPanedWindow.panes)N)r@rArBr�r�r�r	rBr�r�r�r�r�r�r�r�r�r�Z
paneconfigr�r
r
r
rr�
s"

Lr�cCs�t�}dt}|d7}t||d�}|��t|d|fdd�d�}|��||_t|d|jd�}|��|��|��|�	�|�
�dS)	NzThis is Tcl/Tk version %su
This should be a cedilla: ç�r�z	Click me!cSs|jjd|jdd�S)Nz[%s]r�r�)�testr�)rnr
r
r�<lambda>�s�z_test.<locals>.<lambda>)r�rZQUIT)rl�
TclVersionrr�rCr�r�rr rr�)rnr�rr�r{r
r
r�_test�s 
�r��__main__)TN)N)r)r)NNrlr)U�enumr�r�r�Ztkinter.constants�rerC�floatrRZ	TkVersionrSr�ZREADABLEZWRITABLEZ	EXCEPTION�compiler�ASCIIrrrrr!r*r6r�Enumr7rFrirjrkrorrrvr~rwr�r�r�r�r�r_r�r�r�r�r�r�r�r�rlrjrkrtrxr}r�r�rCr�r�r�r
rr
rr:r<r>r?rCrDryr~r�r�r�r�r�r�r�r�r�r@r
r
r
r�<module>!s�





,R

	6

q2~
.37?/8$Vt!'2'BT
3C
PK�(�Zwbh^��$__pycache__/dnd.cpython-38.opt-2.pycnu�[���U

e5d�,�@sTddlZdd�ZGdd�d�ZGdd�d�ZGdd	�d	�Zd
d�ZedkrPe�dS)
�NcCst||�}|jr|SdSdS�N)�
DndHandler�root)�source�event�h�r�#/usr/lib64/python3.8/tkinter/dnd.py�	dnd_startls
r
c@sDeZdZdZdd�Zdd�Zdd�Zdd	�Zdd
d�Zdd
d�Z	dS)rNcCs�|jdkrdS|j��}z|jWdStk
rD||_||_YnX||_d|_|j|_}|j|_	}d||f|_
|dp�d|_|�|j
|j
�|�d|j�d|d<dS)N�z<B%d-ButtonRelease-%d>�cursor��<Motion>Zhand2)Znum�widgetZ_root�_DndHandler__dnd�AttributeErrorrr�targetZinitial_button�initial_widget�release_pattern�save_cursor�bind�
on_release�	on_motion)�selfrrrZbuttonrrrr	�__init__zs$

zDndHandler.__init__cCs2|j}d|_|r.z|`Wntk
r,YnXdSr)rrr�rrrrr	�__del__�szDndHandler.__del__c	Cs�|j|j}}|j�||�}|j}d}|rbz
|j}Wntk
rHYnX|||�}|rZqb|j}q&|j}||kr�|r�|�	||�n,|r�d|_|�
||�|r�|�||�||_dSr)�x_root�y_rootrZwinfo_containingr�
dnd_acceptrZmasterr�
dnd_motion�	dnd_leave�	dnd_enter)	rr�x�yZ
target_widgetr�
new_target�attrZ
old_targetrrr	r�s.

zDndHandler.on_motioncCs|�|d�dS)N���finish�rrrrr	r�szDndHandler.on_releasecCs|�|d�dS)Nrr(r*rrr	�cancel�szDndHandler.cancelrc
Cs�|j}|j}|j}|j}zf|`|j�|j�|j�d�|j|d<d|_|_|_|_|r||rp|�	||�n|�
||�W5|�||�XdS)Nrr)rrrr�dnd_endrZunbindrr�
dnd_commitr!)rrZcommitrrrrrrr	r)�s
zDndHandler.finish)N)r)
�__name__�
__module__�__qualname__rrrrrr+r)rrrr	rvs	
rc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�IconcCs||_d|_|_|_dSr)�name�canvas�label�id)rr2rrr	r�sz
Icon.__init__�
cCs�||jkr |j�|j||�dS|jr.|��|s6dStj||jddd�}|j|||dd�}||_||_||_|�	d|j
�dS)N�Zraised)�textZborderwidthZreliefZnw)ZwindowZanchorz
<ButtonPress>)r3�coordsr5�detach�tkinterZLabelr2Z
create_windowr4r�press)rr3r#r$r4r5rrr	�attach�s 

�zIcon.attachcCsB|j}|sdS|j}|j}d|_|_|_|�|�|��dSr)r3r5r4�deleteZdestroy)rr3r5r4rrr	r:�s
zIcon.detachcCs4t||�r0|j|_|j|_|j�|j�\|_|_	dSr)
r
r#�x_offr$�y_offr3r9r5�x_orig�y_origr*rrr	r<�s
z
Icon.presscCs(|�|j|�\}}|j�|j||�dSr)�wherer3r9r5)rrr#r$rrr	�move�sz	Icon.movecCs|j�|j|j|j�dSr)r3r9r5rArB)rrrr	�putback�szIcon.putbackcCs8|��}|��}|j|}|j|}||j||jfSr)Zwinfo_rootxZwinfo_rootyrrr?r@)rr3rZx_orgZy_orgr#r$rrr	rC�s


z
Icon.wherecCsdSrr)rrrrrr	r,szIcon.dnd_endN)r6r6)r.r/r0rr=r:r<rDrErCr,rrrr	r1�s


r1c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�TestercCs>t�|�|_tj|jddd�|_|jjddd�|j|j_dS)N�d)�widthZheightZbothr')Zfill�expand)r;ZToplevel�topZCanvasr3�packrrrrr	rszTester.__init__cCs|Srr�rrrrrr	rszTester.dnd_acceptcCsp|j��|�|j|�\}}|j�|j�\}}}}||||}	}
|j�||||	||
�|_|�||�dSr)r3�	focus_setrC�bboxr5Zcreate_rectangle�dndidr )rrrr#r$�x1�y1�x2�y2ZdxZdyrrr	r"s
zTester.dnd_enterc	CsF|�|j|�\}}|j�|j�\}}}}|j�|j||||�dSr)rCr3rNrOrD)	rrrr#r$rPrQrRrSrrr	r szTester.dnd_motioncCs"|j��|j�|j�d|_dSr)rJrMr3r>rOrLrrr	r!$s
zTester.dnd_leavecCs2|�||�|�|j|�\}}|�|j||�dSr)r!rCr3r=)rrrr#r$rrr	r-)szTester.dnd_commitN)	r.r/r0rrr"r r!r-rrrr	rFsrFcCs�t��}|�d�tj|jdd���t|�}|j�d�t|�}|j�d�t|�}|j�d�td�}td�}td	�}|�	|j
�|�	|j
�|�	|j
�|��dS)
Nz+1+1ZQuit)Zcommandr8z+1+60z+120+60z+240+60ZICON1ZICON2ZICON3)r;ZTkZgeometryZButton�quitrKrFrJr1r=r3Zmainloop)r�t1�t2Zt3Zi1Zi2Zi3rrr	�test/s 
rW�__main__)r;r
rr1rFrWr.rrrr	�<module>gs
Y=#PK�(�Z�#�N��-__pycache__/colorchooser.cpython-38.opt-1.pycnu�[���U

e5dA
�@s>ddlmZGdd�de�Zd	dd�Zedkr:ede��dS)
�)�Dialogc@s$eZdZdZdZdd�Zdd�ZdS)�Choosera�Create a dialog for the tk_chooseColor command.

    Args:
        master: The master widget for this dialog.  If not provided,
            defaults to options['parent'] (if defined).
        options: Dictionary of options for the tk_chooseColor call.
            initialcolor: Specifies the selected color when the
                dialog is first displayed.  This can be a tk color
                string or a 3-tuple of ints in the range (0, 255)
                for an RGB triplet.
            parent: The parent window of the color dialog.  The
                color dialog is displayed on top of this.
            title: A string for the title of the dialog box.
    Ztk_chooseColorcCs@z&|jd}t|t�r$d||jd<Wntk
r:YnXdS)zvEnsure initialcolor is a tk color string.

        Convert initialcolor from a RGB triplet to a color string.
        �initialcolorz
#%02x%02x%02xN)�options�
isinstance�tuple�KeyError)�self�color�r�,/usr/lib64/python3.8/tkinter/colorchooser.py�_fixoptions!s

zChooser._fixoptionscCs>|rt|�sdS|�|�\}}}|d|d|dft|�fS)z�Adjust result returned from call to tk_chooseColor.

        Return both an RGB tuple of ints in the range (0, 255) and the
        tk color string in the form #rrggbb.
        )NN�)�strZ	winfo_rgb)r	Zwidget�result�r�g�brrr�
_fixresult.szChooser._fixresultN)�__name__�
__module__�__qualname__�__doc__Zcommandr
rrrrrrs
rNcKs"|r|��}||d<tf|���S)z�Display dialog window for selection of a color.

    Convenience wrapper for the Chooser class.  Displays the color
    chooser dialog with color as the initial value.
    r)�copyrZshow)r
rrrr�askcolorBsr�__main__r
)N)Ztkinter.commondialogrrrr�printrrrr�<module>s3
PK�(�Zj�xx*__pycache__/constants.cpython-38.opt-2.pycnu�[���U

e5d��@s8dZZZdZZZdZdZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?d<Z@d=ZAd>ZBd?ZCd@ZDdAZEdBZFdCZGdDZHdEZIdFZJdGZKdHZLdIS)J���n�s�w�eZnw�sw�neZse�nsZewZnsew�centerZnone�x�yZboth�left�top�rightZbottomZraisedZsunkenZflatZridgeZgrooveZsolidZ
horizontalZvertical�numeric�charZwordZbaselineZinsideZoutsideZselz	sel.firstzsel.last�end�insertZcurrentZanchor�allZnormalZdisabledZactiveZhiddenZcascadeZcheckbuttonZcommandZradiobuttonZ	separatorZsingleZbrowseZmultipleZextendedZdotboxZ	underlineZpiesliceZchordZarc�firstZlastZbuttZ
projecting�roundZbevelZmiterZmovetoZscrollZunitsZpagesN)MZNOZFALSEZOFFZYESZTRUEZON�N�S�W�EZNWZSWZNEZSEZNSZEWZNSEWZCENTERZNONE�X�YZBOTHZLEFTZTOPZRIGHTZBOTTOMZRAISEDZSUNKENZFLATZRIDGEZGROOVEZSOLIDZ
HORIZONTALZVERTICALZNUMERICZCHARZWORDZBASELINEZINSIDEZOUTSIDEZSELZ	SEL_FIRSTZSEL_LASTZENDZINSERTZCURRENTZANCHORZALLZNORMALZDISABLEDZACTIVEZHIDDENZCASCADEZCHECKBUTTONZCOMMANDZRADIOBUTTONZ	SEPARATORZSINGLEZBROWSEZMULTIPLEZEXTENDEDZDOTBOXZ	UNDERLINEZPIESLICEZCHORDZARCZFIRSTZLASTZBUTTZ
PROJECTINGZROUNDZBEVELZMITERZMOVETOZSCROLLZUNITSZPAGES�rr�)/usr/lib64/python3.8/tkinter/constants.py�<module>s�PK�(�Z[_��S
S
+__pycache__/messagebox.cpython-38.opt-2.pycnu�[���U

e5d}�@sHddlmZdZdZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZGdd�de�Zd5dd�Zd6dd�Zd7dd�Zd8dd�Zd9dd�Zd:dd �Zd;d!d"�Zd<d#d$�Zd=d%d&�Zed'k�rDeded(d)��eded(d*��eded(d+��eded(d,��ed-ed(d.��ed/ed(d0��ed1ed(d2��ed3ed(d4��dS)>�)�Dialog�error�infoZquestionZwarningZabortretryignore�okZokcancelZretrycancelZyesnoZyesnocancel�abortZretry�ignoreZcancelZyesZnoc@seZdZdZdS)�MessageZ
tk_messageBoxN)�__name__�
__module__�__qualname__Zcommand�rr�*/usr/lib64/python3.8/tkinter/messagebox.pyr9srNcKsl|rd|kr||d<|r(d|kr(||d<|r4||d<|r@||d<tf|���}t|t�rd|r`tStSt|�S)NZicon�type�title�message)rZshow�
isinstance�bool�YES�NO�str)rrZ_iconZ_type�options�resrrr
�_showCs
rcKst||ttf|�S�N)r�INFO�OK�rrrrrr
�showinfoRsrcKst||ttf|�Sr)r�WARNINGrrrrr
�showwarningWsrcKst||ttf|�Sr)r�ERRORrrrrr
�	showerror\sr!cKst||ttf|�Sr)r�QUESTION�YESNOrrrr
�askquestionasr$cKst||ttf|�}|tkSr)rr"�OKCANCELr�rrr�srrr
�askokcancelfsr(cKst||ttf|�}|tkSr)rr"r#rr&rrr
�askyesnolsr)cKs.t||ttf|�}t|�}|tkr&dS|tkSr)rr"�YESNOCANCELr�CANCELrr&rrr
�askyesnocancelrs
r,cKst||ttf|�}|tkSr)rr�RETRYCANCEL�RETRYr&rrr
�askretrycancel|sr/�__main__ZSpamzEgg InformationzEgg Warningz	Egg Alertz	Question?ZproceedzProceed?zyes/nozGot it?z
yes/no/cancelzWant it?z	try againz
Try again?)NNNN)NN)NN)NN)NN)NN)NN)NN)NN)Ztkinter.commondialogrr rr"rZABORTRETRYIGNORErr%r-r#r*ZABORTr.ZIGNOREr+rrrrrrr!r$r(r)r,r/r	�printrrrr
�<module>sH










	
PK�(�Z�1&���+__pycache__/messagebox.cpython-38.opt-1.pycnu�[���U

e5d}�@sHddlmZdZdZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZGdd�de�Zd5dd�Zd6dd�Zd7dd�Zd8dd�Zd9dd�Zd:dd �Zd;d!d"�Zd<d#d$�Zd=d%d&�Zed'k�rDeded(d)��eded(d*��eded(d+��eded(d,��ed-ed(d.��ed/ed(d0��ed1ed(d2��ed3ed(d4��dS)>�)�Dialog�error�infoZquestionZwarningZabortretryignore�okZokcancelZretrycancelZyesnoZyesnocancel�abortZretry�ignoreZcancelZyesZnoc@seZdZdZdZdS)�Messagez
A message boxZ
tk_messageBoxN)�__name__�
__module__�__qualname__�__doc__Zcommand�r
r
�*/usr/lib64/python3.8/tkinter/messagebox.pyr9srNcKsl|rd|kr||d<|r(d|kr(||d<|r4||d<|r@||d<tf|���}t|t�rd|r`tStSt|�S)NZicon�type�title�message)rZshow�
isinstance�bool�YES�NO�str)rrZ_iconZ_type�options�resr
r
r�_showCs
rcKst||ttf|�S)zShow an info message)r�INFO�OK�rrrr
r
r�showinfoRsrcKst||ttf|�S)zShow a warning message)r�WARNINGrrr
r
r�showwarningWsrcKst||ttf|�S)zShow an error message)r�ERRORrrr
r
r�	showerror\sr!cKst||ttf|�S)zAsk a question)r�QUESTION�YESNOrr
r
r�askquestionasr$cKst||ttf|�}|tkS)z@Ask if operation should proceed; return true if the answer is ok)rr"�OKCANCELr�rrr�sr
r
r�askokcancelfsr(cKst||ttf|�}|tkS)z0Ask a question; return true if the answer is yes)rr"r#rr&r
r
r�askyesnolsr)cKs.t||ttf|�}t|�}|tkr&dS|tkS)zDAsk a question; return true if the answer is yes, None if cancelled.N)rr"�YESNOCANCELr�CANCELrr&r
r
r�askyesnocancelrs
r,cKst||ttf|�}|tkS)zDAsk if operation should be retried; return true if the answer is yes)rr�RETRYCANCEL�RETRYr&r
r
r�askretrycancel|sr/�__main__ZSpamzEgg InformationzEgg Warningz	Egg Alertz	Question?ZproceedzProceed?zyes/nozGot it?z
yes/no/cancelzWant it?z	try againz
Try again?)NNNN)NN)NN)NN)NN)NN)NN)NN)NN)Ztkinter.commondialogrr rr"rZABORTRETRYIGNORErr%r-r#r*ZABORTr.ZIGNOREr+rrrrrrr!r$r(r)r,r/r	�printr
r
r
r�<module>sH










	
PK�(�ZM��%__pycache__/font.cpython-38.opt-1.pycnu�[���U

e5d@�@szdZddlZddlZdZdZdZdZdd�ZGd	d
�d
�Zd dd�Z	d!d
d�Z
edk�rve��Z
edded�Zee���ee�d��ee�d��ee���ee�d��ee�d��ee
��ee�d�e�d��eeje
d��edd�Zee�d�ejde
d��eje
ded�Ze��eje
de
jd�Ze��eedd���Zejed�ejed�e��dS)"z0.9�NZnormalZroman�boldZitaliccCst|dd�S)zFGiven the name of a tk named font, returns a Font representation.
    T)�name�exists)�Font�r�r�$/usr/lib64/python3.8/tkinter/font.py�
nametofontsr	c@s�eZdZdZe�d�Zdd�Zdd�Zdd�Z	d#dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd$dd�Zdd�Zdd�ZeZd%dd �Zd!d"�Zd	S)&ra�Represents a named font.

    Constructor options are:

    font -- font specifier (name, system font, or (family, size, style)-tuple)
    name -- name to use for this font configuration (defaults to a unique name)
    exists -- does a named font by this name already exist?
       Creates a new named font if False, points to the existing font if True.
       Raises _tkinter.TclError if the assertion is false.

       the following are ignored if font is specified:

    family -- font 'family', e.g. Courier, Times, Helvetica
    size -- font size in points
    weight -- font thickness: NORMAL, BOLD
    slant -- font slant: ROMAN, ITALIC
    underline -- font underlining: false (0), true (1)
    overstrike -- font strikeout: false (0), true (1)

    �cCs:g}|��D]$\}}|�d|�|�t|��qt|�S�N�-)�items�append�str�tuple)�self�kw�options�k�vrrr�_set1s
z	Font._setcCs$g}|D]}|�d|�qt|�Sr)rr)r�argsrrrrr�_get8sz	Font._getcCs:i}tdt|�d�D] }||d|||dd�<q|S)Nr�r
)�range�len)rrr�irrr�_mkdict>szFont._mkdictNFcKs�|st�d�}t|d|�}|r4|�|�dd|��}n
|�|�}|sTdtt|j��}||_	|r�d|_
|j	|�|�dd��kr�tj�d|j	f��|r�|jdd|j	f|��n|jdd	|j	f|��d
|_
||_
|j|_|j|_dS)Nzuse font�tk�font�actualF�namesz$named font %s does not already exist�	configureZcreateT)�tkinter�_get_default_root�getattr�	splitlist�callrr�next�counterr�delete_fontZ_tkinterZTclError�_tk�_split�_call)r�rootrrrrrrrr�__init__Ds,


�z
Font.__init__cCs|jS�Nr�rrrr�__str__cszFont.__str__cCs&t|t�stS|j|jko$|j|jkSr0)�
isinstancer�NotImplementedrr+)r�otherrrr�__eq__fs
zFont.__eq__cCs
|�|�Sr0)�cget)r�keyrrr�__getitem__kszFont.__getitem__cCs|jf||i�dSr0)r")rr8�valuerrr�__setitem__nszFont.__setitem__cCs4z|jr|�dd|j�Wntk
r.YnXdS)Nr�delete)r*r-r�	Exceptionr1rrr�__del__qs
zFont.__del__cCst|jf|���S)z*Return a distinct copy of the current font)rr+r r1rrr�copyxsz	Font.copycCs^d}|rd|f}|r8|d|f}|jdd|jf|��S|�|�|jdd|jf|����SdS)zReturn actual font attributesr�
-displayofrrr N)r-rrr,)r�option�	displayofrrrrr |s�zFont.actualcCs|�dd|jd|�S)zGet font attributer�configr)r-r)rrArrrr7�sz	Font.cgetc	KsB|r"|jdd|jf|�|���n|�|�|�dd|j���SdS)zModify font attributesrrCN)r-rrrr,)rrrrrrC�s��zFont.configcCs2|f}|rd||f}|j�|jdd|jf|���S)zReturn text widthr@r�measure)r+�getintr-r)r�textrBrrrrrD�s
zFont.measurecOs�d}|�dd�}|rd|f}|rL||�|�}|j�|jdd|jf|���S|�|jdd|jf|���}i}tdt|�d�D](}|j�||d	�|||d	d�<q||SdS)
z}Return font metrics.

        For best performance, create a dummy widget
        using this font before calling this method.rrBNr@r�metricsrrr
)	�poprr+rEr-rr,rr)rrrrrB�resrrrrrG�s�&zFont.metrics)NNNF)NN)N)�__name__�
__module__�__qualname__�__doc__�	itertools�countr)rrrr/r2r6r9r;r>r?r r7rCr"rDrGrrrrrs$


	
rcCs6|st�d�}d}|rd|f}|j�|jjd|���S)zGet font families (as a tuple)zuse font.families()rr@r�families)rrP�r#r$rr&r')r.rBrrrrrP�s
rPcCs$|st�d�}|j�|j�dd��S)z'Get names of defined fonts (as a tuple)zuse font.names()rr!rQ)r.rrrr!�s
r!�__main__�times�)�family�size�weightrUrWZhelloZ	linespace)rB)ZCourier�r)rzHello, world)rFrzQuit!)rFZcommandr)rW)NN)N)�__version__rNr#ZNORMALZROMANZBOLDZITALICr	rrPr!rJZTkr.�f�printr rCr7rDrGZLabel�wZpackZButtonZdestroyr?ZfbZmainlooprrrr�<module>sB






PK�(�Zҧ����'__pycache__/dialog.cpython-38.opt-1.pycnu�[���U

e5d��@srddlTddlmZdZGdd�de�Zdd�Zedkrned	d
ddeeii�Z	ed	d
d
de	j
eii�Ze	��d	S)�)�*)�	_cnfmergeZ	questheadc@s"eZdZdifdd�Zdd�ZdS)�DialogNc
Ks�t||f�}d|_t�|||�|j�|jjd|j|d|d|d|df|d���|_zt�	|�Wnt
k
r~YnXdS)NZ
__dialog__Z	tk_dialog�title�text�bitmap�default�strings)rZ
widgetName�Widget�_setupZtkZgetintZcallZ_w�num�destroyZTclError)�selfZmasterZcnf�kw�r�&/usr/lib64/python3.8/tkinter/dialog.py�__init__
s&���zDialog.__init__cCsdS)Nr)rrrrr
�zDialog.destroy)�__name__�
__module__�__qualname__rr
rrrrr	s
rcCs$tdddtddd��}t|j�dS)Nz
File ModifiedzzFile "Python.h" has been modified since the last time it was saved. Do you want to save it before exiting the application.r)z	Save FilezDiscard ChangeszReturn to Editor)rrrrr	)r�DIALOG_ICON�printr)�drrr�_tests�r�__main__NrZTestZcommandZQuit)
Ztkinterrrr
rrrZButtonZPack�t�quit�qZmainlooprrrr�<module>s$��PK�(�Zv��ZZ-__pycache__/commondialog.cpython-38.opt-2.pycnu�[���U

e5d��@sddlTGdd�d�ZdS)�)�*c@s2eZdZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�DialogNcKs|s|�d�}||_||_dS)N�parent)�get�master�options)�selfrr�r	�,/usr/lib64/python3.8/tkinter/commondialog.py�__init__s
zDialog.__init__cCsdS�Nr	)rr	r	r
�_fixoptionsszDialog._fixoptionscCs|Srr	)rZwidget�resultr	r	r
�
_fixresultszDialog._fixresultcKs||��D]\}}||j|<q|��t|j�}z,|jj|jf|�	|j���}|�
||�}W5z|��WnYnXX|Sr)�itemsrr
ZFramerZdestroyZtkZcall�commandZ_optionsr)rr�k�v�w�sr	r	r
�shows
zDialog.show)N)�__name__�
__module__�__qualname__rrr
rrr	r	r	r
rs

rN)Ztkinterrr	r	r	r
�<module>sPK�(�Zv��ZZ'__pycache__/commondialog.cpython-38.pycnu�[���U

e5d��@sddlTGdd�d�ZdS)�)�*c@s2eZdZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�DialogNcKs|s|�d�}||_||_dS)N�parent)�get�master�options)�selfrr�r	�,/usr/lib64/python3.8/tkinter/commondialog.py�__init__s
zDialog.__init__cCsdS�Nr	)rr	r	r
�_fixoptionsszDialog._fixoptionscCs|Srr	)rZwidget�resultr	r	r
�
_fixresultszDialog._fixresultcKs||��D]\}}||j|<q|��t|j�}z,|jj|jf|�	|j���}|�
||�}W5z|��WnYnXX|Sr)�itemsrr
ZFramerZdestroyZtkZcall�commandZ_optionsr)rr�k�v�w�sr	r	r
�shows
zDialog.show)N)�__name__�
__module__�__qualname__rrr
rrr	r	r	r
rs

rN)Ztkinterrr	r	r	r
�<module>sPK�(�Z�1&���%__pycache__/messagebox.cpython-38.pycnu�[���U

e5d}�@sHddlmZdZdZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZGdd�de�Zd5dd�Zd6dd�Zd7dd�Zd8dd�Zd9dd�Zd:dd �Zd;d!d"�Zd<d#d$�Zd=d%d&�Zed'k�rDeded(d)��eded(d*��eded(d+��eded(d,��ed-ed(d.��ed/ed(d0��ed1ed(d2��ed3ed(d4��dS)>�)�Dialog�error�infoZquestionZwarningZabortretryignore�okZokcancelZretrycancelZyesnoZyesnocancel�abortZretry�ignoreZcancelZyesZnoc@seZdZdZdZdS)�Messagez
A message boxZ
tk_messageBoxN)�__name__�
__module__�__qualname__�__doc__Zcommand�r
r
�*/usr/lib64/python3.8/tkinter/messagebox.pyr9srNcKsl|rd|kr||d<|r(d|kr(||d<|r4||d<|r@||d<tf|���}t|t�rd|r`tStSt|�S)NZicon�type�title�message)rZshow�
isinstance�bool�YES�NO�str)rrZ_iconZ_type�options�resr
r
r�_showCs
rcKst||ttf|�S)zShow an info message)r�INFO�OK�rrrr
r
r�showinfoRsrcKst||ttf|�S)zShow a warning message)r�WARNINGrrr
r
r�showwarningWsrcKst||ttf|�S)zShow an error message)r�ERRORrrr
r
r�	showerror\sr!cKst||ttf|�S)zAsk a question)r�QUESTION�YESNOrr
r
r�askquestionasr$cKst||ttf|�}|tkS)z@Ask if operation should proceed; return true if the answer is ok)rr"�OKCANCELr�rrr�sr
r
r�askokcancelfsr(cKst||ttf|�}|tkS)z0Ask a question; return true if the answer is yes)rr"r#rr&r
r
r�askyesnolsr)cKs.t||ttf|�}t|�}|tkr&dS|tkS)zDAsk a question; return true if the answer is yes, None if cancelled.N)rr"�YESNOCANCELr�CANCELrr&r
r
r�askyesnocancelrs
r,cKst||ttf|�}|tkS)zDAsk if operation should be retried; return true if the answer is yes)rr�RETRYCANCEL�RETRYr&r
r
r�askretrycancel|sr/�__main__ZSpamzEgg InformationzEgg Warningz	Egg Alertz	Question?ZproceedzProceed?zyes/nozGot it?z
yes/no/cancelzWant it?z	try againz
Try again?)NNNN)NN)NN)NN)NN)NN)NN)NN)NN)Ztkinter.commondialogrr rr"rZABORTRETRYIGNORErr%r-r#r*ZABORTr.ZIGNOREr+rrrrrrr!r$r(r)r,r/r	�printr
r
r
r�<module>sH










	
PK�(�Z�T—|�|�$__pycache__/ttk.cpython-38.opt-1.pycnu�[���U

e5d���@s�dZdZdZddddddd	d
ddd
ddddddddddddddgZddlZddlmZmZmZmZej	dkrpd nd!Z
d"d#�ZdXd$d%�ZdYd&d'�Z
d(d)�ZdZd*d+�Zd[d,d-�Zd\d/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Zd?d�Zd]d@d�ZGdAd�de�ZGdBdC�dCej�ZGdDd�de�ZGdEd�de�ZGdFd�deej �Z GdGd�de �Z!GdHd�de�Z"GdId�de�Z#GdJd	�d	e�Z$e$Z%GdKd�de�Z&GdLd�de�Z'GdMd
�d
eej(�Z)e)Z(GdNd�de�Z*GdOd�de�Z+GdPd�deej,�Z,GdQd�deej-�Z-GdRd�de�Z.GdSd�de�Z/GdTd�de �Z0GdUd�deej1ej2�Z3GdVd�de"�Z4GdWd�de&�Z5dS)^a�Ttk wrapper.

This module provides classes to allow using Tk themed widget set.

Ttk is based on a revised and enhanced version of
TIP #48 (http://tip.tcl.tk/48) specified style engine.

Its basic idea is to separate, to the extent possible, the code
implementing a widget's behavior from the code implementing its
appearance. Widget class bindings are primarily responsible for
maintaining the widget state and invoking callbacks, all aspects
of the widgets appearance lies at Themes.
z0.3.1z!Guilherme Polo <ggpolo@gmail.com>�Button�Checkbutton�Combobox�Entry�Frame�Label�
Labelframe�
LabelFrame�
Menubutton�Notebook�Panedwindow�PanedWindow�Progressbar�Radiobutton�Scale�	Scrollbar�	Separator�Sizegrip�Spinbox�Style�Treeview�LabeledScale�
OptionMenu�
tclobjs_to_py�setup_master�N)�_flatten�_join�
_stringify�
_splitdictg!@TFcCsBtr>ddl}|j�d�}|r,|j�d|�|j�d�d|_dS)NrZTILE_LIBRARYz(global auto_path; lappend auto_path {%s}zpackage require tileT)�
_REQUIRE_TILE�os�environ�get�tk�eval�_tile_loaded)�masterr Ztilelib�r'�#/usr/lib64/python3.8/tkinter/ttk.py�
_load_tile"s��r)cCs(|rt|�}nt|ttf�r$t|�}|S)zInternal function.)r�
isinstance�list�tupler)�value�scriptr'r'r(�_format_optvalue1s

r/cCsPg}|��D]:\}}|r ||kr|�d|�|dk	r|�t||��qt|�S)z�Formats optdict to a tuple to pass it to tk.call.

    E.g. (script=False):
      {'foreground': 'blue', 'padding': [1, 2, 3, 4]} returns:
      ('-foreground', 'blue', '-padding', '1 2 3 4')�-%sN)�items�appendr/r)Zoptdictr.�ignore�opts�optr-r'r'r(�_format_optdict;sr6cCsXg}|D]J�^}}t|�dkr,|dp(d}n
d�|�}|�|�|dk	r|�|�q|S)N�r�� )�len�joinr2)r1Zopt_val�state�valr'r'r(�_mapdict_valuesKs

r>cCs:g}|��D]$\}}|�d|tt|�|�f�qt|�S)z�Formats mapdict to pass it to tk.call.

    E.g. (script=False):
      {'expand': [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])]}

      returns:

      ('-expand', '{active selected} grey focus {1, 2, 3, 4}')r0)r1�extendr/r>r)Zmapdictr.r4r5r-r'r'r(�_format_mapdict`s

�r@cOs�d}d}|dkr�|dkrB|d}tt|dd���}d||f}n2|dd�\}}	tt|dd���}
d	||	|
f}t||�}n,|d
kr�|d}t|�dkr�t|d|�f}|r�d|}d�|�}||fS)
zAFormats args and kw according to the given element factory etype.Nr')�imageZvsapirArr7z%s %s�z%s %s %s�fromz{%s}r9)rr>r6r:r/r;)�etyper.�args�kw�specr4ZinameZ	imagespec�
class_nameZpart_idZstatemapr'r'r(�_format_elemcreateqs&
rIrBc
Cs�g}|D]�}|\}}|pi}d�t|dd��}dd|||rDd|ndf}d|kr�|�|d�||7}t|d||�\}	}|�|	�||8}|�d	d|�q|�|�qd
�|�|fS)a$Formats a layout list so we can pass the result to ttk::style
    layout and ttk::style settings. Note that the layout doesn't have to
    be a list necessarily.

    E.g.:
      [("Menubutton.background", None),
       ("Menubutton.button", {"children":
           [("Menubutton.focus", {"children":
               [("Menubutton.padding", {"children":
                [("Menubutton.label", {"side": "left", "expand": 1})]
               })]
           })]
       }),
       ("Menubutton.indicator", {"side": "right"})
      ]

      returns:

      Menubutton.background
      Menubutton.button -children {
        Menubutton.focus -children {
          Menubutton.padding -children {
            Menubutton.label -side left -expand 1
          }
        }
      }
      Menubutton.indicator -side rightr9T)�childrenz%s%s%sz %sr8rJz -children {z%s}�
)r;r6r2�_format_layoutlist)
�layout�indentZindent_sizer.Zlayout_elem�elemr4Zfopts�headZ	newscriptr'r'r(rL�s"
�
rLcCsXg}|��D�]>\}}|�d�rFd�t|dd��}|�d||f�|�d�rvd�t|dd��}|�d||f�d|kr�|ds�d}nt|d�\}}|�d	||f�|�d
�r|d
}|d}d}|t|�kr�t||d
�s�|d7}q�|d|�}	|t|�k�r||�r||ni}
t	|df|	�|
�\}}|�d||||f�qd�|�S)z�Returns an appropriate script, based on settings, according to
    theme_settings definition to be used by theme_settings and
    theme_create.�	configurer9Tzttk::style configure %s %s;�mapzttk::style map %s %s;rM�nullzttk::style layout %s {
%s
}zelement createrr7r1z%ttk::style element create %s %s %s %srK)
r1r"r;r6r2r@rLr:�hasattrrI)�settingsr.�namer4�s�_ZeoptsrDZargcZelemargsZelemkwrGr'r'r(�_script_from_settings�s:



$�
rYcCs�t|t�r|Sg}t|�}t||�D]j\}}t|d�rDt|���}n(t|t�rX|��}nt|ttf�sl|f}t|d�r~t|�}|�||f��q$|S)ztConstruct a list from the given statespec tuple according to the
    accepted statespec accepted by _format_mapdict.�typename)	r*�str�iter�ziprT�splitr,r+r2)Zstuple�result�itr<r=r'r'r(�_list_from_statespec�s




racCs�|�|�}g}d}|t|�kr�||}i}|�||f�|d7}|t|�kr|||d�\}}|�d�slq|dd�}|d7}|dkr�t||�}|||<q@q|S)zpConstruct a list from the tuple returned by ttk::layout, this is
    somewhat the reverse of _format_layoutlist.rr7rB�-NrJ)�	splitlistr:r2�
startswith�_list_from_layouttuple)r#Zltuple�resZindxrVr4r5r=r'r'r(res$


recGs4t|�}|j||�}t|�dr&|St||td�S)ahFormat options then call Tk command with args and options and return
    the appropriate result.

    If no option is specified, a dict is returned. If an option is
    specified with the None value, the value for that option is returned.
    Otherwise, the function just sets the passed options and the caller
    shouldn't be expecting a return value anyway.rB)�conv)r6�callr:r�
_tclobj_to_py)r#�optionsrErfr'r'r(�_val_or_dict!s
rkc	Cs2t|�}zt|�}Wnttfk
r,YnX|S)zAConverts a value to, hopefully, a more appropriate Python object.)r[�int�
ValueError�	TypeError)r-r'r'r(�_convert_stringval1srocCs(t|t�r$d|krt|�}nt|�}|S)N�.)r*r[�floatrl)�xr'r'r(�
_to_number;s


rscCs\|rFt|d�rFt|t�sFt|ddd�dkr6t|�}qXttt|��}nt|d�rXt|�}|S)z8Return value converted from Tcl object to Python object.�__len__rrZNZ	StateSpec)rTr*r[�getattrrar+rRro)r=r'r'r(riCs

ricCs"|��D]\}}t|�||<q|S)zOReturns adict with its values converted from Tcl objects to Python
    objects.)r1ri)Zadictr5r=r'r'r(rPscCs|dkrt��}|S)aIf master is not None, itself is returned. If master is None,
    the default master is returned if there is one, otherwise a new
    master is created and returned.

    If it is not allowed to use the default root and master is None,
    RuntimeError is raised.N)�tkinterZ_get_default_root)r&r'r'r(rXsc@s�eZdZdZdZddd�Zddd�Zddd	�Zdd
d�Zd dd
�Z	dd�Z
dd�Zdd�Zd!dd�Z
dd�Zdd�Zd"dd�ZdS)#rzManipulate style database.z
ttk::styleNcCs0t|�}t|dd�st|�||_|jj|_dS)Nr%F)rrur)r&r#)�selfr&r'r'r(�__init__is
zStyle.__init__cKs4|dk	rd||<t|j||jd|�}|s,|r0|SdS)z�Query or sets the default value of the specified option(s) in
        style.

        Each key in kw is an option and each value is either a string or
        a sequence identifying the value for that option.NrQ)rkr#�_name�rw�styleZ	query_optrFr_r'r'r(rQts
zStyle.configurecsj|dk	r0�j��jd|d|�}t�j�|��S�jj�jd|ft|���}�fdd�t�j|���D�S)aSQuery or sets dynamic values of the specified option(s) in
        style.

        Each key in kw is an option and each value should be a list or a
        tuple (usually) containing statespecs grouped in tuples, or list,
        or something else of your preference. A statespec is compound of
        one or more states and then a value.NrRr0cs"i|]\}}|t�j�|���qSr')rar#rc)�.0�k�v�rwr'r(�
<dictcomp>�s�zStyle.map.<locals>.<dictcomp>)r#rhryrarcr@rr1rzr'rr(rR�s
�z	Style.mapcCs.|rd�|�nd}|j�|jd|d|||�S)aReturns the value specified for option in style.

        If state is specified it is expected to be a sequence of one
        or more states. If the default argument is set, it is used as
        a fallback value in case no specification for option is found.r9r8�lookupr0)r;r#rhry)rwr{�optionr<�defaultr'r'r(r��s
�zStyle.lookupcCs>d}|rt|�d}n|dk	r"d}t|j|j�|jd||��S)a�Define the widget layout for given style. If layoutspec is
        omitted, return the layout specification for given style.

        layoutspec is expected to be a list or an object different than
        None that evaluates to False if you want to "turn off" that style.
        If it is a list (or tuple, or something else), each item should be
        a tuple where the first item is the layout name and the second item
        should have the format described below:

        LAYOUTS

            A layout can contain the value None, if takes no options, or
            a dict of options specifying how to arrange the element.
            The layout mechanism uses a simplified version of the pack
            geometry manager: given an initial cavity, each element is
            allocated a parcel. Valid options/values are:

                side: whichside
                    Specifies which side of the cavity to place the
                    element; one of top, right, bottom or left. If
                    omitted, the element occupies the entire cavity.

                sticky: nswe
                    Specifies where the element is placed inside its
                    allocated parcel.

                children: [sublayout... ]
                    Specifies a list of elements to place inside the
                    element. Each element is a tuple (or other sequence)
                    where the first item is the layout name, and the other
                    is a LAYOUT.NrrSrM)rLrer#rhry)rwr{Z
layoutspecZlspecr'r'r(rM�s �zStyle.layoutcOs8t|df|�|�\}}|jj|jdd|||f|��dS)z9Create a new element in the current theme of given etype.F�element�createN)rIr#rhry)rw�elementnamerDrErFrGr4r'r'r(�element_create�s��zStyle.element_createc	Cs(tdd�|j�|j�|jdd��D��S)z:Returns the list of elements defined in the current theme.css|]}|�d�VqdS�rbN��lstrip)r|�nr'r'r(�	<genexpr>�sz&Style.element_names.<locals>.<genexpr>r��names�r,r#rcrhryrr'r'r(�
element_names�s�zStyle.element_namesc
Cs*tdd�|j�|j�|jdd|��D��S)z)Return the list of elementname's options.css|]}|�d�VqdSr�r�)r|�or'r'r(r��sz(Style.element_options.<locals>.<genexpr>r�rjr�)rwr�r'r'r(�element_options�s�zStyle.element_optionsc
CsN|rt|�nd}|r2|j�|jdd|d|d|�n|j�|jdd|d|�dS)a.Creates a new theme.

        It is an error if themename already exists. If parent is
        specified, the new theme will inherit styles, elements and
        layouts from the specified parent theme. If settings are present,
        they are expected to have the same syntax used for theme_settings.r8�themer�z-parentz	-settingsN�rYr#rhry)rw�	themename�parentrUr.r'r'r(�theme_create�s��zStyle.theme_createcCs"t|�}|j�|jdd||�dS)a�Temporarily sets the current theme to themename, apply specified
        settings and then restore the previous theme.

        Each key in settings is a style and each value may contain the
        keys 'configure', 'map', 'layout' and 'element create' and they
        are expected to have the same format as specified by the methods
        configure, map, layout and element_create respectively.r�rUNr�)rwr�rUr.r'r'r(�theme_settings�szStyle.theme_settingscCs|j�|j�|jdd��S)z#Returns a list of all known themes.r�r�)r#rcrhryrr'r'r(�theme_names�szStyle.theme_namescCs&|dkr|j�d�S|j�d|�dS)z�If themename is None, returns the theme in use, otherwise, set
        the current theme to themename, refreshes all widgets and emits
        a <<ThemeChanged>> event.Nzreturn $ttk::currentThemez
ttk::setTheme)r#r$rh)rwr�r'r'r(�	theme_use�szStyle.theme_use)N)N)N)NN)N)NN)N)�__name__�
__module__�__qualname__�__doc__ryrxrQrRr�rMr�r�r�r�r�r�r�r'r'r'r(rds




+
c@s6eZdZdZddd�Zdd�Zddd�Zd
d	d
�ZdS)�Widgetz!Base class for Tk themed widgets.NcCs4t|�}t|dd�st|�tjj||||d�dS)a�Constructs a Ttk Widget with the parent master.

        STANDARD OPTIONS

            class, cursor, takefocus, style

        SCROLLABLE WIDGET OPTIONS

            xscrollcommand, yscrollcommand

        LABEL WIDGET OPTIONS

            text, textvariable, underline, image, compound, width

        WIDGET STATES

            active, disabled, focus, pressed, selected, background,
            readonly, alternate, invalid
        r%F)rFN)rrur)rvr�rx)rwr&Z
widgetnamerFr'r'r(rxszWidget.__init__cCs|j�|jd||�S)z�Returns the name of the element at position x, y, or the empty
        string if the point does not lie within any element.

        x and y are pixel coordinates relative to the widget.�identify�r#rh�_w�rwrr�yr'r'r(r�+szWidget.identifyc	Os6|j�|j�|jdd�|���}|r2|r2|||�S|S)a1Test the widget's state.

        If callback is not specified, returns True if the widget state
        matches statespec and False otherwise. If callback is specified,
        then it will be invoked with *args, **kw if the widget state
        matches statespec. statespec is expected to be a sequence.�instater9)r#�
getbooleanrhr�r;)rw�	statespec�callbackrErFZretr'r'r(r�3s�
zWidget.instatecCs0|dk	rd�|�}|j�t|j�|jd|���S)aModify or inquire widget state.

        Widget state is returned if statespec is None, otherwise it is
        set according to the statespec flags and then a new state spec
        is returned indicating which flags were changed. statespec is
        expected to be a sequence.Nr9r<)r;r#rcr[rhr�)rwr�r'r'r(r<Bs
zWidget.state)N)N)N)r�r�r�r�rxr�r�r<r'r'r'r(r�
s


r�c@s"eZdZdZddd�Zdd�ZdS)rzcTtk Button widget, displays a textual label and/or image, and
    evaluates a command when pressed.NcKst�||d|�dS)aConstruct a Ttk Button widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, default, width
        zttk::buttonN�r�rx�rwr&rFr'r'r(rxSszButton.__init__cCs|j�|jd�S)z/Invokes the command associated with the button.�invoker�rr'r'r(r�bsz
Button.invoke)N�r�r�r�r�rxr�r'r'r'r(rOs
c@s"eZdZdZddd�Zdd�ZdS)rz;Ttk Checkbutton widget which is either in on- or off-state.NcKst�||d|�dS)a'Construct a Ttk Checkbutton widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, offvalue, onvalue, variable
        zttk::checkbuttonNr�r�r'r'r(rxjszCheckbutton.__init__cCs|j�|jd�S)aWToggles between the selected and deselected states and
        invokes the associated command. If the widget is currently
        selected, sets the option variable to the offvalue option
        and deselects the widget; otherwise, sets the option variable
        to the option onvalue.

        Returns the result of the associated command.r�r�rr'r'r(r�yszCheckbutton.invoke)Nr�r'r'r'r(rgs
c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzeTtk Entry widget displays a one-line text string and allows that
    string to be edited by the user.NcKst�|||pd|�dS)a�Constructs a Ttk Entry widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand

        WIDGET-SPECIFIC OPTIONS

            exportselection, invalidcommand, justify, show, state,
            textvariable, validate, validatecommand, width

        VALIDATION MODES

            none, key, focus, focusin, focusout, all
        z
ttk::entryNr�)rwr&ZwidgetrFr'r'r(rx�szEntry.__init__cCs|�|j�|jd|��S)zqReturn a tuple of (x, y, width, height) which describes the
        bounding box of the character given by index.�bbox�Z_getintsr#rhr�)rw�indexr'r'r(r��sz
Entry.bboxcCs|j�|jd||�S)zxReturns the name of the element at position x, y, or the
        empty string if the coordinates are outside the window.r�r�r�r'r'r(r��szEntry.identifycCs|j�|j�|jd��S)z�Force revalidation, independent of the conditions specified
        by the validate option. Returns False if validation fails, True
        if it succeeds. Sets or clears the invalid state accordingly.�validate�r#r�rhr�rr'r'r(r��szEntry.validate)NN)r�r�r�r�rxr�r�r�r'r'r'r(r�s

c@s,eZdZdZd	dd�Zd
dd�Zdd�ZdS)rzMTtk Combobox widget combines a text field with a pop-down list of
    values.NcKstj||df|�dS)aConstruct a Ttk Combobox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            exportselection, justify, height, postcommand, state,
            textvariable, values, width
        z
ttk::comboboxN�rrxr�r'r'r(rx�szCombobox.__init__cCs2|dkr |j�|j�|jd��S|j�|jd|�S)aIf newindex is supplied, sets the combobox value to the
        element at position newindex in the list of values. Otherwise,
        returns the index of the current value in the list of values
        or -1 if the current value does not appear in the list.N�current�r#Zgetintrhr�)rwZnewindexr'r'r(r��szCombobox.currentcCs|j�|jd|�dS)z(Sets the value of the combobox to value.�setNr��rwr-r'r'r(r��szCombobox.set)N)N)r�r�r�r�rxr�r�r'r'r'r(r�s


c@seZdZdZddd�ZdS)rzJTtk Frame widget is a container, used to group other widgets
    together.NcKst�||d|�dS)z�Construct a Ttk Frame with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            borderwidth, relief, padding, width, height
        z
ttk::frameNr�r�r'r'r(rx�szFrame.__init__)N�r�r�r�r�rxr'r'r'r(r�sc@seZdZdZddd�ZdS)rz7Ttk Label widget displays a textual label and/or image.NcKst�||d|�dS)aGConstruct a Ttk Label with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, style, takefocus, text,
            textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            anchor, background, font, foreground, justify, padding,
            relief, text, wraplength
        z
ttk::labelNr�r�r'r'r(rx�s
zLabel.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)rz�Ttk Labelframe widget is a container used to group other widgets
    together. It has an optional label, which may be a plain text string
    or another widget.NcKst�||d|�dS)z�Construct a Ttk Labelframe with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS
            labelanchor, text, underline, padding, labelwidget, width,
            height
        zttk::labelframeNr�r�r'r'r(rx�szLabelframe.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)r	zbTtk Menubutton widget displays a textual label and/or image, and
    displays a menu when pressed.NcKst�||d|�dS)aConstruct a Ttk Menubutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            direction, menu
        zttk::menubuttonNr�r�r'r'r(rxszMenubutton.__init__)Nr�r'r'r'r(r	
sc@sneZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
ddd�Zddd�Zdd�Z
dd�ZdS)r
z�Ttk Notebook widget manages a collection of windows and displays
    a single one at a time. Each child window is associated with a tab,
    which the user may select to change the currently-displayed window.NcKst�||d|�dS)a\Construct a Ttk Notebook with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            height, padding, width

        TAB OPTIONS

            state, sticky, padding, text, image, compound, underline

        TAB IDENTIFIERS (tab_id)

            The tab_id argument found in several methods may take any of
            the following forms:

                * An integer between zero and the number of tabs
                * The name of a child window
                * A positional specification of the form "@x,y", which
                  defines the tab
                * The string "current", which identifies the
                  currently-selected tab
                * The string "end", which returns the number of tabs (only
                  valid for method index)
        z
ttk::notebookNr�r�r'r'r(rx"szNotebook.__init__cKs |jj|jd|ft|���dS)z�Adds a new tab to the notebook.

        If window is currently managed by the notebook but hidden, it is
        restored to its previous position.�addN�r#rhr�r6)rw�childrFr'r'r(r�BszNotebook.addcCs|j�|jd|�dS)zXRemoves the tab specified by tab_id, unmaps and unmanages the
        associated window.�forgetNr��rw�tab_idr'r'r(r�JszNotebook.forgetcCs|j�|jd|�dS)z�Hides the tab specified by tab_id.

        The tab will not be displayed, but the associated window remains
        managed by the notebook and its configuration remembered. Hidden
        tabs may be restored with the add command.�hideNr�r�r'r'r(r�Psz
Notebook.hidecCs|j�|jd||�S)zZReturns the name of the tab element at position x, y, or the
        empty string if none.r�r�r�r'r'r(r�YszNotebook.identifycCs|j�|j�|jd|��S)z|Returns the numeric index of the tab specified by tab_id, or
        the total number of tabs if tab_id is the string "end".r�r�r�r'r'r(r�_szNotebook.indexcKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified position.

        pos is either the string end, an integer index, or the name of
        a managed child. If child is already managed by the notebook,
        moves it to the specified position.�insertNr��rw�posr�rFr'r'r(r�eszNotebook.insertcCs|j�|jd|�S)z�Selects the specified tab.

        The associated child window will be displayed, and the
        previously-selected window (if different) is unmapped. If tab_id
        is omitted, returns the widget name of the currently selected
        pane.�selectr�r�r'r'r(r�nszNotebook.selectcKs$|dk	rd||<t|j||jd|�S)z�Query or modify the options of the specific tab_id.

        If kw is not given, returns a dict of the tab option values. If option
        is specified, returns the value of that option. Otherwise, sets the
        options to the corresponding values.N�tab�rkr#r�)rwr�r�rFr'r'r(r�xszNotebook.tabcCs|j�|j�|jd�pd�S)z2Returns a list of windows managed by the notebook.�tabsr'�r#rcrhr�rr'r'r(r��sz
Notebook.tabscCs|j�d|j�dS)a�Enable keyboard traversal for a toplevel window containing
        this notebook.

        This will extend the bindings for the toplevel window containing
        this notebook as follows:

            Control-Tab: selects the tab following the currently selected
                         one

            Shift-Control-Tab: selects the tab preceding the currently
                               selected one

            Alt-K: where K is the mnemonic (underlined) character of any
                   tab, will select that tab.

        Multiple notebooks in a single toplevel may be enabled for
        traversal, including nested notebooks. However, notebook traversal
        only works properly if all panes are direct children of the
        notebook.zttk::notebook::enableTraversalNr�rr'r'r(�enable_traversal�szNotebook.enable_traversal)N)N)N)r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r'r'r'r(r
s
 		


c@s>eZdZdZddd�ZejjZdd�Zddd�Z	d
d	d
�Z
dS)rzfTtk Panedwindow widget displays a number of subwindows, stacked
    either vertically or horizontally.NcKst�||d|�dS)z�Construct a Ttk Panedwindow with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, width, height

        PANE OPTIONS

            weight
        zttk::panedwindowNr�r�r'r'r(rx�szPanedwindow.__init__cKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified positions.

        pos is either the string end, and integer index, or the name
        of a child. If child is already managed by the paned window,
        moves it to the specified position.r�Nr�r�r'r'r(r��szPanedwindow.insertcKs$|dk	rd||<t|j||jd|�S)aQQuery or modify the options of the specified pane.

        pane is either an integer index or the name of a managed subwindow.
        If kw is not given, returns a dict of the pane option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.N�paner�)rwr�r�rFr'r'r(r��szPanedwindow.panecCs|j�|j�|jd||��S)aLIf newpos is specified, sets the position of sash number index.

        May adjust the positions of adjacent sashes to ensure that
        positions are monotonically increasing. Sash positions are further
        constrained to be between 0 and the total size of the widget.

        Returns the new position of sash number index.�sashposr�)rwr�Znewposr'r'r(r��szPanedwindow.sashpos)N)N)N)r�r�r�r�rxrvrr�r�r�r�r'r'r'r(r�s
	
c@s6eZdZdZddd�Zddd�Zd
dd�Zd	d
�ZdS)r
a6Ttk Progressbar widget shows the status of a long-running
    operation. They can operate in two modes: determinate mode shows the
    amount completed relative to the total amount of work to be done, and
    indeterminate mode provides an animated display to let the user know
    that something is happening.NcKst�||d|�dS)z�Construct a Ttk Progressbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, length, mode, maximum, value, variable, phase
        zttk::progressbarNr�r�r'r'r(rx�szProgressbar.__init__cCs|j�|jd|�dS)z�Begin autoincrement mode: schedules a recurring timer event
        that calls method step every interval milliseconds.

        interval defaults to 50 milliseconds (20 steps/second) if omitted.�startNr�)rwZintervalr'r'r(r��szProgressbar.startcCs|j�|jd|�dS)zRIncrements the value option by amount.

        amount defaults to 1.0 if omitted.�stepNr�)rwZamountr'r'r(r��szProgressbar.stepcCs|j�|jd�dS)zVStop autoincrement mode: cancels any recurring timer event
        initiated by start.�stopNr�rr'r'r(r�szProgressbar.stop)N)N)N)r�r�r�r�rxr�r�r�r'r'r'r(r
�s



c@s"eZdZdZddd�Zdd�ZdS)rzeTtk Radiobutton widgets are used in groups to show or change a
    set of mutually-exclusive options.NcKst�||d|�dS)aConstruct a Ttk Radiobutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, value, variable
        zttk::radiobuttonNr�r�r'r'r(rxszRadiobutton.__init__cCs|j�|jd�S)z�Sets the option variable to the option value, selects the
        widget, and invokes the associated command.

        Returns the result of the command, or an empty string if
        no command is specified.r�r�rr'r'r(r�szRadiobutton.invoke)Nr�r'r'r'r(rs
c@s.eZdZdZd	dd�Zd
dd�Zddd�ZdS)rzTtk Scale widget is typically used to control the numeric value of
    a linked variable that varies uniformly over some range.NcKst�||d|�dS)z�Construct a Ttk Scale with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, from, length, orient, to, value, variable
        z
ttk::scaleNr�r�r'r'r(rx'szScale.__init__cKsTtj||f|�}t|td�tf�s,|�|�td|kd|kd|kg�rP|�d�|S)z�Modify or query scale options.

        Setting a value for any of the "from", "from_" or "to" options
        generates a <<RangeChanged>> event.NrC�from_�to�<<RangeChanged>>)r�rQr*�typer[�update�anyZevent_generate)rwZcnfrFZretvalr'r'r(rQ5s

zScale.configurecCs|j�|jd||�S)z�Get the current value of the value option, or the value
        corresponding to the coordinates x, y if they are specified.

        x and y are pixel coordinates relative to the scale widget
        origin.r"r�r�r'r'r(r"Bsz	Scale.get)N)N)NN)r�r�r�r�rxrQr"r'r'r'r(r#s


c@seZdZdZddd�ZdS)rz;Ttk Scrollbar controls the viewport of a scrollable widget.NcKst�||d|�dS)z�Construct a Ttk Scrollbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, orient
        zttk::scrollbarNr�r�r'r'r(rxNszScrollbar.__init__)Nr�r'r'r'r(rKsc@seZdZdZddd�ZdS)rzITtk Separator widget displays a horizontal or vertical separator
    bar.NcKst�||d|�dS)z�Construct a Ttk Separator with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient
        zttk::separatorNr�r�r'r'r(rx`szSeparator.__init__)Nr�r'r'r'r(r\sc@seZdZdZddd�ZdS)rzlTtk Sizegrip allows the user to resize the containing toplevel
    window by pressing and dragging the grip.NcKst�||d|�dS)z�Construct a Ttk Sizegrip with parent master.

        STANDARD OPTIONS

            class, cursor, state, style, takefocus
        z
ttk::sizegripNr�r�r'r'r(rxrszSizegrip.__init__)Nr�r'r'r'r(rnsc@s"eZdZdZddd�Zdd�ZdS)rz�Ttk Spinbox is an Entry with increment and decrement arrows

    It is commonly used for number entry or to select from a list of
    string values.
    NcKstj||df|�dS)a/Construct a Ttk Spinbox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, validate,
            validatecommand, xscrollcommand, invalidcommand

        WIDGET-SPECIFIC OPTIONS

            to, from_, increment, values, wrap, format, command
        zttk::spinboxNr�r�r'r'r(rx�szSpinbox.__init__cCs|j�|jd|�dS)z'Sets the value of the Spinbox to value.r�Nr�r�r'r'r(r��szSpinbox.set)N)r�r�r�r�rxr�r'r'r'r(r|s
c@s4eZdZdZdEdd�ZdFdd�ZdGdd�Zd	d
�ZdHdd�Zd
d�Z	dd�Z
dd�ZdIdd�ZdJdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�ZdKd#d$�ZdLd%d&�Zd'd(�ZeZd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Z d;d<�Z!dMd=d>�Z"dNd?d@�Z#dOdAdB�Z$dPdCdD�Z%dS)Qrz�Ttk Treeview widget displays a hierarchical collection of items.

    Each item has a textual label, an optional image, and an optional list
    of data values. The data values are displayed in successive columns
    after the tree label.NcKst�||d|�dS)a�Construct a Ttk Treeview with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand,
            yscrollcommand

        WIDGET-SPECIFIC OPTIONS

            columns, displaycolumns, height, padding, selectmode, show

        ITEM OPTIONS

            text, image, values, open, tags

        TAG OPTIONS

            foreground, background, font, image
        z
ttk::treeviewNr�r�r'r'r(rx�szTreeview.__init__cCs|�|j�|jd||��pdS)aTReturns the bounding box (relative to the treeview widget's
        window) of the specified item in the form x y width height.

        If column is specified, returns the bounding box of that cell.
        If the item is not visible (i.e., if it is a descendant of a
        closed item or is scrolled offscreen), returns an empty string.r�r8r�)rw�item�columnr'r'r(r��sz
Treeview.bboxcCs"|j�|j�|jd|pd�pd�S)zhReturns a tuple of children belonging to item.

        If item is not specified, returns root children.rJr8r'r��rwr�r'r'r(�get_children�s�zTreeview.get_childrencGs|j�|jd||�dS)z�Replaces item's child with newchildren.

        Children present in item that are not present in newchildren
        are detached from tree. No items in newchildren may be an
        ancestor of item.rJNr�)rwr�Znewchildrenr'r'r(�set_children�szTreeview.set_childrencKs$|dk	rd||<t|j||jd|�S)a
Query or modify the options for the specified column.

        If kw is not given, returns a dict of the column option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.Nr�r�)rwr�r�rFr'r'r(r��szTreeview.columncGs|j�|jd|�dS)z_Delete all specified items and all their descendants. The root
        item may not be deleted.�deleteNr��rwr1r'r'r(r��szTreeview.deletecGs|j�|jd|�dS)z�Unlinks all of the specified items from the tree.

        The items and all of their descendants are still present, and may
        be reinserted at another point in the tree, but will not be
        displayed. The root item may not be detached.�detachNr�r�r'r'r(r��szTreeview.detachcCs|j�|j�|jd|��S)zSReturns True if the specified item is present in the tree,
        False otherwise.�existsr�r�r'r'r(r��szTreeview.existscCs|j�|jd|�S)z}If item is specified, sets the focus item to item. Otherwise,
        returns the current focus item, or '' if there is none.�focusr�r�r'r'r(r��szTreeview.focuscKsP|�d�}|r,t|t�s,|j�||j�|d<|dk	r<d||<t|j||jd|�S)a_Query or modify the heading options for the specified column.

        If kw is not given, returns a dict of the heading option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.

        Valid options/values are:
            text: text
                The text to display in the column heading
            image: image_name
                Specifies an image to display to the right of the column
                heading
            anchor: anchor
                Specifies how the heading text should be aligned. One of
                the standard Tk anchor values
            command: callback
                A callback to be invoked when the heading label is
                pressed.

        To configure the tree column heading, call this with column = "#0" �commandN�heading)	r"r*r[r&�registerZ_substituterkr#r�)rwr�r�rF�cmdr'r'r(r��s
zTreeview.headingcCs|j�|jd|||�S)z�Returns a description of the specified component under the
        point given by x and y, or the empty string if no such component
        is present at that position.r�r�)rwZ	componentrrr�r'r'r(r�szTreeview.identifycCs|�dd|�S)z.Returns the item ID of the item at position y.�rowr�r�)rwr�r'r'r(�identify_rowszTreeview.identify_rowcCs|�d|d�S)zaReturns the data column identifier of the cell at position x.

        The tree column has ID #0.r�rr�)rwrrr'r'r(�identify_column"szTreeview.identify_columncCs|�d||�S)z�Returns one of:

        heading: Tree heading area.
        separator: Space between two columns headings;
        tree: The tree area.
        cell: A data cell.

        * Availability: Tk 8.6Zregionr�r�r'r'r(�identify_region)s	zTreeview.identify_regioncCs|�d||�S)zEReturns the element at position x, y.

        * Availability: Tk 8.6r�r�r�r'r'r(�identify_element5szTreeview.identify_elementcCs|j�|j�|jd|��S)zOReturns the integer index of item within its parent's list
        of children.r�r�r�r'r'r(r�<szTreeview.indexcKsNt|�}|dk	r0|jj|jd||d|f|��}n|jj|jd||f|��}|S)a�Creates a new item and return the item identifier of the newly
        created item.

        parent is the item ID of the parent item, or the empty string
        to create a new top-level item. index is an integer, or the value
        end, specifying where in the list of parent's children to insert
        the new item. If index is less than or equal to zero, the new node
        is inserted at the beginning, if index is greater than or equal to
        the current number of children, it is inserted at the end. If iid
        is specified, it is used as the item identifier, iid must not
        already exist in the tree. Otherwise, a new unique identifier
        is generated.Nr�z-id)r6r#rhr�)rwr�r�ZiidrFr4rfr'r'r(r�Bs
��zTreeview.insertcKs$|dk	rd||<t|j||jd|�S)a-Query or modify the options for the specified item.

        If no options are given, a dict with options/values for the item
        is returned. If option is specified then the value for that option
        is returned. Otherwise, sets the options to the corresponding
        values as given by kw.Nr�r�)rwr�r�rFr'r'r(r�Ysz
Treeview.itemcCs|j�|jd|||�dS)aRMoves item to position index in parent's list of children.

        It is illegal to move an item under one of its descendants. If
        index is less than or equal to zero, item is moved to the
        beginning, if greater than or equal to the number of children,
        it is moved to the end. If item was detached it is reattached.�moveNr�)rwr�r�r�r'r'r(r�esz
Treeview.movecCs|j�|jd|�S)zeReturns the identifier of item's next sibling, or '' if item
        is the last child of its parent.�nextr�r�r'r'r(r�qsz
Treeview.nextcCs|j�|jd|�S)zaReturns the ID of the parent of item, or '' if item is at the
        top level of the hierarchy.r�r�r�r'r'r(r�wszTreeview.parentcCs|j�|jd|�S)zjReturns the identifier of item's previous sibling, or '' if
        item is the first child of its parent.�prevr�r�r'r'r(r�}sz
Treeview.prevcCs|j�|jd|�dS)z�Ensure that item is visible.

        Sets all of item's ancestors open option to True, and scrolls
        the widget if necessary so that item is within the visible
        portion of the tree.�seeNr�r�r'r'r(r��szTreeview.seecCs|j�|j�|jd��S)z$Returns the tuple of selected items.�	selectionr�rr'r'r(r��szTreeview.selectioncCs>t|�dkr&t|dttf�r&|d}|j�|jd||�dS)Nr7rr�)r:r*r,r+r#rhr�)rwZselopr1r'r'r(�
_selection�szTreeview._selectioncGs|�d|�dS)z.The specified items becomes the new selection.r�N�r�r�r'r'r(�
selection_set�szTreeview.selection_setcGs|�d|�dS)z0Add all of the specified items to the selection.r�Nr�r�r'r'r(�
selection_add�szTreeview.selection_addcGs|�d|�dS)z5Remove all of the specified items from the selection.�removeNr�r�r'r'r(�selection_remove�szTreeview.selection_removecGs|�d|�dS)z2Toggle the selection state of each specified item.ZtoggleNr�r�r'r'r(�selection_toggle�szTreeview.selection_togglecCs@|j�|jd|||�}|dkr8|dkr8t|j|dtd�S|SdS)a;Query or set the value of given item.

        With one argument, return a dictionary of column/value pairs
        for the specified item. With two arguments, return the current
        value of the specified column. With three arguments, set the
        value of given column in given item to the specified value.r�NF)Z	cut_minusrg)r#rhr�rri)rwr�r�r-rfr'r'r(r��s�zTreeview.setcCs |j|jdd|f||dd�dS)z�Bind a callback for the given event sequence to the tag tagname.
        When an event is delivered to an item, the callbacks for each
        of the item's tags option are called.�tag�bindr)r�N)Z_bindr�)rw�tagnameZsequencer�r'r'r(�tag_bind�szTreeview.tag_bindcKs&|dk	rd||<t|j||jdd|�S)aBQuery or modify the options for the specified tagname.

        If kw is not given, returns a dict of the option settings for tagname.
        If option is specified, returns the value for that option for the
        specified tagname. Otherwise, sets the options to the corresponding
        values for the given tagname.Nr�rQr�)rwr�r�rFr'r'r(�
tag_configure�s
�zTreeview.tag_configurec	CsF|dkr$|j�|j�|jdd|��S|j�|j�|jdd||��SdS)z�If item is specified, returns 1 or 0 depending on whether the
        specified item has the given tagname. Otherwise, returns a list of
        all items which have the specified tag.

        * Availability: Tk 8.6Nr�Zhas)r#rcrhr�r�)rwr�r�r'r'r(�tag_has�s��zTreeview.tag_has)N)N)N)N)N)N)N)N)NN)NN)N)N)&r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zreattachr�r�r�r�r�r�r�r�r�r�r�r�r�r�r'r'r'r(r�sF



	
	

 

		



csLeZdZdZddd�Z�fdd�Zd	d
�Zedd��Zej	d
d��Z�Z
S)rz�A Ttk Scale widget with a Ttk Label widget indicating its
    current value.

    The Ttk Scale can be accessed through instance.scale, and Ttk Label
    can be accessed through instance.labelNr�
c	Ks|�dd�dk|_tj||f|�|p.t�|�|_|j�|�||_t	|�|_
t||j||d�|_|j�
d|j�|jr|dnd}|dkr�dnd}|jj|dd�t	|�}|j|d�|��|j
j|dkr�d	nd
d�|j�d|j�|_|�
d
|j�|�
d|j�dS)a�Construct a horizontal LabeledScale with parent master, a
        variable to be associated with the Ttk Scale widget and its range.
        If variable is not specified, a tkinter.IntVar is created.

        WIDGET-SPECIFIC OPTIONS

            compound: 'top' or 'bottom'
                Specifies how to display the label relative to the scale.
                Defaults to 'top'.
        Zcompound�top)�variabler�r�r�Zbottomrr)�sideZfill)r�r�rW)Zanchor�wz<Configure>z<Map>N)�pop�
_label_toprrxrvZIntVar�	_variabler��_last_validr�labelr�scaler��_adjustZpack�lowerZplaceZtrace_variable�_LabeledScale__tracecb)	rwr&r�r�r�rFZ
scale_sideZ
label_sideZdummyr'r'r(rx�s$
zLabeledScale.__init__csHz|j�d|j�Wntk
r(YnX|`t���d|_d|_dS)z9Destroy this widget and possibly its associated variable.r�N)r�Z
trace_vdeleter�AttributeError�super�destroyrrr��	__class__r'r(rs
zLabeledScale.destroycs��fdd�}t�jd�}t�jd�}||kr:||}}�j��}||krX|ksfn�j�_dS|�_|�jd<��|�dS)z1Adjust the label position according to the scale.csZ����j��\}}�jr2�j���j��}n�j���j��}�jj||d�dS)N�rrr�)Zupdate_idletasksrZcoordsr�Zwinfo_yrZwinfo_reqheightZplace_configurerrr'r(�adjust_labelsz*LabeledScale._adjust.<locals>.adjust_labelrCr�N�text)rsrr�r"rr-rZ
after_idle)rwrErr�r�Znewvalr'rr(rs


zLabeledScale._adjustcCs
|j��S)zReturn current scale value.)r�r"rr'r'r(r-4szLabeledScale.valuecCs|j�|�dS)zSet new scale value.N)r�r�)rwr=r'r'r(r-9s)NNrr�)r�r�r�r�rxrr�propertyr-�setter�
__classcell__r'r'r	r(r�s
&

cs<eZdZdZddd�Zdd�Zddd�Z�fd	d
�Z�ZS)
rzmThemed OptionMenu, based after tkinter's OptionMenu, which allows
    the user to select a value from a menu.NcOs�||�dd�|�dd�d�}tj||f|�tj|dd�|d<||_|�dd�|_|rpt�d	tt	|�
�����|j|f|��dS)
a9Construct a themed OptionMenu widget with master as the parent,
        the resource textvariable set to variable, the initially selected
        value specified by the default parameter, the menu values given by
        *values and additional keywords.

        WIDGET-SPECIFIC OPTIONS

            style: stylename
                Menubutton style.
            direction: 'above', 'below', 'left', 'right', or 'flush'
                Menubutton direction.
            command: callback
                A callback that will be invoked after selecting an item.
        r{N�	direction)Ztextvariabler{rF)Ztearoff�menur�zunknown option -%s)r�r	rxrvZMenur��	_callbackZTclErrorr�r\�keys�set_menu)rwr&r�r��values�kwargsrFr'r'r(rxCs
��zOptionMenu.__init__cCs&|dkr|�t�||��St�||�S)Nr)Znametowidgetr	�__getitem__r�r'r'r(r`szOptionMenu.__getitem__cGsR|d}|�dd�|D]$}|j|t�|j||j�|jd�q|rN|j�|�dS)zUBuild a new menu of radiobuttons with *values and optionally
        a default value.rr�end)rr�r�N)r�Zadd_radiobuttonrvZ_setitr�rr�)rwr�rrr=r'r'r(rgs�zOptionMenu.set_menucs,z|`Wntk
rYnXt���dS)z0Destroy this widget and its associated variable.N)r�rrrrr	r'r(rus
zOptionMenu.destroy)N)N)	r�r�r�r�rxrrrrr'r'r	r(r?s


)F)FN)F)F)rrB)N)6r��__version__�
__author__�__all__rvrrrrZ	TkVersionrr)r/r6r>r@rIrLrYrarerkrorsrirr�objectrr�rrrrrrrrr	r
rrr
rrrrrrZXViewZYViewrrrr'r'r'r(�<module>s��	




%
1*


*B*"8*(J`PK�(�Z���i�(�(+__pycache__/filedialog.cpython-38.opt-2.pycnu�[���U

e5d�8�@sddlTddlmZddlmZddlmZddlZddlZiZGdd�d�Z	Gdd	�d	e	�Z
Gd
d�de	�ZGdd
�d
ej�ZGdd�de�Z
Gdd�de�ZGdd�dej�Zdd�Zdd�Zdd�Zd'dd�Zd(dd�Zd)d d!�Zd"d#�Zd$d%�Zed&k�re�dS)*�)�*)�Dialog)�commondialog)�
_setup_dialogNc@s�eZdZdZd#dd�Zejdddfdd�Zd$d	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zd%dd�Zdd�Zdd�Zd&dd�Zdd �Zd!d"�ZdS)'�
FileDialogzFile Selection DialogNcCs�|dkr|j}||_d|_t|�|_|j�|�|j�|�t|j�t|j�|_|jj	t
td�t|j�|_
|j
j	t
td�|j
�d|j�t|j�|_|jj	ttd�|j�d|j�t|j�|_|jj	ttd�t|j�|_|jj	ttd�t|jd|jdfd�|_|jj	tttd�|j��}|j�|dd�|dd��|j�d	|j�|j�d
|j�|jj|jdfd�t|j�|_ |j j	t!td�t|jd|j dfd�|_"|j"j	t!ttd�|j j|j"dfd�|j"��}|j"�|dd�|dd��|j"�d	|j#�|j"�d
|j$�t%|jd
|j&d�|_'|j'j	t!d�t%|jd|jd�|_(|j(j	t!td�t%|jd|j)d�|_*|j*j	td�|j�+d|j)�|j�d|j)�|j�d|j)�dS)N)�side�fillz<Return>)�expandrr�set)ZexportselectionZyscrollcommand)rr	r�z<ButtonRelease-1>z<Double-ButtonRelease-1>Zyview)�commandZOK)�textr)rZFilter)rr	�CancelZWM_DELETE_WINDOWz<Alt-w>z<Alt-W>),�title�master�	directoryZToplevel�topZiconnamerZFrameZbotframeZpackZBOTTOM�XZEntry�	selectionZbind�ok_event�filterZTOP�filter_commandZmidframeZYESZBOTHZ	ScrollbarZfilesbarZRIGHT�YZListbox�filesZbindtags�files_select_event�files_double_eventZconfigZdirsbarZLEFT�dirs�dirs_select_event�dirs_double_eventZButton�
ok_commandZ	ok_buttonZ
filter_button�cancel_commandZ
cancel_buttonZprotocol)�selfrrZbtags�r"�*/usr/lib64/python3.8/tkinter/filedialog.py�__init__4st

�
 �
 ���zFileDialog.__init__r�cCs�|r|tkrt|\|_}n2tj�|�}tj�|�r<||_ntj�|�\|_}|�|j|�|�|�|�	�|j
��|j�
�|j��d|_|j��|r�|��\}}|jr�tj�|j�}||ft|<|j��|jS�N)�dialogstatesr�os�path�
expanduser�isdir�split�
set_filter�
set_selectionrrZ	focus_setrZwait_visibilityZgrab_set�howrZmainloop�
get_filter�dirnameZdestroy)r!Zdir_or_file�pattern�default�keyrr"r"r#�gots*





z
FileDialog.gocCs||_|j��dSr&)r/r�quit)r!r/r"r"r#r6�szFileDialog.quitcCs|��dSr&)r�r!�eventr"r"r#r�szFileDialog.dirs_double_eventcCs@|��\}}|j�d�}tj�tj�|j|��}|�||�dS�NZactive)	r0r�getr(r)�normpath�joinrr-)r!r8�dir�patZsubdirr"r"r#r�szFileDialog.dirs_select_eventcCs|��dSr&�rr7r"r"r#r�szFileDialog.files_double_eventcCs|j�d�}|�|�dSr9)rr:r.)r!r8�filer"r"r#r�szFileDialog.files_select_eventcCs|��dSr&r?r7r"r"r#r�szFileDialog.ok_eventcCs|�|���dSr&)r6�
get_selection�r!r"r"r#r�szFileDialog.ok_commandcCs&|��\}}zt�|�}Wn tk
r:|j��YdSX||_|�||�|��tj	g}g}|D]@}tj
�||�}tj
�|�r�|�
|�qft�||�rf|�
|�qf|j�dt�|D]}|j�t|�q�|j�dt�|D]}|j�t|�q�tj
�|���\}	}
|
tjk�rd}
|�|
�dS)Nrr%)r0r(�listdir�OSErrorr�bellrr-�sort�pardirr)r<r+�append�fnmatchr�delete�END�insertrr,rA�curdirr.)r!r8r=r>�namesZsubdirsZ
matchingfiles�name�fullname�head�tailr"r"r#r�s6
zFileDialog.filter_commandcCsN|j��}tj�|�}|dd�tjks4tj�|�rBtj�|d�}tj�|�S)N���r)	rr:r(r)r*�sepr+r<r,)r!rr"r"r#r0�s

zFileDialog.get_filtercCs|j��}tj�|�}|Sr&)rr:r(r)r*�r!r@r"r"r#rA�s
zFileDialog.get_selectioncCs|��dSr&)r6r7r"r"r#r �szFileDialog.cancel_commandcCs�tj�|�sPzt��}Wntk
r0d}YnX|rPtj�||�}tj�|�}|j�dt	�|j�
t	tj�|pttj|pzd��dS)Nrr)r(r)�isabs�getcwdrDr<r;rrJrKrLrM)r!r=r>�pwdr"r"r#r-�s
zFileDialog.set_filtercCs,|j�dt�|j�ttj�|j|��dS)Nr)rrJrKrLr(r)r<rrUr"r"r#r.�szFileDialog.set_selection)N)N)N)N)�__name__�
__module__�__qualname__rr$r(rMr5r6rrrrrrrr0rAr r-r.r"r"r"r#rs 
@


rc@seZdZdZdd�ZdS)�LoadFileDialogzLoad File Selection DialogcCs.|��}tj�|�s |j��n
|�|�dSr&)rAr(r)�isfilerrEr6rUr"r"r#r�szLoadFileDialog.ok_commandN�rYrZr[rrr"r"r"r#r\�sr\c@seZdZdZdd�ZdS)�SaveFileDialogzSave File Selection DialogcCs�|��}tj�|�rZtj�|�r.|j��dSt|jdd|fdddd�}|j	dkr�dSn*tj�
|�\}}tj�|�s�|j��dS|�|�dS)Nz Overwrite Existing File QuestionzOverwrite existing file %r?Z	questheadr)ZYesr)rr
Zbitmapr3Zstringsr)rAr(r)�existsr+rrErrZnumr,r6)r!r@�drQrRr"r"r#r�s&
�

zSaveFileDialog.ok_commandNr^r"r"r"r#r_�sr_c@seZdZdd�Zdd�ZdS)�_DialogcCs2zt|jd�|jd<Wntk
r,YnXdS)N�	filetypes)�tuple�options�KeyErrorrBr"r"r#�_fixoptions,sz_Dialog._fixoptionscCsR|rHz
|j}Wntk
r"YnXtj�|�\}}||jd<||jd<||_|S)N�
initialdirZinitialfile)�string�AttributeErrorr(r)r,re�filename�r!�widget�resultr)r@r"r"r#�
_fixresult3s


z_Dialog._fixresultN)rYrZr[rgror"r"r"r#rb*srbc@seZdZdZdd�ZdS)�OpenZtk_getOpenFilecCsxt|t�rBtdd�|D��}|r>tj�|d�\}}||jd<|S|j��sjd|jkrj|�||j�	|��St
�|||�S)NcSsg|]}t|d|��qS)ri)�getattr)�.0�rr"r"r#�
<listcomp>Nsz#Open._fixresult.<locals>.<listcomp>rrh�multiple)�
isinstancerdr(r)r,reZtkZwantobjectsroZ	splitlistrbrlr"r"r#roKs

zOpen._fixresultN�rYrZr[rror"r"r"r#rpFsrpc@seZdZdZdS)�SaveAsZtk_getSaveFileN)rYrZr[rr"r"r"r#rxZsrxc@seZdZdZdd�ZdS)�	DirectoryZtk_chooseDirectorycCs8|r.z
|j}Wntk
r"YnX||jd<||_|S)Nrh)rirjrer)r!rmrnr"r"r#rofs

zDirectory._fixresultNrwr"r"r"r#ryasrycKstf|���Sr&�rp�show�rer"r"r#�askopenfilenamewsr}cKstf|���Sr&)rxr{r|r"r"r#�asksaveasfilename}sr~cKsd|d<tf|���S)Nrrurzr|r"r"r#�askopenfilenames�srrscKs tf|���}|rt||�SdSr&)rpr{�open��modererkr"r"r#�askopenfile�s
r�cKs4tf|�}|r0g}|D]}|�t||��q|}|Sr&)rrHr�)r�rerZofilesrkr"r"r#�askopenfiles�s
r��wcKs tf|���}|rt||�SdSr&)rxr{r�r�r"r"r#�
asksaveasfile�s
r�cKstf|���Sr&)ryr{r|r"r"r#�askdirectory�sr�c
	Cs�t�}|��t|�}|jdd�}t|�}|jdd�}t||�d}ddl}z&ddl}|�|j	d�|�
|j�}Wntt
fk
r�YnXtdgd�}zt|d�}|��Wn$td	�t|��d
�YnXtd|�|��t�}	td|	�|��dS)
N�test)r4zutf-8rr%)z	all filesr)rcrszCould not open File: rr�Zsaveas)ZTkZwithdrawr\r5r_�print�sys�locale�	setlocale�LC_ALL�nl_langinfo�CODESET�ImportErrorrjr}r��close�exc_info�encoder~)
�root�fdZloadfileZsavefile�encr�r�Zopenfilename�fpZsaveasfilenamer"r"r#r��s2

r��__main__)rs)rs)r�)ZtkinterZtkinter.dialogrrZtkinter.simpledialogrr(rIr'rr\r_rbrprxryr}r~rr�r�r�r�r�rYr"r"r"r#�<module>s0I9
	

	,
PK�(�Zv��ZZ-__pycache__/commondialog.cpython-38.opt-1.pycnu�[���U

e5d��@sddlTGdd�d�ZdS)�)�*c@s2eZdZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�DialogNcKs|s|�d�}||_||_dS)N�parent)�get�master�options)�selfrr�r	�,/usr/lib64/python3.8/tkinter/commondialog.py�__init__s
zDialog.__init__cCsdS�Nr	)rr	r	r
�_fixoptionsszDialog._fixoptionscCs|Srr	)rZwidget�resultr	r	r
�
_fixresultszDialog._fixresultcKs||��D]\}}||j|<q|��t|j�}z,|jj|jf|�	|j���}|�
||�}W5z|��WnYnXX|Sr)�itemsrr
ZFramerZdestroyZtkZcall�commandZ_optionsr)rr�k�v�w�sr	r	r
�shows
zDialog.show)N)�__name__�
__module__�__qualname__rrr
rrr	r	r	r
rs

rN)Ztkinterrr	r	r	r
�<module>sPK�(�Z�T—|�|�__pycache__/ttk.cpython-38.pycnu�[���U

e5d���@s�dZdZdZddddddd	d
ddd
ddddddddddddddgZddlZddlmZmZmZmZej	dkrpd nd!Z
d"d#�ZdXd$d%�ZdYd&d'�Z
d(d)�ZdZd*d+�Zd[d,d-�Zd\d/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Zd?d�Zd]d@d�ZGdAd�de�ZGdBdC�dCej�ZGdDd�de�ZGdEd�de�ZGdFd�deej �Z GdGd�de �Z!GdHd�de�Z"GdId�de�Z#GdJd	�d	e�Z$e$Z%GdKd�de�Z&GdLd�de�Z'GdMd
�d
eej(�Z)e)Z(GdNd�de�Z*GdOd�de�Z+GdPd�deej,�Z,GdQd�deej-�Z-GdRd�de�Z.GdSd�de�Z/GdTd�de �Z0GdUd�deej1ej2�Z3GdVd�de"�Z4GdWd�de&�Z5dS)^a�Ttk wrapper.

This module provides classes to allow using Tk themed widget set.

Ttk is based on a revised and enhanced version of
TIP #48 (http://tip.tcl.tk/48) specified style engine.

Its basic idea is to separate, to the extent possible, the code
implementing a widget's behavior from the code implementing its
appearance. Widget class bindings are primarily responsible for
maintaining the widget state and invoking callbacks, all aspects
of the widgets appearance lies at Themes.
z0.3.1z!Guilherme Polo <ggpolo@gmail.com>�Button�Checkbutton�Combobox�Entry�Frame�Label�
Labelframe�
LabelFrame�
Menubutton�Notebook�Panedwindow�PanedWindow�Progressbar�Radiobutton�Scale�	Scrollbar�	Separator�Sizegrip�Spinbox�Style�Treeview�LabeledScale�
OptionMenu�
tclobjs_to_py�setup_master�N)�_flatten�_join�
_stringify�
_splitdictg!@TFcCsBtr>ddl}|j�d�}|r,|j�d|�|j�d�d|_dS)NrZTILE_LIBRARYz(global auto_path; lappend auto_path {%s}zpackage require tileT)�
_REQUIRE_TILE�os�environ�get�tk�eval�_tile_loaded)�masterr Ztilelib�r'�#/usr/lib64/python3.8/tkinter/ttk.py�
_load_tile"s��r)cCs(|rt|�}nt|ttf�r$t|�}|S)zInternal function.)r�
isinstance�list�tupler)�value�scriptr'r'r(�_format_optvalue1s

r/cCsPg}|��D]:\}}|r ||kr|�d|�|dk	r|�t||��qt|�S)z�Formats optdict to a tuple to pass it to tk.call.

    E.g. (script=False):
      {'foreground': 'blue', 'padding': [1, 2, 3, 4]} returns:
      ('-foreground', 'blue', '-padding', '1 2 3 4')�-%sN)�items�appendr/r)Zoptdictr.�ignore�opts�optr-r'r'r(�_format_optdict;sr6cCsXg}|D]J�^}}t|�dkr,|dp(d}n
d�|�}|�|�|dk	r|�|�q|S)N�r�� )�len�joinr2)r1Zopt_val�state�valr'r'r(�_mapdict_valuesKs

r>cCs:g}|��D]$\}}|�d|tt|�|�f�qt|�S)z�Formats mapdict to pass it to tk.call.

    E.g. (script=False):
      {'expand': [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])]}

      returns:

      ('-expand', '{active selected} grey focus {1, 2, 3, 4}')r0)r1�extendr/r>r)Zmapdictr.r4r5r-r'r'r(�_format_mapdict`s

�r@cOs�d}d}|dkr�|dkrB|d}tt|dd���}d||f}n2|dd�\}}	tt|dd���}
d	||	|
f}t||�}n,|d
kr�|d}t|�dkr�t|d|�f}|r�d|}d�|�}||fS)
zAFormats args and kw according to the given element factory etype.Nr')�imageZvsapirArr7z%s %s�z%s %s %s�fromz{%s}r9)rr>r6r:r/r;)�etyper.�args�kw�specr4ZinameZ	imagespec�
class_nameZpart_idZstatemapr'r'r(�_format_elemcreateqs&
rIrBc
Cs�g}|D]�}|\}}|pi}d�t|dd��}dd|||rDd|ndf}d|kr�|�|d�||7}t|d||�\}	}|�|	�||8}|�d	d|�q|�|�qd
�|�|fS)a$Formats a layout list so we can pass the result to ttk::style
    layout and ttk::style settings. Note that the layout doesn't have to
    be a list necessarily.

    E.g.:
      [("Menubutton.background", None),
       ("Menubutton.button", {"children":
           [("Menubutton.focus", {"children":
               [("Menubutton.padding", {"children":
                [("Menubutton.label", {"side": "left", "expand": 1})]
               })]
           })]
       }),
       ("Menubutton.indicator", {"side": "right"})
      ]

      returns:

      Menubutton.background
      Menubutton.button -children {
        Menubutton.focus -children {
          Menubutton.padding -children {
            Menubutton.label -side left -expand 1
          }
        }
      }
      Menubutton.indicator -side rightr9T)�childrenz%s%s%sz %sr8rJz -children {z%s}�
)r;r6r2�_format_layoutlist)
�layout�indentZindent_sizer.Zlayout_elem�elemr4Zfopts�headZ	newscriptr'r'r(rL�s"
�
rLcCsXg}|��D�]>\}}|�d�rFd�t|dd��}|�d||f�|�d�rvd�t|dd��}|�d||f�d|kr�|ds�d}nt|d�\}}|�d	||f�|�d
�r|d
}|d}d}|t|�kr�t||d
�s�|d7}q�|d|�}	|t|�k�r||�r||ni}
t	|df|	�|
�\}}|�d||||f�qd�|�S)z�Returns an appropriate script, based on settings, according to
    theme_settings definition to be used by theme_settings and
    theme_create.�	configurer9Tzttk::style configure %s %s;�mapzttk::style map %s %s;rM�nullzttk::style layout %s {
%s
}zelement createrr7r1z%ttk::style element create %s %s %s %srK)
r1r"r;r6r2r@rLr:�hasattrrI)�settingsr.�namer4�s�_ZeoptsrDZargcZelemargsZelemkwrGr'r'r(�_script_from_settings�s:



$�
rYcCs�t|t�r|Sg}t|�}t||�D]j\}}t|d�rDt|���}n(t|t�rX|��}nt|ttf�sl|f}t|d�r~t|�}|�||f��q$|S)ztConstruct a list from the given statespec tuple according to the
    accepted statespec accepted by _format_mapdict.�typename)	r*�str�iter�ziprT�splitr,r+r2)Zstuple�result�itr<r=r'r'r(�_list_from_statespec�s




racCs�|�|�}g}d}|t|�kr�||}i}|�||f�|d7}|t|�kr|||d�\}}|�d�slq|dd�}|d7}|dkr�t||�}|||<q@q|S)zpConstruct a list from the tuple returned by ttk::layout, this is
    somewhat the reverse of _format_layoutlist.rr7rB�-NrJ)�	splitlistr:r2�
startswith�_list_from_layouttuple)r#Zltuple�resZindxrVr4r5r=r'r'r(res$


recGs4t|�}|j||�}t|�dr&|St||td�S)ahFormat options then call Tk command with args and options and return
    the appropriate result.

    If no option is specified, a dict is returned. If an option is
    specified with the None value, the value for that option is returned.
    Otherwise, the function just sets the passed options and the caller
    shouldn't be expecting a return value anyway.rB)�conv)r6�callr:r�
_tclobj_to_py)r#�optionsrErfr'r'r(�_val_or_dict!s
rkc	Cs2t|�}zt|�}Wnttfk
r,YnX|S)zAConverts a value to, hopefully, a more appropriate Python object.)r[�int�
ValueError�	TypeError)r-r'r'r(�_convert_stringval1srocCs(t|t�r$d|krt|�}nt|�}|S)N�.)r*r[�floatrl)�xr'r'r(�
_to_number;s


rscCs\|rFt|d�rFt|t�sFt|ddd�dkr6t|�}qXttt|��}nt|d�rXt|�}|S)z8Return value converted from Tcl object to Python object.�__len__rrZNZ	StateSpec)rTr*r[�getattrrar+rRro)r=r'r'r(riCs

ricCs"|��D]\}}t|�||<q|S)zOReturns adict with its values converted from Tcl objects to Python
    objects.)r1ri)Zadictr5r=r'r'r(rPscCs|dkrt��}|S)aIf master is not None, itself is returned. If master is None,
    the default master is returned if there is one, otherwise a new
    master is created and returned.

    If it is not allowed to use the default root and master is None,
    RuntimeError is raised.N)�tkinterZ_get_default_root)r&r'r'r(rXsc@s�eZdZdZdZddd�Zddd�Zddd	�Zdd
d�Zd dd
�Z	dd�Z
dd�Zdd�Zd!dd�Z
dd�Zdd�Zd"dd�ZdS)#rzManipulate style database.z
ttk::styleNcCs0t|�}t|dd�st|�||_|jj|_dS)Nr%F)rrur)r&r#)�selfr&r'r'r(�__init__is
zStyle.__init__cKs4|dk	rd||<t|j||jd|�}|s,|r0|SdS)z�Query or sets the default value of the specified option(s) in
        style.

        Each key in kw is an option and each value is either a string or
        a sequence identifying the value for that option.NrQ)rkr#�_name�rw�styleZ	query_optrFr_r'r'r(rQts
zStyle.configurecsj|dk	r0�j��jd|d|�}t�j�|��S�jj�jd|ft|���}�fdd�t�j|���D�S)aSQuery or sets dynamic values of the specified option(s) in
        style.

        Each key in kw is an option and each value should be a list or a
        tuple (usually) containing statespecs grouped in tuples, or list,
        or something else of your preference. A statespec is compound of
        one or more states and then a value.NrRr0cs"i|]\}}|t�j�|���qSr')rar#rc)�.0�k�v�rwr'r(�
<dictcomp>�s�zStyle.map.<locals>.<dictcomp>)r#rhryrarcr@rr1rzr'rr(rR�s
�z	Style.mapcCs.|rd�|�nd}|j�|jd|d|||�S)aReturns the value specified for option in style.

        If state is specified it is expected to be a sequence of one
        or more states. If the default argument is set, it is used as
        a fallback value in case no specification for option is found.r9r8�lookupr0)r;r#rhry)rwr{�optionr<�defaultr'r'r(r��s
�zStyle.lookupcCs>d}|rt|�d}n|dk	r"d}t|j|j�|jd||��S)a�Define the widget layout for given style. If layoutspec is
        omitted, return the layout specification for given style.

        layoutspec is expected to be a list or an object different than
        None that evaluates to False if you want to "turn off" that style.
        If it is a list (or tuple, or something else), each item should be
        a tuple where the first item is the layout name and the second item
        should have the format described below:

        LAYOUTS

            A layout can contain the value None, if takes no options, or
            a dict of options specifying how to arrange the element.
            The layout mechanism uses a simplified version of the pack
            geometry manager: given an initial cavity, each element is
            allocated a parcel. Valid options/values are:

                side: whichside
                    Specifies which side of the cavity to place the
                    element; one of top, right, bottom or left. If
                    omitted, the element occupies the entire cavity.

                sticky: nswe
                    Specifies where the element is placed inside its
                    allocated parcel.

                children: [sublayout... ]
                    Specifies a list of elements to place inside the
                    element. Each element is a tuple (or other sequence)
                    where the first item is the layout name, and the other
                    is a LAYOUT.NrrSrM)rLrer#rhry)rwr{Z
layoutspecZlspecr'r'r(rM�s �zStyle.layoutcOs8t|df|�|�\}}|jj|jdd|||f|��dS)z9Create a new element in the current theme of given etype.F�element�createN)rIr#rhry)rw�elementnamerDrErFrGr4r'r'r(�element_create�s��zStyle.element_createc	Cs(tdd�|j�|j�|jdd��D��S)z:Returns the list of elements defined in the current theme.css|]}|�d�VqdS�rbN��lstrip)r|�nr'r'r(�	<genexpr>�sz&Style.element_names.<locals>.<genexpr>r��names�r,r#rcrhryrr'r'r(�
element_names�s�zStyle.element_namesc
Cs*tdd�|j�|j�|jdd|��D��S)z)Return the list of elementname's options.css|]}|�d�VqdSr�r�)r|�or'r'r(r��sz(Style.element_options.<locals>.<genexpr>r�rjr�)rwr�r'r'r(�element_options�s�zStyle.element_optionsc
CsN|rt|�nd}|r2|j�|jdd|d|d|�n|j�|jdd|d|�dS)a.Creates a new theme.

        It is an error if themename already exists. If parent is
        specified, the new theme will inherit styles, elements and
        layouts from the specified parent theme. If settings are present,
        they are expected to have the same syntax used for theme_settings.r8�themer�z-parentz	-settingsN�rYr#rhry)rw�	themename�parentrUr.r'r'r(�theme_create�s��zStyle.theme_createcCs"t|�}|j�|jdd||�dS)a�Temporarily sets the current theme to themename, apply specified
        settings and then restore the previous theme.

        Each key in settings is a style and each value may contain the
        keys 'configure', 'map', 'layout' and 'element create' and they
        are expected to have the same format as specified by the methods
        configure, map, layout and element_create respectively.r�rUNr�)rwr�rUr.r'r'r(�theme_settings�szStyle.theme_settingscCs|j�|j�|jdd��S)z#Returns a list of all known themes.r�r�)r#rcrhryrr'r'r(�theme_names�szStyle.theme_namescCs&|dkr|j�d�S|j�d|�dS)z�If themename is None, returns the theme in use, otherwise, set
        the current theme to themename, refreshes all widgets and emits
        a <<ThemeChanged>> event.Nzreturn $ttk::currentThemez
ttk::setTheme)r#r$rh)rwr�r'r'r(�	theme_use�szStyle.theme_use)N)N)N)NN)N)NN)N)�__name__�
__module__�__qualname__�__doc__ryrxrQrRr�rMr�r�r�r�r�r�r�r'r'r'r(rds




+
c@s6eZdZdZddd�Zdd�Zddd�Zd
d	d
�ZdS)�Widgetz!Base class for Tk themed widgets.NcCs4t|�}t|dd�st|�tjj||||d�dS)a�Constructs a Ttk Widget with the parent master.

        STANDARD OPTIONS

            class, cursor, takefocus, style

        SCROLLABLE WIDGET OPTIONS

            xscrollcommand, yscrollcommand

        LABEL WIDGET OPTIONS

            text, textvariable, underline, image, compound, width

        WIDGET STATES

            active, disabled, focus, pressed, selected, background,
            readonly, alternate, invalid
        r%F)rFN)rrur)rvr�rx)rwr&Z
widgetnamerFr'r'r(rxszWidget.__init__cCs|j�|jd||�S)z�Returns the name of the element at position x, y, or the empty
        string if the point does not lie within any element.

        x and y are pixel coordinates relative to the widget.�identify�r#rh�_w�rwrr�yr'r'r(r�+szWidget.identifyc	Os6|j�|j�|jdd�|���}|r2|r2|||�S|S)a1Test the widget's state.

        If callback is not specified, returns True if the widget state
        matches statespec and False otherwise. If callback is specified,
        then it will be invoked with *args, **kw if the widget state
        matches statespec. statespec is expected to be a sequence.�instater9)r#�
getbooleanrhr�r;)rw�	statespec�callbackrErFZretr'r'r(r�3s�
zWidget.instatecCs0|dk	rd�|�}|j�t|j�|jd|���S)aModify or inquire widget state.

        Widget state is returned if statespec is None, otherwise it is
        set according to the statespec flags and then a new state spec
        is returned indicating which flags were changed. statespec is
        expected to be a sequence.Nr9r<)r;r#rcr[rhr�)rwr�r'r'r(r<Bs
zWidget.state)N)N)N)r�r�r�r�rxr�r�r<r'r'r'r(r�
s


r�c@s"eZdZdZddd�Zdd�ZdS)rzcTtk Button widget, displays a textual label and/or image, and
    evaluates a command when pressed.NcKst�||d|�dS)aConstruct a Ttk Button widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, default, width
        zttk::buttonN�r�rx�rwr&rFr'r'r(rxSszButton.__init__cCs|j�|jd�S)z/Invokes the command associated with the button.�invoker�rr'r'r(r�bsz
Button.invoke)N�r�r�r�r�rxr�r'r'r'r(rOs
c@s"eZdZdZddd�Zdd�ZdS)rz;Ttk Checkbutton widget which is either in on- or off-state.NcKst�||d|�dS)a'Construct a Ttk Checkbutton widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, offvalue, onvalue, variable
        zttk::checkbuttonNr�r�r'r'r(rxjszCheckbutton.__init__cCs|j�|jd�S)aWToggles between the selected and deselected states and
        invokes the associated command. If the widget is currently
        selected, sets the option variable to the offvalue option
        and deselects the widget; otherwise, sets the option variable
        to the option onvalue.

        Returns the result of the associated command.r�r�rr'r'r(r�yszCheckbutton.invoke)Nr�r'r'r'r(rgs
c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzeTtk Entry widget displays a one-line text string and allows that
    string to be edited by the user.NcKst�|||pd|�dS)a�Constructs a Ttk Entry widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand

        WIDGET-SPECIFIC OPTIONS

            exportselection, invalidcommand, justify, show, state,
            textvariable, validate, validatecommand, width

        VALIDATION MODES

            none, key, focus, focusin, focusout, all
        z
ttk::entryNr�)rwr&ZwidgetrFr'r'r(rx�szEntry.__init__cCs|�|j�|jd|��S)zqReturn a tuple of (x, y, width, height) which describes the
        bounding box of the character given by index.�bbox�Z_getintsr#rhr�)rw�indexr'r'r(r��sz
Entry.bboxcCs|j�|jd||�S)zxReturns the name of the element at position x, y, or the
        empty string if the coordinates are outside the window.r�r�r�r'r'r(r��szEntry.identifycCs|j�|j�|jd��S)z�Force revalidation, independent of the conditions specified
        by the validate option. Returns False if validation fails, True
        if it succeeds. Sets or clears the invalid state accordingly.�validate�r#r�rhr�rr'r'r(r��szEntry.validate)NN)r�r�r�r�rxr�r�r�r'r'r'r(r�s

c@s,eZdZdZd	dd�Zd
dd�Zdd�ZdS)rzMTtk Combobox widget combines a text field with a pop-down list of
    values.NcKstj||df|�dS)aConstruct a Ttk Combobox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            exportselection, justify, height, postcommand, state,
            textvariable, values, width
        z
ttk::comboboxN�rrxr�r'r'r(rx�szCombobox.__init__cCs2|dkr |j�|j�|jd��S|j�|jd|�S)aIf newindex is supplied, sets the combobox value to the
        element at position newindex in the list of values. Otherwise,
        returns the index of the current value in the list of values
        or -1 if the current value does not appear in the list.N�current�r#Zgetintrhr�)rwZnewindexr'r'r(r��szCombobox.currentcCs|j�|jd|�dS)z(Sets the value of the combobox to value.�setNr��rwr-r'r'r(r��szCombobox.set)N)N)r�r�r�r�rxr�r�r'r'r'r(r�s


c@seZdZdZddd�ZdS)rzJTtk Frame widget is a container, used to group other widgets
    together.NcKst�||d|�dS)z�Construct a Ttk Frame with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            borderwidth, relief, padding, width, height
        z
ttk::frameNr�r�r'r'r(rx�szFrame.__init__)N�r�r�r�r�rxr'r'r'r(r�sc@seZdZdZddd�ZdS)rz7Ttk Label widget displays a textual label and/or image.NcKst�||d|�dS)aGConstruct a Ttk Label with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, style, takefocus, text,
            textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            anchor, background, font, foreground, justify, padding,
            relief, text, wraplength
        z
ttk::labelNr�r�r'r'r(rx�s
zLabel.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)rz�Ttk Labelframe widget is a container used to group other widgets
    together. It has an optional label, which may be a plain text string
    or another widget.NcKst�||d|�dS)z�Construct a Ttk Labelframe with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS
            labelanchor, text, underline, padding, labelwidget, width,
            height
        zttk::labelframeNr�r�r'r'r(rx�szLabelframe.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)r	zbTtk Menubutton widget displays a textual label and/or image, and
    displays a menu when pressed.NcKst�||d|�dS)aConstruct a Ttk Menubutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            direction, menu
        zttk::menubuttonNr�r�r'r'r(rxszMenubutton.__init__)Nr�r'r'r'r(r	
sc@sneZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
ddd�Zddd�Zdd�Z
dd�ZdS)r
z�Ttk Notebook widget manages a collection of windows and displays
    a single one at a time. Each child window is associated with a tab,
    which the user may select to change the currently-displayed window.NcKst�||d|�dS)a\Construct a Ttk Notebook with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            height, padding, width

        TAB OPTIONS

            state, sticky, padding, text, image, compound, underline

        TAB IDENTIFIERS (tab_id)

            The tab_id argument found in several methods may take any of
            the following forms:

                * An integer between zero and the number of tabs
                * The name of a child window
                * A positional specification of the form "@x,y", which
                  defines the tab
                * The string "current", which identifies the
                  currently-selected tab
                * The string "end", which returns the number of tabs (only
                  valid for method index)
        z
ttk::notebookNr�r�r'r'r(rx"szNotebook.__init__cKs |jj|jd|ft|���dS)z�Adds a new tab to the notebook.

        If window is currently managed by the notebook but hidden, it is
        restored to its previous position.�addN�r#rhr�r6)rw�childrFr'r'r(r�BszNotebook.addcCs|j�|jd|�dS)zXRemoves the tab specified by tab_id, unmaps and unmanages the
        associated window.�forgetNr��rw�tab_idr'r'r(r�JszNotebook.forgetcCs|j�|jd|�dS)z�Hides the tab specified by tab_id.

        The tab will not be displayed, but the associated window remains
        managed by the notebook and its configuration remembered. Hidden
        tabs may be restored with the add command.�hideNr�r�r'r'r(r�Psz
Notebook.hidecCs|j�|jd||�S)zZReturns the name of the tab element at position x, y, or the
        empty string if none.r�r�r�r'r'r(r�YszNotebook.identifycCs|j�|j�|jd|��S)z|Returns the numeric index of the tab specified by tab_id, or
        the total number of tabs if tab_id is the string "end".r�r�r�r'r'r(r�_szNotebook.indexcKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified position.

        pos is either the string end, an integer index, or the name of
        a managed child. If child is already managed by the notebook,
        moves it to the specified position.�insertNr��rw�posr�rFr'r'r(r�eszNotebook.insertcCs|j�|jd|�S)z�Selects the specified tab.

        The associated child window will be displayed, and the
        previously-selected window (if different) is unmapped. If tab_id
        is omitted, returns the widget name of the currently selected
        pane.�selectr�r�r'r'r(r�nszNotebook.selectcKs$|dk	rd||<t|j||jd|�S)z�Query or modify the options of the specific tab_id.

        If kw is not given, returns a dict of the tab option values. If option
        is specified, returns the value of that option. Otherwise, sets the
        options to the corresponding values.N�tab�rkr#r�)rwr�r�rFr'r'r(r�xszNotebook.tabcCs|j�|j�|jd�pd�S)z2Returns a list of windows managed by the notebook.�tabsr'�r#rcrhr�rr'r'r(r��sz
Notebook.tabscCs|j�d|j�dS)a�Enable keyboard traversal for a toplevel window containing
        this notebook.

        This will extend the bindings for the toplevel window containing
        this notebook as follows:

            Control-Tab: selects the tab following the currently selected
                         one

            Shift-Control-Tab: selects the tab preceding the currently
                               selected one

            Alt-K: where K is the mnemonic (underlined) character of any
                   tab, will select that tab.

        Multiple notebooks in a single toplevel may be enabled for
        traversal, including nested notebooks. However, notebook traversal
        only works properly if all panes are direct children of the
        notebook.zttk::notebook::enableTraversalNr�rr'r'r(�enable_traversal�szNotebook.enable_traversal)N)N)N)r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r'r'r'r(r
s
 		


c@s>eZdZdZddd�ZejjZdd�Zddd�Z	d
d	d
�Z
dS)rzfTtk Panedwindow widget displays a number of subwindows, stacked
    either vertically or horizontally.NcKst�||d|�dS)z�Construct a Ttk Panedwindow with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, width, height

        PANE OPTIONS

            weight
        zttk::panedwindowNr�r�r'r'r(rx�szPanedwindow.__init__cKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified positions.

        pos is either the string end, and integer index, or the name
        of a child. If child is already managed by the paned window,
        moves it to the specified position.r�Nr�r�r'r'r(r��szPanedwindow.insertcKs$|dk	rd||<t|j||jd|�S)aQQuery or modify the options of the specified pane.

        pane is either an integer index or the name of a managed subwindow.
        If kw is not given, returns a dict of the pane option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.N�paner�)rwr�r�rFr'r'r(r��szPanedwindow.panecCs|j�|j�|jd||��S)aLIf newpos is specified, sets the position of sash number index.

        May adjust the positions of adjacent sashes to ensure that
        positions are monotonically increasing. Sash positions are further
        constrained to be between 0 and the total size of the widget.

        Returns the new position of sash number index.�sashposr�)rwr�Znewposr'r'r(r��szPanedwindow.sashpos)N)N)N)r�r�r�r�rxrvrr�r�r�r�r'r'r'r(r�s
	
c@s6eZdZdZddd�Zddd�Zd
dd�Zd	d
�ZdS)r
a6Ttk Progressbar widget shows the status of a long-running
    operation. They can operate in two modes: determinate mode shows the
    amount completed relative to the total amount of work to be done, and
    indeterminate mode provides an animated display to let the user know
    that something is happening.NcKst�||d|�dS)z�Construct a Ttk Progressbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, length, mode, maximum, value, variable, phase
        zttk::progressbarNr�r�r'r'r(rx�szProgressbar.__init__cCs|j�|jd|�dS)z�Begin autoincrement mode: schedules a recurring timer event
        that calls method step every interval milliseconds.

        interval defaults to 50 milliseconds (20 steps/second) if omitted.�startNr�)rwZintervalr'r'r(r��szProgressbar.startcCs|j�|jd|�dS)zRIncrements the value option by amount.

        amount defaults to 1.0 if omitted.�stepNr�)rwZamountr'r'r(r��szProgressbar.stepcCs|j�|jd�dS)zVStop autoincrement mode: cancels any recurring timer event
        initiated by start.�stopNr�rr'r'r(r�szProgressbar.stop)N)N)N)r�r�r�r�rxr�r�r�r'r'r'r(r
�s



c@s"eZdZdZddd�Zdd�ZdS)rzeTtk Radiobutton widgets are used in groups to show or change a
    set of mutually-exclusive options.NcKst�||d|�dS)aConstruct a Ttk Radiobutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, value, variable
        zttk::radiobuttonNr�r�r'r'r(rxszRadiobutton.__init__cCs|j�|jd�S)z�Sets the option variable to the option value, selects the
        widget, and invokes the associated command.

        Returns the result of the command, or an empty string if
        no command is specified.r�r�rr'r'r(r�szRadiobutton.invoke)Nr�r'r'r'r(rs
c@s.eZdZdZd	dd�Zd
dd�Zddd�ZdS)rzTtk Scale widget is typically used to control the numeric value of
    a linked variable that varies uniformly over some range.NcKst�||d|�dS)z�Construct a Ttk Scale with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, from, length, orient, to, value, variable
        z
ttk::scaleNr�r�r'r'r(rx'szScale.__init__cKsTtj||f|�}t|td�tf�s,|�|�td|kd|kd|kg�rP|�d�|S)z�Modify or query scale options.

        Setting a value for any of the "from", "from_" or "to" options
        generates a <<RangeChanged>> event.NrC�from_�to�<<RangeChanged>>)r�rQr*�typer[�update�anyZevent_generate)rwZcnfrFZretvalr'r'r(rQ5s

zScale.configurecCs|j�|jd||�S)z�Get the current value of the value option, or the value
        corresponding to the coordinates x, y if they are specified.

        x and y are pixel coordinates relative to the scale widget
        origin.r"r�r�r'r'r(r"Bsz	Scale.get)N)N)NN)r�r�r�r�rxrQr"r'r'r'r(r#s


c@seZdZdZddd�ZdS)rz;Ttk Scrollbar controls the viewport of a scrollable widget.NcKst�||d|�dS)z�Construct a Ttk Scrollbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, orient
        zttk::scrollbarNr�r�r'r'r(rxNszScrollbar.__init__)Nr�r'r'r'r(rKsc@seZdZdZddd�ZdS)rzITtk Separator widget displays a horizontal or vertical separator
    bar.NcKst�||d|�dS)z�Construct a Ttk Separator with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient
        zttk::separatorNr�r�r'r'r(rx`szSeparator.__init__)Nr�r'r'r'r(r\sc@seZdZdZddd�ZdS)rzlTtk Sizegrip allows the user to resize the containing toplevel
    window by pressing and dragging the grip.NcKst�||d|�dS)z�Construct a Ttk Sizegrip with parent master.

        STANDARD OPTIONS

            class, cursor, state, style, takefocus
        z
ttk::sizegripNr�r�r'r'r(rxrszSizegrip.__init__)Nr�r'r'r'r(rnsc@s"eZdZdZddd�Zdd�ZdS)rz�Ttk Spinbox is an Entry with increment and decrement arrows

    It is commonly used for number entry or to select from a list of
    string values.
    NcKstj||df|�dS)a/Construct a Ttk Spinbox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, validate,
            validatecommand, xscrollcommand, invalidcommand

        WIDGET-SPECIFIC OPTIONS

            to, from_, increment, values, wrap, format, command
        zttk::spinboxNr�r�r'r'r(rx�szSpinbox.__init__cCs|j�|jd|�dS)z'Sets the value of the Spinbox to value.r�Nr�r�r'r'r(r��szSpinbox.set)N)r�r�r�r�rxr�r'r'r'r(r|s
c@s4eZdZdZdEdd�ZdFdd�ZdGdd�Zd	d
�ZdHdd�Zd
d�Z	dd�Z
dd�ZdIdd�ZdJdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�ZdKd#d$�ZdLd%d&�Zd'd(�ZeZd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Z d;d<�Z!dMd=d>�Z"dNd?d@�Z#dOdAdB�Z$dPdCdD�Z%dS)Qrz�Ttk Treeview widget displays a hierarchical collection of items.

    Each item has a textual label, an optional image, and an optional list
    of data values. The data values are displayed in successive columns
    after the tree label.NcKst�||d|�dS)a�Construct a Ttk Treeview with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand,
            yscrollcommand

        WIDGET-SPECIFIC OPTIONS

            columns, displaycolumns, height, padding, selectmode, show

        ITEM OPTIONS

            text, image, values, open, tags

        TAG OPTIONS

            foreground, background, font, image
        z
ttk::treeviewNr�r�r'r'r(rx�szTreeview.__init__cCs|�|j�|jd||��pdS)aTReturns the bounding box (relative to the treeview widget's
        window) of the specified item in the form x y width height.

        If column is specified, returns the bounding box of that cell.
        If the item is not visible (i.e., if it is a descendant of a
        closed item or is scrolled offscreen), returns an empty string.r�r8r�)rw�item�columnr'r'r(r��sz
Treeview.bboxcCs"|j�|j�|jd|pd�pd�S)zhReturns a tuple of children belonging to item.

        If item is not specified, returns root children.rJr8r'r��rwr�r'r'r(�get_children�s�zTreeview.get_childrencGs|j�|jd||�dS)z�Replaces item's child with newchildren.

        Children present in item that are not present in newchildren
        are detached from tree. No items in newchildren may be an
        ancestor of item.rJNr�)rwr�Znewchildrenr'r'r(�set_children�szTreeview.set_childrencKs$|dk	rd||<t|j||jd|�S)a
Query or modify the options for the specified column.

        If kw is not given, returns a dict of the column option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.Nr�r�)rwr�r�rFr'r'r(r��szTreeview.columncGs|j�|jd|�dS)z_Delete all specified items and all their descendants. The root
        item may not be deleted.�deleteNr��rwr1r'r'r(r��szTreeview.deletecGs|j�|jd|�dS)z�Unlinks all of the specified items from the tree.

        The items and all of their descendants are still present, and may
        be reinserted at another point in the tree, but will not be
        displayed. The root item may not be detached.�detachNr�r�r'r'r(r��szTreeview.detachcCs|j�|j�|jd|��S)zSReturns True if the specified item is present in the tree,
        False otherwise.�existsr�r�r'r'r(r��szTreeview.existscCs|j�|jd|�S)z}If item is specified, sets the focus item to item. Otherwise,
        returns the current focus item, or '' if there is none.�focusr�r�r'r'r(r��szTreeview.focuscKsP|�d�}|r,t|t�s,|j�||j�|d<|dk	r<d||<t|j||jd|�S)a_Query or modify the heading options for the specified column.

        If kw is not given, returns a dict of the heading option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.

        Valid options/values are:
            text: text
                The text to display in the column heading
            image: image_name
                Specifies an image to display to the right of the column
                heading
            anchor: anchor
                Specifies how the heading text should be aligned. One of
                the standard Tk anchor values
            command: callback
                A callback to be invoked when the heading label is
                pressed.

        To configure the tree column heading, call this with column = "#0" �commandN�heading)	r"r*r[r&�registerZ_substituterkr#r�)rwr�r�rF�cmdr'r'r(r��s
zTreeview.headingcCs|j�|jd|||�S)z�Returns a description of the specified component under the
        point given by x and y, or the empty string if no such component
        is present at that position.r�r�)rwZ	componentrrr�r'r'r(r�szTreeview.identifycCs|�dd|�S)z.Returns the item ID of the item at position y.�rowr�r�)rwr�r'r'r(�identify_rowszTreeview.identify_rowcCs|�d|d�S)zaReturns the data column identifier of the cell at position x.

        The tree column has ID #0.r�rr�)rwrrr'r'r(�identify_column"szTreeview.identify_columncCs|�d||�S)z�Returns one of:

        heading: Tree heading area.
        separator: Space between two columns headings;
        tree: The tree area.
        cell: A data cell.

        * Availability: Tk 8.6Zregionr�r�r'r'r(�identify_region)s	zTreeview.identify_regioncCs|�d||�S)zEReturns the element at position x, y.

        * Availability: Tk 8.6r�r�r�r'r'r(�identify_element5szTreeview.identify_elementcCs|j�|j�|jd|��S)zOReturns the integer index of item within its parent's list
        of children.r�r�r�r'r'r(r�<szTreeview.indexcKsNt|�}|dk	r0|jj|jd||d|f|��}n|jj|jd||f|��}|S)a�Creates a new item and return the item identifier of the newly
        created item.

        parent is the item ID of the parent item, or the empty string
        to create a new top-level item. index is an integer, or the value
        end, specifying where in the list of parent's children to insert
        the new item. If index is less than or equal to zero, the new node
        is inserted at the beginning, if index is greater than or equal to
        the current number of children, it is inserted at the end. If iid
        is specified, it is used as the item identifier, iid must not
        already exist in the tree. Otherwise, a new unique identifier
        is generated.Nr�z-id)r6r#rhr�)rwr�r�ZiidrFr4rfr'r'r(r�Bs
��zTreeview.insertcKs$|dk	rd||<t|j||jd|�S)a-Query or modify the options for the specified item.

        If no options are given, a dict with options/values for the item
        is returned. If option is specified then the value for that option
        is returned. Otherwise, sets the options to the corresponding
        values as given by kw.Nr�r�)rwr�r�rFr'r'r(r�Ysz
Treeview.itemcCs|j�|jd|||�dS)aRMoves item to position index in parent's list of children.

        It is illegal to move an item under one of its descendants. If
        index is less than or equal to zero, item is moved to the
        beginning, if greater than or equal to the number of children,
        it is moved to the end. If item was detached it is reattached.�moveNr�)rwr�r�r�r'r'r(r�esz
Treeview.movecCs|j�|jd|�S)zeReturns the identifier of item's next sibling, or '' if item
        is the last child of its parent.�nextr�r�r'r'r(r�qsz
Treeview.nextcCs|j�|jd|�S)zaReturns the ID of the parent of item, or '' if item is at the
        top level of the hierarchy.r�r�r�r'r'r(r�wszTreeview.parentcCs|j�|jd|�S)zjReturns the identifier of item's previous sibling, or '' if
        item is the first child of its parent.�prevr�r�r'r'r(r�}sz
Treeview.prevcCs|j�|jd|�dS)z�Ensure that item is visible.

        Sets all of item's ancestors open option to True, and scrolls
        the widget if necessary so that item is within the visible
        portion of the tree.�seeNr�r�r'r'r(r��szTreeview.seecCs|j�|j�|jd��S)z$Returns the tuple of selected items.�	selectionr�rr'r'r(r��szTreeview.selectioncCs>t|�dkr&t|dttf�r&|d}|j�|jd||�dS)Nr7rr�)r:r*r,r+r#rhr�)rwZselopr1r'r'r(�
_selection�szTreeview._selectioncGs|�d|�dS)z.The specified items becomes the new selection.r�N�r�r�r'r'r(�
selection_set�szTreeview.selection_setcGs|�d|�dS)z0Add all of the specified items to the selection.r�Nr�r�r'r'r(�
selection_add�szTreeview.selection_addcGs|�d|�dS)z5Remove all of the specified items from the selection.�removeNr�r�r'r'r(�selection_remove�szTreeview.selection_removecGs|�d|�dS)z2Toggle the selection state of each specified item.ZtoggleNr�r�r'r'r(�selection_toggle�szTreeview.selection_togglecCs@|j�|jd|||�}|dkr8|dkr8t|j|dtd�S|SdS)a;Query or set the value of given item.

        With one argument, return a dictionary of column/value pairs
        for the specified item. With two arguments, return the current
        value of the specified column. With three arguments, set the
        value of given column in given item to the specified value.r�NF)Z	cut_minusrg)r#rhr�rri)rwr�r�r-rfr'r'r(r��s�zTreeview.setcCs |j|jdd|f||dd�dS)z�Bind a callback for the given event sequence to the tag tagname.
        When an event is delivered to an item, the callbacks for each
        of the item's tags option are called.�tag�bindr)r�N)Z_bindr�)rw�tagnameZsequencer�r'r'r(�tag_bind�szTreeview.tag_bindcKs&|dk	rd||<t|j||jdd|�S)aBQuery or modify the options for the specified tagname.

        If kw is not given, returns a dict of the option settings for tagname.
        If option is specified, returns the value for that option for the
        specified tagname. Otherwise, sets the options to the corresponding
        values for the given tagname.Nr�rQr�)rwr�r�rFr'r'r(�
tag_configure�s
�zTreeview.tag_configurec	CsF|dkr$|j�|j�|jdd|��S|j�|j�|jdd||��SdS)z�If item is specified, returns 1 or 0 depending on whether the
        specified item has the given tagname. Otherwise, returns a list of
        all items which have the specified tag.

        * Availability: Tk 8.6Nr�Zhas)r#rcrhr�r�)rwr�r�r'r'r(�tag_has�s��zTreeview.tag_has)N)N)N)N)N)N)N)N)NN)NN)N)N)&r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zreattachr�r�r�r�r�r�r�r�r�r�r�r�r�r�r'r'r'r(r�sF



	
	

 

		



csLeZdZdZddd�Z�fdd�Zd	d
�Zedd��Zej	d
d��Z�Z
S)rz�A Ttk Scale widget with a Ttk Label widget indicating its
    current value.

    The Ttk Scale can be accessed through instance.scale, and Ttk Label
    can be accessed through instance.labelNr�
c	Ks|�dd�dk|_tj||f|�|p.t�|�|_|j�|�||_t	|�|_
t||j||d�|_|j�
d|j�|jr|dnd}|dkr�dnd}|jj|dd�t	|�}|j|d�|��|j
j|dkr�d	nd
d�|j�d|j�|_|�
d
|j�|�
d|j�dS)a�Construct a horizontal LabeledScale with parent master, a
        variable to be associated with the Ttk Scale widget and its range.
        If variable is not specified, a tkinter.IntVar is created.

        WIDGET-SPECIFIC OPTIONS

            compound: 'top' or 'bottom'
                Specifies how to display the label relative to the scale.
                Defaults to 'top'.
        Zcompound�top)�variabler�r�r�Zbottomrr)�sideZfill)r�r�rW)Zanchor�wz<Configure>z<Map>N)�pop�
_label_toprrxrvZIntVar�	_variabler��_last_validr�labelr�scaler��_adjustZpack�lowerZplaceZtrace_variable�_LabeledScale__tracecb)	rwr&r�r�r�rFZ
scale_sideZ
label_sideZdummyr'r'r(rx�s$
zLabeledScale.__init__csHz|j�d|j�Wntk
r(YnX|`t���d|_d|_dS)z9Destroy this widget and possibly its associated variable.r�N)r�Z
trace_vdeleter�AttributeError�super�destroyrrr��	__class__r'r(rs
zLabeledScale.destroycs��fdd�}t�jd�}t�jd�}||kr:||}}�j��}||krX|ksfn�j�_dS|�_|�jd<��|�dS)z1Adjust the label position according to the scale.csZ����j��\}}�jr2�j���j��}n�j���j��}�jj||d�dS)N�rrr�)Zupdate_idletasksrZcoordsr�Zwinfo_yrZwinfo_reqheightZplace_configurerrr'r(�adjust_labelsz*LabeledScale._adjust.<locals>.adjust_labelrCr�N�text)rsrr�r"rr-rZ
after_idle)rwrErr�r�Znewvalr'rr(rs


zLabeledScale._adjustcCs
|j��S)zReturn current scale value.)r�r"rr'r'r(r-4szLabeledScale.valuecCs|j�|�dS)zSet new scale value.N)r�r�)rwr=r'r'r(r-9s)NNrr�)r�r�r�r�rxrr�propertyr-�setter�
__classcell__r'r'r	r(r�s
&

cs<eZdZdZddd�Zdd�Zddd�Z�fd	d
�Z�ZS)
rzmThemed OptionMenu, based after tkinter's OptionMenu, which allows
    the user to select a value from a menu.NcOs�||�dd�|�dd�d�}tj||f|�tj|dd�|d<||_|�dd�|_|rpt�d	tt	|�
�����|j|f|��dS)
a9Construct a themed OptionMenu widget with master as the parent,
        the resource textvariable set to variable, the initially selected
        value specified by the default parameter, the menu values given by
        *values and additional keywords.

        WIDGET-SPECIFIC OPTIONS

            style: stylename
                Menubutton style.
            direction: 'above', 'below', 'left', 'right', or 'flush'
                Menubutton direction.
            command: callback
                A callback that will be invoked after selecting an item.
        r{N�	direction)Ztextvariabler{rF)Ztearoff�menur�zunknown option -%s)r�r	rxrvZMenur��	_callbackZTclErrorr�r\�keys�set_menu)rwr&r�r��values�kwargsrFr'r'r(rxCs
��zOptionMenu.__init__cCs&|dkr|�t�||��St�||�S)Nr)Znametowidgetr	�__getitem__r�r'r'r(r`szOptionMenu.__getitem__cGsR|d}|�dd�|D]$}|j|t�|j||j�|jd�q|rN|j�|�dS)zUBuild a new menu of radiobuttons with *values and optionally
        a default value.rr�end)rr�r�N)r�Zadd_radiobuttonrvZ_setitr�rr�)rwr�rrr=r'r'r(rgs�zOptionMenu.set_menucs,z|`Wntk
rYnXt���dS)z0Destroy this widget and its associated variable.N)r�rrrrr	r'r(rus
zOptionMenu.destroy)N)N)	r�r�r�r�rxrrrrr'r'r	r(r?s


)F)FN)F)F)rrB)N)6r��__version__�
__author__�__all__rvrrrrZ	TkVersionrr)r/r6r>r@rIrLrYrarerkrorsrirr�objectrr�rrrrrrrrr	r
rrr
rrrrrrZXViewZYViewrrrr'r'r'r(�<module>s��	




%
1*


*B*"8*(J`PK�(�ZM��__pycache__/font.cpython-38.pycnu�[���U

e5d@�@szdZddlZddlZdZdZdZdZdd�ZGd	d
�d
�Zd dd�Z	d!d
d�Z
edk�rve��Z
edded�Zee���ee�d��ee�d��ee���ee�d��ee�d��ee
��ee�d�e�d��eeje
d��edd�Zee�d�ejde
d��eje
ded�Ze��eje
de
jd�Ze��eedd���Zejed�ejed�e��dS)"z0.9�NZnormalZroman�boldZitaliccCst|dd�S)zFGiven the name of a tk named font, returns a Font representation.
    T)�name�exists)�Font�r�r�$/usr/lib64/python3.8/tkinter/font.py�
nametofontsr	c@s�eZdZdZe�d�Zdd�Zdd�Zdd�Z	d#dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd$dd�Zdd�Zdd�ZeZd%dd �Zd!d"�Zd	S)&ra�Represents a named font.

    Constructor options are:

    font -- font specifier (name, system font, or (family, size, style)-tuple)
    name -- name to use for this font configuration (defaults to a unique name)
    exists -- does a named font by this name already exist?
       Creates a new named font if False, points to the existing font if True.
       Raises _tkinter.TclError if the assertion is false.

       the following are ignored if font is specified:

    family -- font 'family', e.g. Courier, Times, Helvetica
    size -- font size in points
    weight -- font thickness: NORMAL, BOLD
    slant -- font slant: ROMAN, ITALIC
    underline -- font underlining: false (0), true (1)
    overstrike -- font strikeout: false (0), true (1)

    �cCs:g}|��D]$\}}|�d|�|�t|��qt|�S�N�-)�items�append�str�tuple)�self�kw�options�k�vrrr�_set1s
z	Font._setcCs$g}|D]}|�d|�qt|�Sr)rr)r�argsrrrrr�_get8sz	Font._getcCs:i}tdt|�d�D] }||d|||dd�<q|S)Nr�r
)�range�len)rrr�irrr�_mkdict>szFont._mkdictNFcKs�|st�d�}t|d|�}|r4|�|�dd|��}n
|�|�}|sTdtt|j��}||_	|r�d|_
|j	|�|�dd��kr�tj�d|j	f��|r�|jdd|j	f|��n|jdd	|j	f|��d
|_
||_
|j|_|j|_dS)Nzuse font�tk�font�actualF�namesz$named font %s does not already exist�	configureZcreateT)�tkinter�_get_default_root�getattr�	splitlist�callrr�next�counterr�delete_fontZ_tkinterZTclError�_tk�_split�_call)r�rootrrrrrrrr�__init__Ds,


�z
Font.__init__cCs|jS�Nr�rrrr�__str__cszFont.__str__cCs&t|t�stS|j|jko$|j|jkSr0)�
isinstancer�NotImplementedrr+)r�otherrrr�__eq__fs
zFont.__eq__cCs
|�|�Sr0)�cget)r�keyrrr�__getitem__kszFont.__getitem__cCs|jf||i�dSr0)r")rr8�valuerrr�__setitem__nszFont.__setitem__cCs4z|jr|�dd|j�Wntk
r.YnXdS)Nr�delete)r*r-r�	Exceptionr1rrr�__del__qs
zFont.__del__cCst|jf|���S)z*Return a distinct copy of the current font)rr+r r1rrr�copyxsz	Font.copycCs^d}|rd|f}|r8|d|f}|jdd|jf|��S|�|�|jdd|jf|����SdS)zReturn actual font attributesr�
-displayofrrr N)r-rrr,)r�option�	displayofrrrrr |s�zFont.actualcCs|�dd|jd|�S)zGet font attributer�configr)r-r)rrArrrr7�sz	Font.cgetc	KsB|r"|jdd|jf|�|���n|�|�|�dd|j���SdS)zModify font attributesrrCN)r-rrrr,)rrrrrrC�s��zFont.configcCs2|f}|rd||f}|j�|jdd|jf|���S)zReturn text widthr@r�measure)r+�getintr-r)r�textrBrrrrrD�s
zFont.measurecOs�d}|�dd�}|rd|f}|rL||�|�}|j�|jdd|jf|���S|�|jdd|jf|���}i}tdt|�d�D](}|j�||d	�|||d	d�<q||SdS)
z}Return font metrics.

        For best performance, create a dummy widget
        using this font before calling this method.rrBNr@r�metricsrrr
)	�poprr+rEr-rr,rr)rrrrrB�resrrrrrG�s�&zFont.metrics)NNNF)NN)N)�__name__�
__module__�__qualname__�__doc__�	itertools�countr)rrrr/r2r6r9r;r>r?r r7rCr"rDrGrrrrrs$


	
rcCs6|st�d�}d}|rd|f}|j�|jjd|���S)zGet font families (as a tuple)zuse font.families()rr@r�families)rrP�r#r$rr&r')r.rBrrrrrP�s
rPcCs$|st�d�}|j�|j�dd��S)z'Get names of defined fonts (as a tuple)zuse font.names()rr!rQ)r.rrrr!�s
r!�__main__�times�)�family�size�weightrUrWZhelloZ	linespace)rB)ZCourier�r)rzHello, world)rFrzQuit!)rFZcommandr)rW)NN)N)�__version__rNr#ZNORMALZROMANZBOLDZITALICr	rrPr!rJZTkr.�f�printr rCr7rDrGZLabel�wZpackZButtonZdestroyr?ZfbZmainlooprrrr�<module>sB






PK�(�Zs����'__pycache__/scrolledtext.cpython-38.pycnu�[���U

e5d�@sldZdgZddlmZmZmZmZmZmZddl	m
Z
mZmZm
Z
Gdd�de�Zdd�Zedkrhe�d	S)
aA ScrolledText widget feels like a text widget but also has a
vertical scroll bar on its right.  (Later, options may be added to
add a horizontal bar as well, to make the bars disappear
automatically when not needed, to move them to the other side of the
window, etc.)

Configuration options are passed to the Text widget.
A Frame widget is inserted between the master and the text, to hold
the Scrollbar widget.
Most methods calls are inherited from the Text widget; Pack, Grid and
Place methods are redirected to the Frame widget however.
�ScrolledText�)�Frame�Text�	Scrollbar�Pack�Grid�Place)�RIGHT�LEFT�Y�BOTHc@seZdZddd�Zdd�ZdS)rNcKs�t|�|_t|j�|_|jjttd�|�d|jji�t	j
||jf|�|jttdd�|j
|jd<tt	���}tt���tt���Btt���B}|�|�}|D]4}|ddkr�|dkr�|d	kr�t||t|j|��q�dS)
N)�side�fillZyscrollcommandT)r
r�expandZcommandr�_ZconfigZ	configure)r�framerZvbar�packr	r�update�setr�__init__r
rZyview�vars�keysrrr�
difference�setattr�getattr)�selfZmaster�kwZ
text_meths�methods�m�r�,/usr/lib64/python3.8/tkinter/scrolledtext.pyrs
$
zScrolledText.__init__cCs
t|j�S)N)�strr)rrrr �__str__)szScrolledText.__str__)N)�__name__�
__module__�__qualname__rr"rrrr rs
cCsHddlm}tddd�}|�|t�|jttdd�|��|�	�dS)Nr)�ENDZwhite�
)ZbgZheightT)rr
r)
�tkinter.constantsr&r�insert�__doc__rrr
Z	focus_setZmainloop)r&Zstextrrr �example-sr+�__main__N)r*�__all__Ztkinterrrrrrrr(r	r
rrrr+r#rrrr �<module>s
 
PK�(�Z�#�N��'__pycache__/colorchooser.cpython-38.pycnu�[���U

e5dA
�@s>ddlmZGdd�de�Zd	dd�Zedkr:ede��dS)
�)�Dialogc@s$eZdZdZdZdd�Zdd�ZdS)�Choosera�Create a dialog for the tk_chooseColor command.

    Args:
        master: The master widget for this dialog.  If not provided,
            defaults to options['parent'] (if defined).
        options: Dictionary of options for the tk_chooseColor call.
            initialcolor: Specifies the selected color when the
                dialog is first displayed.  This can be a tk color
                string or a 3-tuple of ints in the range (0, 255)
                for an RGB triplet.
            parent: The parent window of the color dialog.  The
                color dialog is displayed on top of this.
            title: A string for the title of the dialog box.
    Ztk_chooseColorcCs@z&|jd}t|t�r$d||jd<Wntk
r:YnXdS)zvEnsure initialcolor is a tk color string.

        Convert initialcolor from a RGB triplet to a color string.
        �initialcolorz
#%02x%02x%02xN)�options�
isinstance�tuple�KeyError)�self�color�r�,/usr/lib64/python3.8/tkinter/colorchooser.py�_fixoptions!s

zChooser._fixoptionscCs>|rt|�sdS|�|�\}}}|d|d|dft|�fS)z�Adjust result returned from call to tk_chooseColor.

        Return both an RGB tuple of ints in the range (0, 255) and the
        tk color string in the form #rrggbb.
        )NN�)�strZ	winfo_rgb)r	Zwidget�result�r�g�brrr�
_fixresult.szChooser._fixresultN)�__name__�
__module__�__qualname__�__doc__Zcommandr
rrrrrrs
rNcKs"|r|��}||d<tf|���S)z�Display dialog window for selection of a color.

    Convenience wrapper for the Chooser class.  Displays the color
    chooser dialog with color as the initial value.
    r)�copyrZshow)r
rrrr�askcolorBsr�__main__r
)N)Ztkinter.commondialogrrrr�printrrrr�<module>s3
PK�(�Z<,��22)__pycache__/__main__.cpython-38.opt-1.pycnu�[���U

e5d��@s<dZddlZejd�d�r&dejd<ddlmZe�dS)zMain entry point�Nz__main__.pyzpython -m tkinter�)�_test)�__doc__�sys�argv�endswith�r�main�r
r
�(/usr/lib64/python3.8/tkinter/__main__.py�<module>s

PK�(�ZF�9Q�Q�#__pycache__/__init__.cpython-38.pycnu�[���U

e5d͕�@s�dZddlZddlZddlZejZddlTddlZdZeej	�Z
eej�Zej
Z
ejZejZe�d�Ze�dej�Zdd�Zd	d
�Zdd�Zz
ejZWnek
r�YnXd
d�Zz
ejZWnek
r�YnXdydd�ZGdd�deej�ZGdd�d�Zdadadd�Z dzdd�Z!dd�Z"d{dd�Z#da$Gdd�d�Z%Gd d!�d!e%�Z&Gd"d#�d#e%�Z'Gd$d%�d%e%�Z(Gd&d'�d'e%�Z)d|d(d)�Z*e+Z,eZ-d*d+�Z.Gd,d-�d-�Z/Gd.d/�d/�Z0Gd0d1�d1�Z1Gd2d3�d3�Z2Gd4d5�d5�Z3Gd6d7�d7e/e3�Z4d}d8d9�Z5Gd:d;�d;�Z6Gd<d=�d=�Z7Gd>d?�d?�Z8Gd@dA�dAe/�Z9GdBdC�dCe9e6e7e8�Z:GdDdE�dEe9e3�Z;GdFdG�dGe:�Z<GdHdI�dIe:e1e2�Z=GdJdK�dKe:�Z>GdLdM�dMe:e1�Z?GdNdO�dOe:�Z@GdPdQ�dQe:�ZAGdRdS�dSe:e1e2�ZBGdTdU�dUe:�ZCGdVdW�dWe:�ZDGdXdY�dYe:�ZEGdZd[�d[e:�ZFGd\d]�d]e:�ZGGd^d_�d_e:�ZHGd`da�dae:e1e2�ZIGdbdc�dc�ZJGddde�deeD�ZKGdfdg�dg�ZLGdhdi�dieL�ZMGdjdk�dkeL�ZNdldm�ZOdndo�ZPGdpdq�dqe:e1�ZQGdrds�dse:�ZRGdtdu�due:�ZSdvdw�ZTeUdxk�r�eT�dS)~a8Wrapper functions for Tcl/Tk.

Tkinter provides classes which allow the display, positioning and
control of widgets. Toplevel widgets are Tk and Toplevel. Other
widgets are Frame, Label, Entry, Text, Canvas, Button, Radiobutton,
Checkbutton, Scale, Listbox, Scrollbar, OptionMenu, Spinbox
LabelFrame and PanedWindow.

Properties of the widgets are specified with keyword arguments.
Keyword arguments have the same name as the corresponding resource
under Tk.

Widgets are positioned with one of the geometry managers Place, Pack
or Grid. These managers can be called with methods place, pack, grid
available in every Widget.

Actions are bound to events by resources (e.g. keyword argument
command) or with the method bind.

Example (Hello, World):
import tkinter
from tkinter.constants import *
tk = tkinter.Tk()
frame = tkinter.Frame(tk, relief=RIDGE, borderwidth=2)
frame.pack(fill=BOTH,expand=1)
label = tkinter.Label(frame, text="Hello, World")
label.pack(fill=X, expand=1)
button = tkinter.Button(frame,text="Exit",command=tk.destroy)
button.pack(side=BOTTOM)
tk.mainloop()
�N)�*�z([\\{}])z([\s])cCsd�tt|��S)�Internal function.� )�join�map�
_stringify��value�r�(/usr/lib64/python3.8/tkinter/__init__.py�_join8sr
cCs�t|ttf�rHt|�dkr:t|d�}t�|�rFd|}q�dt|�}ntt|�}|sZd}nbt�|�r�t�	d|�}|�
dd�}t�	d|�}|ddkr�d	|}n|ddks�t�|�r�d|}|S)
rrrz{%s}z{}z\\\1�
z\n�"�\)�
isinstance�list�tuple�lenr�	_magic_re�searchr
�str�sub�replace�	_space_rer	rrrr=s$



rcCs@d}|D]2}t|ttf�r(|t|�}q|dk	r||f}q|S)rrN)rrr�_flatten)�seq�res�itemrrrrVsrcCs�t|t�r|St|td�tf�r$|Si}t|�D]^}z|�|�Wq0ttfk
r�}z(td|�|�	�D]\}}|||<qjW5d}~XYq0Xq0|SdS)rNz_cnfmerge: fallback due to:)
r�dict�typerr�update�AttributeError�	TypeError�print�items)Zcnfs�cnf�c�msg�k�vrrr�	_cnfmergees

r+Tc	Csz|�|�}t|�drtd��t|�}i}t||�D]@\}}t|�}|r`|ddkr`|dd�}|rl||�}|||<q4|S)aReturn a properly formatted dict built from Tcl list pairs.

    If cut_minus is True, the supposed '-' prefix will be removed from
    keys. If conv is specified, it is used to convert values.

    Tcl list is expected to contain an even number of elements.
    �zNTcl list representing a dict is expected to contain an even number of elementsr�-rN)�	splitlistr�RuntimeError�iter�zipr)	�tkr*Z	cut_minus�conv�t�itr�keyr
rrr�
_splitdict{s

r7c@s�eZdZdZeZdZdZeZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)e*j+Z+d&S)'�	EventType�2�3�4�5�6�7�8�9Z10Z11Z12Z13Z14Z15Z16Z17Z18Z19Z20Z21Z22Z23Z24Z25Z26Z27Z28Z29Z30Z31Z32Z33Z34Z35Z36Z37Z38N),�__name__�
__module__�__qualname__ZKeyPressZKeyZ
KeyReleaseZButtonPress�ButtonZ
ButtonReleaseZMotionZEnterZLeaveZFocusInZFocusOutZKeymapZExposeZGraphicsExposeZNoExposeZ
VisibilityZCreateZDestroyZUnmapZMapZ
MapRequestZReparentZ	ConfigureZConfigureRequestZGravityZ
ResizeRequestZ	CirculateZCirculateRequestZPropertyZSelectionClearZSelectionRequestZ	SelectionZColormapZ
ClientMessage�MappingZVirtualEventZActivateZ
DeactivateZ
MouseWheelr�__str__rrrrr8�sPr8c@seZdZdZdd�ZdS)�Eventa�Container for the properties of an event.

    Instances of this type are generated if one of the following events occurs:

    KeyPress, KeyRelease - for keyboard events
    ButtonPress, ButtonRelease, Motion, Enter, Leave, MouseWheel - for mouse events
    Visibility, Unmap, Map, Expose, FocusIn, FocusOut, Circulate,
    Colormap, Gravity, Reparent, Property, Destroy, Activate,
    Deactivate - for window events.

    If a callback function for one of these events is registered
    using bind, bind_all, bind_class, or tag_bind, the callback is
    called with an Event as first argument. It will have the
    following attributes (in braces are the event types for which
    the attribute is valid):

        serial - serial number of event
    num - mouse button pressed (ButtonPress, ButtonRelease)
    focus - whether the window has the focus (Enter, Leave)
    height - height of the exposed window (Configure, Expose)
    width - width of the exposed window (Configure, Expose)
    keycode - keycode of the pressed key (KeyPress, KeyRelease)
    state - state of the event as a number (ButtonPress, ButtonRelease,
                            Enter, KeyPress, KeyRelease,
                            Leave, Motion)
    state - state as a string (Visibility)
    time - when the event occurred
    x - x-position of the mouse
    y - y-position of the mouse
    x_root - x-position of the mouse on the screen
             (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    y_root - y-position of the mouse on the screen
             (ButtonPress, ButtonRelease, KeyPress, KeyRelease, Motion)
    char - pressed character (KeyPress, KeyRelease)
    send_event - see X/Windows documentation
    keysym - keysym of the event as a string (KeyPress, KeyRelease)
    keysym_num - keysym of the event as a number (KeyPress, KeyRelease)
    type - type of the event as a number
    widget - widget in which the event occurred
    delta - delta of wheel movement (MouseWheel)
    csdd�|j��D��|js"�d=n|jdkr:t|j��d<t|dd�sL�d=|jdkr^�d=n|t|jt�r�|j}d	}g}t|�D]\}}|d
|>@r�|�	|�q�|d
t
|�>d
@}|s�|s�|�	t|��d�|��d<|j
dkr�d=d
}dt|jd|j�d��fdd�|D��fS)NcSsi|]\}}|dkr||�qS)�??r��.0r)r*rrr�
<dictcomp>�sz"Event.__repr__.<locals>.<dictcomp>�charrH�
send_eventTr�state)
ZShiftZLockZControlZMod1ZMod2ZMod3ZMod4ZMod5ZButton1ZButton2ZButton3ZButton4ZButton5r�|�delta)rMrN�keysym�keycoderL�numrP�focus�x�y�width�heightz<%s event%s>�name�c3s&|]}|�krd|�|fVqdS)z %s=%sNr)rJr)��attrsrr�	<genexpr>
sz!Event.__repr__.<locals>.<genexpr>)�__dict__r%rL�repr�getattrrNr�int�	enumerate�appendr�hexrrPr )�selfrNZmods�s�i�n�keysrr[r�__repr__�s6


�zEvent.__repr__N)rArBrC�__doc__rjrrrrrG�s*rGcCsdadabdS)z�Inhibit setting of default root window.

    Call this function to inhibit that the first instance of
    Tk is used for windows without an explicit parent window.
    FN)�_support_default_root�
_default_rootrrrr�
NoDefaultRootsrncCs:tstd��ts6|r$td|�d���t�}t|ks6t�tS)NzINo master specified and tkinter is configured to not support default rootz
Too early to z: no default root window)rlr/rm�Tk�AssertionError)�what�rootrrr�_get_default_root#srscCsdS�rNr)�errrrr�_tkerror/srvcCs.zt|�}Wntk
r YnXt|��dS)zBInternal function. Calling it will raise the exception SystemExit.N)ra�
ValueError�
SystemExit)�coderrr�_exit4s
rzc@s�eZdZdZdZdZdZddd�Zdd�Zdd	�Z	d
d�Z
e
Zdd
�Zdd�Z
dd�Zdd�Zdd�Zdd�ZeZdd�Zdd�Zdd�ZdS)�Variablez�Class to define value holders for e.g. buttons.

    Subclasses StringVar, IntVar, DoubleVar, BooleanVar are specializations
    that constrain the type of the value returned from get().rZNcCs�|dk	rt|t�std��|s&td�}|��|_|j|_|rD||_ndtt	�|_t	d7a	|dk	rn|�
|�n&|j�|j�dd|j��s�|�
|j
�dS)a.Construct a variable

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to "")
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nzname must be a stringzcreate variable�PY_VARr�info�exists)rrr#rs�_rootr2�_tk�_namer_�_varnum�
initialize�
getboolean�call�_default�re�masterr
rYrrr�__init__Is

zVariable.__init__cCsb|jdkrdS|j�|j�dd|j��r6|j�|j�|jdk	r^|jD]}|j�|�qFd|_dS)zUnset the variable in Tcl.Nr}r~)r�r�r�r�Zglobalunsetvar�_tclCommands�
deletecommand�rerYrrr�__del__gs


zVariable.__del__cCs|jS)z'Return the name of the variable in Tcl.)r��rerrrrFsszVariable.__str__cCs|j�|j|�S�zSet the variable to VALUE.)r��globalsetvarr��rer
rrr�setwszVariable.setcCs|j�|j�S)zReturn value of variable.)r��globalgetvarr�r�rrr�get}szVariable.getcCs�t|d|j�j}tt|��}z
|j}Wntk
r:YnXz||j}Wntk
r^YnX|j�	||�|j
dkr~g|_
|j
�|�|S�N)�CallWrapperr�__call__r_�id�__func__r"rAr��
createcommandr�rc)re�callback�f�cbnamerrr�	_register�s

zVariable._registercCs(|�|�}|j�ddd|j||f�|S)a#Define a trace callback for the variable.

        Mode is one of "read", "write", "unset", or a list or tuple of
        such strings.
        Callback must be a function which is called when the variable is
        read, written or unset.

        Return the name of the callback.
        �trace�add�variable�r�r�r�r��re�moder�r�rrr�	trace_add�s

�zVariable.trace_addcCsx|j�ddd|j||�|��D] \}}|j�|�d|kr qtq |j�|�z|j�|�Wntk
rrYnXdS)aDelete the trace callback for a variable.

        Mode is one of "read", "write", "unset" or a list or tuple of
        such strings.  Must be same as were specified in trace_add().
        cbname is the name of the callback returned from trace_add().
        r��remover�rN)	r�r�r��
trace_infor.r�r�r�rw�rer�r��mZcarrr�trace_remove�s�zVariable.trace_removec
s4|jj��fdd�t��|j�ddd|j���D�S)z&Return all trace callback information.csg|]\}}�|�|f�qSrrrI�r.rr�
<listcomp>�sz'Variable.trace_info.<locals>.<listcomp>r�r}r�)r�r.rr�r�r�rr�rr��s�zVariable.trace_infocCs$|�|�}|j�dd|j||�|S)a�Define a trace callback for the variable.

        MODE is one of "r", "w", "u" for read, write, undefine.
        CALLBACK must be a function which is called when
        the variable is read, written or undefined.

        Return the name of the callback.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_add() instead.
        r�r�r�r�rrr�trace_variable�s
zVariable.trace_variablecCs�|j�dd|j||�|j�|�d}|��D] \}}|j�|�d|kr.q�q.|j�|�z|j�|�Wntk
r�YnXdS)aSDelete the trace callback for a variable.

        MODE is one of "r", "w", "u" for read, write, undefine.
        CBNAME is the name of the callback returned from trace_variable or trace.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_remove() instead.
        r�ZvdeleterN)	r�r�r�r.r�r�r�r�rwr�rrr�
trace_vdelete�s
zVariable.trace_vdeletecs(�fdd��j��j�dd�j��D�S)z�Return all trace callback information.

        This deprecated method wraps a deprecated Tcl method that will
        likely be removed in the future.  Use trace_info() instead.
        csg|]}�j�|��qSr)r�r.�rJrUr�rrr��sz(Variable.trace_vinfo.<locals>.<listcomp>r�Zvinfo)r�r.r�r�r�rr�r�trace_vinfo�s�zVariable.trace_vinfocCs6t|t�stS|j|jko4|jj|jjko4|j|jkSr�)rr{�NotImplementedr��	__class__rAr�)re�otherrrr�__eq__�s
�
�zVariable.__eq__)NNN)rArBrCrkr�r�r�r�r�rFr�r�r�r�r�r�r�r�r�r�r�r�rrrrr{@s&

r{c@s&eZdZdZdZddd�Zdd�ZdS)	�	StringVarz#Value holder for strings variables.rZNcCst�||||�dS)a6Construct a string variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to "")
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        N�r{r�r�rrrr��s
zStringVar.__init__cCs$|j�|j�}t|t�r|St|�S)z#Return value of variable as string.)r�r�r�rrr�rrrr�s
z
StringVar.get)NNN�rArBrCrkr�r�r�rrrrr��s
r�c@s&eZdZdZdZddd�Zdd�ZdS)	�IntVarz#Value holder for integer variables.rNcCst�||||�dS)a7Construct an integer variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to 0)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nr�r�rrrr�s
zIntVar.__init__c	CsJ|j�|j�}z|j�|�WSttfk
rDt|j�|��YSXdS)z/Return the value of the variable as an integer.N)r�r�r��getintr#�TclErrorra�	getdoubler�rrrr�s
z
IntVar.get)NNNr�rrrrr�
s
r�c@s&eZdZdZdZddd�Zdd�ZdS)	�	DoubleVarz!Value holder for float variables.gNcCst�||||�dS)a6Construct a float variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to 0.0)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nr�r�rrrr�*s
zDoubleVar.__init__cCs|j�|j�|j��S)z,Return the value of the variable as a float.)r�r�r�r�r�rrrr�6sz
DoubleVar.get)NNNr�rrrrr�&s
r�c@s2eZdZdZdZd
dd�Zdd�ZeZdd	�ZdS)�
BooleanVarz#Value holder for boolean variables.FNcCst�||||�dS)a:Construct a boolean variable.

        MASTER can be given as master widget.
        VALUE is an optional value (defaults to False)
        NAME is an optional Tcl name (defaults to PY_VARnum).

        If NAME matches an existing variable and VALUE is omitted
        then the existing value is retained.
        Nr�r�rrrr�?s
zBooleanVar.__init__cCs|j�|j|j�|��Sr�)r�r�r�r�r�rrrr�KszBooleanVar.setcCs:z|j�|j�|j��WStk
r4td��YnXdS)z+Return the value of the variable as a bool.� invalid literal for getboolean()N)r�r�r�r�r�rwr�rrrr�QszBooleanVar.get)NNN)	rArBrCrkr�r�r�r�r�rrrrr�;s
r�cCstd�j�|�dS)zRun the main loop of Tcl.zrun the main loopN)rsr2�mainloop)rhrrrr�Ysr�cCs4ztd�j�|�WStk
r.td��YnXdS)z$Convert Tcl object to True or False.zuse getboolean()r�N)rsr2r�r�rw�rfrrrr�csr�c@s�eZdZdZdZdZdd�Zdd�Z�d1dd�Zd	d
�Z	dd�Z
�d2dd�ZeZ�d3dd�Z
�d4dd�Z�d5dd�Z�d6dd�Zdd�Zdd�Zdd�Zdd �ZeZd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z�d7d/d0�Zd1d2�Zd3d4�Z�d8d6d7�Z d8d9�Z!d:d;�Z"d<d=�Z#d>d?�Z$d@dA�Z%dBdC�Z&dDdE�Z'dFdG�Z(�d9dHdI�Z)dJdK�Z*dLdM�Z+�d:dNdO�Z,dPdQ�Z-dRdS�Z.dTdU�Z/dVdW�Z0dXdY�Z1dZd[�Z2�d;d\d]�Z3�d<d^d_�Z4e4Z5�d=d`da�Z6�d>dbdc�Z7ddde�Z8dfdg�Z9dhdi�Z:djdk�Z;�d?dldm�Z<dndo�Z=dpdq�Z>drds�Z?dtdu�Z@dvdw�ZAdxdy�ZB�d@dzd{�ZCd|d}�ZDd~d�ZEd�d��ZFd�d��ZG�dAd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^�dBd�d��Z_d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��Zdd�d��Zed�d„Zfd�dĄZgd�dƄZhd�dȄZid�dʄZj�dCd�d̄Zk�dDd�dτZl�dEd�dфZm�dFd�dӄZn�dGd�dՄZod�dׄZp�dHd�dلZqd�dۄZr�dId�d݄Zsd�d߄Ztd�d�Zud�d�Zvd�d�Zwd�d�Zxeyd�d��Zz�dJd�d�Z{d�d�Z|e|Z}�dKd�d�Z~e~Zd�d�Z�d�Z�d�e��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z�d�d��Z��dLd�d��Z�e�Z��d�d�Z�e�Z��d�d�Z��d�d�Z��d�d�Z��d�d	�Z��d
gZ�e�f�d�d�Z�e�Z��d
�d�Z�e�Z��d�d�Z��dM�d�d�Z�e�Z��dN�d�d�Z�e�Z��d�d�Z��d�d�Z�if�d�d�Z�e�Z��d�d�Z�e�f�d�d�Z�if�d�d �Z�e�Z��d!�d"�Z�e�Z��dO�d#�d$�Z��d%�d&�Z��d'�d(�Z��d)�d*�Z��dP�d+�d,�Z��d-�d.�Z��d/�d0�Z�dS(Q�MisczRInternal class.

    Base class which defines methods common for interior widgets.NcCs,|jdk	r(|jD]}|j�|�qd|_dS)zkInternal function.

        Delete all Tcl commands created for
        this widget in the Tcl interpreter.N)r�r2r�r�rrr�destroyxs

zMisc.destroycCs6|j�|�z|j�|�Wntk
r0YnXdS)zDInternal function.

        Delete the Tcl command provided in NAME.N)r2r�r�r�rwr�rrrr��s
zMisc.deletecommandcCs|j�|j�dd|��S)z�Set Tcl internal variable, whether the look and feel
        should adhere to Motif.

        A parameter of 1 means adhere to Motif (e.g. no color
        change if mouse passes over slider).
        Returns the set value.r��tk_strictMotif)r2r�r��re�booleanrrrr��s
�zMisc.tk_strictMotifcCs|j�d�dS)zDChange the color scheme to light brown as used in Tk 3.6 and before.�	tk_bisqueN�r2r�r�rrrr��szMisc.tk_bisquecOs(|j�dt|�tt|�����dS)aSet a new color scheme for all widget elements.

        A single color as argument will cause that all colors of Tk
        widget elements are derived from this.
        Alternatively several keyword parameters and its associated
        colors can be given. The following keywords are valid:
        activeBackground, foreground, selectColor,
        activeForeground, highlightBackground, selectBackground,
        background, highlightColor, selectForeground,
        disabledForeground, insertBackground, troughColor.)�
tk_setPaletteN)r2r�rrr%�re�args�kwrrrr��s
��zMisc.tk_setPaletter|cCs|j�dd|�dS)z�Wait until the variable is modified.

        A parameter of type IntVar, StringVar, DoubleVar or
        BooleanVar must be given.�tkwaitr�Nr�r�rrr�
wait_variable�szMisc.wait_variablecCs"|dkr|}|j�dd|j�dS)zQWait until a WIDGET is destroyed.

        If no parameter is given self is used.Nr��window�r2r��_w�rer�rrr�wait_window�szMisc.wait_windowcCs"|dkr|}|j�dd|j�dS)zxWait until the visibility of a WIDGET changes
        (e.g. it appears).

        If no parameter is given self is used.Nr�Z
visibilityr�r�rrr�wait_visibility�szMisc.wait_visibility�1cCs|j�||�dS)zSet Tcl variable NAME to VALUE.N)r2�setvar)rerYr
rrrr��szMisc.setvarcCs|j�|�S)z"Return value of Tcl variable NAME.)r2�getvarr�rrrr��szMisc.getvarc
CsBz|j�|�WStk
r<}ztt|���W5d}~XYnXdSr�)r2r�r�rwr�rerf�excrrrr��szMisc.getintc
CsBz|j�|�WStk
r<}ztt|���W5d}~XYnXdSr�)r2r�r�rwrr�rrrr��szMisc.getdoublecCs0z|j�|�WStk
r*td��YnXdS)zPReturn a boolean value for Tcl boolean values true and false given as parameter.r�N)r2r�r�rw)rerfrrrr��szMisc.getbooleancCs|j�d|j�dS)z�Direct input focus to this widget.

        If the application currently does not have the focus
        this widget will get the focus if the application gets
        the focus through the window manager.rTNr�r�rrr�	focus_set�szMisc.focus_setcCs|j�dd|j�dS)ztDirect input focus to this widget even if the
        application does not have the focus. Use with
        caution!rTz-forceNr�r�rrr�focus_force�szMisc.focus_forcecCs&|j�d�}|dks|sdS|�|�S)z�Return the widget which has currently the focus in the
        application.

        Use focus_displayof to allow working with several
        displays. Return None if application does not have
        the focus.rT�noneN)r2r��
_nametowidgetr�rrr�	focus_get�szMisc.focus_getcCs,|j�dd|j�}|dks|s"dS|�|�S)z�Return the widget which has currently the focus on the
        display where this widget is located.

        Return None if the application does not have the focus.rT�
-displayofr�N�r2r�r�r�r�rrr�focus_displayof�szMisc.focus_displayofcCs,|j�dd|j�}|dks|s"dS|�|�S)zyReturn the widget which would have the focus if top level
        for this widget gets the focus from the window manager.rTz-lastforr�Nr�r�rrr�
focus_lastforszMisc.focus_lastforcCs|j�d�dS)zXThe widget under mouse will get automatically focus. Can not
        be disabled easily.�tk_focusFollowsMouseNr�r�rrrr�szMisc.tk_focusFollowsMousecCs"|j�d|j�}|sdS|�|�S)anReturn the next widget in the focus order which follows
        widget which has currently the focus.

        The focus order first goes to the next child, then to
        the children of the child recursively and then to the
        next sibling which is higher in the stacking order.  A
        widget is omitted if it has the takefocus resource set
        to 0.�tk_focusNextNr�r�rrrr�
s	zMisc.tk_focusNextcCs"|j�d|j�}|sdS|�|�S)zHReturn previous widget in the focus order. See tk_focusNext for details.�tk_focusPrevNr�r�rrrr�szMisc.tk_focusPrevcsN�s�j�d|�dS����fdd�}�j|_��|���j�d|��SdS)aCall function once after given time.

        MS specifies the time in milliseconds. FUNC gives the
        function which shall be called. Additional parameters
        are given as parameters to the function call.  Return
        identifier to cancel scheduling with after_cancel.�afterNcs8z���W5z����Wntk
r0YnXXdSr�)r�r�r�r��funcrYrerr�callit,szMisc.after.<locals>.callit)r2r�rAr�)reZmsr�r�r�rr�rr� s
z
Misc.aftercGs|jd|f|��S)z�Call FUNC once if the Tcl main loop has no event to
        process.

        Return an identifier to cancel the scheduling with
        after_cancel.Zidle)r�)rer�r�rrr�
after_idle8szMisc.after_idlecCsd|std��z.|j�dd|�}|j�|�d}|�|�Wntk
rNYnX|j�dd|�dS)z�Cancel scheduling of function identified with ID.

        Identifier returned by after or after_idle must be
        given as first parameter.
        z?id must be a valid identifier returned from after or after_idler�r}rZcancelN)rwr2r�r.r�r�)rer��dataZscriptrrr�after_cancel@szMisc.after_cancelrcCs|j�d|�|��dS)zRing a display's bell.)�bellN)r2r��
_displayof�re�	displayofrrrr�Qsz	Misc.bellcKsdd|krN|jdkrNz d|d<|j�d|�|��WStk
rL|d=YnX|j�d|�|��S)a�Retrieve data from the clipboard on window's display.

        The window keyword defaults to the root window of the Tkinter
        application.

        The type keyword specifies the form in which the data is
        to be returned and should be an atom name such as STRING
        or FILE_NAME.  Type defaults to STRING, except on X11, where the default
        is to try UTF8_STRING and fall back to STRING.

        This command is equivalent to:

        selection_get(CLIPBOARD)
        r �x11�UTF8_STRING)�	clipboardr�)�_windowingsystemr2r��_optionsr��rer�rrr�
clipboard_getVszMisc.clipboard_getcKs,d|kr|j|d<|j�d|�|��dS)z�Clear the data in the Tk clipboard.

        A widget specified for the optional displayof keyword
        argument specifies the target display.r�)r��clearN�r�r2r�r�r�rrr�clipboard_clearms
zMisc.clipboard_clearcKs4d|kr|j|d<|j�d|�|�d|f�dS)z�Append STRING to the Tk clipboard.

        A widget specified at the optional displayof keyword
        argument specifies the target display. The clipboard
        can be retrieved with selection_get.r�)r�rc�--Nr�)re�stringr�rrr�clipboard_appendus

�zMisc.clipboard_appendcCs$|j�dd|j�}|sdS|�|�S)zOReturn widget which has currently the grab in this application
        or None.�grabZcurrentNr�r�rrr�grab_current�szMisc.grab_currentcCs|j�dd|j�dS)z.Release grab for this widget if currently set.r��releaseNr�r�rrr�grab_release�szMisc.grab_releasecCs|j�dd|j�dS)zwSet grab for this widget.

        A grab directs all events to this and descendant
        widgets in the application.r�r�Nr�r�rrr�grab_set�sz
Misc.grab_setcCs|j�ddd|j�dS)z�Set global grab for this widget.

        A global grab directs all events to this and
        descendant widgets on the display. Use with caution -
        other applications do not get events anymore.r�r�z-globalNr�r�rrr�grab_set_global�szMisc.grab_set_globalcCs"|j�dd|j�}|dkrd}|S)zYReturn None, "local" or "global" if this widget has
        no, a local or a global grab.r��statusr�Nr�)rerrrr�grab_status�szMisc.grab_statuscCs|j�dd|||�dS)z�Set a VALUE (second parameter) for an option
        PATTERN (first parameter).

        An optional third parameter gives the numeric priority
        (defaults to 80).�optionr�Nr�)re�patternr
�priorityrrr�
option_add�szMisc.option_addcCs|j�dd�dS)zPClear the option database.

        It will be reloaded if option_add is called.rr�Nr�r�rrr�option_clear�szMisc.option_clearcCs|j�dd|j||�S)z�Return the value for an option NAME for this widget
        with CLASSNAME.

        Values with higher priority override lower values.rr�r�)rerY�	classNamerrr�
option_get�szMisc.option_getcCs|j�dd||�dS)zvRead file FILENAME into the option database.

        An optional second parameter gives the numeric
        priority.rZreadfileNr�)reZfileNamerrrr�option_readfile�szMisc.option_readfilecKs,d|kr|j|d<|j�d|�|��dS)zClear the current X selection.r�)�	selectionr�Nr�r�rrr�selection_clear�s
zMisc.selection_clearcKsvd|kr|j|d<d|kr`|jdkr`z d|d<|j�d|�|��WStk
r^|d=YnX|j�d|�|��S)a�Return the contents of the current X selection.

        A keyword parameter selection specifies the name of
        the selection and defaults to PRIMARY.  A keyword
        parameter displayof specifies a widget on the display
        to use. A keyword parameter type specifies the form of data to be
        fetched, defaulting to STRING except on X11, where UTF8_STRING is tried
        before STRING.r�r r�r�)r
r�)r�r�r2r�r�r�r�rrr�
selection_get�s	
zMisc.selection_getcKs.|�|�}|j�d|�|�|j|f�dS)aSpecify a function COMMAND to call if the X
        selection owned by this widget is queried by another
        application.

        This function must return the contents of the
        selection. The function will be called with the
        arguments OFFSET and LENGTH which allows the chunking
        of very long selections. The following keyword
        parameters can be provided:
        selection - name of the selection (default PRIMARY),
        type - type of the selection (e.g. STRING, FILE_NAME).)r
ZhandleN)r�r2r�r�r�)re�commandr�rYrrr�selection_handle�s
�zMisc.selection_handlecKs"|j�d|�|�|jf�dS)z�Become owner of X selection.

        A keyword parameter selection specifies the name of
        the selection (default PRIMARY).�r
ZownN)r2r�r�r�r�rrr�
selection_own�s
��zMisc.selection_owncKs:d|kr|j|d<|j�d|�|��}|s0dS|�|�S)z�Return owner of X selection.

        The following keyword parameter can
        be provided:
        selection - name of the selection (default PRIMARY),
        type - type of the selection (e.g. STRING, FILE_NAME).r�rN)r�r2r�r�r�)rer�rYrrr�selection_own_get�s
zMisc.selection_own_getcGs|j�d||f|�S)zDSend Tcl command CMD to different interpreter INTERP to be executed.�sendr�)reZinterp�cmdr�rrrr�sz	Misc.sendcCs|j�d|j|�dS)z(Lower this widget in the stacking order.�lowerNr�)re�	belowThisrrrr�sz
Misc.lowercCs|j�d|j|�dS)z(Raise this widget in the stacking order.�raiseNr�)re�	aboveThisrrr�tkraiseszMisc.tkraisecCs(d|�|�|f}|j�|j�|��S)z*Return integer which represents atom NAME.)�winfoZatom)r�r2r�r�)rerYr�r�rrr�
winfo_atomszMisc.winfo_atomcCs d|�|�|f}|j�|�S)z'Return name of atom with identifier ID.)rZatomname�r�r2r��rer�r�r�rrr�winfo_atomnames��zMisc.winfo_atomnamecCs|j�|j�dd|j��S)z7Return number of cells in the colormap for this widget.rZcells�r2r�r�r�r�rrr�winfo_cellss�zMisc.winfo_cellsc	CsRg}|j�|j�dd|j��D].}z|�|�|��Wqtk
rJYqXq|S)z?Return a list of all widgets which are children of this widget.r�children)r2r.r�r�rcr��KeyError)re�result�childrrr�winfo_childrens�zMisc.winfo_childrencCs|j�dd|j�S)z(Return window class name of this widget.r�classr�r�rrr�winfo_class#szMisc.winfo_classcCs|j�|j�dd|j��S)z?Return True if at the last color request the colormap was full.rZcolormapfull�r2r�r�r�r�rrr�winfo_colormapfull's�zMisc.winfo_colormapfullcCs4d|�|�||f}|j�|�}|s*dS|�|�S)z@Return the widget which is at the root coordinates ROOTX, ROOTY.)rZ
containingN)r�r2r�r�)reZrootXZrootYr�r�rYrrr�winfo_containing,s��zMisc.winfo_containingcCs|j�|j�dd|j��S)z$Return the number of bits per pixel.rZdepthr!r�rrr�winfo_depth4szMisc.winfo_depthcCs|j�|j�dd|j��S)z"Return true if this widget exists.rr~r!r�rrr�winfo_exists8s�zMisc.winfo_existscCs|j�|j�dd|j|��S)zWReturn the number of pixels for the given distance NUMBER
        (e.g. "3c") as float.rZfpixels�r2r�r�r��re�numberrrr�
winfo_fpixels=s�zMisc.winfo_fpixelscCs|j�dd|j�S)zFReturn geometry string for this widget in the form "widthxheight+X+Y".r�geometryr�r�rrr�winfo_geometryCszMisc.winfo_geometrycCs|j�|j�dd|j��S)zReturn height of this widget.rrXr!r�rrr�winfo_heightGs�zMisc.winfo_heightcCst|j�dd|j�d�S)z%Return identifier ID for this widget.rr�r)rar2r�r�r�rrr�winfo_idLsz
Misc.winfo_idcCs"d|�|�}|j�|j�|��S)z9Return the name of all Tcl interpreters for this display.)rZinterps)r�r2r.r�)rer�r�rrr�
winfo_interpsPszMisc.winfo_interpscCs|j�|j�dd|j��S)z%Return true if this widget is mapped.rZismappedr!r�rrr�winfo_ismappedUs�zMisc.winfo_ismappedcCs|j�dd|j�S)z/Return the window manager name for this widget.rZmanagerr�r�rrr�
winfo_managerZszMisc.winfo_managercCs|j�dd|j�S)zReturn the name of this widget.rrYr�r�rrr�
winfo_name^szMisc.winfo_namecCs|j�dd|j�S)z-Return the name of the parent of this widget.r�parentr�r�rrr�winfo_parentbszMisc.winfo_parentcCs d|�|�|f}|j�|�S)z.Return the pathname of the widget given by ID.)r�pathnamerrrrr�winfo_pathnamefs��zMisc.winfo_pathnamecCs|j�|j�dd|j|��S)z'Rounded integer value of winfo_fpixels.rZpixelsr!r0rrr�winfo_pixelsls�zMisc.winfo_pixelscCs|j�|j�dd|j��S)z:Return the x coordinate of the pointer on the root window.rZpointerxr!r�rrr�winfo_pointerxqs�zMisc.winfo_pointerxcCs|�|j�dd|j��S)zHReturn a tuple of x and y coordinates of the pointer on the root window.rZ	pointerxy��_getintsr2r�r�r�rrr�winfo_pointerxyvs�zMisc.winfo_pointerxycCs|j�|j�dd|j��S)z:Return the y coordinate of the pointer on the root window.rZpointeryr!r�rrr�winfo_pointery{s�zMisc.winfo_pointerycCs|j�|j�dd|j��S)z'Return requested height of this widget.rZ	reqheightr!r�rrr�winfo_reqheight�s�zMisc.winfo_reqheightcCs|j�|j�dd|j��S)z&Return requested width of this widget.rZreqwidthr!r�rrr�winfo_reqwidth�s�zMisc.winfo_reqwidthcCs|�|j�dd|j|��S)zNReturn a tuple of integer RGB values in range(65536) for color in this widget.rZrgbrA)reZcolorrrr�	winfo_rgb�s�zMisc.winfo_rgbcCs|j�|j�dd|j��S)zSReturn x coordinate of upper left corner of this widget on the
        root window.rZrootxr!r�rrr�winfo_rootx�s�zMisc.winfo_rootxcCs|j�|j�dd|j��S)zSReturn y coordinate of upper left corner of this widget on the
        root window.rZrootyr!r�rrr�winfo_rooty�s�zMisc.winfo_rootycCs|j�dd|j�S)z&Return the screen name of this widget.r�screenr�r�rrr�winfo_screen�szMisc.winfo_screencCs|j�|j�dd|j��S)zTReturn the number of the cells in the colormap of the screen
        of this widget.rZscreencellsr!r�rrr�winfo_screencells�s�zMisc.winfo_screencellscCs|j�|j�dd|j��S)z\Return the number of bits per pixel of the root window of the
        screen of this widget.rZscreendepthr!r�rrr�winfo_screendepth�s�zMisc.winfo_screendepthcCs|j�|j�dd|j��S)zXReturn the number of pixels of the height of the screen of this widget
        in pixel.rZscreenheightr!r�rrr�winfo_screenheight�s�zMisc.winfo_screenheightcCs|j�|j�dd|j��S)zUReturn the number of pixels of the height of the screen of
        this widget in mm.rZscreenmmheightr!r�rrr�winfo_screenmmheight�s�zMisc.winfo_screenmmheightcCs|j�|j�dd|j��S)zTReturn the number of pixels of the width of the screen of
        this widget in mm.rZ
screenmmwidthr!r�rrr�winfo_screenmmwidth�s�zMisc.winfo_screenmmwidthcCs|j�dd|j�S)z�Return one of the strings directcolor, grayscale, pseudocolor,
        staticcolor, staticgray, or truecolor for the default
        colormodel of this screen.rZscreenvisualr�r�rrr�winfo_screenvisual�szMisc.winfo_screenvisualcCs|j�|j�dd|j��S)zWReturn the number of pixels of the width of the screen of
        this widget in pixel.rZscreenwidthr!r�rrr�winfo_screenwidth�s�zMisc.winfo_screenwidthcCs|j�dd|j�S)zxReturn information of the X-Server of the screen of this widget in
        the form "XmajorRminor vendor vendorVersion".rZserverr�r�rrr�winfo_server�szMisc.winfo_servercCs|�|j�dd|j��S)z*Return the toplevel widget of this widget.r�toplevel)r�r2r�r�r�rrr�winfo_toplevel�s

�zMisc.winfo_toplevelcCs|j�|j�dd|j��S)zBReturn true if the widget and all its higher ancestors are mapped.rZviewabler!r�rrr�winfo_viewable�s�zMisc.winfo_viewablecCs|j�dd|j�S)z�Return one of the strings directcolor, grayscale, pseudocolor,
        staticcolor, staticgray, or truecolor for the
        colormodel of this widget.r�visualr�r�rrr�winfo_visual�szMisc.winfo_visualcCs|j�dd|j�S)z7Return the X identifier for the visual for this widget.rZvisualidr�r�rrr�winfo_visualid�szMisc.winfo_visualidFcsH�j�dd�j|rdnd�}�fdd��j�|�D�}�fdd�|D�S)z�Return a list of all visuals available for the screen
        of this widget.

        Each item in the list consists of a visual name (see winfo_visual), a
        depth and if includeids is true is given also the X identifier.rZvisualsavailable�
includeidsNcsg|]}�j�|��qSr)r2r.r�r�rrr��sz/Misc.winfo_visualsavailable.<locals>.<listcomp>csg|]}��|��qSr)�_Misc__winfo_parseitemr�r�rrr��s)r2r�r�r.)rerZr�rr�r�winfo_visualsavailable�s

�zMisc.winfo_visualsavailablecCs$|dd�tt|j|dd���S)rNr)rr�_Misc__winfo_getint)rer4rrrZ__winfo_parseitem�szMisc.__winfo_parseitemcCs
t|d�S)rr)ra�rerUrrrZ__winfo_getint�szMisc.__winfo_getintcCs|j�|j�dd|j��S)z�Return the height of the virtual root window associated with this
        widget in pixels. If there is no virtual root window return the
        height of the screen.rZvrootheightr!r�rrr�winfo_vrootheight�s�zMisc.winfo_vrootheightcCs|j�|j�dd|j��S)z�Return the width of the virtual root window associated with this
        widget in pixel. If there is no virtual root window return the
        width of the screen.rZ
vrootwidthr!r�rrr�winfo_vrootwidth�s�zMisc.winfo_vrootwidthcCs|j�|j�dd|j��S)ziReturn the x offset of the virtual root relative to the root
        window of the screen of this widget.rZvrootxr!r�rrr�winfo_vrootxs�zMisc.winfo_vrootxcCs|j�|j�dd|j��S)ziReturn the y offset of the virtual root relative to the root
        window of the screen of this widget.rZvrootyr!r�rrr�winfo_vrooty	s�zMisc.winfo_vrootycCs|j�|j�dd|j��S)z Return the width of this widget.rrWr!r�rrr�winfo_widths�zMisc.winfo_widthcCs|j�|j�dd|j��S)zVReturn the x coordinate of the upper left corner of this widget
        in the parent.rrUr!r�rrr�winfo_xs�zMisc.winfo_xcCs|j�|j�dd|j��S)zVReturn the y coordinate of the upper left corner of this widget
        in the parent.rrVr!r�rrr�winfo_ys�zMisc.winfo_ycCs|j�d�dS)zEEnter event loop until all pending events have been processed by Tcl.r!Nr�r�rrrr! szMisc.updatecCs|j�dd�dS)z�Enter event loop until all idle callbacks have been called. This
        will update the display of windows but not process events caused by
        the user.r!Z	idletasksNr�r�rrr�update_idletasks$szMisc.update_idletaskscCs6|dkr |j�|j�d|j��S|j�d|j|�dS)a,Set or get the list of bindtags for this widget.

        With no argument return the list of all bindtags associated with
        this widget. With a list of strings as argument the bindtags are
        set to this list. The bindtags determine in which order events are
        processed (see bind).N�bindtags�r2r.r�r�)reZtagListrrrrg*s
�z
Misc.bindtagsrcCs�t|t�r |j�|||f�nn|rd|�||j|�}d|r>dp@d||jf}|j�|||f�|S|rz|j�||f�S|j�|j�|��SdS)rz"%sif {"[%s %s]" == "break"} break
�+rZN)rrr2r�r��_substitute�_subst_format_strr.)rerq�sequencer�r��needcleanup�funcidrrrr�_bind7s"

�
��z
Misc._bindcCs|�d|jf|||�S)aOBind to this widget at event SEQUENCE a call to function FUNC.

        SEQUENCE is a string of concatenated event
        patterns. An event pattern is of the form
        <MODIFIER-MODIFIER-TYPE-DETAIL> where MODIFIER is one
        of Control, Mod2, M2, Shift, Mod3, M3, Lock, Mod4, M4,
        Button1, B1, Mod5, M5 Button2, B2, Meta, M, Button3,
        B3, Alt, Button4, B4, Double, Button5, B5 Triple,
        Mod1, M1. TYPE is one of Activate, Enter, Map,
        ButtonPress, Button, Expose, Motion, ButtonRelease
        FocusIn, MouseWheel, Circulate, FocusOut, Property,
        Colormap, Gravity Reparent, Configure, KeyPress, Key,
        Unmap, Deactivate, KeyRelease Visibility, Destroy,
        Leave and DETAIL is the button number for ButtonPress,
        ButtonRelease and DETAIL is the Keysym for KeyPress and
        KeyRelease. Examples are
        <Control-Button-1> for pressing Control and mouse button 1 or
        <Alt-A> for pressing A and the Alt key (KeyPress can be omitted).
        An event pattern can also be a virtual event of the form
        <<AString>> where AString can be arbitrary. This
        event can be generated by event_generate.
        If events are concatenated they must appear shortly
        after each other.

        FUNC will be called if the event sequence occurs with an
        instance of Event as argument. If the return value of FUNC is
        "break" no further bound function is invoked.

        An additional boolean parameter ADD specifies whether FUNC will
        be called additionally to the other bound function or whether
        it will replace the previous function.

        Bind will return an identifier to allow deletion of the bound function with
        unbind without memory leak.

        If FUNC or SEQUENCE is omitted the bound function or list
        of bound events are returned.�bind�ror��rerlr�r�rrrrpIs'z	Misc.bindcCs&|j�d|j|d�|r"|�|�dS)zWUnbind for this widget for event SEQUENCE  the
        function identified with FUNCID.rprZN�r2r�r�r�)rerlrnrrr�unbindrszMisc.unbindcCs|�d|||d�S)aBind to all widgets at an event SEQUENCE a call to function FUNC.
        An additional boolean parameter ADD specifies whether FUNC will
        be called additionally to the other bound function or whether
        it will replace the previous function. See bind for the return value.)rp�allr�rorrrrr�bind_allysz
Misc.bind_allcCs|j�dd|d�dS)z8Unbind for all widgets for event SEQUENCE all functions.rprurZNr�)rerlrrr�
unbind_all�szMisc.unbind_allcCs|�d|f|||d�S)a=Bind to widgets with bindtag CLASSNAME at event
        SEQUENCE a call of function FUNC. An additional
        boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or
        whether it will replace the previous function. See bind for
        the return value.rprrv)rer
rlr�r�rrr�
bind_class�szMisc.bind_classcCs|j�d||d�dS)zWUnbind for all widgets with bindtag CLASSNAME for event SEQUENCE
        all functions.rprZNr�)rer
rlrrr�unbind_class�szMisc.unbind_classcCs|j�|�dS)zCall the mainloop of Tk.N)r2r�)rerhrrrr��sz
Misc.mainloopcCs|j��dS)z8Quit the Tcl interpreter. All widgets will be destroyed.N)r2�quitr�rrrr{�sz	Misc.quitcCs"|rtt|jj|j�|���SdSrt)rrr2r�r.�rer�rrrrB�sz
Misc._getintscCs"|rtt|jj|j�|���SdSrt)rrr2r�r.r|rrr�_getdoubles�szMisc._getdoublescCs|r|j�|�SdSrt)r2r�r|rrr�_getboolean�szMisc._getbooleancCs"|rd|fS|dkrd|jfSdS)rr�Nr�r�r�rrrr��s

zMisc._displayofcCsBz|��jWStk
r<|j�dd�}|��_|YSXdS)rr2ZwindowingsystemN)rZ_windowingsystem_cachedr"r2r�)reZwsrrrr��s�zMisc._windowingsystemcCs�|rt||f�}nt|�}d}|��D]�\}}|dk	r&|ddkrN|dd�}t|�rb|�|�}n^t|ttf�r�g}|D]<}t|t�r�|�t	|��qxt|t	�r�|�t
|��qxq�qxd�|�}|d||f}q&|S)rrN����_rr-)r+r%�callabler�rrrrarcrrr)rer&r�rr)r*Znvrrrrr��s*


z
Misc._optionscCsNt|��d�}|}|ds.|��}|dd�}|D]}|s>qJ|j|}q2|S)zPReturn the Tkinter instance of a widget identified by
        its Tcl name NAME.�.rrN)r�splitrr#)rerY�wrhrrr�nametowidget�szMisc.nametowidgetcCs�t|||�j}tt|��}z
|j}Wntk
r8YnXz||j}Wntk
r\YnX|j�||�|r�|j	dkr�g|_	|j	�
|�|S)z�Return a newly created Tcl function. If this
        function is called, the Python function FUNC will
        be executed. An optional function SUBST can
        be given which will be executed before FUNC.N)r�r�r_r�r�r"rAr2r�r�rc)rer��substrmr�rYrrrr��s 

zMisc._registercCs|}|jr|j}q|S)r�r�)rer�rrrrsz
Misc._root)z%#z%bz%fz%hz%kz%sz%tz%wz%xz%yz%Az%Ez%Kz%Nz%Wz%Tz%Xz%Yz%Drcs�t|�t|j�kr|S|jj}|jj��fdd�}|\}}}}}}	}
}}}
}}}}}}}}}t�}�|�|_||�|_z||�|_Wnt	k
r�YnX||�|_
||�|_||	�|_||
�|_
||�|_||�|_||
�|_||_z||�|_Wnt	k
�r
YnX||_||�|_zt|�|_Wntk
�rF||_YnXz|�|�|_Wntk
�rt||_YnX||�|_||�|_z�|�|_Wn tt	fk
�r�d|_YnX|fS)rc	s,z
�|�WSttfk
r&|YSXdS)z?Tk changed behavior in 8.4.2, returning "??" rather more often.N)rwr�r��r�rr�getint_events
z&Misc._substitute.<locals>.getint_eventr)r�
_subst_formatr2r�r�rG�serialrSrTr�rXrRrN�timerWrUrVrLrMrQZ
keysym_numr8r rwr��widgetr$Zx_rootZy_rootrP)rer�r�r�Znsign�br��hr)rfr4r�rUrV�A�E�K�N�W�T�X�Y�D�err�rrjsT*











zMisc._substitutecCs(t��\}}}|��}|�|||�dSrt)�sys�exc_infor�report_callback_exception)rer��val�tbrrrrr�_report_exceptionHszMisc._report_exceptioncGs\i}|j�|jj|��D]>}|j�|�}|ddd�f|dd�||ddd�<q|S)z;Call Tcl configure command and return the result as a dict.rrN�r2r.r�)rer�r&rUrrr�
_getconfigureNs
0zMisc._getconfigurecGs2|j�|jj|��}|ddd�f|dd�S)Nrrr�)rer�rUrrr�_getconfigure1VszMisc._getconfigure1cCs�|rt||f�}n|rt|�}|dkr:|�t|j|f��St|t�r^|�t|j|d|f��S|j�t|j|f�|�	|��dS)rNr-)
r+r�rr�rrr�r2r�r�)rerr&r�rrr�
_configureZs
zMisc._configurecKs|�d||�S)z�Configure resources of a widget.

        The values for resources are specified as keyword
        arguments. To get an overview about
        the allowed keyword arguments call the method keys.
        �	configure�r��rer&r�rrrr�gszMisc.configurecCs|j�|jdd|�S)z4Return the resource value for a KEY given as string.�cgetr-r��rer6rrrr�rsz	Misc.cgetcCs|�||i�dSr�)r��rer6r
rrr�__setitem__xszMisc.__setitem__cs*|jj��fdd��|j�|jd��D�S)z3Return a list of all resource names of this widget.cs g|]}�|�ddd��qS)rrNrr�r�rrr�~szMisc.keys.<locals>.<listcomp>r�rhr�rr�rri{s
�z	Misc.keyscCs|jS)z+Return the window path name of this widget.rr�rrrrF�szMisc.__str__cCsd|jj|jj|jfS)Nz<%s.%s object %s>)r�rBrCr�r�rrrrj�s
�z
Misc.__repr__�_noarg_cCs:|tjkr"|�|j�dd|j��S|j�dd|j|�dS)aSet or get the status for propagation of geometry information.

        A boolean argument specifies whether the geometry information
        of the slaves will determine the size of this widget. If no argument
        is given the current setting will be returned.
        �pack�	propagateN�r�r�r~r2r�r��re�flagrrr�pack_propagate�s

�zMisc.pack_propagatecs(�fdd��j��j�dd�j��D�S)�HReturn a list of all slaves of this widget
        in its packing order.csg|]}��|��qSr�r�r�r�rrr��sz$Misc.pack_slaves.<locals>.<listcomp>r��slavesrhr�rr�r�pack_slaves�s

��zMisc.pack_slavescs(�fdd��j��j�dd�j��D�S)r�csg|]}��|��qSrr�r�r�rrr��sz%Misc.place_slaves.<locals>.<listcomp>�placer�rhr�rr�r�place_slaves�s
���zMisc.place_slavescCs|j�dd|j|�dS)z�The anchor value controls how to place the grid within the
        master when no row/column has any weight.

        The default anchor is nw.�grid�anchorNr�)rer�rrr�grid_anchor�szMisc.grid_anchorcCsZdd|jf}|dk	r(|dk	r(|||f}|dk	rD|dk	rD|||f}|�|jj|��pXdS)a�Return a tuple of integer coordinates for the bounding
        box of this widget controlled by the geometry manager grid.

        If COLUMN, ROW is given the bounding box applies from
        the cell with row and column 0 to the specified
        cell. If COL2 and ROW2 are given the bounding box
        starts at that cell.

        The returned integers specify the offset of the upper left
        corner in the master widget and the width and height.
        r��bboxN)r�rBr2r�)re�column�rowZcol2Zrow2r�rrr�	grid_bbox�szMisc.grid_bboxc	Csht|ttjf�rdz:t|�}|s$WdSd|kr:|j�|�WS|j�|�WSWnttfk
rbYnX|S)Nr�)	rr�_tkinterZTcl_Objr2r�r�rwr�)rer
Zsvaluerrr�_gridconvvalue�szMisc._gridconvvaluecCs�t|t�rJ|sJ|dd�dkr*|dd�}|dd�dkrBd|}|f}n|�||�}|s|t|j|j�d||j|�|jd�S|j�d||j|f|�}t|�dkr�|�|�SdS)rr�Nr�rr-r�)r3)	rrr�r7r2r�r�r�r)rer�indexr&r��optionsrrrr�_grid_configure�s(���zMisc._grid_configurecKs|�d|||�S)z�Configure column INDEX of a grid.

        Valid resources are minsize (minimum size of the column),
        weight (how much does additional space propagate to this column)
        and pad (how much space to let additionally).�columnconfigure�r��rer�r&r�rrr�grid_columnconfigure�szMisc.grid_columnconfigurec	Cs |�|j�dd|j||��pdS)z�Return a tuple of column and row which identify the cell
        at which the pixel at position X and Y inside the master
        widget is located.r��locationNrA�rerUrVrrr�
grid_location�s���zMisc.grid_locationcCs:|tjkr"|�|j�dd|j��S|j�dd|j|�dS)aSet or get the status for propagation of geometry information.

        A boolean argument specifies whether the geometry information
        of the slaves will determine the size of this widget. If no argument
        is given, the current setting will be returned.
        r�r�Nr�r�rrr�grid_propagates

�zMisc.grid_propagatecKs|�d|||�S)z�Configure row INDEX of a grid.

        Valid resources are minsize (minimum size of the row),
        weight (how much does additional space propagate to this row)
        and pad (how much space to let additionally).�rowconfigurer�r�rrr�grid_rowconfigureszMisc.grid_rowconfigurecCs|�|j�dd|j��pdS)z<Return a tuple of the number of column and rows in the grid.r��sizeNrAr�rrr�	grid_sizes
��zMisc.grid_sizecsZd}|dk	r|d|f}|dk	r,|d|f}�fdd��j��j�dd�jf|��D�S)	r�rNz-rowz-columncsg|]}��|��qSrr�r�r�rrr�(sz$Misc.grid_slaves.<locals>.<listcomp>r�r�rh)rer�r�r�rr�r�grid_slaves s
��zMisc.grid_slavescGsdd|f|}|j�|�dS)z�Bind a virtual event VIRTUAL (of the form <<Name>>)
        to an event SEQUENCE such that the virtual event is triggered
        whenever SEQUENCE occurs.�eventr�Nr��re�virtual�	sequencesr�rrr�	event_add/szMisc.event_addcGsdd|f|}|j�|�dS)z-Unbind a virtual event VIRTUAL from SEQUENCE.r��deleteNr�r�rrr�event_delete6szMisc.event_deletecKsDdd|j|f}|��D]\}}|d|t|�f}q|j�|�dS)z�Generate an event SEQUENCE. Additional
        keyword arguments specify parameter of the event
        (e.g. x, y, rootx, rooty).r�Zgenerate�-%sN)r�r%rr2r�)rerlr�r�r)r*rrr�event_generate;szMisc.event_generatecCs|j�|j�dd|��S)zuReturn a list of all virtual events or the information
        about the SEQUENCE bound to the virtual event VIRTUAL.r�r}r�)rer�rrr�
event_infoDs�zMisc.event_infocCs|j�|j�dd��S)z*Return a list of all existing image names.�image�namesr�r�rrr�image_namesLszMisc.image_namescCs|j�|j�dd��S)z?Return a list of all available image types (e.g. photo bitmap).r��typesr�r�rrr�image_typesPszMisc.image_types)N)r|)N)N)r|r�)r|)N)r)N)N)N)N)r)r)r)r)r)F)N)r)NNN)N)NNN)NNN)r)N)Nr)N)N)NNNN)NN)N)�rArBrCrk�_last_child_idsr�r�r�r�r�r�r�Zwaitvarr�r�r�r�r�r�r�r�rTr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr	rrrrrrrrrr�liftrr r"r'r)r+r,r-r.r2r4r5r6r7r8r9r:r<r>r?r@rCrDrErFrGrHrIrKrLrMrNrOrPrQrRrSrUrVrXrYr\r[r]r_r`rarbrcrdrer!rfrgrorprtrwrxryrzr�r{rBr}r~r��propertyr�r�r�r�r��registerrr�rrkrjr�r�r�r�r��configr��__getitem__r�rirFrjr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�msP
		


)

	
=
	


	r�c@s eZdZdZdd�Zdd�ZdS)r�zwInternal class. Stores function to call when some user
    defined Tcl function is called e.g. after an event occurred.cCs||_||_||_dS)z(Store FUNC, SUBST and WIDGET as members.N)r�r�r�)rer�r�r�rrrr�YszCallWrapper.__init__cGsLz|jr|j|�}|j|�WStk
r2�Yn|j��YnXdS)z3Apply first function SUBST to arguments, than FUNC.N)r�r�rxr�r��rer�rrrr�_s
zCallWrapper.__call__N�rArBrCrkr�r�rrrrr�Usr�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�XViewzXMix-in class for querying and changing the horizontal position
    of a widget's window.cGs(|jj|jdf|��}|s$|�|�SdS)z5Query and change the horizontal position of the view.�xviewN�r2r�r�r}�rer�rrrrr�oszXView.xviewcCs|j�|jdd|�dS)zsAdjusts the view in the window so that FRACTION of the
        total width of the canvas is off-screen to the left.r��movetoNr��re�fractionrrr�xview_movetouszXView.xview_movetocCs|j�|jdd||�dS)z\Shift the x-view according to NUMBER which is measured in "units"
        or "pages" (WHAT).r��scrollNr��rer1rqrrr�xview_scrollzszXView.xview_scrollN)rArBrCrkr�r�r�rrrrr�ksr�c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�YViewzVMix-in class for querying and changing the vertical position
    of a widget's window.cGs(|jj|jdf|��}|s$|�|�SdS)z3Query and change the vertical position of the view.�yviewNr�r�rrrr��szYView.yviewcCs|j�|jdd|�dS)zsAdjusts the view in the window so that FRACTION of the
        total height of the canvas is off-screen to the top.r�r�Nr�r�rrr�yview_moveto�szYView.yview_movetocCs|j�|jdd||�dS)z\Shift the y-view according to NUMBER which is measured in
        "units" or "pages" (WHAT).r�r�Nr�r�rrr�yview_scroll�szYView.yview_scrollN)rArBrCrkr�r�r�rrrrr��sr�c@s�eZdZdZdBdd�ZeZdd�ZeZdCdd�ZeZ	d	d
�Z
e
ZdDdd�ZeZ
d
d�ZeZdEdd�ZeZdd�ZeZdd�ZeZdFdd�ZeZdGdd�ZeZdHdd�ZeZdIdd�ZeZdd�ZeZdJdd �Z e Z!dKd!d"�Z"e"Z#dLd$d%�Z$e$Z%dMd&d'�Z&e&Z'dNd(d)�Z(e(Z)d*d+�Z*e*Z+dOd,d-�Z,e,Z-dPd.d/�Z.e.Z/dQd0d1�Z0e0Z1dRd2d3�Z2e2Z3dSd4d5�Z4e4Z5dTd6d7�Z6e6Z7dUd8d9�Z8e8Z9dVd:d;�Z:e:Z;dWd<d=�Z<e<Z=dXd>d?�Z>e>Z?d@dA�Z@e@ZAdS)Y�WmzAProvides functions for the communication with the window manager.NcCs |�|j�dd|j||||��S)z�Instruct the window manager to set the aspect ratio (width/height)
        of this widget to be between MINNUMER/MINDENOM and MAXNUMER/MAXDENOM. Return a tuple
        of the actual values if no argument is given.�wm�aspectrA)reZminNumerZminDenomZmaxNumerZmaxDenomrrr�	wm_aspect�s��zWm.wm_aspectcGsdd|jf|}|j�|�S)a�This subcommand returns or sets platform specific attributes

        The first form returns a list of the platform specific flags and
        their values. The second form returns the value for the specific
        option. The third form sets one or more of the values. The values
        are as follows:

        On Windows, -disabled gets or sets whether the window is in a
        disabled state. -toolwindow gets or sets the style of the window
        to toolwindow (as defined in the MSDN). -topmost gets or sets
        whether this is a topmost window (displays above all other
        windows).

        On Macintosh, XXXXX

        On Unix, there are currently no special attribute values.
        r��
attributes)r�r2r�r�rrr�
wm_attributes�szWm.wm_attributescCs|j�dd|j|�S)zVStore NAME in WM_CLIENT_MACHINE property of this widget. Return
        current value.r��clientr�r�rrr�	wm_client�szWm.wm_clientcsZt|�dkr|f}dd�jf|}|r4�j�|�n"�fdd��j��j�|��D�SdS)z�Store list of window names (WLIST) into WM_COLORMAPWINDOWS property
        of this widget. This list contains windows whose colormaps differ from their
        parents. Return current list of widgets if WLIST is empty.rr��colormapwindowscsg|]}��|��qSrr�r�r�rrr��s�z)Wm.wm_colormapwindows.<locals>.<listcomp>N)rr�r2r�r.)reZwlistr�rr�r�wm_colormapwindows�s
�zWm.wm_colormapwindowscCs|j�dd|j|�S)z�Store VALUE in WM_COMMAND property. It is the command
        which shall be used to invoke the application. Return current
        command if VALUE is None.r�rr�r�rrr�
wm_command�sz
Wm.wm_commandcCs|j�dd|j�S)z�Deiconify this widget. If it was never mapped it will not be mapped.
        On Windows it will raise this widget and give it the focus.r��	deiconifyr�r�rrr�wm_deiconify�szWm.wm_deiconifycCs|j�dd|j|�S)z�Set focus model to MODEL. "active" means that this widget will claim
        the focus itself, "passive" means that the window manager shall give
        the focus. Return current focus model if MODEL is None.r��
focusmodelr�)reZmodelrrr�
wm_focusmodel�szWm.wm_focusmodelcCs|j�dd|�dS)aAThe window will be unmapped from the screen and will no longer
        be managed by wm. toplevel windows will be treated like frame
        windows once they are no longer managed by wm, however, the menu
        option configuration will be remembered and the menus will return
        once the widget is managed again.r��forgetNr�r�rrr�	wm_forget�szWm.wm_forgetcCs|j�dd|j�S)zAReturn identifier for decorative frame of this widget if present.r��framer�r�rrr�wm_frame�szWm.wm_framecCs|j�dd|j|�S)ziSet geometry to NEWGEOMETRY of the form =widthxheight+x+y. Return
        current value if None is given.r�r3r�)reZnewGeometryrrr�wm_geometry�szWm.wm_geometrycCs |�|j�dd|j||||��S)aInstruct the window manager that this widget shall only be
        resized on grid boundaries. WIDTHINC and HEIGHTINC are the width and
        height of a grid unit in pixels. BASEWIDTH and BASEHEIGHT are the
        number of grid units requested in Tk_GeometryRequest.r�r�rA)reZ	baseWidthZ
baseHeightZwidthIncZ	heightIncrrr�wm_grids
�z
Wm.wm_gridcCs|j�dd|j|�S)z~Set the group leader widgets for related widgets to PATHNAME. Return
        the group leader of this widget if None is given.r��groupr��reZpathNamerrr�wm_group
szWm.wm_groupcCs2|r|j�dd|jd|�S|j�dd|j|�SdS)a�Set bitmap for the iconified widget to BITMAP. Return
        the bitmap if None is given.

        Under Windows, the DEFAULT parameter can be used to set the icon
        for the widget and any descendents that don't have an icon set
        explicitly.  DEFAULT can be the relative path to a .ico file
        (example: root.iconbitmap(default='myicon.ico') ).  See Tk
        documentation for more information.r��
iconbitmap�-defaultNr�)re�bitmap�defaultrrr�
wm_iconbitmaps	zWm.wm_iconbitmapcCs|j�dd|j�S)zDisplay widget as icon.r��iconifyr�r�rrr�
wm_iconify$sz
Wm.wm_iconifycCs|j�dd|j|�S)zVSet mask for the icon bitmap of this widget. Return the
        mask if None is given.r��iconmaskr�)rerrrr�wm_iconmask*szWm.wm_iconmaskcCs|j�dd|j|�S)zSSet the name of the icon for this widget. Return the name if
        None is given.r��iconnamer�)reZnewNamerrr�wm_iconname1szWm.wm_iconnameFcGs<|r |jjdd|jdf|��n|jjdd|jf|��dS)a�Sets the titlebar icon for this window based on the named photo
        images passed through args. If default is True, this is applied to
        all future created toplevels as well.

        The data in the images is taken as a snapshot at the time of
        invocation. If the images are later changed, this is not reflected
        to the titlebar icons. Multiple images are accepted to allow
        different images sizes to be provided. The window manager may scale
        provided icons to an appropriate size.

        On Windows, the images are packed into a Windows icon structure.
        This will override an icon specified to wm_iconbitmap, and vice
        versa.

        On X, the images are arranged into the _NET_WM_ICON X property,
        which most modern window managers support. An icon specified by
        wm_iconbitmap may exist simultaneously.

        On Macintosh, this currently does nothing.r��	iconphotorNr�)rerr�rrr�wm_iconphoto8szWm.wm_iconphotoc	Cs|�|j�dd|j||��S)z�Set the position of the icon of this widget to X and Y. Return
        a tuple of the current values of X and X if None is given.r��iconpositionrAr�rrr�wm_iconpositionSs
�zWm.wm_iconpositioncCs|j�dd|j|�S)zgSet widget PATHNAME to be displayed instead of icon. Return the current
        value if None is given.r��
iconwindowr�rrrr�
wm_iconwindow[szWm.wm_iconwindowcCs|j�dd|�dS)z�The widget specified will become a stand alone top-level window.
        The window will be decorated with the window managers title bar,
        etc.r��manageNr�)rer�rrr�	wm_managebszWm.wm_managec	Cs|�|j�dd|j||��S)z�Set max WIDTH and HEIGHT for this widget. If the window is gridded
        the values are given in grid units. Return the current values if None
        is given.r��maxsizerA�rerWrXrrr�
wm_maxsizejs
�z
Wm.wm_maxsizec	Cs|�|j�dd|j||��S)z�Set min WIDTH and HEIGHT for this widget. If the window is gridded
        the values are given in grid units. Return the current values if None
        is given.r��minsizerAr$rrr�
wm_minsizess
�z
Wm.wm_minsizecCs|�|j�dd|j|��S)z�Instruct the window manager to ignore this widget
        if BOOLEAN is given with 1. Return the current value if None
        is given.r��overrideredirect)r~r2r�r�r�rrr�wm_overrideredirect|s
�zWm.wm_overrideredirectcCs|j�dd|j|�S)z�Instruct the window manager that the position of this widget shall
        be defined by the user if WHO is "user", and by its own policy if WHO is
        "program".r��positionfromr��reZwhorrr�wm_positionfrom�szWm.wm_positionfromcCs.t|�r|�|�}n|}|j�dd|j||�S)z�Bind function FUNC to command NAME for this widget.
        Return the function bound to NAME if None is given. NAME could be
        e.g. "WM_SAVE_YOURSELF" or "WM_DELETE_WINDOW".r��protocol)r�r�r2r�r�)rerYr�rrrr�wm_protocol�s�zWm.wm_protocolcCs|j�dd|j||�S)zyInstruct the window manager whether this width can be resized
        in WIDTH or HEIGHT. Both values are boolean values.r��	resizabler�r$rrr�wm_resizable�szWm.wm_resizablecCs|j�dd|j|�S)z�Instruct the window manager that the size of this widget shall
        be defined by the user if WHO is "user", and by its own policy if WHO is
        "program".r��sizefromr�r+rrr�wm_sizefrom�szWm.wm_sizefromcCs|j�dd|j|�S)z�Query or set the state of this widget as one of normal, icon,
        iconic (see wm_iconwindow), withdrawn, or zoomed (Windows only).r�rNr�)reZnewstaterrr�wm_state�szWm.wm_statecCs|j�dd|j|�S)zSet the title of this widget.r��titler�r|rrr�wm_title�szWm.wm_titlecCs|j�dd|j|�S)z_Instruct the window manager that this widget is transient
        with regard to widget MASTER.r��	transientr�)rer�rrr�wm_transient�szWm.wm_transientcCs|j�dd|j�S)z�Withdraw this widget from the screen such that it is unmapped
        and forgotten by the window manager. Re-draw it with wm_deiconify.r��withdrawr�r�rrr�wm_withdraw�szWm.wm_withdraw)NNNN)N)N)N)N)NNNN)N)NN)N)N)F)NN)N)NN)NN)N)N)NN)NN)N)N)N)N)BrArBrCrkr�r�r�r�r�r�rrrrrrrrrrr
r	rr3rr�rr
rrrrrrrrrrrrr rr"r!r%r#r'r&r)r(r,r*r.r-r0r/r2r1r3rNr5r4r7r6r9r8rrrrr��s��





�

















r�c@sNeZdZdZdZddd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�ZdS)rozzToplevel widget of Tk which represents mostly the main window
    of an application. It has an associated Tcl interpreter.r�Nrrc

Cs�d|_i|_d|_d|_|dkrZddl}|j�tjd�}|j�	|�\}}|dkrZ||}d}	t
�||||	t|||�|_|r�|�
�tjjs�|�||�dS)a@Return a new Toplevel widget on screen SCREENNAME. A new Tcl interpreter will
        be created. BASENAME will be used for the identification of the profile file (see
        readprofile).
        It is constructed from sys.argv[0] without extensions if None is given. CLASSNAME
        is the name of the widget class.NFr)z.pyz.pyc)r�r#�	_tkloadedr2�os�path�basenamer��argv�splitextr��create�wantobjects�_loadtk�flags�ignore_environment�readprofile)
re�
screenName�baseNamer
�useTk�syncZuser;Zext�interactiverrrr��s zTk.__init__cCs|js|j��|��dSr�)r:r2�loadtkrBr�rrrrK�s
z	Tk.loadtkcCs�d|_|j�d�}|tjkr.tdtj|f��t|j�d��}|tjkrZtdtj|f��|jdkrjg|_|j�	dt
�|j�	dt�|j�d�|j�d�t
r�ts�|a|�d|j�dS)	NT�
tk_versionz4tk.h version (%s) doesn't match libtk.a version (%s)�tcl_versionz6tcl.h version (%s) doesn't match libtcl.a version (%s)Ztkerror�exit�WM_DELETE_WINDOW)r:r2r�r��
TK_VERSIONr/r�TCL_VERSIONr�r�rvrzrcrlrmr-r�)rerLrMrrrrB�s(
�
�
z
Tk._loadtkcCsJt|j���D]}|��q|j�d|j�t�|�trFt	|krFda	dS)zhDestroy this and all descendants widgets. This will
        end the application of this Tcl interpreter.r�N)
rr#�valuesr�r2r�r�r�rlrm�rer'rrrr�	s

z
Tk.destroyc
Cs�ddl}d|jkr|jd}n|j}|j�|d|�}|j�|d|�}|j�|d|�}|j�|d|�}d|i}	td|	�|j�|�r�|j�d|�|j�|�r�tt	|��
�|	�|j�|�r�|j�d|�|j�|�r�tt	|��
�|	�dS)	z�Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into
        the Tcl Interpreter and calls exec on the contents of BASENAME.py and
        CLASSNAME.py if such a file exists in the home directory.rN�HOMEz.%s.tclz.%s.pyrezfrom tkinter import *�source)r;�environ�curdirr<r�exec�isfiler2r��open�read)
rerGr
r;�homeZ	class_tclZclass_pyZbase_tclZbase_py�dirrrrrE	s$

zTk.readprofilecCs:ddl}tdtjd�|t_|t_|t_|�|||�dS)z�Report callback exception on sys.stderr.

        Applications may want to override this internal function, and
        should when sys.stderr is None.rNzException in Tkinter callback)�file)�	tracebackr$r��stderr�	last_type�
last_value�last_traceback�print_exception)rer�r�r�r_rrrr�$	szTk.report_callback_exceptioncCst|j|�S)z3Delegate attribute access to the interpreter object)r`r2)re�attrrrr�__getattr__0	szTk.__getattr__)NNrorrN)rArBrCrkr�r�rKrBr�rEr�rfrrrrro�s�

rocCst||||�Sr�)ro)rFrGr
rHrrr�TclC	srgc@sTeZdZdZifdd�ZeZZZdd�ZeZ	dd�Z
e
Zej
ZZ
ejZZdS)	�PackzQGeometry manager Pack.

    Base class to use the methods pack_* in every widget.cKs$|j�dd|jf|�||��dS)a(Pack a widget in the parent widget. Use as options:
        after=widget - pack it after you have packed widget
        anchor=NSEW (or subset) - position widget according to
                                  given direction
        before=widget - pack it before you will pack widget
        expand=bool - expand widget if parent size grows
        fill=NONE or X or Y or BOTH - fill widget if widget grows
        in=master - use master to contain this widget
        in_=master - see 'in' option description
        ipadx=amount - add internal padding in x direction
        ipady=amount - add internal padding in y direction
        padx=amount - add padding in x direction
        pady=amount - add padding in y direction
        side=TOP or BOTTOM or LEFT or RIGHT -  where to add this widget.
        r�r�N�r2r�r�r�r�rrr�pack_configureL	s


��zPack.pack_configurecCs|j�dd|j�dS)z:Unmap this widget and do not use it for the packing order.r�rNr�r�rrr�pack_forgetb	szPack.pack_forgetcCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)zEReturn information about the packing options
        for this widget.r�r}�in�r7r2r�r�r��re�drrr�	pack_infoh	szPack.pack_infoN)rArBrCrkrjr�r�r�rkrrpr}r�r�r�r�r�rrrrrhG	s
rhc@sJeZdZdZifdd�ZeZZZdd�ZeZ	dd�Z
e
Zej
ZZ
dS)	�PlacezSGeometry manager Place.

    Base class to use the methods place_* in every widget.cKs$|j�dd|jf|�||��dS)a Place a widget in the parent widget. Use as options:
        in=master - master relative to which the widget is placed
        in_=master - see 'in' option description
        x=amount - locate anchor of this widget at position x of master
        y=amount - locate anchor of this widget at position y of master
        relx=amount - locate anchor of this widget between 0.0 and 1.0
                      relative to width of master (1.0 is right edge)
        rely=amount - locate anchor of this widget between 0.0 and 1.0
                      relative to height of master (1.0 is bottom edge)
        anchor=NSEW (or subset) - position anchor according to given direction
        width=amount - width of this widget in pixel
        height=amount - height of this widget in pixel
        relwidth=amount - width of this widget between 0.0 and 1.0
                          relative to width of master (1.0 is the same width
                          as the master)
        relheight=amount - height of this widget between 0.0 and 1.0
                           relative to height of master (1.0 is the same
                           height as the master)
        bordermode="inside" or "outside" - whether to take border width of
                                           master widget into account
        r�r�Nrir�rrr�place_configurez	s


��zPlace.place_configurecCs|j�dd|j�dS)�Unmap this widget.r�rNr�r�rrr�place_forget�	szPlace.place_forgetcCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)zEReturn information about the placing options
        for this widget.r�r}rlrmrnrrr�
place_info�	szPlace.place_infoN)rArBrCrkrrr�r�r�rtrrur}r�r�r�rrrrrqu	srqc@s�eZdZdZifdd�ZeZZZej	Z
Z	ejZZdd�Z
e
Zdd�Zdd	�ZeZejZZejZZejZZejZZejZZd
S)�GridzQGeometry manager Grid.

    Base class to use the methods grid_* in every widget.cKs$|j�dd|jf|�||��dS)aPosition a widget in the parent widget in a grid. Use as options:
        column=number - use cell identified with given column (starting with 0)
        columnspan=number - this widget will span several columns
        in=master - use master to contain this widget
        in_=master - see 'in' option description
        ipadx=amount - add internal padding in x direction
        ipady=amount - add internal padding in y direction
        padx=amount - add padding in x direction
        pady=amount - add padding in y direction
        row=number - use cell identified with given row (starting with 0)
        rowspan=number - this widget will span several rows
        sticky=NSEW - if cell is larger on which sides will this
                      widget stick to the cell boundary
        r�r�Nrir�rrr�grid_configure�	s


��zGrid.grid_configurecCs|j�dd|j�dS)rsr�rNr�r�rrr�grid_forget�	szGrid.grid_forgetcCs|j�dd|j�dS)z0Unmap this widget but remember the grid options.r�r�Nr�r�rrr�grid_remove�	szGrid.grid_removecCs8t|j|j�dd|j��}d|kr4|�|d�|d<|S)zSReturn information about the options
        for positioning this widget in a grid.r�r}rlrmrnrrr�	grid_info�	szGrid.grid_infoN)rArBrCrkrwr�r�r�r�r�r�r�r�rxrryrzr}r�r�r�r�r�r�r�r�r�r�rrrrrv�	s





rvc@s:eZdZdZdd�Ziidfdd�Zdd�Zdd	d
�ZdS)
�
BaseWidgetzInternal class.cCs�|s
t�}||_|j|_d}d|kr2|d}|d=|s�|jj��}|jdkrRi|_|j�|d�d}||j|<|dkr�d|f}nd||f}||_|j	dkr�d||_	n|j	d||_	i|_
|j|jj
kr�|jj
|j��||jj
|j<dS)z6Internal function. Sets up information about children.NrYrrz!%sz!%s%dr�)rsr�r2r�rArr�r�r�r�r#r�)rer�r&rY�countrrr�_setup�	s2


zBaseWidget._setuprc	Cs�|rt||f�}||_t�|||�|jdkr4g|_dd�|��D�}|D]\}}||=qJ|j�||jf||�	|��|D]\}}|�
||�q~dS)zdConstruct a widget with the parent widget MASTER, a name WIDGETNAME
        and appropriate options.NcSs"g|]\}}t|t�r||f�qSr)rr rIrrrr�	
s
z'BaseWidget.__init__.<locals>.<listcomp>)r+�
widgetNamer{r}r�r%r2r�r�r�r�)	rer�r~r&r��extra�classesr)r*rrrr�
s
�zBaseWidget.__init__cCsTt|j���D]}|��q|j�d|j�|j|jjkrF|jj|j=t	�|�dS)z)Destroy this and all descendants widgets.r�N)
rr#rRr�r2r�r�r�r�r�rSrrrr�
s
zBaseWidget.destroycCs|j�|j|f|�Sr�r�)rerYr�rrr�_do
szBaseWidget._doN)r)rArBrCrkr}r�r�r�rrrrr{�	s
r{c@seZdZdZdS)�WidgetzxInternal class.

    Base class for a widget which can be positioned with the geometry managers
    Pack, Place or Grid.N)rArBrCrkrrrrr�
sr�c@seZdZdZdifdd�ZdS)�Toplevelz"Toplevel widget, e.g. for dialogs.Nc	Ks�|rt||f�}d}dD]L}||kr||}|ddkrJd|dd�}nd|}|||f}||=qt�||d|i|�|��}|�|���|�|���|�d|j�dS)	a%Construct a toplevel widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, class,
        colormap, container, cursor, height, highlightbackground,
        highlightcolor, highlightthickness, menu, relief, screen, takefocus,
        use, visual, width.r)rJ�class_r(rWZcolormapr�r�r-NrTrO)r+r{r�rrr4r-r�)	rer�r&r�rZwmkeyr��optrrrrrr�)
s zToplevel.__init__�rArBrCrkr�rrrrr�&
sr�c@s.eZdZdZdifdd�Zdd�Zdd�ZdS)	rDzButton widget.NcKst�||d||�dS)aUConstruct a button widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, activeforeground, anchor,
            background, bitmap, borderwidth, cursor,
            disabledforeground, font, foreground
            highlightbackground, highlightcolor,
            highlightthickness, image, justify,
            padx, pady, relief, repeatdelay,
            repeatinterval, takefocus, text,
            textvariable, underline, wraplength

        WIDGET-SPECIFIC OPTIONS

            command, compound, default, height,
            overrelief, state, width
        ZbuttonN�r�r��rer�r&r�rrrr�G
szButton.__init__cCs|j�|jd�dS)a_Flash the button.

        This is accomplished by redisplaying
        the button several times, alternating between active and
        normal colors. At the end of the flash the button is left
        in the same normal/active state as when the command was
        invoked. This command is ignored if the button's state is
        disabled.
        �flashNr�r�rrrr�\
s
zButton.flashcCs|j�|jd�S)aInvoke the command associated with the button.

        The return value is the return value from the command,
        or an empty string if there is no command associated with
        the button. This command is ignored if the button's state
        is disabled.
        �invoker�r�rrrr�h
sz
Button.invoke)rArBrCrkr�r�r�rrrrrDD
srDc@seZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zdwd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dxdd�Zdydd�Zdzdd�Zd{dd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!d?d@�Z"dAdB�Z#d|dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+dSdT�Z,dUdV�Z-d}dWdX�Z.e.Z/dYdZ�Z0e0Z1d[d\�Z2d~d^d_�Z3ifd`da�Z4dbdc�Z5e5Z6Z7ddde�Z8dfdg�Z9ddidj�Z:dkdl�Z;dmdn�Z<dodp�Z=dqdr�Z>dsdt�Z?dudv�Z@dS)��Canvasz?Canvas widget to display graphical elements like lines or text.NcKst�||d||�dS)aConstruct a canvas widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, closeenough,
        confine, cursor, height, highlightbackground, highlightcolor,
        highlightthickness, insertbackground, insertborderwidth,
        insertofftime, insertontime, insertwidth, offset, relief,
        scrollregion, selectbackground, selectborderwidth, selectforeground,
        state, takefocus, width, xscrollcommand, xscrollincrement,
        yscrollcommand, yscrollincrement.ZcanvasNr�r�rrrr�v
s
zCanvas.__init__cGs|j�|jdf|�dS)r�addtagNr�r�rrrr��
sz
Canvas.addtagcCs|�|d|�dS)z*Add tag NEWTAG to all items above TAGORID.�aboveN�r��re�newtag�tagOrIdrrr�addtag_above�
szCanvas.addtag_abovecCs|�|d�dS)zAdd tag NEWTAG to all items.ruNr�)rer�rrr�
addtag_all�
szCanvas.addtag_allcCs|�|d|�dS)z*Add tag NEWTAG to all items below TAGORID.�belowNr�r�rrr�addtag_below�
szCanvas.addtag_belowcCs|�|d||||�dS)z�Add tag NEWTAG to item which is closest to pixel at X, Y.
        If several match take the top-most.
        All items closer than HALO are considered overlapping (all are
        closests). If START is specified the next below this tag is taken.�closestNr�)rer�rUrV�halo�startrrr�addtag_closest�
szCanvas.addtag_closestcCs|�|d||||�dS)zLAdd tag NEWTAG to all items in the rectangle defined
        by X1,Y1,X2,Y2.�enclosedNr��rer��x1�y1�x2�y2rrr�addtag_enclosed�
szCanvas.addtag_enclosedcCs|�|d||||�dS)zWAdd tag NEWTAG to all items which overlap the rectangle
        defined by X1,Y1,X2,Y2.�overlappingNr�r�rrr�addtag_overlapping�
szCanvas.addtag_overlappingcCs|�|d|�dS)z)Add tag NEWTAG to all items with TAGORID.�withtagNr�r�rrr�addtag_withtag�
szCanvas.addtag_withtagcGs |�|j�|jdf|��pdS)z|Return a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
        which encloses all items with tags specified as arguments.r�NrAr�rrrr��
s
��zCanvas.bboxcCs(|j�|jd||d�|r$|�|�dS)zbUnbind for all items with TAGORID for event SEQUENCE  the
        function identified with FUNCID.rprZNrs)rer�rlrnrrr�
tag_unbind�
szCanvas.tag_unbindcCs|�|jd|f|||�S)a&Bind to all items with TAGORID at event SEQUENCE a call to function FUNC.

        An additional boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or whether it will
        replace the previous function. See bind for the return value.rprq)rer�rlr�r�rrr�tag_bind�
s
�zCanvas.tag_bindcCs|j�|j�|jd||��S)zrReturn the canvas x coordinate of pixel position SCREENX rounded
        to nearest multiple of GRIDSPACING units.�canvasxr/)reZscreenx�gridspacingrrrr��
s�zCanvas.canvasxcCs|j�|j�|jd||��S)zrReturn the canvas y coordinate of pixel position SCREENY rounded
        to nearest multiple of GRIDSPACING units.�canvasyr/)reZscreenyr�rrrr��
s�zCanvas.canvasycs,�fdd��j��j��jdf|��D�S)z8Return a list of coordinates for the item given in ARGS.csg|]}�j�|��qSr)r2r�r�r�rrr��
sz!Canvas.coords.<locals>.<listcomp>�coordsrhr�rr�rr��
s

��z
Canvas.coordsc	Cs\t|�}|d}t|ttf�r,|dd�}ni}|j�|jj|jd|f||�||����S)rr�Nr@)	rrrrr2r�r�r�r�)re�itemTyper�r�r&rrr�_create�
s��zCanvas._createcOs|�d||�S)z6Create arc shaped region with coordinates x1,y1,x2,y2.Zarc�r�r�rrr�
create_arc�
szCanvas.create_arccOs|�d||�S)z%Create bitmap with coordinates x1,y1.rr�r�rrr�
create_bitmap�
szCanvas.create_bitmapcOs|�d||�S)z)Create image item with coordinates x1,y1.r�r�r�rrr�create_image�
szCanvas.create_imagecOs|�d||�S)z-Create line with coordinates x1,y1,...,xn,yn.�liner�r�rrr�create_line�
szCanvas.create_linecOs|�d||�S)z)Create oval with coordinates x1,y1,x2,y2.Zovalr�r�rrr�create_oval�
szCanvas.create_ovalcOs|�d||�S)z0Create polygon with coordinates x1,y1,...,xn,yn.Zpolygonr�r�rrr�create_polygon�
szCanvas.create_polygoncOs|�d||�S)z.Create rectangle with coordinates x1,y1,x2,y2.Z	rectangler�r�rrr�create_rectangle�
szCanvas.create_rectanglecOs|�d||�S)z#Create text with coordinates x1,y1.�textr�r�rrr�create_text�
szCanvas.create_textcOs|�d||�S)z+Create window with coordinates x1,y1,x2,y2.r�r�r�rrr�
create_window�
szCanvas.create_windowcGs|j�|jdf|�dS)z�Delete characters of text items identified by tag or id in ARGS (possibly
        several times) from FIRST to LAST character (including).�dcharsNr�r�rrrr�sz
Canvas.dcharscGs|j�|jdf|�dS)z<Delete items identified by all tag or ids contained in ARGS.r�Nr�r�rrrr�sz
Canvas.deletecGs|j�|jdf|�dS)ziDelete tag or id given as last arguments in ARGS from items
        identified by first argument in ARGS.�dtagNr�r�rrrr�	szCanvas.dtagcGs |�|j�|jdf|��pdS)r�findrrAr�rrrr�s
��zCanvas.findcCs|�d|�S)zReturn items above TAGORID.r��r��rer�rrr�
find_aboveszCanvas.find_abovecCs
|�d�S)zReturn all items.rur�r�rrr�find_allszCanvas.find_allcCs|�d|�S)zReturn all items below TAGORID.r�r�r�rrr�
find_belowszCanvas.find_belowcCs|�d||||�S)z�Return item which is closest to pixel at X, Y.
        If several match take the top-most.
        All items closer than HALO are considered overlapping (all are
        closest). If START is specified the next below this tag is taken.r�r�)rerUrVr�r�rrr�find_closestszCanvas.find_closestcCs|�d||||�S)z=Return all items in rectangle defined
        by X1,Y1,X2,Y2.r�r��rer�r�r�r�rrr�
find_enclosed&szCanvas.find_enclosedcCs|�d||||�S)zLReturn all items which overlap the rectangle
        defined by X1,Y1,X2,Y2.r�r�r�rrr�find_overlapping+szCanvas.find_overlappingcCs|�d|�S)zReturn all items with TAGORID.r�r�r�rrr�find_withtag0szCanvas.find_withtagcGs|j�|jdf|�S)z.Set focus to the first item specified in ARGS.rTr�r�rrrrT4szCanvas.focuscGs|j�|j�|jdf|��S)z=Return tags associated with the first item specified in ARGS.�gettagsrhr�rrrr�8s�zCanvas.gettagscGs|j�|jdf|�dS)zdSet cursor at position POS in the item identified by TAGORID.
        In ARGS TAGORID must be first.�icursorNr�r�rrrr�=szCanvas.icursorcGs|j�|j�|jdf|��S)z?Return position of cursor as integer in item specified in ARGS.r�r!r�rrrr�BszCanvas.indexcGs|j�|jdf|�dS)zSInsert TEXT in item TAGORID at position POS. ARGS must
        be TAGORID POS TEXT.�insertNr�r�rrrr�Fsz
Canvas.insertcCs|j�|jdf|d|f�S)z9Return the resource value for an OPTION for item TAGORID.�itemcgetr-r�)rer�rrrrr�Ks�zCanvas.itemcgetcKs|�d|f||�S)z�Configure resources of an item TAGORID.

        The values for resources are specified as keyword
        arguments. To get an overview about
        the allowed keyword arguments call the method without arguments.
        �
itemconfigurer��rer�r&r�rrrr�PszCanvas.itemconfigurecGs|j�|jdf|�dS)zJLower an item TAGORID given in ARGS
        (optional below another item).rNr�r�rrr�	tag_lower_szCanvas.tag_lowercGs|j�|jdf|�dS)z#Move an item TAGORID given in ARGS.�moveNr�r�rrrr�fszCanvas.moverZcCs|j�|jd|||�dS)a}Move the items given by TAGORID in the canvas coordinate
        space so that the first coordinate pair of the bottommost
        item with tag TAGORID is located at position (X,Y).
        X and Y may be the empty string, in which case the
        corresponding coordinate will be unchanged. All items matching
        TAGORID remain in the same positions relative to each other.r�Nr�)rer�rUrVrrrr�jsz
Canvas.movetocKs|j�|jdf|�||��S)z�Print the contents of the canvas to a postscript
        file. Valid options: colormap, colormode, file, fontmap,
        height, pageanchor, pageheight, pagewidth, pagex, pagey,
        rotate, width, x, y.�
postscriptrir�rrrr�ss
�zCanvas.postscriptcGs|j�|jdf|�dS)zJRaise an item TAGORID given in ARGS
        (optional above another item).rNr�r�rrr�	tag_raise{szCanvas.tag_raisecGs|j�|jdf|�dS)z9Scale item TAGORID with XORIGIN, YORIGIN, XSCALE, YSCALE.�scaleNr�r�rrrr��szCanvas.scalecCs|j�|jdd||�dS�z&Remember the current X, Y coordinates.�scan�markNr�r�rrr�	scan_mark�szCanvas.scan_mark�
cCs|j�|jdd|||�dS)z�Adjust the view of the canvas to GAIN times the
        difference between X and Y and the coordinates given in
        scan_mark.r��dragtoNr�)rerUrVZgainrrr�scan_dragto�szCanvas.scan_dragtocCs|j�|jdd||�dS)zLAdjust the end of the selection near the cursor of an item TAGORID to index.�select�adjustNr��rer�r�rrr�
select_adjust�szCanvas.select_adjustcCs|j�|jdd�dS)�,Clear the selection if it is in this widget.r�r�Nr�r�rrr�select_clear�szCanvas.select_clearcCs|j�|jdd||�dS)z:Set the fixed end of a selection in item TAGORID to INDEX.r��fromNr�r�rrr�select_from�szCanvas.select_fromcCs|j�|jdd�pdS)z(Return the item which has the selection.r�rNr�r�rrr�select_item�szCanvas.select_itemcCs|j�|jdd||�dS)z=Set the variable end of a selection in item TAGORID to INDEX.r��toNr�r�rrr�	select_to�szCanvas.select_tocCs|j�|jd|�pdS)z$Return the type of the item TAGORID.r Nr�r�rrrr �szCanvas.type)NN)N)NNN)N)N)NN)N)rZrZ)r�)ArArBrCrkr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rTr�r�r�r�r�r��
itemconfigr�rr�r�r�r�r�rr�r�r�r�r�r�r�r�r rrrrr�s
sz


	



	
	
r�c@sFeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�Checkbuttonz7Checkbutton widget which is either in on- or off-state.NcKst�||d||�dS)aConstruct a checkbutton widget with the parent MASTER.

        Valid resource names: activebackground, activeforeground, anchor,
        background, bd, bg, bitmap, borderwidth, command, cursor,
        disabledforeground, fg, font, foreground, height,
        highlightbackground, highlightcolor, highlightthickness, image,
        indicatoron, justify, offvalue, onvalue, padx, pady, relief,
        selectcolor, selectimage, state, takefocus, text, textvariable,
        underline, variable, width, wraplength.�checkbuttonNr�r�rrrr��s
zCheckbutton.__init__cCs|j�|jd�dS�zPut the button in off-state.�deselectNr�r�rrrr��szCheckbutton.deselectcCs|j�|jd�dS�zFlash the button.r�Nr�r�rrrr��szCheckbutton.flashcCs|j�|jd�S�z<Toggle the button and invoke a command if given as resource.r�r�r�rrrr��szCheckbutton.invokecCs|j�|jd�dS�zPut the button in on-state.r�Nr�r�rrrr��szCheckbutton.selectcCs|j�|jd�dS)zToggle the button.�toggleNr�r�rrrr��szCheckbutton.toggle)
rArBrCrkr�r�r�r�r�r�rrrrr��sr�c@s�eZdZdZdifdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZeZ
dd�ZeZdd�ZeZdd�ZeZdd�ZeZdd�ZeZdS) �Entryz1Entry widget which allows displaying simple text.NcKst�||d||�dS)aConstruct an entry widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, cursor,
        exportselection, fg, font, foreground, highlightbackground,
        highlightcolor, highlightthickness, insertbackground,
        insertborderwidth, insertofftime, insertontime, insertwidth,
        invalidcommand, invcmd, justify, relief, selectbackground,
        selectborderwidth, selectforeground, show, state, takefocus,
        textvariable, validate, validatecommand, vcmd, width,
        xscrollcommand.�entryNr�r�rrrr��szEntry.__init__cCs|j�|jd||�dS)z.Delete text from FIRST to LAST (not included).r�Nr��re�firstZlastrrrr��szEntry.deletecCs|j�|jd�S)zReturn the text.r�r�r�rrrr��sz	Entry.getcCs|j�|jd|�dS)zInsert cursor at INDEX.r�Nr��rer�rrrr��sz
Entry.icursorcCs|j�|j�|jd|��S)zReturn position of cursor.r�r!r�rrrr��s
�zEntry.indexcCs|j�|jd||�dS)zInsert STRING at INDEX.r�Nr�)rer�r�rrrr��szEntry.insertcCs|j�|jdd|�dSr�r�r^rrrr��szEntry.scan_markcCs|j�|jdd|�dS)z�Adjust the view of the canvas to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark.r�r�Nr�r^rrrr��szEntry.scan_dragtocCs|j�|jdd|�dS)z9Adjust the end of the selection near the cursor to INDEX.r
r�Nr�r�rrr�selection_adjust�szEntry.selection_adjustcCs|j�|jdd�dS)r�r
r�Nr�r�rrrrszEntry.selection_clearcCs|j�|jdd|�dS)�*Set the fixed end of a selection to INDEX.r
r�Nr�r�rrr�selection_fromszEntry.selection_fromcCs|j�|j�|jdd��S)zSReturn True if there are characters selected in the entry, False
        otherwise.r
�presentr*r�rrr�selection_presents�zEntry.selection_presentcCs|j�|jdd||�dS)�3Set the selection from START to END (not included).r
�rangeNr��rer��endrrr�selection_rangeszEntry.selection_rangecCs|j�|jdd|�dS)�-Set the variable end of a selection to INDEX.r
r�Nr�r�rrr�selection_toszEntry.selection_to)N)rArBrCrkr�r�r�r�r�r�r�r�r�r�rr�r�r�r�Zselect_presentr�Zselect_ranger�r�rrrrr��s*
r�c@seZdZdZdifdd�ZdS)�FramezFFrame widget which may contain other widgets and can have a 3D border.NcKs^t||f�}d}d|kr,d|df}|d=nd|krFd|df}|d=t�||d|i|�dS)aConstruct a frame widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, class,
        colormap, container, cursor, height, highlightbackground,
        highlightcolor, highlightthickness, relief, takefocus, visual, width.rr�z-classr(r	N)r+r�r�)rer�r&r�rrrrr�&szFrame.__init__r�rrrrr�#sr�c@seZdZdZdifdd�ZdS)�Labelz0Label widget which can display text and bitmaps.NcKst�||d||�dS)a�Construct a label widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, activeforeground, anchor,
            background, bitmap, borderwidth, cursor,
            disabledforeground, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, image, justify,
            padx, pady, relief, takefocus, text,
            textvariable, underline, wraplength

        WIDGET-SPECIFIC OPTIONS

            height, state, width

        �labelNr�r�rrrr�:szLabel.__init__r�rrrrr�7sr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zd)dd�Zd*d
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZeZd+dd�ZeZdd �ZeZd,d!d"�ZeZd#d$�Zd%d&�Zd-d'd(�ZeZdS).�Listboxz3Listbox widget which can display a list of strings.NcKst�||d||�dS)a�Construct a listbox widget with the parent MASTER.

        Valid resource names: background, bd, bg, borderwidth, cursor,
        exportselection, fg, font, foreground, height, highlightbackground,
        highlightcolor, highlightthickness, relief, selectbackground,
        selectborderwidth, selectforeground, selectmode, setgrid, takefocus,
        width, xscrollcommand, yscrollcommand, listvariable.ZlistboxNr�r�rrrr�RszListbox.__init__cCs|j�|jd|�dS)z"Activate item identified by INDEX.�activateNr�r�rrrr\szListbox.activatecCs|�|j�|jd|��pdS)zxReturn a tuple of X1,Y1,X2,Y2 coordinates for a rectangle
        which encloses the item identified by the given index.r�NrAr�rrrr�`szListbox.bboxcCs|�|j�|jd��pdS)z.Return the indices of currently selected item.�curselectionrrAr�rrrreszListbox.curselectioncCs|j�|jd||�dS)z+Delete items from FIRST to LAST (included).r�Nr�r�rrrr�iszListbox.deletecCs:|dk	r$|j�|j�|jd||��S|j�|jd|�SdS)z0Get list of items from FIRST to LAST (included).Nr�rhr�rrrr�ms�zListbox.getcCs*|j�|jd|�}|dkrdS|j�|�S)z+Return index of item identified with INDEX.r�r�N�r2r�r�r��rer�rgrrrr�usz
Listbox.indexcGs|j�|jd|f|�dS)zInsert ELEMENTS at INDEX.r�Nr�)rer��elementsrrrr�{szListbox.insertcCs|j�|j�|jd|��S)z5Get index of item which is nearest to y coordinate Y.�nearestr!)rerVrrrrs
�zListbox.nearestcCs|j�|jdd||�dSr�r�r�rrrr��szListbox.scan_markcCs|j�|jdd||�dS)z�Adjust the view of the listbox to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark.r�r�Nr�r�rrrr��szListbox.scan_dragtocCs|j�|jd|�dS)z"Scroll such that INDEX is visible.�seeNr�r�rrrr�szListbox.seecCs|j�|jdd|�dS)z-Set the fixed end oft the selection to INDEX.r
r�Nr�r�rrr�selection_anchor�szListbox.selection_anchorcCs|j�|jdd||�dS)z2Clear the selection from FIRST to LAST (included).r
r�Nr�r�rrrr�s
�zListbox.selection_clearcCs|j�|j�|jdd|��S)z.Return True if INDEX is part of the selection.r
Zincludesr*r�rrr�selection_includes�s�zListbox.selection_includescCs|j�|jdd||�dS)ziSet the selection from FIRST to LAST (included) without
        changing the currently selected elements.r
r�Nr�r�rrr�
selection_set�szListbox.selection_setcCs|j�|j�|jd��S)z-Return the number of elements in the listbox.r�r!r�rrrr��szListbox.sizecCs|j�|jdf|d|f�S)z4Return the resource value for an ITEM and an OPTION.r�r-r��rer�rrrrr��s�zListbox.itemcgetcKs|�d|f||�S)a9Configure resources of an ITEM.

        The values for resources are specified as keyword arguments.
        To get an overview about the allowed keyword arguments
        call the method without arguments.
        Valid resource names: background, bg, foreground, fg,
        selectbackground, selectforeground.r�r�r�rrrr��szListbox.itemconfigure)N)N)N)N)N)rArBrCrkr�rr�rr�r�r�r�rr�r�rrZ
select_anchorrr�r	Zselect_includesr
Z
select_setr�r�r�r�rrrrrOs2






rc@seZdZdZdifdd�Zd6dd�Zdd	�Zifd
d�Zifdd
�Zifdd�Z	ifdd�Z
ifdd�Zifdd�Zifdd�Z
ifdd�Zifdd�Zifdd�Zifdd�Zifd d!�Zd7d"d#�Zd$d%�Zd8d&d'�ZeZd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�ZdS)9�MenuzPMenu widget which allows displaying menu bars, pull-down menus and pop-up menus.NcKst�||d||�dS)aAConstruct menu widget with the parent MASTER.

        Valid resource names: activebackground, activeborderwidth,
        activeforeground, background, bd, bg, borderwidth, cursor,
        disabledforeground, fg, font, foreground, postcommand, relief,
        selectcolor, takefocus, tearoff, tearoffcommand, title, type.�menuNr�r�rrrr��sz
Menu.__init__rZcCs|j�d|j|||�dS)z/Post the menu at position X,Y with entry ENTRY.�tk_popupNr�)rerUrVr�rrrr�sz
Menu.tk_popupcCs|j�|jd|�dS)zActivate entry at INDEX.rNr�r�rrrr�sz
Menu.activatecKs$|j�|jd|f|�||��dS)rr�Nri)rer�r&r�rrrr��s
�zMenu.addcKs|�d|p|�dS)zAdd hierarchical menu item.�cascadeN�r�r�rrr�add_cascade�szMenu.add_cascadecKs|�d|p|�dS)zAdd checkbutton menu item.r�Nrr�rrr�add_checkbutton�szMenu.add_checkbuttoncKs|�d|p|�dS)zAdd command menu item.rNrr�rrr�add_command�szMenu.add_commandcKs|�d|p|�dS)zAddd radio menu item.�radiobuttonNrr�rrr�add_radiobutton�szMenu.add_radiobuttoncKs|�d|p|�dS)zAdd separator.�	separatorNrr�rrr�
add_separator�szMenu.add_separatorcKs&|j�|jd||f|�||��dS)rr�Nri)rer�r�r&r�rrrr��s
�zMenu.insertcKs|�|d|p|�dS)z$Add hierarchical menu item at INDEX.rN�r�r�rrr�insert_cascade�szMenu.insert_cascadecKs|�|d|p|�dS)z#Add checkbutton menu item at INDEX.r�Nrr�rrr�insert_checkbutton�szMenu.insert_checkbuttoncKs|�|d|p|�dS)zAdd command menu item at INDEX.rNrr�rrr�insert_command�szMenu.insert_commandcKs|�|d|p|�dS)zAddd radio menu item at INDEX.rNrr�rrr�insert_radiobutton
szMenu.insert_radiobuttoncKs|�|d|p|�dS)zAdd separator at INDEX.rNrr�rrr�insert_separator
szMenu.insert_separatorcCs�|dkr|}|�|�|�|�}}|dks2|dkr:d\}}t||d�D]0}d|�|�krHt|�|d��}|rH|�|�qH|j�|jd||�dS)z7Delete menu items between INDEX1 and INDEX2 (included).N)rr�rrr�)	r�r��entryconfigr�	entrycgetr�r2r�r�)re�index1�index2Z
num_index1Z
num_index2rgr'rrrr�	
szMenu.deletecCs|j�|jd|d|�S)z=Return the resource value of a menu item for OPTION at INDEX.rr-r�rrrrr
szMenu.entrycgetcKs|�d|f||�S)zConfigure a menu item at INDEX.�entryconfigurer�r�rrrr"
szMenu.entryconfigurecCs*|j�|jd|�}|dkrdS|j�|�S)z4Return the index of a menu item identified by INDEX.r�r�Nrrrrrr�#
sz
Menu.indexcCs|j�|jd|�S)zRInvoke a menu item identified by INDEX and execute
        the associated command.r�r�r�rrrr�)
szMenu.invokecCs|j�|jd||�dS)zDisplay a menu at position X,Y.�postNr�r�rrrr#.
sz	Menu.postcCs|j�|jd|�S)z*Return the type of the menu item at INDEX.r r�r�rrrr 2
sz	Menu.typecCs|j�|jd�dS)z
Unmap a menu.�unpostNr�r�rrrr$6
szMenu.unpostcCs|j�|j�|jd|��S)zNReturn the x-position of the leftmost pixel of the menu item
        at INDEX.�	xpositionr!r�rrrr%:
szMenu.xpositioncCs|j�|j�|jd|��S)zEReturn the y-position of the topmost pixel of the menu item at INDEX.�	ypositionr!r�rrrr&?
s
�zMenu.yposition)rZ)N)N)rArBrCrkr�rrr�rrrrrr�rrrrrr�rr"rr�r�r#r r$r%r&rrrrr�s6	


rc@seZdZdZdifdd�ZdS)�
Menubuttonz(Menubutton widget, obsolete since Tk8.0.NcKst�||d||�dS)N�
menubuttonr�r�rrrr�H
szMenubutton.__init__r�rrrrr'E
sr'c@seZdZdZdifdd�ZdS)�MessagezKMessage widget to display multiline text. Obsolete since Label does it too.NcKst�||d||�dS)N�messager�r�rrrr�O
szMessage.__init__r�rrrrr)L
sr)c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�RadiobuttonzGRadiobutton widget which shows only one of several buttons in on-state.NcKst�||d||�dS)a�Construct a radiobutton widget with the parent MASTER.

        Valid resource names: activebackground, activeforeground, anchor,
        background, bd, bg, bitmap, borderwidth, command, cursor,
        disabledforeground, fg, font, foreground, height,
        highlightbackground, highlightcolor, highlightthickness, image,
        indicatoron, justify, padx, pady, relief, selectcolor, selectimage,
        state, takefocus, text, textvariable, underline, value, variable,
        width, wraplength.rNr�r�rrrr�V
s
zRadiobutton.__init__cCs|j�|jd�dSr�r�r�rrrr�b
szRadiobutton.deselectcCs|j�|jd�dSr�r�r�rrrr�g
szRadiobutton.flashcCs|j�|jd�Sr�r�r�rrrr�k
szRadiobutton.invokecCs|j�|jd�dSr�r�r�rrrr�o
szRadiobutton.select)	rArBrCrkr�r�r�r�r�rrrrr+S
sr+c@s@eZdZdZdifdd�Zdd�Zdd�Zd
d	d
�Zdd�ZdS)�Scalez1Scale widget which can display a numerical scale.NcKst�||d||�dS)a�Construct a scale widget with the parent MASTER.

        Valid resource names: activebackground, background, bigincrement, bd,
        bg, borderwidth, command, cursor, digits, fg, font, foreground, from,
        highlightbackground, highlightcolor, highlightthickness, label,
        length, orient, relief, repeatdelay, repeatinterval, resolution,
        showvalue, sliderlength, sliderrelief, state, takefocus,
        tickinterval, to, troughcolor, variable, width.r�Nr�r�rrrr�w
s	zScale.__init__c
CsJ|j�|jd�}z|j�|�WStttfk
rD|j�|�YSXdS)z*Get the current value as integer or float.r�N)r2r�r�r�rwr#r�r�r�rrrr��
s
z	Scale.getcCs|j�|jd|�dS)zSet the value to VALUE.r�Nr�r�rrrr��
sz	Scale.setcCs|�|j�|jd|��S)z�Return a tuple (X,Y) of the point along the centerline of the
        trough that corresponds to VALUE or the current value if None is
        given.r�rAr�rrrr��
szScale.coordscCs|j�|jd||�S)zcReturn where the point X,Y lies. Valid return values are "slider",
        "though1" and "though2".�identifyr�r�rrrr-�
szScale.identify)N)	rArBrCrkr�r�r�r�r-rrrrr,t
s
r,c@sPeZdZdZdifdd�Zddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�	Scrollbarz?Scrollbar widget which displays a slider at a certain position.NcKst�||d||�dS)alConstruct a scrollbar widget with the parent MASTER.

        Valid resource names: activebackground, activerelief,
        background, bd, bg, borderwidth, command, cursor,
        elementborderwidth, highlightbackground,
        highlightcolor, highlightthickness, jump, orient,
        relief, repeatdelay, repeatinterval, takefocus,
        troughcolor, width.Z	scrollbarNr�r�rrrr��
s	zScrollbar.__init__cCs|j�|jd|�pdS)a�Marks the element indicated by index as active.
        The only index values understood by this method are "arrow1",
        "slider", or "arrow2".  If any other value is specified then no
        element of the scrollbar will be active.  If index is not specified,
        the method returns the name of the element that is currently active,
        or None if no element is active.rNr�r�rrrr�
szScrollbar.activatecCs|j�|j�|jd||��S)znReturn the fractional change of the scrollbar setting if it
        would be moved by DELTAX or DELTAY pixels.rPr/)reZdeltaxZdeltayrrrrP�
s�zScrollbar.deltacCs|j�|j�|jd||��S)zRReturn the fractional value which corresponds to a slider
        position of X,Y.r�r/r�rrrr��
szScrollbar.fractioncCs|j�|jd||�S)zYReturn the element under position X,Y as one of
        "arrow1","slider","arrow2" or "".r-r�r�rrrr-�
szScrollbar.identifycCs|�|j�|jd��S)zZReturn the current fractional values (upper and lower end)
        of the slider position.r�)r}r2r�r�r�rrrr��
sz
Scrollbar.getcCs|j�|jd||�dS)ziSet the fractional values of the slider position (upper and
        lower ends as value between 0 and 1).r�Nr�r�rrrr��
sz
Scrollbar.set)N)rArBrCrkr�rrPr�r-r�r�rrrrr.�
s
	r.c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdkdd�Zdld
d�Z	dd�Z
dmdd�Zdd�Zdndd�Z
dd�Zdd�Zdd�Zdd�Zdodd �Zd!d"�Zdpd#d$�Zifd%d&�Zd'd(�Zd)d*�Zd+d,�Zdqd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zifd9d:�Zd;d<�Z d=d>�Z!d?d@�Z"dAdB�Z#drdCdD�Z$dEdF�Z%dGdH�Z&dsdIdJ�Z'dtdKdL�Z(dMdN�Z)dudOdP�Z*e*Z+dQdR�Z,dvdSdT�Z-dwdUdV�Z.dxdWdX�Z/dydYdZ�Z0dzd[d\�Z1d]d^�Z2d{d_d`�Z3dadb�Z4d|dcdd�Z5e5Z6ifdedf�Z7dgdh�Z8didj�Z9dS)}�Textz4Text widget which can display text in various forms.NcKst�||d||�dS)a�Construct a text widget with the parent MASTER.

        STANDARD OPTIONS

            background, borderwidth, cursor,
            exportselection, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, insertbackground,
            insertborderwidth, insertofftime,
            insertontime, insertwidth, padx, pady,
            relief, selectbackground,
            selectborderwidth, selectforeground,
            setgrid, takefocus,
            xscrollcommand, yscrollcommand,

        WIDGET-SPECIFIC OPTIONS

            autoseparators, height, maxundo,
            spacing1, spacing2, spacing3,
            state, tabs, undo, width, wrap,

        r�Nr�r�rrrr��
sz
Text.__init__cCs|�|j�|jd|��pdS)z�Return a tuple of (x,y,width,height) which gives the bounding
        box of the visible part of the character at the given index.r�NrAr�rrrr��
s
��z	Text.bboxc	Cs|j�|j�|jd|||��S)z�Return whether between index INDEX1 and index INDEX2 the
        relation OP is satisfied. OP is one of <, <=, ==, >=, >, or !=.�comparer*)rer �opr!rrrr0�
s�zText.comparecGsVdd�|D�}|||g7}|jj|jdf|��p2d}|dk	rNt|�dkrN|fS|SdS)a�Counts the number of relevant things between the two indices.
        If index1 is after index2, the result will be a negative number
        (and this holds for each of the possible options).

        The actual items which are counted depends on the options given by
        args. The result is a list of integers, one for the result of each
        counting option given. Valid counting options are "chars",
        "displaychars", "displayindices", "displaylines", "indices",
        "lines", "xpixels" and "ypixels". There is an additional possible
        option "update", which if given then all subsequent options ensure
        that any possible out of date information is recalculated.cSsg|]}|�d�sd|�qS)r-r�)�
startswith)rJ�argrrrr�s
zText.count.<locals>.<listcomp>r|N�)r2r�r�r)rer r!r�rrrrr|�
sz
Text.countcCs6|dkr |j�|j�|jd��S|j�|jd|�dS)zjTurn on the internal consistency checks of the B-Tree inside the text
        widget according to BOOLEAN.N�debugr*r�rrrr5	sz
Text.debugcCs|j�|jd||�dS)z?Delete the characters between INDEX1 and INDEX2 (not included).r�Nr��rer r!rrrr�szText.deletecCs|�|j�|jd|��S)z�Return tuple (x,y,width,height,baseline) giving the bounding box
        and baseline position of the visible part of the line containing
        the character at INDEX.�	dlineinforAr�rrrr7szText.dlineinfoc
	Ks�g}d}d}|s$g}|fdd�}|}zzt|t�s>|�|�}}|d|g7}|D]}	||	rN|�d|	�qN|�|�|r�|�|�|jj|jdf|��|W�S|r�|�|�XdS)a�Return the contents of the widget between index1 and index2.

        The type of contents returned in filtered based on the keyword
        parameters; if 'all', 'image', 'mark', 'tag', 'text', or 'window' are
        given and true, then the corresponding items are returned. The result
        is a list of triples of the form (key, value, index). If none of the
        keywords are true then 'all' is used by default.

        If the 'command' argument is given, it is called once for each element
        of the list of triples, with the values of each triple serving as the
        arguments to the function. In this case the list is not returned.NcSs|�|||f�dSr�)rc)r6r
r�r%rrr�
append_triple/sz Text.dump.<locals>.append_triplez-commandr-�dump)r�rrr�rcr2r�r�)
rer r!rr�r�Z	func_namer%r8r6rrrr9s*


z	Text.dumpcGs|jj|jdf|��S)arInternal method

        This method controls the undo mechanism and
        the modified flag. The exact behavior of the
        command depends on the option argument that
        follows the edit argument. The following forms
        of the command are currently supported:

        edit_modified, edit_redo, edit_reset, edit_separator
        and edit_undo

        �editr�r�rrrr:Bs
z	Text.editcCs|�d|�S)a;Get or Set the modified flag

        If arg is not specified, returns the modified
        flag of the widget. The insert, delete, edit undo and
        edit redo commands or the user can set or clear the
        modified flag. If boolean is specified, sets the
        modified flag of the widget to arg.
        Zmodified�r:)rer3rrr�
edit_modifiedQs	zText.edit_modifiedcCs
|�d�S)aRedo the last undone edit

        When the undo option is true, reapplies the last
        undone edits provided no other edits were done since
        then. Generates an error when the redo stack is empty.
        Does nothing when the undo option is false.
        Zredor;r�rrr�	edit_redo\szText.edit_redocCs
|�d�S)z(Clears the undo and redo stacks
        �resetr;r�rrr�
edit_resetfszText.edit_resetcCs
|�d�S)znInserts a separator (boundary) on the undo stack.

        Does nothing when the undo option is false
        rr;r�rrr�edit_separatorkszText.edit_separatorcCs
|�d�S)aDUndoes the last edit action

        If the undo option is true. An edit action is defined
        as all the insert and delete commands that are recorded
        on the undo stack in between two separators. Generates
        an error when the undo stack is empty. Does nothing
        when the undo option is false
        Zundor;r�rrr�	edit_undors	zText.edit_undocCs|j�|jd||�S)z5Return the text from INDEX1 to INDEX2 (not included).r�r�r6rrrr�}szText.getcCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)z9Return the value of OPTION of an embedded image at INDEX.Nrr-r�r�r�r�r�rrrr�
image_cget�s
zText.image_cgetcKs|�dd|f||�S)z%Configure an embedded image at INDEX.r�r�r�r�rrr�image_configure�szText.image_configurecKs"|jj|jdd|f|�||���S)z"Create an embedded image at INDEX.r�r@rir�rrr�image_create�s�
�zText.image_createcCs|j�|jdd�S)z3Return all names of embedded images in this widget.r�r�r�r�rrrr��szText.image_namescCst|j�|jd|��S)z1Return the index in the form line.char for INDEX.r�)rr2r�r�r�rrrr��sz
Text.indexcGs|j�|jd||f|�dS)z�Insert CHARS before the characters at INDEX. An additional
        tag can be given in ARGS. Additional CHARS and tags can follow in ARGS.r�Nr�)rer��charsr�rrrr��szText.insertcCs|j�|jdd||f�S)z�Change the gravity of a mark MARKNAME to DIRECTION (LEFT or RIGHT).
        Return the current value if None is given for DIRECTION.r�Zgravityr�)re�markName�	directionrrr�mark_gravity�s�zText.mark_gravitycCs|j�|j�|jdd��S)zReturn all mark names.r�r�rhr�rrr�
mark_names�s
�zText.mark_namescCs|j�|jdd||�dS)z0Set mark MARKNAME before the character at INDEX.r�r�Nr�)rerFr�rrr�mark_set�sz
Text.mark_setcGs|j�|jddf|�dS)zDelete all marks in MARKNAMES.r�ZunsetNr�)reZ	markNamesrrr�
mark_unset�szText.mark_unsetcCs|j�|jdd|�pdS)z-Return the name of the next mark after INDEX.r��nextNr�r�rrr�	mark_next�szText.mark_nextcCs|j�|jdd|�pdS)z2Return the name of the previous mark before INDEX.r�ZpreviousNr�r�rrr�
mark_previous�szText.mark_previouscKs&|jj|jdd|f|�||���dS)aCreates a peer text widget with the given newPathName, and any
        optional standard configuration options. By default the peer will
        have the same start and end line as the parent widget, but
        these can be overridden with the standard configuration options.�peerr@Nri)reZnewPathNamer&r�rrr�peer_create�s
�zText.peer_createcCs|j�|j�|jdd��S)zYReturns a list of peers of this widget (this does not include
        the widget itself).rOr�rhr�rrr�
peer_names�szText.peer_namescGs |jj|jd|||f|��dS)z�Replaces the range of characters between index1 and index2 with
        the given characters and tags specified by args.

        See the method insert for some more information about args, and the
        method delete for information about the indices.rNr�)rer r!rEr�rrrr�szText.replacecCs|j�|jdd||�dSr�r�r�rrrr��szText.scan_markcCs|j�|jdd||�dS)z~Adjust the view of the text to 10 times the
        difference between X and Y and the coordinates given in
        scan_mark.r�r�Nr�r�rrrr��szText.scan_dragtocCs�|jdg}|r|�d�|r&|�d�|r4|�d�|rB|�d�|rP|�d�|
r^|�d�|	rv|�d�|�|	�|r�|d	d
kr�|�d�|�|�|�|�|r�|�|�t|j�t|���S)z�Search PATTERN beginning from INDEX until STOPINDEX.
        Return the index of the first character of a match or an
        empty string.rz	-forwardsz
-backwardsz-exactz-regexpz-nocasez-elidez-countrr-r�)r�rcrr2r�r)rerr�Z	stopindexZforwardsZ	backwards�exactZregexpZnocaser|Zelider�rrrr�s.












zText.searchcCs|j�|jd|�dS)z3Scroll such that the character at INDEX is visible.rNr�r�rrrr�szText.seecGs |j�|jdd||f|�dS)z|Add tag TAGNAME to all characters between INDEX1 and index2 in ARGS.
        Additional pairs of indices may follow in ARGS.�tagr�Nr�)re�tagNamer r�rrr�tag_add�s�zText.tag_addcCs*|j�|jdd||d�|r&|�|�dS)zgUnbind for all characters with TAGNAME for event SEQUENCE  the
        function identified with FUNCID.rSrprZNrs)rerTrlrnrrrr��szText.tag_unbindcCs|�|jdd|f|||�S)a+Bind to all characters with TAGNAME at event SEQUENCE a call to function FUNC.

        An additional boolean parameter ADD specifies whether FUNC will be
        called additionally to the other bound function or whether it will
        replace the previous function. See bind for the return value.rSrprq)rerTrlr�r�rrrr�s
�z
Text.tag_bindcCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)z+Return the value of OPTION for tag TAGNAME.Nrr-r�r�rSr�r�)rerTrrrr�tag_cget	s
z
Text.tag_cgetcKs|�dd|f||�S)zConfigure a tag TAGNAME.rSr�r�)rerTr&r�rrr�
tag_configureszText.tag_configurecGs|j�|jddf|�dS)zDelete all tags in TAGNAMES.rSr�Nr�)reZtagNamesrrr�
tag_deleteszText.tag_deletecCs|j�|jdd||�dS)z`Change the priority of tag TAGNAME such that it is lower
        than the priority of BELOWTHIS.rSrNr�)rerTrrrrr�szText.tag_lowercCs|j�|j�|jdd|��S)zReturn a list of all tag names.rSr�rhr�rrr�	tag_names s�zText.tag_namesc
Cs |j�|j�|jdd|||��S)z�Return a list of start and end index for the first sequence of
        characters between INDEX1 and INDEX2 which all have tag TAGNAME.
        The text is searched forward from INDEX1.rSZ	nextrangerh�rerTr r!rrr�
tag_nextrange%s�zText.tag_nextrangec
Cs |j�|j�|jdd|||��S)z�Return a list of start and end index for the first sequence of
        characters between INDEX1 and INDEX2 which all have tag TAGNAME.
        The text is searched backwards from INDEX1.rSZ	prevrangerhrZrrr�
tag_prevrange,s�zText.tag_prevrangecCs|j�|jdd||�dS)zaChange the priority of tag TAGNAME such that it is higher
        than the priority of ABOVETHIS.rSrNr�)rerTrrrrr�3s�zText.tag_raisecCs|j�|j�|jdd|��S)z7Return a list of ranges of text which have tag TAGNAME.rSZrangesrh)rerTrrr�
tag_ranges9s�zText.tag_rangescCs|j�|jdd|||�dS)zARemove tag TAGNAME from all characters between INDEX1 and INDEX2.rSr�Nr�rZrrr�
tag_remove>s�zText.tag_removecCsJ|dd�dkrd|}|dd�dkr4|dd�}|j�|jdd||�S)z:Return the value of OPTION of an embedded window at INDEX.Nrr-r�r�r�r�r�rrrr�window_cgetCs
zText.window_cgetcKs|�dd|f||�S)z&Configure an embedded window at INDEX.r�r�r�r�rrr�window_configureKszText.window_configurecKs&|j�|jdd|f|�||��dS)zCreate a window at INDEX.r�r@Nrir�rrr�
window_createQs

��zText.window_createcCs|j�|j�|jdd��S)z4Return all names of embedded windows in this widget.r�r�rhr�rrr�window_namesWs�zText.window_namescGs|j�|jddf|�dS)zObsolete function, use see.r�z
-pickplaceNr�)rerqrrr�yview_pickplace\szText.yview_pickplace)N)N)NN)N)N)N)N)NNNNNNNN)N)N)N)N)N)N)N)N)N)N):rArBrCrkr�r�r0r|r5r�r7r9r:r<r=r?r@rAr�rBrCrDr�r�r�rHrIrJrKrMrNrPrQrr�r�rrrUr�r�rVrWZ
tag_configrXr�rYr[r\r�r]r^r_r`Z
window_configrarbrcrrrrr/�
s~


(




�


	







r/c@s"eZdZdZddd�Zdd�ZdS)�_setitz>Internal class. It wraps the command in the widget OptionMenu.NcCs||_||_||_dSr�)�
_setit__value�_setit__var�_setit__callback)re�varr
r�rrrr�dsz_setit.__init__cGs*|j�|j�|jr&|j|jf|��dSr�)rfr�rergr�rrrr�isz_setit.__call__)Nr�rrrrrdas
rdc@s(eZdZdZdd�Zdd�Zdd�ZdS)	�
OptionMenuz?OptionMenu which allows the user to select a value from a menu.c
Os�d|dtddd�}t�||d|�d|_t|ddd	�}|_|j|_|�d
�}d
|kr\|d
=|rtt	dt
t|����|j|t
|||�d�|D]}	|j|	t
||	|�d�q�||d<d
S)z�Construct an optionmenu widget with the parent MASTER, with
        the resource textvariable set to VARIABLE, the initially selected
        value VALUE, the other menu values VALUES and an additional
        keyword argument command.r,rr')ZborderwidthZtextvariableZindicatoronZreliefr�Zhighlightthicknessr(Z
tk_optionMenur
r)rYZtearoffrzunknown option -)r�rN)ZRAISEDr�r�r~r�_OptionMenu__menur�Zmenunamer�r�rLr0rrd)
rer�r�r
rR�kwargsr�r
r�r*rrrr�rs.�

�
�zOptionMenu.__init__cCs|dkr|jSt�||�S)Nr
)rjr�r�r�rrrr��szOptionMenu.__getitem__cCst�|�d|_dS)z,Destroy this widget and the associated menu.N)r'r�rjr�rrrr��s
zOptionMenu.destroyN)rArBrCrkr�r�r�rrrrriosric@sheZdZdZdZdidfdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
e
Zdd�Zdd�Z
dd�ZdS)�ImagezBase class for images.rNc	Ks�d|_|std�}t|d|�|_|s>tjd7_dtjf}|rT|rTt||f�}n|r\|}d}|��D]*\}}t|�r�|�	|�}|d||f}qh|j�
dd||f|�||_dS)	Nzcreate imager2rz	pyimage%rrr-r�r@)rYrsr`r2rl�_last_idr+r%r�r�r�)	reZimgtyperYr&r�r�r�r)r*rrrr��s$
zImage.__init__cCs|jSr�)rYr�rrrrF��z
Image.__str__cCs6|jr2z|j�dd|j�Wntk
r0YnXdS)Nr�r�)rYr2r�r�r�rrrr��s
z
Image.__del__cCs|j�|jdd||�dS�Nr�r-�r2r�rYr�rrrr��szImage.__setitem__cCs|j�|jdd|�Srorpr�rrrr��szImage.__getitem__cKsvd}t|���D]J\}}|dk	r|ddkr8|dd�}t|�rJ|�|�}|d||f}q|j�|jdf|�dS)zConfigure the image.rNr�r�r-r�)r+r%r�r�r2r�rY)rer�rr)r*rrrr��s
zImage.configurecCs|j�|j�dd|j��S)zReturn the height of the image.r�rX�r2r�r�rYr�rrrrX�s�zImage.heightcCs|j�dd|j�S)z7Return the type of the image, e.g. "photo" or "bitmap".r�r rpr�rrrr �sz
Image.typecCs|j�|j�dd|j��S)zReturn the width of the image.r�rWrqr�rrrrW�s�zImage.width)rArBrCrkrmr�rFr�r�r�r�r�rXr rWrrrrrl�srlc@s�eZdZdZdidfdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	ddd�Z
dd�Zddd�Zddd�Z
dd�Zdd�ZdS) �
PhotoImagez=Widget which can display images in PGM, PPM, GIF, PNG format.NcKstj|d|||f|�dS)ztCreate an image with NAME.

        Valid resource names: data, format, file, gamma, height, palette,
        width.ZphotoN�rlr��rerYr&r�r�rrrr��szPhotoImage.__init__cCs|j�|jd�dS)zDisplay a transparent image.�blankNrpr�rrrru�szPhotoImage.blankcCs|j�|jdd|�S)zReturn the value of OPTION.r�r-rp)rerrrrr��szPhotoImage.cgetcCs|j�|jdd|�S)Nr�r-rpr�rrrr��szPhotoImage.__getitem__cCs"t|jd�}|j�|d|j�|S)z;Return a new PhotoImage with the same image as this widget.r��copy�rrr2r�rY)re�	destImagerrrrv�szPhotoImage.copyrZcCs4t|jd�}|dkr|}|j�|d|jd||�|S)z�Return a new PhotoImage with the same image as this widget
        but zoom it with a factor of x in the X direction and y in the Y
        direction.  If y is not given, the default value is the same as x.
        r�rZrvz-zoomrw�rerUrVrxrrr�zoom�s
zPhotoImage.zoomcCs4t|jd�}|dkr|}|j�|d|jd||�|S)z�Return a new PhotoImage based on the same image as this widget
        but use only every Xth or Yth pixel.  If y is not given, the
        default value is the same as x.
        r�rZrvz
-subsamplerwryrrr�	subsample�s
zPhotoImage.subsamplecCs|j�|jd||�S)z8Return the color (red, green, blue) of the pixel at X,Y.r�rpr�rrrr�	szPhotoImage.getcCsH|jd|f}|r8|ddkr(|dd�}|dt|�}|j�|�dS)zzPut row formatted colors to image starting from
        position TO, e.g. image.put("{red green} {blue yellow}", to=(4,6))�putr�-torN)r}�rYrr2r�)rer�r�r�rrrr|
szPhotoImage.putcCs@|jd|f}|r|d|f}|r0|dt|�}|j�|�dS)zRWrite image to file FILENAME in FORMAT starting from
        position FROM_COORDS.�writez-format)z-fromNr~)re�filename�formatZfrom_coordsr�rrrrszPhotoImage.writec	Cs|j�|j�|jdd||��S)z/Return True if the pixel at x,y is transparent.�transparencyr�)r2r�r�rYr�rrr�transparency_get"s�zPhotoImage.transparency_getcCs|j�|jdd|||�dS)z)Set the transparency of the pixel at x,y.r�r�Nrp)rerUrVr�rrr�transparency_set'szPhotoImage.transparency_set)rZ)rZ)N)NN)rArBrCrkr�rur�r�rvrzr{r�r|rr�r�rrrrrr�s






rrc@s eZdZdZdidfdd�ZdS)�BitmapImagez.Widget which can display images in XBM format.NcKstj|d|||f|�dS)zqCreate a bitmap with NAME.

        Valid resource names: background, data, file, foreground, maskdata, maskfile.rNrsrtrrrr�/szBitmapImage.__init__r�rrrrr�,sr�cCstd�j}|�|�dd��S)Nzuse image_names()r�r��rsr2r.r��r2rrrr�6s
r�cCstd�j}|�|�dd��S)Nzuse image_types()r�r�r�r�rrrr�;s
r�c@s�eZdZdZdifdd�Zdd�Zd+dd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd,d!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�ZdS)-�Spinboxzspinbox widget.NcKst�||d||�dS)a�Construct a spinbox widget with the parent MASTER.

        STANDARD OPTIONS

            activebackground, background, borderwidth,
            cursor, exportselection, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, insertbackground,
            insertborderwidth, insertofftime,
            insertontime, insertwidth, justify, relief,
            repeatdelay, repeatinterval,
            selectbackground, selectborderwidth
            selectforeground, takefocus, textvariable
            xscrollcommand.

        WIDGET-SPECIFIC OPTIONS

            buttonbackground, buttoncursor,
            buttondownrelief, buttonuprelief,
            command, disabledbackground,
            disabledforeground, format, from,
            invalidcommand, increment,
            readonlybackground, state, to,
            validate, validatecommand values,
            width, wrap,
        ZspinboxNr�r�rrrr�CszSpinbox.__init__cCs|�|j�|jd|��pdS)a�Return a tuple of X1,Y1,X2,Y2 coordinates for a
        rectangle which encloses the character given by index.

        The first two elements of the list give the x and y
        coordinates of the upper-left corner of the screen
        area covered by the character (in pixels relative
        to the widget) and the last two elements give the
        width and height of the character, in pixels. The
        bounding box may refer to a region outside the
        visible area of the window.
        r�NrAr�rrrr�`szSpinbox.bboxcCs|j�|jd||�S)aWDelete one or more elements of the spinbox.

        First is the index of the first character to delete,
        and last is the index of the character just after
        the last one to delete. If last isn't specified it
        defaults to first+1, i.e. a single character is
        deleted.  This command returns an empty string.
        r�r�r�rrrr�ns	zSpinbox.deletecCs|j�|jd�S)zReturns the spinbox's stringr�r�r�rrrr�yszSpinbox.getcCs|j�|jd|�S)z�Alter the position of the insertion cursor.

        The insertion cursor will be displayed just before
        the character given by index. Returns an empty string
        r�r�r�rrrr�}szSpinbox.icursorcCs|j�|jd||�S)z{Returns the name of the widget at position x, y

        Return value is one of: none, buttondown, buttonup, entry
        r-r�r�rrrr-�szSpinbox.identifycCs|j�|jd|�S)z;Returns the numerical index corresponding to index
        r�r�r�rrrr��sz
Spinbox.indexcCs|j�|jd||�S)zDInsert string s at index

         Returns an empty string.
        r�r�)rer�rfrrrr��szSpinbox.insertcCs|j�|jd|�S)z�Causes the specified element to be invoked

        The element could be buttondown or buttonup
        triggering the action associated with it.
        r�r��re�elementrrrr��szSpinbox.invokecGs |�|j�|jdf|��pdS)rr�rrAr�rrrr��s
��zSpinbox.scancCs|�d|�S)z�Records x and the current view in the spinbox window;

        used in conjunction with later scan dragto commands.
        Typically this command is associated with a mouse button
        press in the widget. It returns an empty string.
        r��r�r^rrrr��szSpinbox.scan_markcCs|�d|�S)a�Compute the difference between the given x argument
        and the x argument to the last scan mark command

        It then adjusts the view left or right by 10 times the
        difference in x-coordinates. This command is typically
        associated with mouse motion events in the widget, to
        produce the effect of dragging the spinbox at high speed
        through the window. The return value is an empty string.
        r�r�r^rrrr��s
zSpinbox.scan_dragtocGs |�|j�|jdf|��pdS)rr
rrAr�rrrr
�s
��zSpinbox.selectioncCs|�d|�S)a�Locate the end of the selection nearest to the character
        given by index,

        Then adjust that end of the selection to be at index
        (i.e including but not going beyond index). The other
        end of the selection is made the anchor point for future
        select to commands. If the selection isn't currently in
        the spinbox, then a new selection is created to include
        the characters between index and the most recent selection
        anchor point, inclusive.
        r��r
r�rrrr��szSpinbox.selection_adjustcCs
|�d�S)zsClear the selection

        If the selection isn't in this widget then the
        command has no effect.
        r�r�r�rrrr�szSpinbox.selection_clearcCs|j�|jdd|�S)z�Sets or gets the currently selected element.

        If a spinbutton element is specified, it will be
        displayed depressed.
        r
r�r�r�rrr�selection_element�szSpinbox.selection_elementcCs|�d|�dS)r�r�Nr�r�rrrr��szSpinbox.selection_fromcCs|j�|j�|jdd��S)zUReturn True if there are characters selected in the spinbox, False
        otherwise.r
r�r*r�rrrr��s�zSpinbox.selection_presentcCs|�d||�dS)r�r�Nr�r�rrrr��szSpinbox.selection_rangecCs|�d|�dS)r�r�Nr�r�rrrr��szSpinbox.selection_to)N)N)rArBrCrkr�r�r�r�r�r-r�r�r�r�r�r�r
r�rr�r�r�r�r�rrrrr�@s*
	
r�c@seZdZdZdifdd�ZdS)�
LabelFramezlabelframe widget.NcKst�||d||�dS)a�Construct a labelframe widget with the parent MASTER.

        STANDARD OPTIONS

            borderwidth, cursor, font, foreground,
            highlightbackground, highlightcolor,
            highlightthickness, padx, pady, relief,
            takefocus, text

        WIDGET-SPECIFIC OPTIONS

            background, class, colormap, container,
            height, labelanchor, labelwidget,
            visual, width
        Z
labelframeNr�r�rrrr��szLabelFrame.__init__r�rrrrr��sr�c@s�eZdZdZdifdd�Zdd�Zdd�ZeZd	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd!dd�ZeZdd �ZdS)"�PanedWindowzpanedwindow widget.NcKst�||d||�dS)aTConstruct a panedwindow widget with the parent MASTER.

        STANDARD OPTIONS

            background, borderwidth, cursor, height,
            orient, relief, width

        WIDGET-SPECIFIC OPTIONS

            handlepad, handlesize, opaqueresize,
            sashcursor, sashpad, sashrelief,
            sashwidth, showhandle,
        ZpanedwindowNr�r�rrrr�
szPanedWindow.__init__cKs"|j�|jd|f|�|��dS)a+Add a child widget to the panedwindow in a new pane.

        The child argument is the name of the child widget
        followed by pairs of arguments that specify how to
        manage the windows. The possible options and values
        are the ones accepted by the paneconfigure method.
        r�Nri)rer&r�rrrr�szPanedWindow.addcCs|j�|jd|�dS)z�Remove the pane containing child from the panedwindow

        All geometry management options for child will be forgotten.
        rNr�)rer&rrrr�'szPanedWindow.removecCs|j�|jd||�S)a�Identify the panedwindow component at point x, y

        If the point is over a sash or a sash handle, the result
        is a two element list containing the index of the sash or
        handle, and a word indicating whether it is over a sash
        or a handle, such as {0 sash} or {2 handle}. If the point
        is over any other part of the panedwindow, the result is
        an empty list.
        r-r�r�rrrr-0s
zPanedWindow.identifycGs |�|j�|jdf|��pdS)r�proxyrrAr�rrrr�<s
��zPanedWindow.proxycCs
|�d�S)zBReturn the x and y pair of the most recent proxy location
        �coord�r�r�rrr�proxy_coordAszPanedWindow.proxy_coordcCs
|�d�S)z+Remove the proxy from the display.
        rr�r�rrr�proxy_forgetFszPanedWindow.proxy_forgetcCs|�d||�S)z:Place the proxy at the given x and y coordinates.
        r�r�r�rrr�proxy_placeKszPanedWindow.proxy_placecGs |�|j�|jdf|��pdS)r�sashrrAr�rrrr�Ps
��zPanedWindow.sashcCs|�d|�S)aAReturn the current x and y pair for the sash given by index.

        Index must be an integer between 0 and 1 less than the
        number of panes in the panedwindow. The coordinates given are
        those of the top left corner of the region containing the sash.
        pathName sash dragto index x y This command computes the
        difference between the given coordinates and the coordinates
        given to the last sash coord command for the given sash. It then
        moves that sash the computed difference. The return value is the
        empty string.
        r��r�r�rrr�
sash_coordUszPanedWindow.sash_coordcCs|�d|�S)zRecords x and y for the sash given by index;

        Used in conjunction with later dragto commands to move the sash.
        r�r�r�rrr�	sash_markcszPanedWindow.sash_markcCs|�d|||�S)z?Place the sash given by index at the given coordinates
        r�r�)rer�rUrVrrr�
sash_placejszPanedWindow.sash_placecCs|j�|jdf|d|f�S)zwQuery a management option for window.

        Option may be any value allowed by the paneconfigure subcommand
        �panecgetr-r�)rer&rrrrr�os�zPanedWindow.panecgetcKsd|dkr|s|�|jd|�St|t�r@|s@|�|jd|d|�S|j�|jd|f|�||��dS)a�
Query or modify the management options for window.

        If no option is specified, returns a list describing all
        of the available options for pathName.  If option is
        specified with no value, then the command returns a list
        describing the one named option (this list will be identical
        to the corresponding sublist of the value returned if no
        option is specified). If one or more option-value pairs are
        specified, then the command modifies the given widget
        option(s) to have the given value(s); in this case the
        command returns an empty string. The following options
        are supported:

        after window
            Insert the window after the window specified. window
            should be the name of a window already managed by pathName.
        before window
            Insert the window before the window specified. window
            should be the name of a window already managed by pathName.
        height size
            Specify a height for the window. The height will be the
            outer dimension of the window including its border, if
            any. If size is an empty string, or if -height is not
            specified, then the height requested internally by the
            window will be used initially; the height may later be
            adjusted by the movement of sashes in the panedwindow.
            Size may be any value accepted by Tk_GetPixels.
        minsize n
            Specifies that the size of the window cannot be made
            less than n. This constraint only affects the size of
            the widget in the paned dimension -- the x dimension
            for horizontal panedwindows, the y dimension for
            vertical panedwindows. May be any value accepted by
            Tk_GetPixels.
        padx n
            Specifies a non-negative value indicating how much
            extra space to leave on each side of the window in
            the X-direction. The value may have any of the forms
            accepted by Tk_GetPixels.
        pady n
            Specifies a non-negative value indicating how much
            extra space to leave on each side of the window in
            the Y-direction. The value may have any of the forms
            accepted by Tk_GetPixels.
        sticky style
            If a window's pane is larger than the requested
            dimensions of the window, this option may be used
            to position (or stretch) the window within its pane.
            Style is a string that contains zero or more of the
            characters n, s, e or w. The string can optionally
            contains spaces or commas, but they are ignored. Each
            letter refers to a side (north, south, east, or west)
            that the window will "stick" to. If both n and s
            (or e and w) are specified, the window will be
            stretched to fill the entire height (or width) of
            its cavity.
        width size
            Specify a width for the window. The width will be
            the outer dimension of the window including its
            border, if any. If size is an empty string, or
            if -width is not specified, then the width requested
            internally by the window will be used initially; the
            width may later be adjusted by the movement of sashes
            in the panedwindow. Size may be any value accepted by
            Tk_GetPixels.

        N�
paneconfigurer-)r�r�rrr�r2r�r�r�rrrr�wsD�
�zPanedWindow.paneconfigurecCs|j�|j�|jd��S)z+Returns an ordered list of the child panes.�panesrhr�rrrr��szPanedWindow.panes)N)rArBrCrkr�r�r�rr-r�r�r�r�r�r�r�r�r�r�Z
paneconfigr�rrrrr�
s$

Lr�cCs�t�}dt}|d7}t||d�}|��t|d|fdd�d�}|��||_t|d|jd�}|��|��|��|�	�|�
�dS)	NzThis is Tcl/Tk version %su
This should be a cedilla: ç�r�z	Click me!cSs|jjd|jdd�S)Nz[%s]r�r�)�testr�)rrrrr�<lambda>�s�z_test.<locals>.<lambda>)r�rZQUIT)ro�
TclVersionr�r�rDr�r�rr!rr�)rrr�r�r�r{rrr�_test�s 
�r��__main__)TN)N)r)r)NNror)Vrk�enumr�r�r�Ztkinter.constants�rerA�floatrPZ	TkVersionrQr�ZREADABLEZWRITABLEZ	EXCEPTION�compiler�ASCIIrr
rrr"r+r7r�Enumr8rGrlrmrnrsrvrzr�r{r�r�r�r�r�rar�r�r�r�r�r�r�r�rorgrhrqrvr{r�r�rDr�r�r�r�r�rrr'r)r+r,r.r/rdrirlrrr�r�r�r�r�r�r�rArrrr�<module>s� 





,R

	6

q2~
.37?/8$Vt!'2'BT
3C
PK�(�ZOU��)__pycache__/__main__.cpython-38.opt-2.pycnu�[���U

e5d��@s8ddlZejd�d�r"dejd<ddlmZe�dS)�Nz__main__.pyzpython -m tkinter�)�_test)�sys�argv�endswith�r�main�r	r	�(/usr/lib64/python3.8/tkinter/__main__.py�<module>s
PK�(�Z�p����commondialog.pynu�[���# base class for tk common dialogues
#
# this module provides a base class for accessing the common
# dialogues available in Tk 4.2 and newer.  use filedialog,
# colorchooser, and messagebox to access the individual
# dialogs.
#
# written by Fredrik Lundh, May 1997
#

from tkinter import *


class Dialog:

    command  = None

    def __init__(self, master=None, **options):
        if not master:
            master = options.get('parent')
        self.master = master
        self.options = options

    def _fixoptions(self):
        pass # hook

    def _fixresult(self, widget, result):
        return result # hook

    def show(self, **options):

        # update instance options
        for k, v in options.items():
            self.options[k] = v

        self._fixoptions()

        # we need a dummy widget to properly process the options
        # (at least as long as we use Tkinter 1.63)
        w = Frame(self.master)

        try:

            s = w.tk.call(self.command, *w._options(self.options))

            s = self._fixresult(w, s)

        finally:

            try:
                # get rid of the widget
                w.destroy()
            except:
                pass

        return s
PK�(�ZSs�-�,�,dnd.pynu�[���"""Drag-and-drop support for Tkinter.

This is very preliminary.  I currently only support dnd *within* one
application, between different windows (or within the same window).

I am trying to make this as generic as possible -- not dependent on
the use of a particular widget or icon type, etc.  I also hope that
this will work with Pmw.

To enable an object to be dragged, you must create an event binding
for it that starts the drag-and-drop process. Typically, you should
bind <ButtonPress> to a callback function that you write. The function
should call Tkdnd.dnd_start(source, event), where 'source' is the
object to be dragged, and 'event' is the event that invoked the call
(the argument to your callback function).  Even though this is a class
instantiation, the returned instance should not be stored -- it will
be kept alive automatically for the duration of the drag-and-drop.

When a drag-and-drop is already in process for the Tk interpreter, the
call is *ignored*; this normally averts starting multiple simultaneous
dnd processes, e.g. because different button callbacks all
dnd_start().

The object is *not* necessarily a widget -- it can be any
application-specific object that is meaningful to potential
drag-and-drop targets.

Potential drag-and-drop targets are discovered as follows.  Whenever
the mouse moves, and at the start and end of a drag-and-drop move, the
Tk widget directly under the mouse is inspected.  This is the target
widget (not to be confused with the target object, yet to be
determined).  If there is no target widget, there is no dnd target
object.  If there is a target widget, and it has an attribute
dnd_accept, this should be a function (or any callable object).  The
function is called as dnd_accept(source, event), where 'source' is the
object being dragged (the object passed to dnd_start() above), and
'event' is the most recent event object (generally a <Motion> event;
it can also be <ButtonPress> or <ButtonRelease>).  If the dnd_accept()
function returns something other than None, this is the new dnd target
object.  If dnd_accept() returns None, or if the target widget has no
dnd_accept attribute, the target widget's parent is considered as the
target widget, and the search for a target object is repeated from
there.  If necessary, the search is repeated all the way up to the
root widget.  If none of the target widgets can produce a target
object, there is no target object (the target object is None).

The target object thus produced, if any, is called the new target
object.  It is compared with the old target object (or None, if there
was no old target widget).  There are several cases ('source' is the
source object, and 'event' is the most recent event object):

- Both the old and new target objects are None.  Nothing happens.

- The old and new target objects are the same object.  Its method
dnd_motion(source, event) is called.

- The old target object was None, and the new target object is not
None.  The new target object's method dnd_enter(source, event) is
called.

- The new target object is None, and the old target object is not
None.  The old target object's method dnd_leave(source, event) is
called.

- The old and new target objects differ and neither is None.  The old
target object's method dnd_leave(source, event), and then the new
target object's method dnd_enter(source, event) is called.

Once this is done, the new target object replaces the old one, and the
Tk mainloop proceeds.  The return value of the methods mentioned above
is ignored; if they raise an exception, the normal exception handling
mechanisms take over.

The drag-and-drop processes can end in two ways: a final target object
is selected, or no final target object is selected.  When a final
target object is selected, it will always have been notified of the
potential drop by a call to its dnd_enter() method, as described
above, and possibly one or more calls to its dnd_motion() method; its
dnd_leave() method has not been called since the last call to
dnd_enter().  The target is notified of the drop by a call to its
method dnd_commit(source, event).

If no final target object is selected, and there was an old target
object, its dnd_leave(source, event) method is called to complete the
dnd sequence.

Finally, the source object is notified that the drag-and-drop process
is over, by a call to source.dnd_end(target, event), specifying either
the selected target object, or None if no target object was selected.
The source object can use this to implement the commit action; this is
sometimes simpler than to do it in the target's dnd_commit().  The
target's dnd_commit() method could then simply be aliased to
dnd_leave().

At any time during a dnd sequence, the application can cancel the
sequence by calling the cancel() method on the object returned by
dnd_start().  This will call dnd_leave() if a target is currently
active; it will never call dnd_commit().

"""


import tkinter


# The factory function

def dnd_start(source, event):
    h = DndHandler(source, event)
    if h.root:
        return h
    else:
        return None


# The class that does the work

class DndHandler:

    root = None

    def __init__(self, source, event):
        if event.num > 5:
            return
        root = event.widget._root()
        try:
            root.__dnd
            return # Don't start recursive dnd
        except AttributeError:
            root.__dnd = self
            self.root = root
        self.source = source
        self.target = None
        self.initial_button = button = event.num
        self.initial_widget = widget = event.widget
        self.release_pattern = "<B%d-ButtonRelease-%d>" % (button, button)
        self.save_cursor = widget['cursor'] or ""
        widget.bind(self.release_pattern, self.on_release)
        widget.bind("<Motion>", self.on_motion)
        widget['cursor'] = "hand2"

    def __del__(self):
        root = self.root
        self.root = None
        if root:
            try:
                del root.__dnd
            except AttributeError:
                pass

    def on_motion(self, event):
        x, y = event.x_root, event.y_root
        target_widget = self.initial_widget.winfo_containing(x, y)
        source = self.source
        new_target = None
        while target_widget:
            try:
                attr = target_widget.dnd_accept
            except AttributeError:
                pass
            else:
                new_target = attr(source, event)
                if new_target:
                    break
            target_widget = target_widget.master
        old_target = self.target
        if old_target is new_target:
            if old_target:
                old_target.dnd_motion(source, event)
        else:
            if old_target:
                self.target = None
                old_target.dnd_leave(source, event)
            if new_target:
                new_target.dnd_enter(source, event)
                self.target = new_target

    def on_release(self, event):
        self.finish(event, 1)

    def cancel(self, event=None):
        self.finish(event, 0)

    def finish(self, event, commit=0):
        target = self.target
        source = self.source
        widget = self.initial_widget
        root = self.root
        try:
            del root.__dnd
            self.initial_widget.unbind(self.release_pattern)
            self.initial_widget.unbind("<Motion>")
            widget['cursor'] = self.save_cursor
            self.target = self.source = self.initial_widget = self.root = None
            if target:
                if commit:
                    target.dnd_commit(source, event)
                else:
                    target.dnd_leave(source, event)
        finally:
            source.dnd_end(target, event)


# ----------------------------------------------------------------------
# The rest is here for testing and demonstration purposes only!

class Icon:

    def __init__(self, name):
        self.name = name
        self.canvas = self.label = self.id = None

    def attach(self, canvas, x=10, y=10):
        if canvas is self.canvas:
            self.canvas.coords(self.id, x, y)
            return
        if self.canvas:
            self.detach()
        if not canvas:
            return
        label = tkinter.Label(canvas, text=self.name,
                              borderwidth=2, relief="raised")
        id = canvas.create_window(x, y, window=label, anchor="nw")
        self.canvas = canvas
        self.label = label
        self.id = id
        label.bind("<ButtonPress>", self.press)

    def detach(self):
        canvas = self.canvas
        if not canvas:
            return
        id = self.id
        label = self.label
        self.canvas = self.label = self.id = None
        canvas.delete(id)
        label.destroy()

    def press(self, event):
        if dnd_start(self, event):
            # where the pointer is relative to the label widget:
            self.x_off = event.x
            self.y_off = event.y
            # where the widget is relative to the canvas:
            self.x_orig, self.y_orig = self.canvas.coords(self.id)

    def move(self, event):
        x, y = self.where(self.canvas, event)
        self.canvas.coords(self.id, x, y)

    def putback(self):
        self.canvas.coords(self.id, self.x_orig, self.y_orig)

    def where(self, canvas, event):
        # where the corner of the canvas is relative to the screen:
        x_org = canvas.winfo_rootx()
        y_org = canvas.winfo_rooty()
        # where the pointer is relative to the canvas widget:
        x = event.x_root - x_org
        y = event.y_root - y_org
        # compensate for initial pointer offset
        return x - self.x_off, y - self.y_off

    def dnd_end(self, target, event):
        pass


class Tester:

    def __init__(self, root):
        self.top = tkinter.Toplevel(root)
        self.canvas = tkinter.Canvas(self.top, width=100, height=100)
        self.canvas.pack(fill="both", expand=1)
        self.canvas.dnd_accept = self.dnd_accept

    def dnd_accept(self, source, event):
        return self

    def dnd_enter(self, source, event):
        self.canvas.focus_set() # Show highlight border
        x, y = source.where(self.canvas, event)
        x1, y1, x2, y2 = source.canvas.bbox(source.id)
        dx, dy = x2-x1, y2-y1
        self.dndid = self.canvas.create_rectangle(x, y, x+dx, y+dy)
        self.dnd_motion(source, event)

    def dnd_motion(self, source, event):
        x, y = source.where(self.canvas, event)
        x1, y1, x2, y2 = self.canvas.bbox(self.dndid)
        self.canvas.move(self.dndid, x-x1, y-y1)

    def dnd_leave(self, source, event):
        self.top.focus_set() # Hide highlight border
        self.canvas.delete(self.dndid)
        self.dndid = None

    def dnd_commit(self, source, event):
        self.dnd_leave(source, event)
        x, y = source.where(self.canvas, event)
        source.attach(self.canvas, x, y)


def test():
    root = tkinter.Tk()
    root.geometry("+1+1")
    tkinter.Button(command=root.quit, text="Quit").pack()
    t1 = Tester(root)
    t1.top.geometry("+1+60")
    t2 = Tester(root)
    t2.top.geometry("+120+60")
    t3 = Tester(root)
    t3.top.geometry("+240+60")
    i1 = Icon("ICON1")
    i2 = Icon("ICON2")
    i3 = Icon("ICON3")
    i1.attach(t1.canvas)
    i2.attach(t2.canvas)
    i3.attach(t3.canvas)
    root.mainloop()


if __name__ == '__main__':
    test()
PK�(�Zc����constants.pynu�[���# Symbolic constants for Tk

# Booleans
NO=FALSE=OFF=0
YES=TRUE=ON=1

# -anchor and -sticky
N='n'
S='s'
W='w'
E='e'
NW='nw'
SW='sw'
NE='ne'
SE='se'
NS='ns'
EW='ew'
NSEW='nsew'
CENTER='center'

# -fill
NONE='none'
X='x'
Y='y'
BOTH='both'

# -side
LEFT='left'
TOP='top'
RIGHT='right'
BOTTOM='bottom'

# -relief
RAISED='raised'
SUNKEN='sunken'
FLAT='flat'
RIDGE='ridge'
GROOVE='groove'
SOLID = 'solid'

# -orient
HORIZONTAL='horizontal'
VERTICAL='vertical'

# -tabs
NUMERIC='numeric'

# -wrap
CHAR='char'
WORD='word'

# -align
BASELINE='baseline'

# -bordermode
INSIDE='inside'
OUTSIDE='outside'

# Special tags, marks and insert positions
SEL='sel'
SEL_FIRST='sel.first'
SEL_LAST='sel.last'
END='end'
INSERT='insert'
CURRENT='current'
ANCHOR='anchor'
ALL='all' # e.g. Canvas.delete(ALL)

# Text widget and button states
NORMAL='normal'
DISABLED='disabled'
ACTIVE='active'
# Canvas state
HIDDEN='hidden'

# Menu item types
CASCADE='cascade'
CHECKBUTTON='checkbutton'
COMMAND='command'
RADIOBUTTON='radiobutton'
SEPARATOR='separator'

# Selection modes for list boxes
SINGLE='single'
BROWSE='browse'
MULTIPLE='multiple'
EXTENDED='extended'

# Activestyle for list boxes
# NONE='none' is also valid
DOTBOX='dotbox'
UNDERLINE='underline'

# Various canvas styles
PIESLICE='pieslice'
CHORD='chord'
ARC='arc'
FIRST='first'
LAST='last'
BUTT='butt'
PROJECTING='projecting'
ROUND='round'
BEVEL='bevel'
MITER='miter'

# Arguments to xview/yview
MOVETO='moveto'
SCROLL='scroll'
UNITS='units'
PAGES='pages'
PK�(�Z���scrolledtext.pynu�[���"""A ScrolledText widget feels like a text widget but also has a
vertical scroll bar on its right.  (Later, options may be added to
add a horizontal bar as well, to make the bars disappear
automatically when not needed, to move them to the other side of the
window, etc.)

Configuration options are passed to the Text widget.
A Frame widget is inserted between the master and the text, to hold
the Scrollbar widget.
Most methods calls are inherited from the Text widget; Pack, Grid and
Place methods are redirected to the Frame widget however.
"""

__all__ = ['ScrolledText']

from tkinter import Frame, Text, Scrollbar, Pack, Grid, Place
from tkinter.constants import RIGHT, LEFT, Y, BOTH


class ScrolledText(Text):
    def __init__(self, master=None, **kw):
        self.frame = Frame(master)
        self.vbar = Scrollbar(self.frame)
        self.vbar.pack(side=RIGHT, fill=Y)

        kw.update({'yscrollcommand': self.vbar.set})
        Text.__init__(self, self.frame, **kw)
        self.pack(side=LEFT, fill=BOTH, expand=True)
        self.vbar['command'] = self.yview

        # Copy geometry methods of self.frame without overriding Text
        # methods -- hack!
        text_meths = vars(Text).keys()
        methods = vars(Pack).keys() | vars(Grid).keys() | vars(Place).keys()
        methods = methods.difference(text_meths)

        for m in methods:
            if m[0] != '_' and m != 'config' and m != 'configure':
                setattr(self, m, getattr(self.frame, m))

    def __str__(self):
        return str(self.frame)


def example():
    from tkinter.constants import END

    stext = ScrolledText(bg='white', height=10)
    stext.insert(END, __doc__)
    stext.pack(fill=BOTH, side=LEFT, expand=True)
    stext.focus_set()
    stext.mainloop()


if __name__ == "__main__":
    example()
PK�(�Z�6;��	dialog.pynu�[���# dialog.py -- Tkinter interface to the tk_dialog script.

from tkinter import *
from tkinter import _cnfmerge

DIALOG_ICON = 'questhead'


class Dialog(Widget):
    def __init__(self, master=None, cnf={}, **kw):
        cnf = _cnfmerge((cnf, kw))
        self.widgetName = '__dialog__'
        Widget._setup(self, master, cnf)
        self.num = self.tk.getint(
                self.tk.call(
                      'tk_dialog', self._w,
                      cnf['title'], cnf['text'],
                      cnf['bitmap'], cnf['default'],
                      *cnf['strings']))
        try: Widget.destroy(self)
        except TclError: pass

    def destroy(self): pass


def _test():
    d = Dialog(None, {'title': 'File Modified',
                      'text':
                      'File "Python.h" has been modified'
                      ' since the last time it was saved.'
                      ' Do you want to save it before'
                      ' exiting the application.',
                      'bitmap': DIALOG_ICON,
                      'default': 0,
                      'strings': ('Save File',
                                  'Discard Changes',
                                  'Return to Editor')})
    print(d.num)


if __name__ == '__main__':
    t = Button(None, {'text': 'Test',
                      'command': _test,
                      Pack: {}})
    q = Button(None, {'text': 'Quit',
                      'command': t.quit,
                      Pack: {}})
    t.mainloop()
PK��Z�}N�

matt/pong-demo-1.pynu�[���from Tkinter import *

import string


class Pong(Frame):
    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)

        ## The playing field
        self.draw = Canvas(self, width="5i", height="5i")

        ## The speed control for the ball
        self.speed = Scale(self, orient=HORIZONTAL, label="ball speed",
                           from_=-100, to=100)

        self.speed.pack(side=BOTTOM, fill=X)

        # The ball
        self.ball = self.draw.create_oval("0i", "0i", "0.10i", "0.10i",
                                          fill="red")
        self.x = 0.05
        self.y = 0.05
        self.velocity_x = 0.3
        self.velocity_y = 0.5

        self.draw.pack(side=LEFT)

    def moveBall(self, *args):
        if (self.x > 5.0) or (self.x < 0.0):
            self.velocity_x = -1.0 * self.velocity_x
        if (self.y > 5.0) or (self.y < 0.0):
            self.velocity_y = -1.0 * self.velocity_y

        deltax = (self.velocity_x * self.speed.get() / 100.0)
        deltay = (self.velocity_y * self.speed.get() / 100.0)
        self.x = self.x + deltax
        self.y = self.y + deltay

        self.draw.move(self.ball,  "%ri" % deltax, "%ri" % deltay)
        self.after(10, self.moveBall)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()
        self.after(10, self.moveBall)


game = Pong()

game.mainloop()
PK��Z��>;��matt/packer-simple.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs|jdGHdS(Ntcommand(thi_there(tself((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pytprintitscCs�t|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�t|dd	�|_|jj�t|dd
�|_	|j	j�dS(NttexttQUITt
foregroundtredRtsidetfilltHellosbutton 2sbutton 3(
tButtontquitRtpacktLEFTtBOTHRRtguy2tguy3(R((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyt
createWidgetss
cCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyRs
N(t__name__t
__module__RRtNoneR(((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyRs		N(tTkinterRRttesttmainloop(((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyt<module>s
	PK��ZMh�Ω	�	matt/canvas-moving-w-mouse.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(cCs|j|_|j|_dS(N(txtlastxtytlasty(tselftevent((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt	mouseDown	scCsF|jjt|j|j|j|j�|j|_|j|_dS(N(tdrawtmovetCURRENTRRRR(RR((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt	mouseMoves*cCs|jjtdd�dS(Ntfilltred(R	t
itemconfigR(RR((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt
mouseEnterscCs|jjtdd�dS(NR
tblue(R	RR(RR((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt
mouseLeavesc	Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdt�|jjdddddd
dd�}|jj	|d|j
�|jj	|d|j�tj
|jd|j�tj
|jd|j�dS(NttexttQUITt
foregroundRtcommandtsideR
twidtht5itheightiitgreenttagstselecteds<Any-Enter>s<Any-Leave>s<1>s<B1-Motion>(tButtontquitRtpacktLEFTtBOTHtCanvasR	tcreate_ovalttag_bindRRtWidgettbindRR(Rtfred((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt
createWidgets!scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR)(Rtmaster((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyR+1s
N(	t__name__t
__module__RRRRR)tNoneR+(((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyRs						N(tTkinterR*Rttesttmainloop(((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt<module>s
1	PK��Z~����matt/00-HELLO-WORLD.pynu�[���from Tkinter import *

# note that there is no explicit call to start Tk.
# Tkinter is smart enough to start the system if it's not already going.

class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)

        self.QUIT.pack(side=LEFT, fill=BOTH)

        # a hello button
        self.hi_there = Button(self, text='Hello',
                               command=self.printit)
        self.hi_there.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z��)��matt/canvas-reading-tag-info.pynu�[���from Tkinter import *


class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)

        self.drawing = Canvas(self, width="5i", height="5i")

        # make a shape
        pgon = self.drawing.create_polygon(
            10, 10, 110, 10, 110, 110, 10 , 110,
            fill="red", tags=("weee", "foo", "groo"))

        # this is how you query an object for its attributes
        # config options FOR CANVAS ITEMS always come back in tuples of length 5.
        # 0 attribute name
        # 1 BLANK
        # 2 BLANK
        # 3 default value
        # 4 current value
        # the blank spots are for consistency with the config command that
        # is used for widgets. (remember, this is for ITEMS drawn
        # on a canvas widget, not widgets)
        option_value = self.drawing.itemconfig(pgon, "stipple")
        print "pgon's current stipple value is -->", option_value[4], "<--"
        option_value = self.drawing.itemconfig(pgon,  "fill")
        print "pgon's current fill value is -->", option_value[4], "<--"
        print "  when he is usually colored -->", option_value[3], "<--"

        ## here we print out all the tags associated with this object
        option_value = self.drawing.itemconfig(pgon,  "tags")
        print "pgon's tags are", option_value[4]

        self.drawing.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()

test.mainloop()
PK��Z�f� 44#matt/window-creation-w-location.pyonu�[����
��^c@sYddlTddlZdefd��YZdefd��YZe�Zej�dS(i����(t*Nt
QuitButtoncBseZd�ZRS(cOs\|jd�sd|d<n|jd�s;|j|d<nttj||f||�dS(NttexttQUITtcommand(thas_keytquittapplytButtont__init__(tselftmastertargstkwargs((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyR	s

(t__name__t
__module__R	(((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyR
stTestcBs&eZd�Zd�Zdd�ZRS(cGsgt�}t|dddd�|_|jjdddd�|jjdddd�|jj�dS(Ntwidtht2itheightt0(tTopleveltCanvastlabeltcreate_linetpack(R
Rtfred((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyt
makeWindows
	c
Csit|�|_|jjdtdt�t|ddddddd	|j�|_|jjdt�dS(
NtsidetfillRsMake a New WindowRi2RiR(RRRtLEFTtBOTHRR(R
((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(tFrameR	tPacktconfigR (R
R((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyR	's
N(RRRR tNoneR	(((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyRs			(tTkintertsysRRR!Rttesttmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyt<module>s

	PK��Z�		matt/canvas-gridding.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs8eZd�Zd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pytprintit	scCs{t|ddddddddd	|j�|_|jjd
tdt�t|dd
dd
�|_|jjd
t�dS(NttexttQUITt
backgroundtredt
foregroundtwhitetheightitcommandtsidetfilltwidtht5i(	tButtontquitRtpacktBOTTOMtBOTHtCanvastcanvasObjecttLEFT(R((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyt
createWidgetsscCs@|jj|j|j�|_|jj|j|j�|_dS(N(RtcanvasxtxtgriddingSizetstartxtcanvasytytstarty(Rtevent((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyt	mouseDownscCs�|jj|j|j�}|jj|j|j�}|j|jkr�|j|jkr�|jj|j	�|jj
|j|j||�|_	|j�ndS(N(RRRRRRRR tdeletet
rubberbandBoxtcreate_rectangletupdate_idletasks(RR!RR((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pytmouseMotions$	cCsotj||�tj|�|j�d|_d|_tj	|j
d|j�tj	|j
d|j�dS(Ni2s
<Button-1>s<Button1-Motion>(
tFramet__init__tPacktconfigRtNoneR$RtWidgettbindRR"R'(Rtmaster((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyR),s

		N(t__name__t
__module__RRR"R'R,R)(((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyRs
				N(tTkinterR(Rttesttmainloop(((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyt<module>s
3	PK��Zk�����matt/dialog-box.pyonu�[����
��^c@sGddlTddlmZdefd��YZe�Zej�dS(i����(t*(tDialogtTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pytprintitsc
Cs1t|ddddddddd	d�}|jS(
s�Create a top-level dialog with some buttons.

        This uses the Dialog class, which is a wrapper around the Tcl/Tk
        tk_dialog script.  The function returns 0 if the user clicks 'yes'
        or 1 if the user clicks 'no'.
        ttitlesfred the dialog boxttextsclick on a choicetbitmaptinfotdefaultitstringstyestno(RR
(Rtnum(Rtd((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyt
makeWindows	cCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NRtQUITt
foregroundtredtcommandtsidetfillsMake a New Window(tButtontquitRtpacktLEFTtBOTHRthi_there(R((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyt
createWidgets.scCs4tj||�tj|�d|_|j�dS(Ni(tFramet__init__tPacktconfigt	windownumR(Rtmaster((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyR9s
	N(t__name__t
__module__RRRtNoneR(((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyRs		#	N(tTkinterRRRttesttmainloop(((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyt<module>s
8	PK��Za>oQ��"matt/animation-w-velocity-ctrl.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pytprintit
sc	Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_t|dt	dd
dd�|_
|j
jdtdt�|jjdddddddd�|jjdt
�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheighttorienttfrom_i����ttoidii
ttagstthingtblue(tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawtScalet
HORIZONTALtspeedtXtcreate_rectangletLEFT(R((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyt
createWidgets
s!%cGsY|jj�}t|�d}d|f}|jjd||�|jd|j�dS(Ng@�@s%riRi
(RtgettfloatRtmovetaftert	moveThing(Rtargstvelocitytstr((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyR's

cCs>tj||�tj|�|j�|jd|j�dS(Ni
(tFramet__init__tPacktconfigR"R&R'(Rtmaster((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyR,#s

N(t__name__t
__module__RR"R'tNoneR,(((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyR	s			N(tTkinterR+Rttesttmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyt<module>s
!	PK��Z�]���!matt/animation-w-velocity-ctrl.pynu�[���from Tkinter import *

# this is the same as simple-demo-1.py, but uses
# subclassing.
# note that there is no explicit call to start Tk.
# Tkinter is smart enough to start the system if it's not already going.


class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)

        self.draw = Canvas(self, width="5i", height="5i")

        self.speed = Scale(self, orient=HORIZONTAL, from_=-100, to=100)

        self.speed.pack(side=BOTTOM, fill=X)

        # all of these work..
        self.draw.create_rectangle(0, 0, 10, 10, tags="thing", fill="blue")
        self.draw.pack(side=LEFT)

    def moveThing(self, *args):
        velocity = self.speed.get()
        str = float(velocity) / 1000.0
        str = "%ri" % (str,)
        self.draw.move("thing",  str, str)
        self.after(10, self.moveThing)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()
        self.after(10, self.moveThing)


test = Test()

test.mainloop()
PK��Z��Vkk"matt/menu-all-types-of-entries.pycnu�[����
��^c@sddlTd�Zd�Zd�Zdad�Zd�Zd�Zd	�Zd
�Z	d�Z
e�Ze
eded
d�Zejde�e�Ze�Ze�Ze	�Ze
�Zejeeeee�ejd�ejd�ej�dS(i����(t*cCs	dGHdS(Nsopening new file((((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytnew_file%scCs	dGHdS(Nsopening OLD file((((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pyt	open_file(scCs	dGHdS(Nspicked a menu item((((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytprint_something+sicCstadGtGHdS(Ns
anchovies?(t	anchovies(((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytprint_anchovies2scCs+ttdddd�}|jdtdd�t|�|_|jjdd	�|jjdd
t�|jjdddddt	�|jjdd
dddt
�|jjdddddddt�|jjdd�|jjd�|jjddddddddd|j
�|j|d<|S(NttextsSimple Button Commandst	underlineitsidetpadxt2mtlabeltUndotstatesNew...tcommandsOpen...sDifferent Fonttfonts&-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*tbitmaptinfot	separatortQuitt
backgroundtredtactivebackgroundtgreentmenu(t
MenubuttontmBartpacktLEFTtMenuRtadd_commandtentryconfigtDISABLEDRRRtaddtquit(tCommand_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeCommandMenu7s,	

cCs�ttdddd�}|jdtdd�t|�|_t|j�|j_t|jj�|jj_|jjjjdd	�|jjjjdd
�|jjjjdd�|jjjdd�|jjjdd
�|jjjdd�|jjjdd�|jjjdd�|jjjdd�|jjj	ddd|jjj�|jj	ddd|jj�|j|d<|S(NRsCascading MenusRiRR	R
Rtavacadosbelgian endivet	beefaronit	ChocolatetVanillatTuttiFruititWopBopaLoopBapABopBamBooms
Rocky Roadt	BubbleGums
Weird FlavorsRsmore choices(
RRRRRRtchoicest	weirdonesRtadd_cascade(tCascade_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeCascadeMenues*

cCs�ttdddd�}|jdtdd�t|�|_|jjdd	�|jjdd
�|jjdd�|jjddd
t�|jj|jj	d��|j|d<|S(NRsCheckbutton MenusRiRR	R
Rt	PepperonitSausagesExtra CheesetAnchovyRR(
RRRRRRtadd_checkbuttonRtinvoketindex(tCheckbutton_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeCheckbuttonMenu�s	
cCsttdddd�}|jdtdd�t|�|_|jjdd	�|jjdd
�|jjdd�|jjdd�|jjdd
�|jjdd�|jjdd�|jjdd�|jjdd�|jjdd�|j|d<|S(NRsRadiobutton MenusRiRR	R
Rt
RepublicantDemocrattLibertariantCommietFacistsLabor PartytTorietIndependentt	Anarchists
No OpinionR(RRRRRRtadd_radiobutton(tRadiobutton_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeRadiobuttonMenu�s 	
cCs<ttdddd�}|jdtdd�t|d<|S(	NRs	Dead MenuRiRR	R
R
(RRRRR (tDummy_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeDisabledMenu�s
trelieftborderwidthitfills	menu demoN(tTkinterRRRRRR$R0R8RCREtTktroottFrametRAISEDRRtXR#R/R7RBtNoMenut
tk_menuBarttitleticonnametmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pyt<module>s,
$					.	&	,								

PK��Zb*�//matt/window-creation-simple.pynu�[���from Tkinter import *

# this shows how to spawn off new windows at a button press

class Test(Frame):
    def printit(self):
        print "hi"

    def makeWindow(self):
        fred = Toplevel()
        fred.label = Label(fred, text="Here's a new window")
        fred.label.pack()

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)

        self.QUIT.pack(side=LEFT, fill=BOTH)

        # a hello button
        self.hi_there = Button(self, text='Make a New Window',
                               command=self.makeWindow)
        self.hi_there.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z;U<��"matt/subclass-existing-widgets.pyonu�[����
��^c@sJddlTdefd��YZd�Ze�Zee�ej�dS(i����(t*t
New_ButtoncBseZd�ZRS(cCs|jGH|jd|_dS(Ni(tcounter(tself((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pytcallbacks(t__name__t
__module__R(((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pyRscCs�t|�}|j�t|ddddd|j�|_|jjdtdt�t|dd�|_|jj	d|jj
�|jjdt�d	|j_dS(
NttexttQUITt
foregroundtredtcommandtsidetfilltHelloi+(tFrametpacktButtontquitRtLEFTtBOTHRthi_theretconfigRR(ttoptf((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pyt
createWidgetss
$N(tTkinterRRRtTktroottmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pyt<module>s

		
PK��Zb�r;	;	matt/canvas-with-scrollbars.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pytprintit	sc
Cs�t|dd�|_|jj�t|ddddddd|j�|_|jjd	td
t�t|dd�}|jd	t�t	|dd
dd
dddd�|_
t|dt�|j
_
t|dt�|j
_|j
j
j|j
d<|j
jj|j
d<|j
j|j
j
d<|j
j|j
jd<|j
jddddd
d�|j
jddddd
d�|j
j
jd	td
t�|j
jjd	td
t�|j
jd	t�dS(NttextsCan Find The BLUE Square??????tQUITt
backgroundtredtheightitcommandtsidetfills0.25itwidtht5itwhitetscrollregionit20itorienttxscrollcommandtyscrollcommands3.5itblackt10is13.5itblue(iiRR(tLabeltquestiontpacktButtontquitRtBOTTOMtBOTHtFrametCanvastdrawt	Scrollbart
HORIZONTALtscrollXtVERTICALtscrollYtsettxviewtyviewtcreate_rectangletXtRIGHTtYtLEFT(Rtspacer((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyt
createWidgetss*
cGsdG|GH|jjj�GHdS(Nt	scrolling(R!R$tget(Rtargs((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyt
scrollCanvasX0s	cCs+tj||�tj|�|j�dS(N(Rt__init__tPacktconfigR0(Rtmaster((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyR55s
N(t__name__t
__module__RR0R4tNoneR5(((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyRs		$	N(tTkinterRRttesttmainloop(((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyt<module>s
2	PK��Z;mDD matt/canvas-reading-tag-info.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pytprintitscCs!t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjddddddddddd
d�}|jj	|d�}dG|dGdGH|jj	|d�}dG|dGdGHdG|dGdGH|jj	|d
�}dG|dGH|jjdt
�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheighti
inttagstweeetfootgrootstipples#pgon's current stipple value is -->is<--s pgon's current fill value is -->s   when he is usually colored -->ispgon's tags are(RRR(tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawingtcreate_polygont
itemconfigtLEFT(Rtpgontoption_value((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyt
createWidgetss	
cCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR (Rtmaster((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyR"*s
N(t__name__t
__module__RR tNoneR"(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyRs		"N(tTkinterR!Rttesttmainloop(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyt<module>s
+	PK��Z�j�HHmatt/radiobutton-simple.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pytprintitsc
Csvt�|_|jjd�t|�|_|jj�t|jddd|jdddt�|j_|jjjdt	�t|jddd|jdd	dt�|j_
|jj
jdt	�t|jdd
d|jdddt�|j_|jjjdt	�t|d|j�|_
|j
jdt	�t|dd
ddd|j�|_|jjdtdt�dS(Nt	chocolatettextsChocolate FlavortvariabletvaluetanchortfillsStrawberry Flavort
strawberrysLemon FlavortlemonttextvariabletQUITt
foregroundtredtcommandtside(t	StringVartflavortsettFramet
radioframetpacktRadiobuttontWtchoctXtstrawRtEntrytentrytButtontquitRtBOTTOMtBOTH(R((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyt
createWidgetss0
cCs+tj||�tj|�|j�dS(N(Rt__init__tPacktconfigR$(Rtmaster((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyR%7s
N(t__name__t
__module__RR$tNoneR%(((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyR
s		&N(tTkinterRRttesttmainloop(((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyt<module>s
/	PK��Z��gmatt/00-HELLO-WORLD.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pytprintitscCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NttexttQUITt
foregroundtredtcommandtsidetfilltHello(tButtontquitRtpacktLEFTtBOTHRthi_there(R((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyt
createWidgets
scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyRs
N(t__name__t
__module__RRtNoneR(((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyRs		N(tTkinterRRttesttmainloop(((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyt<module>s
	PK��Z���ll#matt/packer-and-placer-together.pyonu�[����
��^c@seddlTd�Zd�Zd�Ze�Zee�Zejd�ejdd�ej	�dS(i����(t*cCs#tjjd|jd|j�dS(Ntxty(tapptbuttontplaceRR(tevent((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pyt	do_motionscCs	dGHdS(Nscalling me!((((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pytdothis
scCs�t|dddddd�}|jdtdd�t|d	d
ddd
t�|_|jjdddddt�|jdt	�|S(Ntwidthi�theightt
backgroundtgreentfilltexpandit
foregroundtredttexttamazingtcommandtrelxg�?trelygtanchors<Control-Shift-Motion>(
tFrametpacktBOTHtButtonRRRtNWtbindR(ttoptf((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pyt
createWidgets
s!t400x400i�N(
tTkinterRRRtTktrootRtgeometrytmaxsizetmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pyt<module>s
				
PK��Z�D66matt/placer-simple.pynu�[���from Tkinter import *

# This is a program that tests the placer geom manager

def do_motion(event):
    app.button.place(x=event.x, y=event.y)

def dothis():
    print 'calling me!'

def createWidgets(top):
    # make a frame. Note that the widget is 200 x 200
    # and the window containing is 400x400. We do this
    # simply to show that this is possible. The rest of the
    # area is inaccesssible.
    f = Frame(top, width=200, height=200, background='green')

    # place it so the upper left hand corner of
    # the frame is in the upper left corner of
    # the parent
    f.place(relx=0.0, rely=0.0)

    # now make a button
    f.button = Button(f, foreground='red', text='amazing', command=dothis)

    # and place it so that the nw corner is
    # 1/2 way along the top X edge of its' parent
    f.button.place(relx=0.5, rely=0.0, anchor=NW)

    # allow the user to move the button SUIT-style.
    f.bind('<Control-Shift-Motion>', do_motion)

    return f

root = Tk()
app = createWidgets(root)
root.geometry("400x400")
root.maxsize(1000, 1000)
root.mainloop()
PK��Z3��(jjmatt/window-creation-simple.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pytprintitscCs/t�}t|dd�|_|jj�dS(NttextsHere's a new window(tTopleveltLabeltlabeltpack(Rtfred((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyt
makeWindow	s	cCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NRtQUITt
foregroundtredtcommandtsidetfillsMake a New Window(tButtontquitRR	tLEFTtBOTHRthi_there(R((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyRs
N(t__name__t
__module__RRRtNoneR(((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyRs			N(tTkinterRRttesttmainloop(((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyt<module>s
	PK��Z���*hh#matt/entry-with-shared-variable.pycnu�[����
��^c@sSddlTddlZdefd��YZe�Zejjd�ej�dS(i����(t*NtAppcBs&eZdd�Zd�Zd�ZRS(cCs�tj||�|j�t|�|_|jj�t|ddd|j�|_|jj�t�|_	|j	j
d�|jjd|j	�|jjd|j
�dS(NttextsUppercase The Entrytcommandsthis is a variablettextvariables<Key-Return>(tFramet__init__tpacktEntrytentrythingytButtontuppertbuttont	StringVartcontentstsettconfigtbindtprint_contents(tselftmaster((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyRs


cCs,tj|jj��}|jj|�dS(N(tstringRRtgetR(Rtstr((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyR scCsdG|jj�GHdS(Ns"hi. contents of entry is now ---->(RR(Rtevent((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyR)sN(t__name__t
__module__tNoneRRR(((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyRs		tFoo(tTkinterRRRtrootRttitletmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyt<module>s

&	PK��Z�X
���"matt/packer-and-placer-together.pynu�[���from Tkinter import *

# This is a program that tests the placer geom manager in conjunction with
# the packer. The background (green) is packed, while the widget inside is placed


def do_motion(event):
    app.button.place(x=event.x, y=event.y)

def dothis():
    print 'calling me!'

def createWidgets(top):
    # make a frame. Note that the widget is 200 x 200
    # and the window containing is 400x400. We do this
    # simply to show that this is possible. The rest of the
    # area is inaccesssible.
    f = Frame(top, width=200, height=200, background='green')

    # note that we use a different manager here.
    # This way, the top level frame widget resizes when the
    # application window does.
    f.pack(fill=BOTH, expand=1)

    # now make a button
    f.button = Button(f, foreground='red', text='amazing', command=dothis)

    # and place it so that the nw corner is
    # 1/2 way along the top X edge of its' parent
    f.button.place(relx=0.5, rely=0.0, anchor=NW)

    # allow the user to move the button SUIT-style.
    f.bind('<Control-Shift-Motion>', do_motion)

    return f

root = Tk()
app = createWidgets(root)
root.geometry("400x400")
root.maxsize(1000, 1000)
root.mainloop()
PK��Z���*hh#matt/entry-with-shared-variable.pyonu�[����
��^c@sSddlTddlZdefd��YZe�Zejjd�ej�dS(i����(t*NtAppcBs&eZdd�Zd�Zd�ZRS(cCs�tj||�|j�t|�|_|jj�t|ddd|j�|_|jj�t�|_	|j	j
d�|jjd|j	�|jjd|j
�dS(NttextsUppercase The Entrytcommandsthis is a variablettextvariables<Key-Return>(tFramet__init__tpacktEntrytentrythingytButtontuppertbuttont	StringVartcontentstsettconfigtbindtprint_contents(tselftmaster((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyRs


cCs,tj|jj��}|jj|�dS(N(tstringRRtgetR(Rtstr((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyR scCsdG|jj�GHdS(Ns"hi. contents of entry is now ---->(RR(Rtevent((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyR)sN(t__name__t
__module__tNoneRRR(((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyRs		tFoo(tTkinterRRRtrootRttitletmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/entry-with-shared-variable.pyt<module>s

&	PK��Z��t44matt/entry-simple.pyonu�[����
��^c@sSddlTddlZdefd��YZe�Zejjd�ej�dS(i����(t*NtAppcBseZdd�Zd�ZRS(cCsMtj||�|j�t�|_|jj�|jjd|j�dS(Ns<Key-Return>(tFramet__init__tpacktEntrytentrythingytbindtprint_contents(tselftmaster((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyRs


cCsdG|jj�GHdS(Ns"hi. contents of entry is now ---->(Rtget(R	tevent((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyRsN(t__name__t
__module__tNoneRR(((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyRstFoo(tTkintertstringRRtrootR
ttitletmainloop(((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyt<module>s

	PK��Z��ZZ��matt/window-creation-more.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pytprintitscCsOt�}t|dd|jd|j�|_|jj�|jd|_dS(NttextsThis is window number %d.tcommandi(tTopleveltButtont	windownumt
makeWindowtlabeltpack(Rtfred((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyR

s		

cCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NRtQUITt
foregroundtredRtsidetfillsMake a New Window(RtquitRRtLEFTtBOTHR
thi_there(R((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyt
createWidgetsscCs4tj||�tj|�d|_|j�dS(Ni(tFramet__init__tPacktconfigR	R(Rtmaster((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyRs
	N(t__name__t
__module__RR
RtNoneR(((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyRs			
N(tTkinterRRttesttmainloop(((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyt<module>s
	PK��Z��gmatt/00-HELLO-WORLD.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pytprintitscCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NttexttQUITt
foregroundtredtcommandtsidetfilltHello(tButtontquitRtpacktLEFTtBOTHRthi_there(R((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyt
createWidgets
scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyRs
N(t__name__t
__module__RRtNoneR(((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyRs		N(tTkinterRRttesttmainloop(((s8/usr/lib64/python2.7/Demo/tkinter/matt/00-HELLO-WORLD.pyt<module>s
	PK��Z�3�--"matt/window-creation-w-location.pynu�[���from Tkinter import *

import sys
##sys.path.append("/users/mjc4y/projects/python/tkinter/utils")
##from TkinterUtils  import *

# this shows how to create a new window with a button in it that
# can create new windows

class QuitButton(Button):
    def __init__(self, master, *args, **kwargs):
        if not kwargs.has_key("text"):
            kwargs["text"] = "QUIT"
        if not kwargs.has_key("command"):
            kwargs["command"] = master.quit
        apply(Button.__init__, (self, master) + args, kwargs)

class Test(Frame):
    def makeWindow(self, *args):
        fred = Toplevel()

        fred.label = Canvas (fred, width="2i", height="2i")

        fred.label.create_line("0", "0", "2i", "2i")
        fred.label.create_line("0", "2i", "2i", "0")
        fred.label.pack()

        ##centerWindow(fred, self.master)

    def createWidgets(self):
        self.QUIT = QuitButton(self)
        self.QUIT.pack(side=LEFT, fill=BOTH)

        self.makeWindow = Button(self, text='Make a New Window',
                                 width=50, height=20,
                                 command=self.makeWindow)
        self.makeWindow.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z�P6��matt/slider-demo-1.pynu�[���from Tkinter import *

# shows how to make a slider, set and get its value under program control


class Test(Frame):
    def print_value(self, val):
        print "slider now at", val

    def reset(self):
        self.slider.set(0)

    def createWidgets(self):
        self.slider = Scale(self, from_=0, to=100,
                            orient=HORIZONTAL,
                            length="3i",
                            label="happy slider",
                            command=self.print_value)

        self.reset = Button(self, text='reset slider',
                            command=self.reset)

        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)

        self.slider.pack(side=LEFT)
        self.reset.pack(side=LEFT)
        self.QUIT.pack(side=LEFT, fill=BOTH)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z��Vkk"matt/menu-all-types-of-entries.pyonu�[����
��^c@sddlTd�Zd�Zd�Zdad�Zd�Zd�Zd	�Zd
�Z	d�Z
e�Ze
eded
d�Zejde�e�Ze�Ze�Ze	�Ze
�Zejeeeee�ejd�ejd�ej�dS(i����(t*cCs	dGHdS(Nsopening new file((((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytnew_file%scCs	dGHdS(Nsopening OLD file((((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pyt	open_file(scCs	dGHdS(Nspicked a menu item((((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytprint_something+sicCstadGtGHdS(Ns
anchovies?(t	anchovies(((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytprint_anchovies2scCs+ttdddd�}|jdtdd�t|�|_|jjdd	�|jjdd
t�|jjdddddt	�|jjdd
dddt
�|jjdddddddt�|jjdd�|jjd�|jjddddddddd|j
�|j|d<|S(NttextsSimple Button Commandst	underlineitsidetpadxt2mtlabeltUndotstatesNew...tcommandsOpen...sDifferent Fonttfonts&-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*tbitmaptinfot	separatortQuitt
backgroundtredtactivebackgroundtgreentmenu(t
MenubuttontmBartpacktLEFTtMenuRtadd_commandtentryconfigtDISABLEDRRRtaddtquit(tCommand_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeCommandMenu7s,	

cCs�ttdddd�}|jdtdd�t|�|_t|j�|j_t|jj�|jj_|jjjjdd	�|jjjjdd
�|jjjjdd�|jjjdd�|jjjdd
�|jjjdd�|jjjdd�|jjjdd�|jjjdd�|jjj	ddd|jjj�|jj	ddd|jj�|j|d<|S(NRsCascading MenusRiRR	R
Rtavacadosbelgian endivet	beefaronit	ChocolatetVanillatTuttiFruititWopBopaLoopBapABopBamBooms
Rocky Roadt	BubbleGums
Weird FlavorsRsmore choices(
RRRRRRtchoicest	weirdonesRtadd_cascade(tCascade_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeCascadeMenues*

cCs�ttdddd�}|jdtdd�t|�|_|jjdd	�|jjdd
�|jjdd�|jjddd
t�|jj|jj	d��|j|d<|S(NRsCheckbutton MenusRiRR	R
Rt	PepperonitSausagesExtra CheesetAnchovyRR(
RRRRRRtadd_checkbuttonRtinvoketindex(tCheckbutton_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeCheckbuttonMenu�s	
cCsttdddd�}|jdtdd�t|�|_|jjdd	�|jjdd
�|jjdd�|jjdd�|jjdd
�|jjdd�|jjdd�|jjdd�|jjdd�|jjdd�|j|d<|S(NRsRadiobutton MenusRiRR	R
Rt
RepublicantDemocrattLibertariantCommietFacistsLabor PartytTorietIndependentt	Anarchists
No OpinionR(RRRRRRtadd_radiobutton(tRadiobutton_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeRadiobuttonMenu�s 	
cCs<ttdddd�}|jdtdd�t|d<|S(	NRs	Dead MenuRiRR	R
R
(RRRRR (tDummy_button((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pytmakeDisabledMenu�s
trelieftborderwidthitfills	menu demoN(tTkinterRRRRRR$R0R8RCREtTktroottFrametRAISEDRRtXR#R/R7RBtNoMenut
tk_menuBarttitleticonnametmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/menu-all-types-of-entries.pyt<module>s,
$					.	&	,								

PK��Z�w�� matt/bind-w-mult-calls-p-type.pynu�[���from Tkinter import *
import string

# This program  shows how to use a simple type-in box

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

        self.entrythingy = Entry()
        self.entrythingy.pack()

        # and here we get a callback when the user hits return. we could
        # make the key that triggers the callback anything we wanted to.
        # other typical options might be <Key-Tab> or <Key> (for anything)
        self.entrythingy.bind('<Key-Return>', self.print_contents)

        # Note that here is where we bind a completely different callback to
        # the same event. We pass "+" here to indicate that we wish to ADD
        # this callback to the list associated with this event type.
        # Not specifying "+" would simply override whatever callback was
        # defined on this event.
        self.entrythingy.bind('<Key-Return>', self.print_something_else, "+")

    def print_contents(self, event):
        print "hi. contents of entry is now ---->", self.entrythingy.get()


    def print_something_else(self, event):
        print "hi. Now doing something completely different"


root = App()
root.master.title("Foo")
root.mainloop()



# secret tip for experts: if you pass *any* non-false value as
# the third parameter to bind(), Tkinter.py will accumulate
# callbacks instead of overwriting. I use "+" here because that's
# the Tk notation for getting this sort of behavior. The perfect GUI
# interface would use a less obscure notation.
PK��Z�Fֳ�matt/menu-simple.pynu�[���from Tkinter import *

# some vocabulary to keep from getting confused. This terminology
# is something I cooked up for this file, but follows the man pages
# pretty closely
#
#
#
#       This is a MENUBUTTON
#       V
# +-------------+
# |             |
#
# +------------++------------++------------+
# |            ||            ||            |
# |  File      ||  Edit      || Options    |   <-------- the MENUBAR
# |            ||            ||            |
# +------------++------------++------------+
# | New...         |
# | Open...        |
# | Print          |
# |                |  <------ This is a MENU. The lines of text in the menu are
# |                |                          MENU ENTRIES
# |                +---------------+
# | Open Files >   | file1         |
# |                | file2         |
# |                | another file  | <------ this cascading part is also a MENU
# +----------------|               |
#                  |               |
#                  |               |
#                  |               |
#                  +---------------+



def new_file():
    print "opening new file"


def open_file():
    print "opening OLD file"


def makeFileMenu():
    # make menu button : "File"
    File_button = Menubutton(mBar, text='File', underline=0)
    File_button.pack(side=LEFT, padx="1m")
    File_button.menu = Menu(File_button)

    # add an item. The first param is a menu entry type,
    # must be one of: "cascade", "checkbutton", "command", "radiobutton", "separator"
    # see menu-demo-2.py for examples of use
    File_button.menu.add_command(label='New...', underline=0,
                                 command=new_file)


    File_button.menu.add_command(label='Open...', underline=0,
                                 command=open_file)

    File_button.menu.add_command(label='Quit', underline=0,
                                 command='exit')

    # set up a pointer from the file menubutton back to the file menu
    File_button['menu'] = File_button.menu

    return File_button



def makeEditMenu():
    Edit_button = Menubutton(mBar, text='Edit', underline=0)
    Edit_button.pack(side=LEFT, padx="1m")
    Edit_button.menu = Menu(Edit_button)

    # just to be cute, let's disable the undo option:
    Edit_button.menu.add('command', label="Undo")
    # Since the tear-off bar is the 0th entry,
    # undo is the 1st entry...
    Edit_button.menu.entryconfig(1, state=DISABLED)

    # and these are just for show. No "command" callbacks attached.
    Edit_button.menu.add_command(label="Cut")
    Edit_button.menu.add_command(label="Copy")
    Edit_button.menu.add_command(label="Paste")

    # set up a pointer from the file menubutton back to the file menu
    Edit_button['menu'] = Edit_button.menu

    return Edit_button


#################################################

#### Main starts here ...
root = Tk()


# make a menu bar
mBar = Frame(root, relief=RAISED, borderwidth=2)
mBar.pack(fill=X)

File_button = makeFileMenu()
Edit_button = makeEditMenu()

# finally, install the buttons in the menu bar.
# This allows for scanning from one menubutton to the next.
mBar.tk_menuBar(File_button, Edit_button)

root.title('menu demo')
root.iconname('packer')

root.mainloop()
PK��Z�F�77#matt/not-what-you-might-think-2.pycnu�[����
��^c@sWddlTdefd��YZe�Zejjd�ejjd�ej�dS(i����(t*tTestcBseZd�Zdd�ZRS(cCs�t|dddddd�|_|jjd�|jjdt�t|jdd	d
dd|j�|j_|jjjdt�dS(
Ntwidtht1itheightt
backgroundtgreenitsidettexttQUITt
foregroundtredtcommand(tFrametGpanelt	propagatetpacktLEFTtButtontquitR	(tself((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(R
t__init__tPacktconfigR(Rtmaster((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyRs
N(t__name__t
__module__RtNoneR(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyRs	spacker demotpackerN(tTkinterR
RttestRttitleticonnametmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyt<module>s

	PK��Z���ll#matt/packer-and-placer-together.pycnu�[����
��^c@seddlTd�Zd�Zd�Ze�Zee�Zejd�ejdd�ej	�dS(i����(t*cCs#tjjd|jd|j�dS(Ntxty(tapptbuttontplaceRR(tevent((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pyt	do_motionscCs	dGHdS(Nscalling me!((((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pytdothis
scCs�t|dddddd�}|jdtdd�t|d	d
ddd
t�|_|jjdddddt�|jdt	�|S(Ntwidthi�theightt
backgroundtgreentfilltexpandit
foregroundtredttexttamazingtcommandtrelxg�?trelygtanchors<Control-Shift-Motion>(
tFrametpacktBOTHtButtonRRRtNWtbindR(ttoptf((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pyt
createWidgets
s!t400x400i�N(
tTkinterRRRtTktrootRtgeometrytmaxsizetmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/packer-and-placer-together.pyt<module>s
				
PK��Z��>;��matt/packer-simple.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs|jdGHdS(Ntcommand(thi_there(tself((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pytprintitscCs�t|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�t|dd	�|_|jj�t|dd
�|_	|j	j�dS(NttexttQUITt
foregroundtredRtsidetfilltHellosbutton 2sbutton 3(
tButtontquitRtpacktLEFTtBOTHRRtguy2tguy3(R((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyt
createWidgetss
cCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyRs
N(t__name__t
__module__RRtNoneR(((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyRs		N(tTkinterRRttesttmainloop(((s7/usr/lib64/python2.7/Demo/tkinter/matt/packer-simple.pyt<module>s
	PK��Z�� �yy!matt/bind-w-mult-calls-p-type.pyonu�[����
��^c@sSddlTddlZdefd��YZe�Zejjd�ej�dS(i����(t*NtAppcBs&eZdd�Zd�Zd�ZRS(cCsftj||�|j�t�|_|jj�|jjd|j�|jjd|jd�dS(Ns<Key-Return>t+(tFramet__init__tpacktEntrytentrythingytbindtprint_contentstprint_something_else(tselftmaster((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyRs

cCsdG|jj�GHdS(Ns"hi. contents of entry is now ---->(Rtget(Rtevent((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyR	scCs	dGHdS(Ns,hi. Now doing something completely different((RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyR
sN(t__name__t
__module__tNoneRR	R
(((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyRs	tFoo(tTkintertstringRRtrootRttitletmainloop(((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyt<module>s

	PK��Zʥ�E��"matt/not-what-you-might-think-1.pynu�[���from Tkinter import *


class Test(Frame):
    def createWidgets(self):

        self.Gpanel = Frame(self, width='1i', height='1i',
                            background='green')
        self.Gpanel.pack(side=LEFT)

        # a QUIT button
        self.Gpanel.QUIT = Button(self.Gpanel, text='QUIT',
                                  foreground='red',
                                  command=self.quit)
        self.Gpanel.QUIT.pack(side=LEFT)


    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()

test.master.title('packer demo')
test.master.iconname('packer')

test.mainloop()
PK��Zv��	
	
matt/rubber-band-box-demo-1.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pytprintitscCs{t|ddddddddd	|j�|_|jjd
tdt�t|dd
dd
�|_|jjd
t�dS(NttexttQUITt
backgroundtredt
foregroundtwhitetheightitcommandtsidetfilltwidtht5i(	tButtontquitRtpacktBOTTOMtBOTHtCanvastcanvasObjecttLEFT(R((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyt
createWidgetsscCs4|jj|j�|_|jj|j�|_dS(N(Rtcanvasxtxtstartxtcanvasytytstarty(Rtevent((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyt	mouseDownscCs�|jj|j�}|jj|j�}|j|jkr�|j|jkr�|jj|j�|jj	|j|j||�|_|j
�ndS(N(RRRRRRRtdeletet
rubberbandBoxtcreate_rectangletupdate_idletasks(RR RR((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pytmouseMotions$	cCs|jj|j�dS(N(RR"R#(RR ((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pytmouseUp'scCstj||�tj|�|j�d|_tj|j	d|j
�tj|j	d|j�tj|j	d|j�dS(Ns
<Button-1>s<Button1-Motion>s<Button1-ButtonRelease>(
tFramet__init__tPacktconfigRtNoneR#tWidgettbindRR!R&R'(Rtmaster((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyR)*s

	N(	t__name__t
__module__RRR!R&R'R,R)(((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyRs					N(tTkinterR(Rttesttmainloop(((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyt<module>s
5	PK��Z�!��matt/READMEnu�[���This directory contains some ad-hoc examples of Tkinter widget
creation. The files named 

		*-simple.py

are the ones to start with if you're looking for a bare-bones usage of
a widget. The other files are meant to show common usage patters that
are a tad more involved. 

If you have a suggestion for an example program, please send mail to 
	
	conway@virginia.edu

and I'll include it.


matt

TODO
-------
The X selection
Dialog Boxes
More canvas examples
Message widgets
Text Editors
Scrollbars
Listboxes



PK��Ze��̍�matt/canvas-demo-simple.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pytprintitscCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdddddd
�|jjdt	�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheightit3itblack(
tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawtcreate_rectangletLEFT(R((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyt
createWidgets	scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyRs
N(t__name__t
__module__RRtNoneR(((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyRs		N(tTkinterRRttesttmainloop(((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyt<module>s
	PK��Za>oQ��"matt/animation-w-velocity-ctrl.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pytprintit
sc	Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_t|dt	dd
dd�|_
|j
jdtdt�|jjdddddddd�|jjdt
�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheighttorienttfrom_i����ttoidii
ttagstthingtblue(tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawtScalet
HORIZONTALtspeedtXtcreate_rectangletLEFT(R((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyt
createWidgets
s!%cGsY|jj�}t|�d}d|f}|jjd||�|jd|j�dS(Ng@�@s%riRi
(RtgettfloatRtmovetaftert	moveThing(Rtargstvelocitytstr((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyR's

cCs>tj||�tj|�|j�|jd|j�dS(Ni
(tFramet__init__tPacktconfigR"R&R'(Rtmaster((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyR,#s

N(t__name__t
__module__RR"R'tNoneR,(((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyR	s			N(tTkinterR+Rttesttmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/animation-w-velocity-ctrl.pyt<module>s
!	PK��Z	����matt/slider-demo-1.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs
dG|GHdS(Ns
slider now at((tselftval((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pytprint_valuescCs|jjd�dS(Ni(tslidertset(R((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pytreset
scCs�t|dddddtdddd	d
|j�|_t|ddd
|j�|_t|dd
ddd
|j�|_|jjdt	�|jjdt	�|jjdt	dt
�dS(Ntfrom_ittoidtorienttlengtht3itlabelshappy slidertcommandttextsreset slidertQUITt
foregroundtredtsidetfill(tScalet
HORIZONTALRRtButtonRtquitRtpacktLEFTtBOTH(R((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyt
createWidgets
scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyRs
N(t__name__t
__module__RRRtNoneR(((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyRs			N(tTkinterRRttesttmainloop(((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyt<module>s
	PK��ZCa�33matt/packer-simple.pynu�[���from Tkinter import *


class Test(Frame):
    def printit(self):
        print self.hi_there["command"]

    def createWidgets(self):
        # a hello button
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)

        self.hi_there = Button(self, text='Hello',
                               command=self.printit)
        self.hi_there.pack(side=LEFT)

        # note how Packer defaults to side=TOP

        self.guy2 = Button(self, text='button 2')
        self.guy2.pack()

        self.guy3 = Button(self, text='button 3')
        self.guy3.pack()

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z`MY��!matt/subclass-existing-widgets.pynu�[���from Tkinter import *

# This is a program that makes a simple two button application


class New_Button(Button):
    def callback(self):
        print self.counter
        self.counter = self.counter + 1

def createWidgets(top):
    f = Frame(top)
    f.pack()
    f.QUIT = Button(f, text='QUIT', foreground='red', command=top.quit)

    f.QUIT.pack(side=LEFT, fill=BOTH)

    # a hello button
    f.hi_there = New_Button(f, text='Hello')
    # we do this on a different line because we need to reference f.hi_there
    f.hi_there.config(command=f.hi_there.callback)
    f.hi_there.pack(side=LEFT)
    f.hi_there.counter = 43


root = Tk()
createWidgets(root)
root.mainloop()
PK��Z|=4�>>matt/canvas-with-scrollbars.pynu�[���from Tkinter import *

# This example program creates a scrolling canvas, and demonstrates
# how to tie scrollbars and canvases together. The mechanism
# is analogus for listboxes and other widgets with
# "xscroll" and "yscroll" configuration options.

class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.question = Label(self, text="Can Find The BLUE Square??????")
        self.question.pack()

        self.QUIT = Button(self, text='QUIT', background='red',
                           height=3, command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)
        spacer = Frame(self, height="0.25i")
        spacer.pack(side=BOTTOM)

        # notice that the scroll region (20" x 20") is larger than
        # displayed size of the widget (5" x 5")
        self.draw = Canvas(self, width="5i", height="5i",
                           background="white",
                           scrollregion=(0, 0, "20i", "20i"))

        self.draw.scrollX = Scrollbar(self, orient=HORIZONTAL)
        self.draw.scrollY = Scrollbar(self, orient=VERTICAL)

        # now tie the three together. This is standard boilerplate text
        self.draw['xscrollcommand'] = self.draw.scrollX.set
        self.draw['yscrollcommand'] = self.draw.scrollY.set
        self.draw.scrollX['command'] = self.draw.xview
        self.draw.scrollY['command'] = self.draw.yview

        # draw something. Note that the first square
        # is visible, but you need to scroll to see the second one.
        self.draw.create_rectangle(0, 0, "3.5i", "3.5i", fill="black")
        self.draw.create_rectangle("10i", "10i", "13.5i", "13.5i", fill="blue")

        # pack 'em up
        self.draw.scrollX.pack(side=BOTTOM, fill=X)
        self.draw.scrollY.pack(side=RIGHT, fill=Y)
        self.draw.pack(side=LEFT)


    def scrollCanvasX(self, *args):
        print "scrolling", args
        print self.draw.scrollX.get()


    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()

test.mainloop()
PK��Z���'��matt/canvas-gridding.pynu�[���from Tkinter import *

# this is the same as simple-demo-1.py, but uses
# subclassing.
# note that there is no explicit call to start Tk.
# Tkinter is smart enough to start the system if it's not already going.

class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT',
                                  background='red',
                                  foreground='white',
                                  height=3,
                                  command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)

        self.canvasObject = Canvas(self, width="5i", height="5i")
        self.canvasObject.pack(side=LEFT)

    def mouseDown(self, event):
        # canvas x and y take the screen coords from the event and translate
        # them into the coordinate system of the canvas object
        self.startx = self.canvasObject.canvasx(event.x, self.griddingSize)
        self.starty = self.canvasObject.canvasy(event.y, self.griddingSize)

    def mouseMotion(self, event):
        # canvas x and y take the screen coords from the event and translate
        # them into the coordinate system of the canvas object
        x = self.canvasObject.canvasx(event.x, self.griddingSize)
        y = self.canvasObject.canvasy(event.y, self.griddingSize)

        if (self.startx != event.x)  and (self.starty != event.y) :
            self.canvasObject.delete(self.rubberbandBox)
            self.rubberbandBox = self.canvasObject.create_rectangle(
                self.startx, self.starty, x, y)
            # this flushes the output, making sure that
            # the rectangle makes it to the screen
            # before the next event is handled
            self.update_idletasks()

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

        # this is a "tagOrId" for the rectangle we draw on the canvas
        self.rubberbandBox = None

        # this is the size of the gridding squares
        self.griddingSize = 50

        Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
        Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)


test = Test()

test.mainloop()
PK��Zv��	
	
matt/rubber-band-box-demo-1.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pytprintitscCs{t|ddddddddd	|j�|_|jjd
tdt�t|dd
dd
�|_|jjd
t�dS(NttexttQUITt
backgroundtredt
foregroundtwhitetheightitcommandtsidetfilltwidtht5i(	tButtontquitRtpacktBOTTOMtBOTHtCanvastcanvasObjecttLEFT(R((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyt
createWidgetsscCs4|jj|j�|_|jj|j�|_dS(N(Rtcanvasxtxtstartxtcanvasytytstarty(Rtevent((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyt	mouseDownscCs�|jj|j�}|jj|j�}|j|jkr�|j|jkr�|jj|j�|jj	|j|j||�|_|j
�ndS(N(RRRRRRRtdeletet
rubberbandBoxtcreate_rectangletupdate_idletasks(RR RR((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pytmouseMotions$	cCs|jj|j�dS(N(RR"R#(RR ((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pytmouseUp'scCstj||�tj|�|j�d|_tj|j	d|j
�tj|j	d|j�tj|j	d|j�dS(Ns
<Button-1>s<Button1-Motion>s<Button1-ButtonRelease>(
tFramet__init__tPacktconfigRtNoneR#tWidgettbindRR!R&R'(Rtmaster((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyR)*s

	N(	t__name__t
__module__RRR!R&R'R,R)(((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyRs					N(tTkinterR(Rttesttmainloop(((s@/usr/lib64/python2.7/Demo/tkinter/matt/rubber-band-box-demo-1.pyt<module>s
5	PK��Z�;���matt/window-creation-more.pynu�[���from Tkinter import *

# this shows how to create a new window with a button in it
# that can create new windows

class Test(Frame):
    def printit(self):
        print "hi"

    def makeWindow(self):
        fred = Toplevel()
        fred.label = Button(fred,
                            text="This is window number %d." % self.windownum,
                            command=self.makeWindow)
        fred.label.pack()
        self.windownum = self.windownum + 1

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)

        # a hello button
        self.hi_there = Button(self, text='Make a New Window',
                               command=self.makeWindow)
        self.hi_there.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.windownum = 0
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z�Q.�matt/killing-window-w-wm.pynu�[���from Tkinter import *

# This file shows how to trap the killing of a window
# when the user uses window manager menus (typ. upper left hand corner
# menu in the decoration border).


### ******* this isn't really called -- read the comments
def my_delete_callback():
    print "whoops -- tried to delete me!"

class Test(Frame):
    def deathHandler(self, event):
        print self, "is now getting nuked. performing some save here...."

    def createWidgets(self):
        # a hello button
        self.hi_there = Button(self, text='Hello')
        self.hi_there.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

        ###
        ###  PREVENT WM kills from happening
        ###

        # the docs would have you do this:

#       self.master.protocol("WM_DELETE_WINDOW", my_delete_callback)

        # unfortunately, some window managers will not send this request to a window.
        # the "protocol" function seems incapable of trapping these "aggressive" window kills.
        # this line of code catches everything, tho. The window is deleted, but you have a chance
        # of cleaning up first.
        self.bind_all("<Destroy>", self.deathHandler)


test = Test()
test.mainloop()
PK��Z������matt/animation-simple.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pytprintitsc	Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjddddd
ddd�|jjdt�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheightii
ttagstthingtblue(	tButtontquitRtpacktLEFTtBOTHtCanvastdrawtcreate_rectangle(R((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyt
createWidgets	s%cGs-|jjddd�|jd|j�dS(NRs0.01ii
(Rtmovetaftert	moveThing(Rtargs((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyRscCs>tj||�tj|�|j�|jd|j�dS(Ni
(tFramet__init__tPacktconfigRRR(Rtmaster((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyR s

N(t__name__t
__module__RRRtNoneR (((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyRs			N(tTkinterRRttesttmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyt<module>s
	PK��Z;mDD matt/canvas-reading-tag-info.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pytprintitscCs!t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjddddddddddd
d�}|jj	|d�}dG|dGdGH|jj	|d�}dG|dGdGHdG|dGdGH|jj	|d
�}dG|dGH|jjdt
�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheighti
inttagstweeetfootgrootstipples#pgon's current stipple value is -->is<--s pgon's current fill value is -->s   when he is usually colored -->ispgon's tags are(RRR(tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawingtcreate_polygont
itemconfigtLEFT(Rtpgontoption_value((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyt
createWidgetss	
cCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR (Rtmaster((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyR"*s
N(t__name__t
__module__RR tNoneR"(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyRs		"N(tTkinterR!Rttesttmainloop(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-reading-tag-info.pyt<module>s
+	PK��Z����matt/rubber-line-demo-1.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs8eZd�Zd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pytprintitscCs{t|ddddddddd	|j�|_|jjd
tdt�t|dd
dd
�|_|jjd
t�dS(NttexttQUITt
backgroundtredt
foregroundtwhitetheightitcommandtsidetfilltwidtht5i(	tButtontquitRtpacktBOTTOMtBOTHtCanvastcanvasObjecttLEFT(R((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyt
createWidgetsscCs4|jj|j�|_|jj|j�|_dS(N(Rtcanvasxtxtstartxtcanvasytytstarty(Rtevent((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyt	mouseDownscCs�|jj|j�}|jj|j�}|j|jkr�|j|jkr�|jj|j�|jj	|j|j||�|_|j
�ndS(N(RRRRRRRtdeletetrubberbandLinetcreate_linetupdate_idletasks(RR RR((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pytmouseMotions$	cCsftj||�tj|�|j�d|_tj|j	d|j
�tj|j	d|j�dS(Ns
<Button-1>s<Button1-Motion>(tFramet__init__tPacktconfigRtNoneR#tWidgettbindRR!R&(Rtmaster((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyR('s

	N(t__name__t
__module__RRR!R&R+R((((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyRs
				N(tTkinterR'Rttesttmainloop(((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyt<module>s
.	PK��ZS�"

matt/placer-simple.pyonu�[����
��^c@seddlTd�Zd�Zd�Ze�Zee�Zejd�ejdd�ej	�dS(i����(t*cCs#tjjd|jd|j�dS(Ntxty(tapptbuttontplaceRR(tevent((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pyt	do_motionscCs	dGHdS(Nscalling me!((((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pytdothisscCs�t|dddddd�}|jdddd�t|d	d
ddd
t�|_|jjdddddt�|jdt�|S(Ntwidthi�theightt
backgroundtgreentrelxgtrelyt
foregroundtredttexttamazingtcommandg�?tanchors<Control-Shift-Motion>(tFrameRtButtonRRtNWtbindR(ttoptf((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pyt
createWidgetss!t400x400i�N(
tTkinterRRRtTktrootRtgeometrytmaxsizetmainloop(((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pyt<module>s
				
PK��Zk�����matt/dialog-box.pycnu�[����
��^c@sGddlTddlmZdefd��YZe�Zej�dS(i����(t*(tDialogtTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pytprintitsc
Cs1t|ddddddddd	d�}|jS(
s�Create a top-level dialog with some buttons.

        This uses the Dialog class, which is a wrapper around the Tcl/Tk
        tk_dialog script.  The function returns 0 if the user clicks 'yes'
        or 1 if the user clicks 'no'.
        ttitlesfred the dialog boxttextsclick on a choicetbitmaptinfotdefaultitstringstyestno(RR
(Rtnum(Rtd((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyt
makeWindows	cCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NRtQUITt
foregroundtredtcommandtsidetfillsMake a New Window(tButtontquitRtpacktLEFTtBOTHRthi_there(R((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyt
createWidgets.scCs4tj||�tj|�d|_|j�dS(Ni(tFramet__init__tPacktconfigt	windownumR(Rtmaster((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyR9s
	N(t__name__t
__module__RRRtNoneR(((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyRs		#	N(tTkinterRRRttesttmainloop(((s4/usr/lib64/python2.7/Demo/tkinter/matt/dialog-box.pyt<module>s
8	PK��Z�		matt/canvas-gridding.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs8eZd�Zd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pytprintit	scCs{t|ddddddddd	|j�|_|jjd
tdt�t|dd
dd
�|_|jjd
t�dS(NttexttQUITt
backgroundtredt
foregroundtwhitetheightitcommandtsidetfilltwidtht5i(	tButtontquitRtpacktBOTTOMtBOTHtCanvastcanvasObjecttLEFT(R((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyt
createWidgetsscCs@|jj|j|j�|_|jj|j|j�|_dS(N(RtcanvasxtxtgriddingSizetstartxtcanvasytytstarty(Rtevent((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyt	mouseDownscCs�|jj|j|j�}|jj|j|j�}|j|jkr�|j|jkr�|jj|j	�|jj
|j|j||�|_	|j�ndS(N(RRRRRRRR tdeletet
rubberbandBoxtcreate_rectangletupdate_idletasks(RR!RR((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pytmouseMotions$	cCsotj||�tj|�|j�d|_d|_tj	|j
d|j�tj	|j
d|j�dS(Ni2s
<Button-1>s<Button1-Motion>(
tFramet__init__tPacktconfigRtNoneR$RtWidgettbindRR"R'(Rtmaster((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyR),s

		N(t__name__t
__module__RRR"R'R,R)(((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyRs
				N(tTkinterR(Rttesttmainloop(((s9/usr/lib64/python2.7/Demo/tkinter/matt/canvas-gridding.pyt<module>s
3	PK��Z��aI

"matt/canvas-moving-or-creating.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(c	Cs�|jjt�s�|jj|jd|jd|jd|jddddt�}|jj|d|j�|jj|d|j	�n|j|_
|j|_dS(Ni
tfilltgreenttagss<Any-Enter>s<Any-Leave>(twidgettfind_withtagtCURRENTtdrawtcreate_ovaltxtyttag_bindt
mouseEntert
mouseLeavetlastxtlasty(tselfteventtfred((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt	mouseDown
s	+cCsF|jjt|j|j|j|j�|j|_|j|_dS(N(RtmoveRR
RRR(RR((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt	mouseMoves*cCs|jjtdd�dS(NRtred(Rt
itemconfigR(RR((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyR
$scCs|jjtdd�dS(NRtblue(RRR(RR((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyR)scCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdt�tj	|jd|j
�tj	|jd|j�dS(
NttexttQUITt
foregroundRtcommandtsideRtwidtht5itheights<1>s<B1-Motion>(tButtontquitRtpacktLEFTtBOTHtCanvasRtWidgettbindRR(R((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt
createWidgets.scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR*(Rtmaster((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyR,8s
N(	t__name__t
__module__RRR
RR*tNoneR,(((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyRs					
N(tTkinterR+Rttesttmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt<module>s
7	PK��Z0L���matt/killing-window-w-wm.pycnu�[����
��^c@s@ddlTd�Zdefd��YZe�Zej�dS(i����(t*cCs	dGHdS(Nswhoops -- tried to delete me!((((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pytmy_delete_callback	stTestcBs&eZd�Zd�Zdd�ZRS(cCs
|GdGHdS(Ns3is now getting nuked. performing some save here....((tselftevent((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pytdeathHandler
scCs,t|dd�|_|jjdt�dS(NttexttHellotside(tButtonthi_theretpacktLEFT(R((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyt
createWidgetsscCs>tj||�tj|�|j�|jd|j�dS(Ns	<Destroy>(tFramet__init__tPacktconfigR
tbind_allR(Rtmaster((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyRs

N(t__name__t
__module__RR
tNoneR(((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyRs		N(tTkinterRRRttesttmainloop(((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyt<module>s
		PK��Z	����matt/slider-demo-1.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs
dG|GHdS(Ns
slider now at((tselftval((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pytprint_valuescCs|jjd�dS(Ni(tslidertset(R((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pytreset
scCs�t|dddddtdddd	d
|j�|_t|ddd
|j�|_t|dd
ddd
|j�|_|jjdt	�|jjdt	�|jjdt	dt
�dS(Ntfrom_ittoidtorienttlengtht3itlabelshappy slidertcommandttextsreset slidertQUITt
foregroundtredtsidetfill(tScalet
HORIZONTALRRtButtonRtquitRtpacktLEFTtBOTH(R((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyt
createWidgets
scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyRs
N(t__name__t
__module__RRRtNoneR(((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyRs			N(tTkinterRRttesttmainloop(((s7/usr/lib64/python2.7/Demo/tkinter/matt/slider-demo-1.pyt<module>s
	PK��Z0L���matt/killing-window-w-wm.pyonu�[����
��^c@s@ddlTd�Zdefd��YZe�Zej�dS(i����(t*cCs	dGHdS(Nswhoops -- tried to delete me!((((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pytmy_delete_callback	stTestcBs&eZd�Zd�Zdd�ZRS(cCs
|GdGHdS(Ns3is now getting nuked. performing some save here....((tselftevent((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pytdeathHandler
scCs,t|dd�|_|jjdt�dS(NttexttHellotside(tButtonthi_theretpacktLEFT(R((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyt
createWidgetsscCs>tj||�tj|�|j�|jd|j�dS(Ns	<Destroy>(tFramet__init__tPacktconfigR
tbind_allR(Rtmaster((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyRs

N(t__name__t
__module__RR
tNoneR(((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyRs		N(tTkinterRRRttesttmainloop(((s=/usr/lib64/python2.7/Demo/tkinter/matt/killing-window-w-wm.pyt<module>s
		PK��ZS�"

matt/placer-simple.pycnu�[����
��^c@seddlTd�Zd�Zd�Ze�Zee�Zejd�ejdd�ej	�dS(i����(t*cCs#tjjd|jd|j�dS(Ntxty(tapptbuttontplaceRR(tevent((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pyt	do_motionscCs	dGHdS(Nscalling me!((((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pytdothisscCs�t|dddddd�}|jdddd�t|d	d
ddd
t�|_|jjdddddt�|jdt�|S(Ntwidthi�theightt
backgroundtgreentrelxgtrelyt
foregroundtredttexttamazingtcommandg�?tanchors<Control-Shift-Motion>(tFrameRtButtonRRtNWtbindR(ttoptf((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pyt
createWidgetss!t400x400i�N(
tTkinterRRRtTktrootRtgeometrytmaxsizetmainloop(((s7/usr/lib64/python2.7/Demo/tkinter/matt/placer-simple.pyt<module>s
				
PK��Z;U<��"matt/subclass-existing-widgets.pycnu�[����
��^c@sJddlTdefd��YZd�Ze�Zee�ej�dS(i����(t*t
New_ButtoncBseZd�ZRS(cCs|jGH|jd|_dS(Ni(tcounter(tself((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pytcallbacks(t__name__t
__module__R(((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pyRscCs�t|�}|j�t|ddddd|j�|_|jjdtdt�t|dd�|_|jj	d|jj
�|jjdt�d	|j_dS(
NttexttQUITt
foregroundtredtcommandtsidetfilltHelloi+(tFrametpacktButtontquitRtLEFTtBOTHRthi_theretconfigRR(ttoptf((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pyt
createWidgetss
$N(tTkinterRRRtTktroottmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/subclass-existing-widgets.pyt<module>s

		
PK��Z�̆^#matt/not-what-you-might-think-1.pyonu�[����
��^c@sWddlTdefd��YZe�Zejjd�ejjd�ej�dS(i����(t*tTestcBseZd�Zdd�ZRS(cCsxt|dddddd�|_|jjdt�t|jddd	d
d|j�|j_|jjjdt�dS(Ntwidtht1itheightt
backgroundtgreentsidettexttQUITt
foregroundtredtcommand(tFrametGpaneltpacktLEFTtButtontquitR	(tself((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(R
t__init__tPacktconfigR(Rtmaster((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyRs
N(t__name__t
__module__RtNoneR(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyRs	
spacker demotpackerN(tTkinterR
RttestRttitleticonnametmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyt<module>s

	PK��Z3��(jjmatt/window-creation-simple.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pytprintitscCs/t�}t|dd�|_|jj�dS(NttextsHere's a new window(tTopleveltLabeltlabeltpack(Rtfred((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyt
makeWindow	s	cCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NRtQUITt
foregroundtredtcommandtsidetfillsMake a New Window(tButtontquitRR	tLEFTtBOTHRthi_there(R((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyRs
N(t__name__t
__module__RRRtNoneR(((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyRs			N(tTkinterRRttesttmainloop(((s@/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-simple.pyt<module>s
	PK��Z������matt/animation-simple.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pytprintitsc	Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjddddd
ddd�|jjdt�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheightii
ttagstthingtblue(	tButtontquitRtpacktLEFTtBOTHtCanvastdrawtcreate_rectangle(R((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyt
createWidgets	s%cGs-|jjddd�|jd|j�dS(NRs0.01ii
(Rtmovetaftert	moveThing(Rtargs((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyRscCs>tj||�tj|�|j�|jd|j�dS(Ni
(tFramet__init__tPacktconfigRRR(Rtmaster((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyR s

N(t__name__t
__module__RRRtNoneR (((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyRs			N(tTkinterRRttesttmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/matt/animation-simple.pyt<module>s
	PK��ZMh�Ω	�	matt/canvas-moving-w-mouse.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(cCs|j|_|j|_dS(N(txtlastxtytlasty(tselftevent((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt	mouseDown	scCsF|jjt|j|j|j|j�|j|_|j|_dS(N(tdrawtmovetCURRENTRRRR(RR((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt	mouseMoves*cCs|jjtdd�dS(Ntfilltred(R	t
itemconfigR(RR((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt
mouseEnterscCs|jjtdd�dS(NR
tblue(R	RR(RR((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt
mouseLeavesc	Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdt�|jjdddddd
dd�}|jj	|d|j
�|jj	|d|j�tj
|jd|j�tj
|jd|j�dS(NttexttQUITt
foregroundRtcommandtsideR
twidtht5itheightiitgreenttagstselecteds<Any-Enter>s<Any-Leave>s<1>s<B1-Motion>(tButtontquitRtpacktLEFTtBOTHtCanvasR	tcreate_ovalttag_bindRRtWidgettbindRR(Rtfred((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt
createWidgets!scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR)(Rtmaster((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyR+1s
N(	t__name__t
__module__RRRRR)tNoneR+(((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyRs						N(tTkinterR*Rttesttmainloop(((s?/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-w-mouse.pyt<module>s
1	PK��Z�nЈ	�	matt/dialog-box.pynu�[���from Tkinter import *
from Dialog import Dialog

# this shows how to create a new window with a button in it
# that can create new windows

class Test(Frame):
    def printit(self):
        print "hi"

    def makeWindow(self):
        """Create a top-level dialog with some buttons.

        This uses the Dialog class, which is a wrapper around the Tcl/Tk
        tk_dialog script.  The function returns 0 if the user clicks 'yes'
        or 1 if the user clicks 'no'.
        """
        # the parameters to this call are as follows:
        d = Dialog(
            self,                       ## name of a toplevel window
            title="fred the dialog box",## title on the window
            text="click on a choice",   ## message to appear in window
            bitmap="info",              ## bitmap (if any) to appear;
                                        ## if none, use ""
            #     legal values here are:
            #      string      what it looks like
            #      ----------------------------------------------
            #      error       a circle with a slash through it
            #      grey25      grey square
            #      grey50      darker grey square
            #      hourglass   use for "wait.."
            #      info        a large, lower case "i"
            #      questhead   a human head with a "?" in it
            #      question    a large "?"
            #      warning     a large "!"
            #        @fname    X bitmap where fname is the path to the file
            #
            default=0,    # the index of the default button choice.
                          # hitting return selects this
            strings=("yes", "no"))
                          # values of the 'strings' key are the labels for the
                          # buttons that appear left to right in the dialog box
        return d.num


    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)

        # a hello button
        self.hi_there = Button(self, text='Make a New Window',
                               command=self.makeWindow)
        self.hi_there.pack(side=LEFT)


    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.windownum = 0
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z�	��NNmatt/canvas-moving-w-mouse.pynu�[���from Tkinter import *

# this file demonstrates the movement of a single canvas item under mouse control

class Test(Frame):
    ###################################################################
    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
    ###################################################################
    def mouseDown(self, event):
        # remember where the mouse went down
        self.lastx = event.x
        self.lasty = event.y

    def mouseMove(self, event):
        # whatever the mouse is over gets tagged as CURRENT for free by tk.
        self.draw.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
        self.lastx = event.x
        self.lasty = event.y

    ###################################################################
    ###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
    ###################################################################
    def mouseEnter(self, event):
        # the CURRENT tag is applied to the object the cursor is over.
        # this happens automatically.
        self.draw.itemconfig(CURRENT, fill="red")

    def mouseLeave(self, event):
        # the CURRENT tag is applied to the object the cursor is over.
        # this happens automatically.
        self.draw.itemconfig(CURRENT, fill="blue")

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)
        self.draw = Canvas(self, width="5i", height="5i")
        self.draw.pack(side=LEFT)

        fred = self.draw.create_oval(0, 0, 20, 20,
                                     fill="green", tags="selected")

        self.draw.tag_bind(fred, "<Any-Enter>", self.mouseEnter)
        self.draw.tag_bind(fred, "<Any-Leave>", self.mouseLeave)

        Widget.bind(self.draw, "<1>", self.mouseDown)
        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z����matt/rubber-line-demo-1.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs8eZd�Zd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pytprintitscCs{t|ddddddddd	|j�|_|jjd
tdt�t|dd
dd
�|_|jjd
t�dS(NttexttQUITt
backgroundtredt
foregroundtwhitetheightitcommandtsidetfilltwidtht5i(	tButtontquitRtpacktBOTTOMtBOTHtCanvastcanvasObjecttLEFT(R((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyt
createWidgetsscCs4|jj|j�|_|jj|j�|_dS(N(Rtcanvasxtxtstartxtcanvasytytstarty(Rtevent((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyt	mouseDownscCs�|jj|j�}|jj|j�}|j|jkr�|j|jkr�|jj|j�|jj	|j|j||�|_|j
�ndS(N(RRRRRRRtdeletetrubberbandLinetcreate_linetupdate_idletasks(RR RR((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pytmouseMotions$	cCsftj||�tj|�|j�d|_tj|j	d|j
�tj|j	d|j�dS(Ns
<Button-1>s<Button1-Motion>(tFramet__init__tPacktconfigRtNoneR#tWidgettbindRR!R&(Rtmaster((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyR('s

	N(t__name__t
__module__RRR!R&R+R((((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyRs
				N(tTkinterR'Rttesttmainloop(((s</usr/lib64/python2.7/Demo/tkinter/matt/rubber-line-demo-1.pyt<module>s
.	PK��Ze��̍�matt/canvas-demo-simple.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pytprintitscCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdddddd
�|jjdt	�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheightit3itblack(
tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawtcreate_rectangletLEFT(R((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyt
createWidgets	scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyRs
N(t__name__t
__module__RRtNoneR(((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyRs		N(tTkinterRRttesttmainloop(((s</usr/lib64/python2.7/Demo/tkinter/matt/canvas-demo-simple.pyt<module>s
	PK��ZL�

!matt/printing-coords-of-items.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(cCs�|jjt�s�|jj|jd|jd|jd|jddd�}|jj|d|j�|jj|d|j	�n|j|_
|j|_dS(Ni
tfilltgreens<Enter>s<Leave>(twidgettfind_withtagtCURRENTtdrawtcreate_ovaltxtyttag_bindt
mouseEntert
mouseLeavetlastxtlasty(tselfteventtfred((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt	mouseDown	s	+	cCsF|jjt|j|j|j|j�|j|_|j|_dS(N(RtmoveRR	RR
R(RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt	mouseMoves*cCs+|jjtdd�|jjt�GHdS(NRtred(Rt
itemconfigRtcoords(RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyR"scCs|jjtdd�dS(NRtblue(RRR(RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyR
(scCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdt�tj	|jd|j
�tj	|jd|j�dS(
NttexttQUITt
foregroundRtcommandtsideRtwidtht5itheights<1>s<B1-Motion>(tButtontquitRtpacktLEFTtBOTHtCanvasRtWidgettbindRR(R((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt
createWidgets-scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR*(Rtmaster((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyR,7s
N(	t__name__t
__module__RRRR
R*tNoneR,(((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyRs					
N(tTkinterR+Rttesttmainloop(((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt<module>s
7	PK��Zb�r;	;	matt/canvas-with-scrollbars.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pytprintit	sc
Cs�t|dd�|_|jj�t|ddddddd|j�|_|jjd	td
t�t|dd�}|jd	t�t	|dd
dd
dddd�|_
t|dt�|j
_
t|dt�|j
_|j
j
j|j
d<|j
jj|j
d<|j
j|j
j
d<|j
j|j
jd<|j
jddddd
d�|j
jddddd
d�|j
j
jd	td
t�|j
jjd	td
t�|j
jd	t�dS(NttextsCan Find The BLUE Square??????tQUITt
backgroundtredtheightitcommandtsidetfills0.25itwidtht5itwhitetscrollregionit20itorienttxscrollcommandtyscrollcommands3.5itblackt10is13.5itblue(iiRR(tLabeltquestiontpacktButtontquitRtBOTTOMtBOTHtFrametCanvastdrawt	Scrollbart
HORIZONTALtscrollXtVERTICALtscrollYtsettxviewtyviewtcreate_rectangletXtRIGHTtYtLEFT(Rtspacer((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyt
createWidgetss*
cGsdG|GH|jjj�GHdS(Nt	scrolling(R!R$tget(Rtargs((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyt
scrollCanvasX0s	cCs+tj||�tj|�|j�dS(N(Rt__init__tPacktconfigR0(Rtmaster((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyR55s
N(t__name__t
__module__RR0R4tNoneR5(((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyRs		$	N(tTkinterRRttesttmainloop(((s@/usr/lib64/python2.7/Demo/tkinter/matt/canvas-with-scrollbars.pyt<module>s
2	PK��Z��>kv	v	!matt/canvas-moving-or-creating.pynu�[���from Tkinter import *

# this file demonstrates a more sophisticated movement --
# move dots or create new ones if you click outside the dots

class Test(Frame):
    ###################################################################
    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
    ###################################################################
    def mouseDown(self, event):
        # see if we're inside a dot. If we are, it
        # gets tagged as CURRENT for free by tk.
        if not event.widget.find_withtag(CURRENT):
            # there is no dot here, so we can make one,
            # and bind some interesting behavior to it.
            # ------
            # create a dot, and mark it as CURRENT
            fred = self.draw.create_oval(
                event.x - 10, event.y -10, event.x +10, event.y + 10,
                fill="green", tags=CURRENT)

            self.draw.tag_bind(fred, "<Any-Enter>", self.mouseEnter)
            self.draw.tag_bind(fred, "<Any-Leave>", self.mouseLeave)

        self.lastx = event.x
        self.lasty = event.y

    def mouseMove(self, event):
        self.draw.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
        self.lastx = event.x
        self.lasty = event.y

    ###################################################################
    ###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
    ###################################################################
    def mouseEnter(self, event):
        # the CURRENT tag is applied to the object the cursor is over.
        # this happens automatically.
        self.draw.itemconfig(CURRENT, fill="red")

    def mouseLeave(self, event):
        # the CURRENT tag is applied to the object the cursor is over.
        # this happens automatically.
        self.draw.itemconfig(CURRENT, fill="blue")

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)
        self.draw = Canvas(self, width="5i", height="5i")
        self.draw.pack(side=LEFT)

        Widget.bind(self.draw, "<1>", self.mouseDown)
        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z�x�#�#!matt/menu-all-types-of-entries.pynu�[���from Tkinter import *

# some vocabulary to keep from getting confused. This terminology
# is something I cooked up for this file, but follows the man pages
# pretty closely
#
#
#
#       This is a MENUBUTTON
#       V
# +-------------+
# |             |
#
# +------------++------------++------------+
# |            ||            ||            |
# |  File      ||  Edit      || Options    |   <-------- the MENUBAR
# |            ||            ||            |
# +------------++------------++------------+
# | New...         |
# | Open...        |
# | Print          |
# |                |  <-------- This is a MENU. The lines of text in the menu are
# |                |                            MENU ENTRIES
# |                +---------------+
# | Open Files >   | file1         |
# |                | file2         |
# |                | another file  | <------ this cascading part is also a MENU
# +----------------|               |
#                  |               |
#                  |               |
#                  |               |
#                  +---------------+



# some miscellaneous callbacks
def new_file():
    print "opening new file"

def open_file():
    print "opening OLD file"

def print_something():
    print "picked a menu item"



anchovies = 0

def print_anchovies():
    global anchovies
    anchovies = not anchovies
    print "anchovies?", anchovies

def makeCommandMenu():
    # make menu button
    Command_button = Menubutton(mBar, text='Simple Button Commands',
                                underline=0)
    Command_button.pack(side=LEFT, padx="2m")

    # make the pulldown part of the File menu. The parameter passed is the master.
    # we attach it to the button as a python attribute called "menu" by convention.
    # hopefully this isn't too confusing...
    Command_button.menu = Menu(Command_button)

    # just to be cute, let's disable the undo option:
    Command_button.menu.add_command(label="Undo")
    # undo is the 0th entry...
    Command_button.menu.entryconfig(0, state=DISABLED)

    Command_button.menu.add_command(label='New...', underline=0,
                                    command=new_file)
    Command_button.menu.add_command(label='Open...', underline=0,
                                    command=open_file)
    Command_button.menu.add_command(label='Different Font', underline=0,
                                    font='-*-helvetica-*-r-*-*-*-180-*-*-*-*-*-*',
                                    command=print_something)

    # we can make bitmaps be menu entries too. File format is X11 bitmap.
    # if you use XV, save it under X11 bitmap format. duh-uh.,..
    Command_button.menu.add_command(
        bitmap="info")
        #bitmap='@/home/mjc4y/dilbert/project.status.is.doomed.last.panel.bm')

    # this is just a line
    Command_button.menu.add('separator')

    # change the color
    Command_button.menu.add_command(label='Quit', underline=0,
                                    background='red',
                                    activebackground='green',
                                    command=Command_button.quit)

    # set up a pointer from the file menubutton back to the file menu
    Command_button['menu'] = Command_button.menu

    return Command_button



def makeCascadeMenu():
    # make menu button
    Cascade_button = Menubutton(mBar, text='Cascading Menus', underline=0)
    Cascade_button.pack(side=LEFT, padx="2m")

    # the primary pulldown
    Cascade_button.menu = Menu(Cascade_button)

    # this is the menu that cascades from the primary pulldown....
    Cascade_button.menu.choices = Menu(Cascade_button.menu)

    # ...and this is a menu that cascades from that.
    Cascade_button.menu.choices.weirdones = Menu(Cascade_button.menu.choices)

    # then you define the menus from the deepest level on up.
    Cascade_button.menu.choices.weirdones.add_command(label='avacado')
    Cascade_button.menu.choices.weirdones.add_command(label='belgian endive')
    Cascade_button.menu.choices.weirdones.add_command(label='beefaroni')

    # definition of the menu one level up...
    Cascade_button.menu.choices.add_command(label='Chocolate')
    Cascade_button.menu.choices.add_command(label='Vanilla')
    Cascade_button.menu.choices.add_command(label='TuttiFruiti')
    Cascade_button.menu.choices.add_command(label='WopBopaLoopBapABopBamBoom')
    Cascade_button.menu.choices.add_command(label='Rocky Road')
    Cascade_button.menu.choices.add_command(label='BubbleGum')
    Cascade_button.menu.choices.add_cascade(
        label='Weird Flavors',
        menu=Cascade_button.menu.choices.weirdones)

    # and finally, the definition for the top level
    Cascade_button.menu.add_cascade(label='more choices',
                                    menu=Cascade_button.menu.choices)

    Cascade_button['menu'] = Cascade_button.menu

    return Cascade_button

def makeCheckbuttonMenu():
    global fred
    # make menu button
    Checkbutton_button = Menubutton(mBar, text='Checkbutton Menus',
                                    underline=0)
    Checkbutton_button.pack(side=LEFT, padx='2m')

    # the primary pulldown
    Checkbutton_button.menu = Menu(Checkbutton_button)

    # and all the check buttons. Note that the "variable" "onvalue" and "offvalue" options
    # are not supported correctly at present. You have to do all your application
    # work through the calback.
    Checkbutton_button.menu.add_checkbutton(label='Pepperoni')
    Checkbutton_button.menu.add_checkbutton(label='Sausage')
    Checkbutton_button.menu.add_checkbutton(label='Extra Cheese')

    # so here's a callback
    Checkbutton_button.menu.add_checkbutton(label='Anchovy',
                                            command=print_anchovies)

    # and start with anchovies selected to be on. Do this by
    # calling invoke on this menu option. To refer to the "anchovy" menu
    # entry we need to know it's index. To do this, we use the index method
    # which takes arguments of several forms:
    #
    # argument        what it does
    # -----------------------------------
    # a number        -- this is useless.
    # "last"          -- last option in the menu
    # "none"          -- used with the activate command. see the man page on menus
    # "active"        -- the currently active menu option. A menu option is made active
    #                         with the 'activate' method
    # "@number"       -- where 'number' is an integer and is treated like a y coordinate in pixels
    # string pattern  -- this is the option used below, and attempts to match "labels" using the
    #                    rules of Tcl_StringMatch
    Checkbutton_button.menu.invoke(Checkbutton_button.menu.index('Anchovy'))

    # set up a pointer from the file menubutton back to the file menu
    Checkbutton_button['menu'] = Checkbutton_button.menu

    return Checkbutton_button


def makeRadiobuttonMenu():
    # make menu button
    Radiobutton_button = Menubutton(mBar, text='Radiobutton Menus',
                                    underline=0)
    Radiobutton_button.pack(side=LEFT, padx='2m')

    # the primary pulldown
    Radiobutton_button.menu = Menu(Radiobutton_button)

    # and all the Radio buttons. Note that the "variable" "onvalue" and "offvalue" options
    # are not supported correctly at present. You have to do all your application
    # work through the calback.
    Radiobutton_button.menu.add_radiobutton(label='Republican')
    Radiobutton_button.menu.add_radiobutton(label='Democrat')
    Radiobutton_button.menu.add_radiobutton(label='Libertarian')
    Radiobutton_button.menu.add_radiobutton(label='Commie')
    Radiobutton_button.menu.add_radiobutton(label='Facist')
    Radiobutton_button.menu.add_radiobutton(label='Labor Party')
    Radiobutton_button.menu.add_radiobutton(label='Torie')
    Radiobutton_button.menu.add_radiobutton(label='Independent')
    Radiobutton_button.menu.add_radiobutton(label='Anarchist')
    Radiobutton_button.menu.add_radiobutton(label='No Opinion')

    # set up a pointer from the file menubutton back to the file menu
    Radiobutton_button['menu'] = Radiobutton_button.menu

    return Radiobutton_button


def makeDisabledMenu():
    Dummy_button = Menubutton(mBar, text='Dead Menu', underline=0)
    Dummy_button.pack(side=LEFT, padx='2m')

    # this is the standard way of turning off a whole menu
    Dummy_button["state"] = DISABLED
    return Dummy_button


#################################################
#### Main starts here ...
root = Tk()


# make a menu bar
mBar = Frame(root, relief=RAISED, borderwidth=2)
mBar.pack(fill=X)

Command_button     = makeCommandMenu()
Cascade_button     = makeCascadeMenu()
Checkbutton_button = makeCheckbuttonMenu()
Radiobutton_button = makeRadiobuttonMenu()
NoMenu             = makeDisabledMenu()

# finally, install the buttons in the menu bar.
# This allows for scanning from one menubutton to the next.
mBar.tk_menuBar(Command_button, Cascade_button, Checkbutton_button, Radiobutton_button, NoMenu)


root.title('menu demo')
root.iconname('menu demo')

root.mainloop()
PK��Z:���
�
matt/canvas-mult-item-sel.pyonu�[����
��^c@sCddlTdZdZdefd��YZe�Zej�dS(i����(t*tredtbluetTestcBs8eZd�Zd�Zd�Zd�Zdd�ZRS(cCs�|jjt�s;|jjddt�|jjd�n,|jjddt�|jjddt�|j	|_
|j|_dS(Ntselectedtfilltwithtag(
twidgettfind_withtagtCURRENTtdrawt
itemconfigtUNSELECTED_COLORtdtagtaddtagtSELECTED_COLORtxtlastxtytlasty(tselftevent((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt	mouseDownscCsF|jjd|j|j|j|j�|j|_|j|_dS(NR(R
tmoveRRRR(RR((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt	mouseMove!s*c	CsA|jjdddddtdt�}|jjddt�dS(NiiRttagsRR(R
tcreate_ovalRR	R(Rtfred((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt
makeNewDot&scCs(t|ddddd|j�|_t|dddd�|_tj|jd	|j�tj|jd
|j�t|ddddd|j	�|_
d
ttf}t
|ddd|�|_|jjdtdt�|jjdtdtdd�|j
jdtdt�|jjdt�dS(NttexttQUITt
foregroundRtcommandtwidtht5itheights<1>s<B1-Motion>smake a new dotRs�%s dots are selected and can be dragged.
%s are not selected.
Click in a dot to select it.
Click on empty space to deselect all dots.tsideRtexpandi(tButtontquitRtCanvasR
tWidgettbindRRRtbuttonRRtMessagetlabeltpacktBOTTOMtBOTHtXtLEFT(Rtmessage((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt
createWidgets-s
cCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR4(Rtmaster((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyR6Hs
N(t__name__t
__module__RRRR4tNoneR6(((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyRs
				N(tTkinterRRR5Rttesttmainloop(((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt<module>s

E	PK��Z�F�77#matt/not-what-you-might-think-2.pyonu�[����
��^c@sWddlTdefd��YZe�Zejjd�ejjd�ej�dS(i����(t*tTestcBseZd�Zdd�ZRS(cCs�t|dddddd�|_|jjd�|jjdt�t|jdd	d
dd|j�|j_|jjjdt�dS(
Ntwidtht1itheightt
backgroundtgreenitsidettexttQUITt
foregroundtredtcommand(tFrametGpanelt	propagatetpacktLEFTtButtontquitR	(tself((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(R
t__init__tPacktconfigR(Rtmaster((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyRs
N(t__name__t
__module__RtNoneR(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyRs	spacker demotpackerN(tTkinterR
RttestRttitleticonnametmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-2.pyt<module>s

	PK��ZL�

!matt/printing-coords-of-items.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(cCs�|jjt�s�|jj|jd|jd|jd|jddd�}|jj|d|j�|jj|d|j	�n|j|_
|j|_dS(Ni
tfilltgreens<Enter>s<Leave>(twidgettfind_withtagtCURRENTtdrawtcreate_ovaltxtyttag_bindt
mouseEntert
mouseLeavetlastxtlasty(tselfteventtfred((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt	mouseDown	s	+	cCsF|jjt|j|j|j|j�|j|_|j|_dS(N(RtmoveRR	RR
R(RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt	mouseMoves*cCs+|jjtdd�|jjt�GHdS(NRtred(Rt
itemconfigRtcoords(RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyR"scCs|jjtdd�dS(NRtblue(RRR(RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyR
(scCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdt�tj	|jd|j
�tj	|jd|j�dS(
NttexttQUITt
foregroundRtcommandtsideRtwidtht5itheights<1>s<B1-Motion>(tButtontquitRtpacktLEFTtBOTHtCanvasRtWidgettbindRR(R((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt
createWidgets-scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR*(Rtmaster((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyR,7s
N(	t__name__t
__module__RRRR
R*tNoneR,(((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyRs					
N(tTkinterR+Rttesttmainloop(((sB/usr/lib64/python2.7/Demo/tkinter/matt/printing-coords-of-items.pyt<module>s
7	PK��Z��aI

"matt/canvas-moving-or-creating.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBsAeZd�Zd�Zd�Zd�Zd�Zdd�ZRS(c	Cs�|jjt�s�|jj|jd|jd|jd|jddddt�}|jj|d|j�|jj|d|j	�n|j|_
|j|_dS(Ni
tfilltgreenttagss<Any-Enter>s<Any-Leave>(twidgettfind_withtagtCURRENTtdrawtcreate_ovaltxtyttag_bindt
mouseEntert
mouseLeavetlastxtlasty(tselfteventtfred((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt	mouseDown
s	+cCsF|jjt|j|j|j|j�|j|_|j|_dS(N(RtmoveRR
RRR(RR((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt	mouseMoves*cCs|jjtdd�dS(NRtred(Rt
itemconfigR(RR((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyR
$scCs|jjtdd�dS(NRtblue(RRR(RR((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyR)scCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_|jjdt�tj	|jd|j
�tj	|jd|j�dS(
NttexttQUITt
foregroundRtcommandtsideRtwidtht5itheights<1>s<B1-Motion>(tButtontquitRtpacktLEFTtBOTHtCanvasRtWidgettbindRR(R((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt
createWidgets.scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR*(Rtmaster((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyR,8s
N(	t__name__t
__module__RRR
RR*tNoneR,(((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyRs					
N(tTkinterR+Rttesttmainloop(((sC/usr/lib64/python2.7/Demo/tkinter/matt/canvas-moving-or-creating.pyt<module>s
7	PK��Z���d�� matt/canvas-w-widget-draw-el.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pytprinthiscCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_t|ddd|j�|_	|jj
ddd
|j	�|jjdt�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheightsthis is a buttoni,twindow(tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawRtbuttont
create_windowtLEFT(R((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyt
createWidgets	scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyRs
N(t__name__t
__module__RRtNoneR(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyRs		N(tTkinterRRttesttmainloop(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyt<module>s
	PK��Z�uk/��matt/animation-simple.pynu�[���from Tkinter import *

# This program shows how to use the "after" function to make animation.

class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)

        self.draw = Canvas(self, width="5i", height="5i")

        # all of these work..
        self.draw.create_rectangle(0, 0, 10, 10, tags="thing", fill="blue")
        self.draw.pack(side=LEFT)

    def moveThing(self, *args):
        # move 1/10 of an inch every 1/10 sec (1" per second, smoothly)
        self.draw.move("thing", "0.01i", "0.01i")
        self.after(10, self.moveThing)


    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()
        self.after(10, self.moveThing)


test = Test()

test.mainloop()
PK��Z��t44matt/entry-simple.pycnu�[����
��^c@sSddlTddlZdefd��YZe�Zejjd�ej�dS(i����(t*NtAppcBseZdd�Zd�ZRS(cCsMtj||�|j�t�|_|jj�|jjd|j�dS(Ns<Key-Return>(tFramet__init__tpacktEntrytentrythingytbindtprint_contents(tselftmaster((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyRs


cCsdG|jj�GHdS(Ns"hi. contents of entry is now ---->(Rtget(R	tevent((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyRsN(t__name__t
__module__tNoneRR(((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyRstFoo(tTkintertstringRRtrootR
ttitletmainloop(((s6/usr/lib64/python2.7/Demo/tkinter/matt/entry-simple.pyt<module>s

	PK��Z�� �yy!matt/bind-w-mult-calls-p-type.pycnu�[����
��^c@sSddlTddlZdefd��YZe�Zejjd�ej�dS(i����(t*NtAppcBs&eZdd�Zd�Zd�ZRS(cCsftj||�|j�t�|_|jj�|jjd|j�|jjd|jd�dS(Ns<Key-Return>t+(tFramet__init__tpacktEntrytentrythingytbindtprint_contentstprint_something_else(tselftmaster((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyRs

cCsdG|jj�GHdS(Ns"hi. contents of entry is now ---->(Rtget(Rtevent((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyR	scCs	dGHdS(Ns,hi. Now doing something completely different((RR((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyR
sN(t__name__t
__module__tNoneRR	R
(((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyRs	tFoo(tTkintertstringRRtrootRttitletmainloop(((sB/usr/lib64/python2.7/Demo/tkinter/matt/bind-w-mult-calls-p-type.pyt<module>s

	PK��Z~ǁ���"matt/not-what-you-might-think-2.pynu�[���from Tkinter import *


class Test(Frame):
    def createWidgets(self):

        self.Gpanel = Frame(self, width='1i', height='1i',
                            background='green')

        # this line turns off the recalculation of geometry by masters.
        self.Gpanel.propagate(0)

        self.Gpanel.pack(side=LEFT)

        # a QUIT button
        self.Gpanel.QUIT = Button(self.Gpanel, text='QUIT', foreground='red',
                                  command=self.quit)
        self.Gpanel.QUIT.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()

test.master.title('packer demo')
test.master.iconname('packer')

test.mainloop()
PK��Z4+���matt/two-radio-groups.pycnu�[����
��^c@s�ddlTd�Zd�Zd�Ze�Zeededd�Zej	de
�e�Ze
�Zee�Zee�Zejee�eed	d
ddd
e�Zej	de�ejd�ejd�ej�dS(i����(t*cCs�ttdddd�}|jdtdd�t|�|_|jjdd	d
|dd�|jjd
idd6|d
6dd6�|jjd
idd6|d
6dd6�|jd�|j|d<|S(NttextsPolitical Partyt	underlineitsidetpadxt2mtlabelt
RepublicantvariabletvalueitradiobuttontDemocratitLibertarianitmenu(	t
MenubuttontmBartpacktLEFTtMenuR
tadd_radiobuttontaddtset(tvartRadiobutton_button((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pytmakePoliticalPartiess	


cCs�ttdddd�}|jdtdd�t|�|_|jjdd	d
|dd	�|jjddd
|dd�|jjdd
d
|dd
�|jd�|j|d<|S(NRtFlavorsRiRRRRt
StrawberryRR	t	Chocolates
Rocky RoadR
(RRRRRR
RR(RR((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pytmakeFlavors2s	




cCs#dGtj�GHdGtj�GHHdS(Nsparty iss	flavor is(tpartytgettflavor(((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pyt
printStuffMstrelieftborderwidthitfillRsprint party and flavort
foregroundtredtcommandRs	menu demoN(tTkinterRRR tTktroottFrametRAISEDRRtXtIntVarRt	StringVarRRtRadiobutton_button2t
tk_menuBartButtontbtTOPttitleticonnametmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pyt<module>s"
							

PK��Z����PPmatt/pong-demo-1.pycnu�[����
��^c@sCddlTddlZdefd��YZe�Zej�dS(i����(t*NtPongcBs&eZd�Zd�Zdd�ZRS(c
Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_t|dt	dd
dddd�|_
|j
jdtdt�|jj
dddddd�|_d|_d|_d|_d|_|jjdt�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheighttorienttlabels
ball speedtfrom_i����ttoidt0is0.10ig�������?g333333�?g�?(tButtontquitRtpacktLEFTtBOTHtCanvastdrawtScalet
HORIZONTALtspeedtBOTTOMtXtcreate_ovaltballtxtyt
velocity_xt
velocity_y(tself((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyt
createWidgetss				cGs�|jdks|jdkr1d|j|_n|jdksO|jdkrbd|j|_n|j|jj�d}|j|jj�d}|j||_|j||_|jj|jd|d|�|j	d|j
�dS(Ng@gg�gY@s%rii
(RR!R R"RtgetRtmoveRtaftertmoveBall(R#targstdeltaxtdeltay((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyR(s!cCs>tj||�tj|�|j�|jd|j�dS(Ni
(tFramet__init__tPacktconfigR$R'R((R#tmaster((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyR--s

N(t__name__t
__module__R$R(tNoneR-(((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyRs		(tTkintertstringR,Rtgametmainloop(((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyt<module>s
.	PK��Z:���
�
matt/canvas-mult-item-sel.pycnu�[����
��^c@sCddlTdZdZdefd��YZe�Zej�dS(i����(t*tredtbluetTestcBs8eZd�Zd�Zd�Zd�Zdd�ZRS(cCs�|jjt�s;|jjddt�|jjd�n,|jjddt�|jjddt�|j	|_
|j|_dS(Ntselectedtfilltwithtag(
twidgettfind_withtagtCURRENTtdrawt
itemconfigtUNSELECTED_COLORtdtagtaddtagtSELECTED_COLORtxtlastxtytlasty(tselftevent((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt	mouseDownscCsF|jjd|j|j|j|j�|j|_|j|_dS(NR(R
tmoveRRRR(RR((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt	mouseMove!s*c	CsA|jjdddddtdt�}|jjddt�dS(NiiRttagsRR(R
tcreate_ovalRR	R(Rtfred((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt
makeNewDot&scCs(t|ddddd|j�|_t|dddd�|_tj|jd	|j�tj|jd
|j�t|ddddd|j	�|_
d
ttf}t
|ddd|�|_|jjdtdt�|jjdtdtdd�|j
jdtdt�|jjdt�dS(NttexttQUITt
foregroundRtcommandtwidtht5itheights<1>s<B1-Motion>smake a new dotRs�%s dots are selected and can be dragged.
%s are not selected.
Click in a dot to select it.
Click on empty space to deselect all dots.tsideRtexpandi(tButtontquitRtCanvasR
tWidgettbindRRRtbuttonRRtMessagetlabeltpacktBOTTOMtBOTHtXtLEFT(Rtmessage((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt
createWidgets-s
cCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR4(Rtmaster((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyR6Hs
N(t__name__t
__module__RRRR4tNoneR6(((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyRs
				N(tTkinterRRR5Rttesttmainloop(((s>/usr/lib64/python2.7/Demo/tkinter/matt/canvas-mult-item-sel.pyt<module>s

E	PK��Z����PPmatt/pong-demo-1.pyonu�[����
��^c@sCddlTddlZdefd��YZe�Zej�dS(i����(t*NtPongcBs&eZd�Zd�Zdd�ZRS(c
Cs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_t|dt	dd
dddd�|_
|j
jdtdt�|jj
dddddd�|_d|_d|_d|_d|_|jjdt�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheighttorienttlabels
ball speedtfrom_i����ttoidt0is0.10ig�������?g333333�?g�?(tButtontquitRtpacktLEFTtBOTHtCanvastdrawtScalet
HORIZONTALtspeedtBOTTOMtXtcreate_ovaltballtxtyt
velocity_xt
velocity_y(tself((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyt
createWidgetss				cGs�|jdks|jdkr1d|j|_n|jdksO|jdkrbd|j|_n|j|jj�d}|j|jj�d}|j||_|j||_|jj|jd|d|�|j	d|j
�dS(Ng@gg�gY@s%rii
(RR!R R"RtgetRtmoveRtaftertmoveBall(R#targstdeltaxtdeltay((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyR(s!cCs>tj||�tj|�|j�|jd|j�dS(Ni
(tFramet__init__tPacktconfigR$R'R((R#tmaster((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyR--s

N(t__name__t
__module__R$R(tNoneR-(((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyRs		(tTkintertstringR,Rtgametmainloop(((s5/usr/lib64/python2.7/Demo/tkinter/matt/pong-demo-1.pyt<module>s
.	PK��ZR��۩�matt/menu-simple.pycnu�[����
��^c@s�ddlTd�Zd�Zd�Zd�Ze�Zeededd�Z	e	j
d	e�e�Ze�Z
e	jee
�ejd
�ejd�ej�dS(
i����(t*cCs	dGHdS(Nsopening new file((((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pytnew_file$scCs	dGHdS(Nsopening OLD file((((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pyt	open_file(scCs�ttdddd�}|jdtdd�t|�|_|jjdd	ddd
t�|jjddddd
t�|jjddddd
d
�|j|d<|S(NttexttFilet	underlineitsidetpadxt1mtlabelsNew...tcommandsOpen...tQuittexittmenu(	t
MenubuttontmBartpacktLEFTtMenuR
tadd_commandRR(tFile_button((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pytmakeFileMenu,s
cCs�ttdddd�}|jdtdd�t|�|_|jjdd	d
�|jjddt�|jj	d	d
�|jj	d	d�|jj	d	d�|j|d<|S(NRtEditRiRRRR
R	tUndoitstatetCuttCopytPasteR
(
RRRRRR
taddtentryconfigtDISABLEDR(tEdit_button((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pytmakeEditMenuFs
trelieftborderwidthitfills	menu demotpackerN(tTkinterRRRR tTktroottFrametRAISEDRRtXRRt
tk_menuBarttitleticonnametmainloop(((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pyt<module>s
#							

PK��Z�}�`	`	 matt/printing-coords-of-items.pynu�[���from Tkinter import *

# this file demonstrates the creation of widgets as part of a canvas object

class Test(Frame):
    ###################################################################
    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
    ###################################################################
    def mouseDown(self, event):
        # see if we're inside a dot. If we are, it
        # gets tagged as CURRENT for free by tk.

        if not event.widget.find_withtag(CURRENT):
            # there is no dot here, so we can make one,
            # and bind some interesting behavior to it.
            # ------
            # create a dot, and mark it as current
            fred = self.draw.create_oval(
                event.x - 10, event.y -10, event.x +10, event.y + 10,
                fill="green")
            self.draw.tag_bind(fred, "<Enter>", self.mouseEnter)
            self.draw.tag_bind(fred, "<Leave>", self.mouseLeave)
        self.lastx = event.x
        self.lasty = event.y

    def mouseMove(self, event):
        self.draw.move(CURRENT, event.x - self.lastx, event.y - self.lasty)
        self.lastx = event.x
        self.lasty = event.y

    ###################################################################
    ###### Event callbacks for canvas ITEMS (stuff drawn on the canvas)
    ###################################################################
    def mouseEnter(self, event):
        # the "current" tag is applied to the object the cursor is over.
        # this happens automatically.
        self.draw.itemconfig(CURRENT, fill="red")
        print self.draw.coords(CURRENT)

    def mouseLeave(self, event):
        # the "current" tag is applied to the object the cursor is over.
        # this happens automatically.
        self.draw.itemconfig(CURRENT, fill="blue")

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=LEFT, fill=BOTH)
        self.draw = Canvas(self, width="5i", height="5i")
        self.draw.pack(side=LEFT)

        Widget.bind(self.draw, "<1>", self.mouseDown)
        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��Z�_ ��matt/canvas-demo-simple.pynu�[���from Tkinter import *

# this program creates a canvas and puts a single polygon on the canvas

class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)

        self.draw = Canvas(self, width="5i", height="5i")

        # see the other demos for other ways of specifying coords for a polygon
        self.draw.create_rectangle(0, 0, "3i", "3i", fill="black")

        self.draw.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()

test.mainloop()
PK��Z�>���matt/two-radio-groups.pynu�[���from Tkinter import *

#       The way to think about this is that each radio button menu
#       controls a different variable -- clicking on one of the
#       mutually exclusive choices in a radiobutton assigns some value
#       to an application variable you provide. When you define a
#       radiobutton menu choice, you have the option of specifying the
#       name of a varaible and value to assign to that variable when
#       that choice is selected. This clever mechanism relieves you,
#       the programmer, from having to write a dumb callback that
#       probably wouldn't have done anything more than an assignment
#       anyway. The Tkinter options for this follow their Tk
#       counterparts:
#       {"variable" : my_flavor_variable, "value" : "strawberry"}
#       where my_flavor_variable is an instance of one of the
#       subclasses of Variable, provided in Tkinter.py (there is
#       StringVar(), IntVar(), DoubleVar() and BooleanVar() to choose
#       from)



def makePoliticalParties(var):
    # make menu button
    Radiobutton_button = Menubutton(mBar, text='Political Party',
                                    underline=0)
    Radiobutton_button.pack(side=LEFT, padx='2m')

    # the primary pulldown
    Radiobutton_button.menu = Menu(Radiobutton_button)

    Radiobutton_button.menu.add_radiobutton(label='Republican',
                                            variable=var, value=1)

    Radiobutton_button.menu.add('radiobutton', {'label': 'Democrat',
                                                'variable' : var,
                                                'value' : 2})

    Radiobutton_button.menu.add('radiobutton', {'label': 'Libertarian',
                                                'variable' : var,
                                                'value' : 3})

    var.set(2)

    # set up a pointer from the file menubutton back to the file menu
    Radiobutton_button['menu'] = Radiobutton_button.menu

    return Radiobutton_button


def makeFlavors(var):
    # make menu button
    Radiobutton_button = Menubutton(mBar, text='Flavors',
                                    underline=0)
    Radiobutton_button.pack(side=LEFT, padx='2m')

    # the primary pulldown
    Radiobutton_button.menu = Menu(Radiobutton_button)

    Radiobutton_button.menu.add_radiobutton(label='Strawberry',
                                            variable=var, value='Strawberry')

    Radiobutton_button.menu.add_radiobutton(label='Chocolate',
                                            variable=var, value='Chocolate')

    Radiobutton_button.menu.add_radiobutton(label='Rocky Road',
                                            variable=var, value='Rocky Road')

    # choose a default
    var.set("Chocolate")

    # set up a pointer from the file menubutton back to the file menu
    Radiobutton_button['menu'] = Radiobutton_button.menu

    return Radiobutton_button


def printStuff():
    print "party is", party.get()
    print "flavor is", flavor.get()
    print

#################################################
#### Main starts here ...
root = Tk()


# make a menu bar
mBar = Frame(root, relief=RAISED, borderwidth=2)
mBar.pack(fill=X)

# make two application variables,
# one to control each radio button set
party = IntVar()
flavor = StringVar()

Radiobutton_button = makePoliticalParties(party)
Radiobutton_button2 = makeFlavors(flavor)

# finally, install the buttons in the menu bar.
# This allows for scanning from one menubutton to the next.
mBar.tk_menuBar(Radiobutton_button, Radiobutton_button2)

b = Button(root, text="print party and flavor", foreground="red",
           command=printStuff)
b.pack(side=TOP)

root.title('menu demo')
root.iconname('menu demo')

root.mainloop()
PK��Z�̆^#matt/not-what-you-might-think-1.pycnu�[����
��^c@sWddlTdefd��YZe�Zejjd�ejjd�ej�dS(i����(t*tTestcBseZd�Zdd�ZRS(cCsxt|dddddd�|_|jjdt�t|jddd	d
d|j�|j_|jjjdt�dS(Ntwidtht1itheightt
backgroundtgreentsidettexttQUITt
foregroundtredtcommand(tFrametGpaneltpacktLEFTtButtontquitR	(tself((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(R
t__init__tPacktconfigR(Rtmaster((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyRs
N(t__name__t
__module__RtNoneR(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyRs	
spacker demotpackerN(tTkinterR
RttestRttitleticonnametmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/not-what-you-might-think-1.pyt<module>s

	PK��Z���d�� matt/canvas-w-widget-draw-el.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pytprinthiscCs�t|ddddd|j�|_|jjdtdt�t|dd	d
d	�|_t|ddd|j�|_	|jj
ddd
|j	�|jjdt�dS(NttexttQUITt
foregroundtredtcommandtsidetfilltwidtht5itheightsthis is a buttoni,twindow(tButtontquitRtpacktBOTTOMtBOTHtCanvastdrawRtbuttont
create_windowtLEFT(R((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyt
createWidgets	scCs+tj||�tj|�|j�dS(N(tFramet__init__tPacktconfigR(Rtmaster((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyRs
N(t__name__t
__module__RRtNoneR(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyRs		N(tTkinterRRttesttmainloop(((sA/usr/lib64/python2.7/Demo/tkinter/matt/canvas-w-widget-draw-el.pyt<module>s
	PK��Z#~���"matt/entry-with-shared-variable.pynu�[���from Tkinter import *
import string

# This program  shows how to make a typein box shadow a program variable.

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

        self.entrythingy = Entry(self)
        self.entrythingy.pack()

        self.button = Button(self, text="Uppercase The Entry",
                             command=self.upper)
        self.button.pack()

        # here we have the text in the entry widget tied to a variable.
        # changes in the variable are echoed in the widget and vice versa.
        # Very handy.
        # there are other Variable types. See Tkinter.py for all
        # the other variable types that can be shadowed
        self.contents = StringVar()
        self.contents.set("this is a variable")
        self.entrythingy.config(textvariable=self.contents)

        # and here we get a callback when the user hits return. we could
        # make the key that triggers the callback anything we wanted to.
        # other typical options might be <Key-Tab> or <Key> (for anything)
        self.entrythingy.bind('<Key-Return>', self.print_contents)

    def upper(self):
        # notice here, we don't actually refer to the entry box.
        # we just operate on the string variable and we
        # because it's being looked at by the entry widget, changing
        # the variable changes the entry widget display automatically.
        # the strange get/set operators are clunky, true...
        str = string.upper(self.contents.get())
        self.contents.set(str)

    def print_contents(self, event):
        print "hi. contents of entry is now ---->", self.contents.get()

root = App()
root.master.title("Foo")
root.mainloop()
PK��Z�J����matt/radiobutton-simple.pynu�[���from Tkinter import *

# This is a demo program that shows how to
# create radio buttons and how to get other widgets to
# share the information in a radio button.
#
# There are other ways of doing this too, but
# the "variable" option of radiobuttons seems to be the easiest.
#
# note how each button has a value it sets the variable to as it gets hit.


class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):

        self.flavor = StringVar()
        self.flavor.set("chocolate")

        self.radioframe = Frame(self)
        self.radioframe.pack()

        # 'text' is the label
        # 'variable' is the name of the variable that all these radio buttons share
        # 'value' is the value this variable takes on when the radio button is selected
        # 'anchor' makes the text appear left justified (default is centered. ick)
        self.radioframe.choc = Radiobutton(
            self.radioframe, text="Chocolate Flavor",
            variable=self.flavor, value="chocolate",
            anchor=W)
        self.radioframe.choc.pack(fill=X)

        self.radioframe.straw = Radiobutton(
            self.radioframe, text="Strawberry Flavor",
            variable=self.flavor, value="strawberry",
            anchor=W)
        self.radioframe.straw.pack(fill=X)

        self.radioframe.lemon = Radiobutton(
            self.radioframe, text="Lemon Flavor",
            variable=self.flavor, value="lemon",
            anchor=W)
        self.radioframe.lemon.pack(fill=X)

        # this is a text entry that lets you type in the name of a flavor too.
        self.entry = Entry(self, textvariable=self.flavor)
        self.entry.pack(fill=X)
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)


    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()

test.mainloop()
PK��Z����matt/canvas-w-widget-draw-el.pynu�[���from Tkinter import *

# this file demonstrates the creation of widgets as part of a canvas object

class Test(Frame):
    def printhi(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)

        self.draw = Canvas(self, width="5i", height="5i")

        self.button = Button(self, text="this is a button",
                             command=self.printhi)

        # note here the coords are given in pixels (form the
        # upper right and corner of the window, as usual for X)
        # but might just have well been given in inches or points or
        # whatever...use the "anchor" option to control what point of the
        # widget (in this case the button) gets mapped to the given x, y.
        # you can specify corners, edges, center, etc...
        self.draw.create_window(300, 300, window=self.button)

        self.draw.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()

test.mainloop()
PK��Zo���VVmatt/rubber-band-box-demo-1.pynu�[���from Tkinter import *

class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT',
                                  background='red',
                                  foreground='white',
                                  height=3,
                                  command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)

        self.canvasObject = Canvas(self, width="5i", height="5i")
        self.canvasObject.pack(side=LEFT)

    def mouseDown(self, event):
        # canvas x and y take the screen coords from the event and translate
        # them into the coordinate system of the canvas object
        self.startx = self.canvasObject.canvasx(event.x)
        self.starty = self.canvasObject.canvasy(event.y)

    def mouseMotion(self, event):
        # canvas x and y take the screen coords from the event and translate
        # them into the coordinate system of the canvas object
        x = self.canvasObject.canvasx(event.x)
        y = self.canvasObject.canvasy(event.y)

        if (self.startx != event.x)  and (self.starty != event.y) :
            self.canvasObject.delete(self.rubberbandBox)
            self.rubberbandBox = self.canvasObject.create_rectangle(
                self.startx, self.starty, x, y)
            # this flushes the output, making sure that
            # the rectangle makes it to the screen
            # before the next event is handled
            self.update_idletasks()

    def mouseUp(self, event):
        self.canvasObject.delete(self.rubberbandBox)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

        # this is a "tagOrId" for the rectangle we draw on the canvas
        self.rubberbandBox = None

        # and the bindings that make it work..
        Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
        Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)
        Widget.bind(self.canvasObject, "<Button1-ButtonRelease>", self.mouseUp)


test = Test()

test.mainloop()
PK��Z��ZZ��matt/window-creation-more.pyonu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs/eZd�Zd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pytprintitscCsOt�}t|dd|jd|j�|_|jj�|jd|_dS(NttextsThis is window number %d.tcommandi(tTopleveltButtont	windownumt
makeWindowtlabeltpack(Rtfred((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyR

s		

cCsrt|ddddd|j�|_|jjdtdt�t|ddd|j�|_|jjdt�dS(	NRtQUITt
foregroundtredRtsidetfillsMake a New Window(RtquitRRtLEFTtBOTHR
thi_there(R((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyt
createWidgetsscCs4tj||�tj|�d|_|j�dS(Ni(tFramet__init__tPacktconfigR	R(Rtmaster((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyRs
	N(t__name__t
__module__RR
RtNoneR(((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyRs			
N(tTkinterRRttesttmainloop(((s>/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-more.pyt<module>s
	PK��Z�j�HHmatt/radiobutton-simple.pycnu�[����
��^c@s7ddlTdefd��YZe�Zej�dS(i����(t*tTestcBs&eZd�Zd�Zdd�ZRS(cCs	dGHdS(Nthi((tself((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pytprintitsc
Csvt�|_|jjd�t|�|_|jj�t|jddd|jdddt�|j_|jjjdt	�t|jddd|jdd	dt�|j_
|jj
jdt	�t|jdd
d|jdddt�|j_|jjjdt	�t|d|j�|_
|j
jdt	�t|dd
ddd|j�|_|jjdtdt�dS(Nt	chocolatettextsChocolate FlavortvariabletvaluetanchortfillsStrawberry Flavort
strawberrysLemon FlavortlemonttextvariabletQUITt
foregroundtredtcommandtside(t	StringVartflavortsettFramet
radioframetpacktRadiobuttontWtchoctXtstrawRtEntrytentrytButtontquitRtBOTTOMtBOTH(R((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyt
createWidgetss0
cCs+tj||�tj|�|j�dS(N(Rt__init__tPacktconfigR$(Rtmaster((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyR%7s
N(t__name__t
__module__RR$tNoneR%(((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyR
s		&N(tTkinterRRttesttmainloop(((s</usr/lib64/python2.7/Demo/tkinter/matt/radiobutton-simple.pyt<module>s
/	PK��Z�f� 44#matt/window-creation-w-location.pycnu�[����
��^c@sYddlTddlZdefd��YZdefd��YZe�Zej�dS(i����(t*Nt
QuitButtoncBseZd�ZRS(cOs\|jd�sd|d<n|jd�s;|j|d<nttj||f||�dS(NttexttQUITtcommand(thas_keytquittapplytButtont__init__(tselftmastertargstkwargs((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyR	s

(t__name__t
__module__R	(((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyR
stTestcBs&eZd�Zd�Zdd�ZRS(cGsgt�}t|dddd�|_|jjdddd�|jjdddd�|jj�dS(Ntwidtht2itheightt0(tTopleveltCanvastlabeltcreate_linetpack(R
Rtfred((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyt
makeWindows
	c
Csit|�|_|jjdtdt�t|ddddddd	|j�|_|jjdt�dS(
NtsidetfillRsMake a New WindowRi2RiR(RRRtLEFTtBOTHRR(R
((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyt
createWidgetsscCs+tj||�tj|�|j�dS(N(tFrameR	tPacktconfigR (R
R((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyR	's
N(RRRR tNoneR	(((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyRs			(tTkintertsysRRR!Rttesttmainloop(((sD/usr/lib64/python2.7/Demo/tkinter/matt/window-creation-w-location.pyt<module>s

	PK��Z�(�matt/canvas-mult-item-sel.pynu�[���from Tkinter import *

# allows moving dots with multiple selection.

SELECTED_COLOR = "red"
UNSELECTED_COLOR = "blue"

class Test(Frame):
    ###################################################################
    ###### Event callbacks for THE CANVAS (not the stuff drawn on it)
    ###################################################################
    def mouseDown(self, event):
        # see if we're inside a dot. If we are, it
        # gets tagged as CURRENT for free by tk.

        if not event.widget.find_withtag(CURRENT):
            # we clicked outside of all dots on the canvas. unselect all.

            # re-color everything back to an unselected color
            self.draw.itemconfig("selected", fill=UNSELECTED_COLOR)
            # unselect everything
            self.draw.dtag("selected")
        else:
            # mark as "selected" the thing the cursor is under
            self.draw.addtag("selected", "withtag", CURRENT)
            # color it as selected
            self.draw.itemconfig("selected", fill=SELECTED_COLOR)

        self.lastx = event.x
        self.lasty = event.y


    def mouseMove(self, event):
        self.draw.move("selected", event.x - self.lastx, event.y - self.lasty)
        self.lastx = event.x
        self.lasty = event.y

    def makeNewDot(self):
        # create a dot, and mark it as current
        fred = self.draw.create_oval(0, 0, 20, 20,
                                     fill=SELECTED_COLOR, tags=CURRENT)
        # and make it selected
        self.draw.addtag("selected", "withtag", CURRENT)

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT', foreground='red',
                           command=self.quit)

        ################
        # make the canvas and bind some behavior to it
        ################
        self.draw = Canvas(self, width="5i", height="5i")
        Widget.bind(self.draw, "<1>", self.mouseDown)
        Widget.bind(self.draw, "<B1-Motion>", self.mouseMove)

        # and other things.....
        self.button = Button(self, text="make a new dot", foreground="blue",
                             command=self.makeNewDot)

        message = ("%s dots are selected and can be dragged.\n"
                   "%s are not selected.\n"
                   "Click in a dot to select it.\n"
                   "Click on empty space to deselect all dots."
                   ) % (SELECTED_COLOR, UNSELECTED_COLOR)
        self.label = Message(self, width="5i", text=message)

        self.QUIT.pack(side=BOTTOM, fill=BOTH)
        self.label.pack(side=BOTTOM, fill=X, expand=1)
        self.button.pack(side=BOTTOM, fill=X)
        self.draw.pack(side=LEFT)

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()

test = Test()
test.mainloop()
PK��ZQmatt/rubber-line-demo-1.pynu�[���from Tkinter import *

class Test(Frame):
    def printit(self):
        print "hi"

    def createWidgets(self):
        self.QUIT = Button(self, text='QUIT',
                                  background='red',
                                  foreground='white',
                                  height=3,
                                  command=self.quit)
        self.QUIT.pack(side=BOTTOM, fill=BOTH)

        self.canvasObject = Canvas(self, width="5i", height="5i")
        self.canvasObject.pack(side=LEFT)

    def mouseDown(self, event):
        # canvas x and y take the screen coords from the event and translate
        # them into the coordinate system of the canvas object
        self.startx = self.canvasObject.canvasx(event.x)
        self.starty = self.canvasObject.canvasy(event.y)

    def mouseMotion(self, event):
        # canvas x and y take the screen coords from the event and translate
        # them into the coordinate system of the canvas object
        x = self.canvasObject.canvasx(event.x)
        y = self.canvasObject.canvasy(event.y)

        if (self.startx != event.x)  and (self.starty != event.y) :
            self.canvasObject.delete(self.rubberbandLine)
            self.rubberbandLine = self.canvasObject.create_line(
                self.startx, self.starty, x, y)
            # this flushes the output, making sure that
            # the rectangle makes it to the screen
            # before the next event is handled
            self.update_idletasks()

    def __init__(self, master=None):
        Frame.__init__(self, master)
        Pack.config(self)
        self.createWidgets()
        # this is a "tagOrId" for the rectangle we draw on the canvas
        self.rubberbandLine = None
        Widget.bind(self.canvasObject, "<Button-1>", self.mouseDown)
        Widget.bind(self.canvasObject, "<Button1-Motion>", self.mouseMotion)


test = Test()

test.mainloop()
PK��ZR��۩�matt/menu-simple.pyonu�[����
��^c@s�ddlTd�Zd�Zd�Zd�Ze�Zeededd�Z	e	j
d	e�e�Ze�Z
e	jee
�ejd
�ejd�ej�dS(
i����(t*cCs	dGHdS(Nsopening new file((((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pytnew_file$scCs	dGHdS(Nsopening OLD file((((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pyt	open_file(scCs�ttdddd�}|jdtdd�t|�|_|jjdd	ddd
t�|jjddddd
t�|jjddddd
d
�|j|d<|S(NttexttFilet	underlineitsidetpadxt1mtlabelsNew...tcommandsOpen...tQuittexittmenu(	t
MenubuttontmBartpacktLEFTtMenuR
tadd_commandRR(tFile_button((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pytmakeFileMenu,s
cCs�ttdddd�}|jdtdd�t|�|_|jjdd	d
�|jjddt�|jj	d	d
�|jj	d	d�|jj	d	d�|j|d<|S(NRtEditRiRRRR
R	tUndoitstatetCuttCopytPasteR
(
RRRRRR
taddtentryconfigtDISABLEDR(tEdit_button((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pytmakeEditMenuFs
trelieftborderwidthitfills	menu demotpackerN(tTkinterRRRR tTktroottFrametRAISEDRRtXRRt
tk_menuBarttitleticonnametmainloop(((s5/usr/lib64/python2.7/Demo/tkinter/matt/menu-simple.pyt<module>s
#							

PK��Z4+���matt/two-radio-groups.pyonu�[����
��^c@s�ddlTd�Zd�Zd�Ze�Zeededd�Zej	de
�e�Ze
�Zee�Zee�Zejee�eed	d
ddd
e�Zej	de�ejd�ejd�ej�dS(i����(t*cCs�ttdddd�}|jdtdd�t|�|_|jjdd	d
|dd�|jjd
idd6|d
6dd6�|jjd
idd6|d
6dd6�|jd�|j|d<|S(NttextsPolitical Partyt	underlineitsidetpadxt2mtlabelt
RepublicantvariabletvalueitradiobuttontDemocratitLibertarianitmenu(	t
MenubuttontmBartpacktLEFTtMenuR
tadd_radiobuttontaddtset(tvartRadiobutton_button((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pytmakePoliticalPartiess	


cCs�ttdddd�}|jdtdd�t|�|_|jjdd	d
|dd	�|jjddd
|dd�|jjdd
d
|dd
�|jd�|j|d<|S(NRtFlavorsRiRRRRt
StrawberryRR	t	Chocolates
Rocky RoadR
(RRRRRR
RR(RR((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pytmakeFlavors2s	




cCs#dGtj�GHdGtj�GHHdS(Nsparty iss	flavor is(tpartytgettflavor(((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pyt
printStuffMstrelieftborderwidthitfillRsprint party and flavort
foregroundtredtcommandRs	menu demoN(tTkinterRRR tTktroottFrametRAISEDRRtXtIntVarRt	StringVarRRtRadiobutton_button2t
tk_menuBartButtontbtTOPttitleticonnametmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/matt/two-radio-groups.pyt<module>s"
							

PK��Z#U����matt/entry-simple.pynu�[���from Tkinter import *
import string

# This program  shows how to use a simple type-in box

class App(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()

        self.entrythingy = Entry()
        self.entrythingy.pack()

        # and here we get a callback when the user hits return. we could
        # make the key that triggers the callback anything we wanted to.
        # other typical options might be <Key-Tab> or <Key> (for anything)
        self.entrythingy.bind('<Key-Return>', self.print_contents)

    def print_contents(self, event):
        print "hi. contents of entry is now ---->", self.entrythingy.get()

root = App()
root.master.title("Foo")
root.mainloop()
PK��Z��$&$&ttk/ttkcalendar.pycnu�[����
��^c@s{dZddlZddlZddlZddlZd�Zdejfd��YZd�Ze	dkrwe�ndS(sQ
Simple calendar using ttk Treeview together with calendar and datetime
classes.
i����NcCs-|dkrtj|�Stj||�SdS(N(tNonetcalendartTextCalendartLocaleTextCalendar(tlocaletfwday((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pytget_calendar
s
tCalendarcBs�eZejjZejjZdd�Zd�Zd�Zd�Z	d�Z
d�Zd�Zd�Z
d�Zd	�Zd
�Zd�Zd�Zed
��ZRS(c
KsY|jdtj�}|jd|jj�j�}|jd|jj�j�}|jdd�}|jdd�}|jdd�}|j||d	�|_d|_	t
jj|||�t
||�|_|j�|j�|j�|j||�gtd
�D]!}	|jjddd
d�^q|_|j�|jjd|j�dS(s�
        WIDGET-SPECIFIC OPTIONS

            locale, firstweekday, year, month, selectbackground,
            selectforeground
        tfirstweekdaytyeartmonthRtselectbackgrounds#ecffc4tselectforegrounds#05640eiittendtvaluess<Map>N(tpopRtMONDAYtdatetimetnowR	R
Rt_datet
_selectiontttktFramet__init__Rt_calt_Calendar__setup_stylest_Calendar__place_widgetst_Calendar__config_calendart_Calendar__setup_selectiontranget	_calendartinsertt_itemst_build_calendartbindt_Calendar__minsize(
tselftmastertkwRR	R
Rtsel_bgtsel_fgt_((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRs$	


4
cCs�|dkrtd|��n]|dkr;||jd<nA|dkrf|jj|jjd|�ntjj|||�dS(	NR	R
sattribute '%s' is not writeableRt
backgroundRtitem(R	R
(tAttributeErrort_canvast
itemconfigurettextRRt__setitem__(R%R,tvalue((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR1<scCs�|dkrt|j|�S|dkr3|jdS|dkrX|jj|jjd�Stjitjj||�|6�}||SdS(NR	R
RR+Rtfill(R	R
(	tgetattrRR.titemcgetR0Rt
tclobjs_to_pyRt__getitem__(R%R,tr((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR7Fs%cCsKtj|j�}d�}|jd|d��|jd|d��dS(NcSs!did|dfgd6fgS(NsButton.focussButton.%sarrowtchildren(R(tdir((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt<lambda>Tss	L.TButtontlefts	R.TButtontright(RtStyleR&tlayout(R%tstyletarrow_layout((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__setup_stylesQs	c	Cs&tj|�}tj|ddd|j�}tj|ddd|j�}tj|dddd�|_tjd	d
ddd
d�|_|j	d|dddddd�|j
d|�|jj
d|dddddd�|j
d|dddd�|jj	d|dddddd�dS(NR@s	L.TButtontcommands	R.TButtontwidthitanchortcentertshowR
t
selectmodetnonetheightitin_tsidettoptpadyitcolumnitrowitpadxiitexpandR3tbothtbottom(RRtButtont_prev_montht_next_monthtLabelt_headertTreeviewRtpacktgrid(R%thframetlbtntrbtn((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__place_widgetsZs!"%c	s�|jjd�j�}||jd<|jjddd�|jjddd|d	d�tj��t�fd
�|D��}x0|D](}|jj	|d|d|d
d�q�WdS(NitcolumnstheaderR+tgrey90R
RRttagc3s|]}�j|�VqdS(N(tmeasure(t.0tcol(tfont(s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pys	<genexpr>qsRDtminwidthREte(
RtformatweekheadertsplitRt
tag_configureR ttkFonttFonttmaxRO(R%tcolstmaxwidthRg((Rhs4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__config_calendarjs

cs�tj�|_tj|jd|dddd�|_��jddd|dd��_�j	d�fd	��|jj	d
�fd��|jj	d|j
�dS(NR+tborderwidthithighlightthicknessR3REtws<ButtonPress-1>cs
�j�S(N(tplace_forget(tevt(tcanvas(s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR;|R
s<Configure>cs
�j�S(N(Rw(Rx(Ry(s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR;}R
(RnRot_fonttTkintertCanvasRR.tcreate_textR0R#t_pressed(R%R(R)((Rys4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__setup_selectionvs!cCsN|jjj�jd�\}}||jd� }|jjj||�dS(Ntxt+(RR&tgeometryRltindextminsize(R%RxRDRJ((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt	__minsize�s!c
Cs�|jj|jj}}|jj||d�}|j�|jd<|jj||�}x~t|j	�D]m\}}|t
|�kr�||ng}g|D]}|r�d|nd^q�}	|jj|d|	�qiWdS(NiR0s%02dR
R(
RR	R
RtformatmonthnamettitleRYtmonthdayscalendart	enumerateR!tlenRR,(
R%R	R
RbtcaltindxR,tweektdaytfmt_week((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR"�s")c	Cs�|\}}}}|jj|�}|j}|jd|d|�|j|j|||dd�|j|jd|�|jd|jd|d|�d	S(
s%Configure canvas for a new selection.RDRJiiR0RKR�tyN(	RzReR.t	configuretcoordsR0R/tplaceR(	R%R0tbboxR�R�RDRJttextwRy((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt_show_selection�s	"c
Cs�|j|j|j}}}|j|�}|j|�}|sQ||jkrUdS|j|�d}t|�sxdS|t|d�d}|s�dS|j	||�}	|	s�dSd|}|||f|_
|j||	�dS(s"Clicked somewhere in the calendar.NRis%02d(R�R�twidgettidentify_rowtidentify_columnR!R,R�tintR�RR�(
R%RxR�R�R�R,ROtitem_valuesR0R�((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR~�s"
cCs[|jj�|j|jdd�|_|j|jj|jjd�|_|j�dS(s,Updated calendar to show the previous month.tdaysiN(R.RwRt	timedeltaRR	R
R"(R%((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRV�s
$cCs�|jj�|jj|jj}}|j|jdtj||�dd�|_|j|jj|jjd�|_|j	�dS(s'Update calendar to show the next month.R�iN(
R.RwRR	R
R�Rt
monthrangeRR"(R%R	R
((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRW�s
!$cCsF|js
dS|jj|jj}}|j||t|jd��S(s9Return a datetime representing the current selected date.iN(RRRR	R
RR�(R%R	R
((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt	selection�s	N(t__name__t
__module__RRR�RRR1R7RRRRR$R"R�R~RVRWtpropertyR�(((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRs %	
						
						cCs�ddl}tj�}|jd�tdtj�}|jdddd�d|jkrxt	j
�}|jd	�n|j�dS(
Ni����sTtk CalendarRRRiR3RStwintclam(
tsysR{tTkR�RRtSUNDAYR[tplatformRR>t	theme_usetmainloop(R�troottttkcalR@((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyttest�s
t__main__(
t__doc__RR{RnRRRRR�R�(((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt<module>s	�	
PK��Z��[���ttk/mac_searchentry.pynu�[���"""Mac style search widget

Translated from Tcl code by Schelte Bron, http://wiki.tcl.tk/18188
"""
import Tkinter
import ttk

root = Tkinter.Tk()

data = """
R0lGODlhKgAaAOfnAFdZVllbWFpcWVtdWlxeW11fXF9hXmBiX2ZnZWhpZ2lraGxua25wbXJ0
cXR2c3V3dHZ4dXh6d3x+e31/fH6AfYSGg4eJhoiKh4qMiYuNio2PjHmUqnqVq3yXrZGTkJKU
kX+asJSWk32cuJWXlIGcs5aYlX6euZeZloOetZial4SftpqbmIWgt4GhvYahuIKivpudmYei
uYOjv5yem4ijuoSkwIWlwYmlu56gnYamwp+hnoenw4unvaCin4ioxJCnuZykrImpxZmlsoaq
zI2pv6KkoZGouoqqxpqms4erzaOloo6qwYurx5Kqu5untIiszqSmo5CrwoysyJeqtpOrvJyo
tZGsw42typSsvaaopZKtxJWtvp6qt4+uy6epppOuxZCvzKiqp5quuZSvxoyx06mrqJWwx42y
1JKxzpmwwaqsqZaxyI6z1ZqxwqutqpOzz4+01qyuq56yvpizypS00Jm0y5W10Zq1zJa20rCy
rpu3zqizwbGzr6C3yZy4z7K0saG4yp250LO1sqK5y5660Z+70qO7zKy4xaC806S8zba4taG9
1KW9zq66x6+7yLi6t6S/1rC8yrm7uLO8xLG9y7q8ubS9xabB2anB07K+zLW+xrO/za7CzrTA
zrjAyLXBz77BvbbC0K/G2LjD0bnE0rLK28TGw8bIxcLL07vP28HN28rMycvOyr/T38DU4cnR
2s/RztHT0NLU0cTY5MrW5MvX5dHX2c3Z59bY1dPb5Nbb3dLe7Nvd2t3f3NXh797g3d3j5dnl
9OPl4eTm4+Ln6tzo9uXn5Obo5eDp8efp5uHq8uXq7ejq5+nr6OPs9Ovu6unu8O3v6+vw8+7w
7ezx9O/x7vDy7/Hz8O/19/P18vT38/L3+fb49Pf59vX6/fj69/b7/vn7+Pr8+ff9//v9+vz/
+/7//P//////////////////////////////////////////////////////////////////
/////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJZAD/ACwC
AAIAKAAWAAAI/gD/CRz4bwUGCg8eQFjIsGHDBw4iTLAQgqBFgisuePCiyJOpUyBDihRpypMi
Lx8qaLhIMIyGFZ5sAUsmjZrNmzhzWpO2DJgtTysqfGDpxoMbW8ekeQsXzty4p1CjRjUXrps3
asJsuclQ4uKKSbamMR3n1JzZs2jRkh1HzuxVXX8y4CDYAwqua+DInVrRwMGJU2kDp31KThy1
XGWGDlxhi1rTPAUICBBAoEAesoIzn6Vm68MKgVAUHftmzhOCBCtQwQKSoABgzZnJdSMmyIPA
FbCotdUQAIhNa9B6DPCAGbZac+SowVIMRVe4pwkA4GpqDlwuAAmMZx4nTtfnf1mO5JEDNy46
MHJkxQEDgKC49rPjwC0bqGaZuOoZAKjBPE4NgAzUvYcWOc0QZF91imAnCDHJ5JFAAJN0I2Ba
4iRDUC/gOEVNDwIUcEABCAgAAATUTIgWOMBYRFp80ghiAQIIVAAEAwJIYI2JZnUji0XSYAYO
NcsQA8wy0hCTwAASXGOiONFcxAtpTokTHznfiLMNMAkcAMuE43jDC0vLeGOWe2R5o4sn1LgH
GzkWsvTPMgEOaA433Ag4TjjMuDkQMNi0tZ12sqWoJ0HATMPNffAZZ6U0wLAyqJ62RGoLLrhI
aqmlpzwaEAAh+QQJZAD/ACwAAAAAKgAaAAAI/gD/CRw40JEhQoEC+fGjcOHCMRAjRkxDsKLF
f5YcAcID582ZjyBDJhmZZIjJIUySEDHiBMhFghrtdNnRAgSHmzhz6sTZQcSLITx+CHn5bxSk
Nz5MCMGy55CjTVCjbuJEtSrVQ3uwqDBRQwrFi476SHHxow8qXcemVbPGtm21t3CnTaP27Jgu
VHtuiIjBsuImQkRiiEEFTNo2cOTMKV7MuLE5cN68QUOGSgwKG1EqJqJDY8+rZt8UjxtNunTj
cY3DgZOWS46KIFgGjiI0ZIsqaqNNjWjgYMUpx8Adc3v2aosNMAI1DbqyI9WycOb4IAggQEAB
A3lQBxet/TG4cMpI/tHwYeSfIzxM0uTKNs7UgAQrYL1akaDA7+3bueVqY4NJlUhIcQLNYx8E
AIQ01mwjTQ8DeNAdfouNA8440GBCQxJY3MEGD6p4Y844CQCAizcSgpMLAAlAuJ03qOyQRBR3
nEHEK+BMGKIui4kDDAAIPKiiYuSYSMQQRCDCxhiziPMYBgDkEaEaAGQA3Y+MjUPOLFoMoUUh
cKxRC4ngeILiH8Qkk0cCAUzSDZWpzbLEE1EwggcYqWCj2DNADFDAAQUgIAAAEFDDJmPYqNJF
F1s4cscTmCDjDTjdSPOHBQggUAEQDAgggTWDPoYMJkFoUdRmddyyjWLeULMMMcAsIw0x4wkM
IME1g25zyxpHxFYUHmyIggw4H4ojITnfiLMNMAkcAAub4BQjihRdDGTJHmvc4Qo1wD6Imje6
eILbj+BQ4wqu5Q3ECSJ0FOKKMtv4mBg33Pw4zjbKuBIIE1xYpIkhdQQiyi7OtAucj6dt48wu
otQhBRa6VvSJIRwhIkotvgRTzMUYZ6xxMcj4QkspeKDxxRhEmUfIHWjAgQcijEDissuXvCyz
zH7Q8YQURxDhUsn/bCInR3AELfTQZBRt9BBJkCGFFVhMwTNBlnBCSCGEIJQQIAklZMXWRBAR
RRRWENHwRQEBADs="""


s1 = Tkinter.PhotoImage("search1", data=data, format="gif -index 0")
s2 = Tkinter.PhotoImage("search2", data=data, format="gif -index 1")

style = ttk.Style()

style.element_create("Search.field", "image", "search1",
    ("focus", "search2"), border=[22, 7, 14], sticky="ew")

style.layout("Search.entry", [
    ("Search.field", {"sticky": "nswe", "border": 1, "children":
        [("Entry.padding", {"sticky": "nswe", "children":
            [("Entry.textarea", {"sticky": "nswe"})]
        })]
    })]
)

style.configure("Search.entry", background="#b2b2b2")

root.configure(background="#b2b2b2")

e1 = ttk.Entry(style="Search.entry", width=20)
e2 = ttk.Entry(style="Search.entry", width=20)

e1.grid(padx=10, pady=10)
e2.grid(padx=10, pady=10)

root.mainloop()
PK��Z|&C]��ttk/combo_themes.pycnu�[����
��^c@sNdZddlZdejfd��YZd�ZedkrJe�ndS(s�Ttk Theme Selector.

Although it is a theme selector, you won't notice many changes since
there is only a combobox and a frame around.
i����NtAppcBs#eZd�Zd�Zd�ZRS(cCs-tjj|�tj�|_|j�dS(N(tttktFramet__init__tStyletstylet_setup_widgets(tself((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyR	scCs5|jj�r1|jj�}|jj|�ndS(N(twidgettcurrenttgetRt	theme_use(Rteventtnewtheme((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyt
_change_themescCs�t|jj��}|jdd�tj|d|dddd�}|j|d�|jd|j�|j	d	d
�|j	d	ddd
�dS(NisPick a themetvalueststatetreadonlytheightis<<ComboboxSelected>>tfilltxtbothtexpandi(
tlistRttheme_namestinsertRtComboboxtsettbindRtpack(Rtthemestthemes_combo((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyRs	(t__name__t
__module__RRR(((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyRs		cCs't�}|jjd�|j�dS(NsTtk Combobox(Rtmasterttitletmainloop(tapp((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pytmain(s	t__main__(t__doc__RRRR&R (((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyt<module>s
 	PK��Z|&C]��ttk/combo_themes.pyonu�[����
��^c@sNdZddlZdejfd��YZd�ZedkrJe�ndS(s�Ttk Theme Selector.

Although it is a theme selector, you won't notice many changes since
there is only a combobox and a frame around.
i����NtAppcBs#eZd�Zd�Zd�ZRS(cCs-tjj|�tj�|_|j�dS(N(tttktFramet__init__tStyletstylet_setup_widgets(tself((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyR	scCs5|jj�r1|jj�}|jj|�ndS(N(twidgettcurrenttgetRt	theme_use(Rteventtnewtheme((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyt
_change_themescCs�t|jj��}|jdd�tj|d|dddd�}|j|d�|jd|j�|j	d	d
�|j	d	ddd
�dS(NisPick a themetvalueststatetreadonlytheightis<<ComboboxSelected>>tfilltxtbothtexpandi(
tlistRttheme_namestinsertRtComboboxtsettbindRtpack(Rtthemestthemes_combo((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyRs	(t__name__t
__module__RRR(((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyRs		cCs't�}|jjd�|j�dS(NsTtk Combobox(Rtmasterttitletmainloop(tapp((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pytmain(s	t__main__(t__doc__RRRR&R (((s5/usr/lib64/python2.7/Demo/tkinter/ttk/combo_themes.pyt<module>s
 	PK��ZRh�|@@ttk/listbox_scrollcmd.pyonu�[����
��^c@sWdZddlZddlZej�Zejdd�Zejdddddd	�ejd
ej	dd�Z
e
jed
<e
jdddddd�ejdddd�Z
e
jdddddd�ej�Zejdddddd�ejddd�ejddd�x(ed�D]Zejdde�q+Wej�dS(sWSample taken from: http://www.tkdocs.com/tutorial/morewidgets.html and
converted to Python, mainly to demonstrate xscrollcommand option.

grid [tk::listbox .l -yscrollcommand ".s set" -height 5] -column 0 -row 0 -sticky nwes
grid [ttk::scrollbar .s -command ".l yview" -orient vertical] -column 1 -row 0 -sticky ns
grid [ttk::label .stat -text "Status message here" -anchor w] -column 0 -row 1 -sticky we
grid [ttk::sizegrip .sz] -column 1 -row 1 -sticky se
grid columnconfigure . 0 -weight 1; grid rowconfigure . 0 -weight 1
for {set i 0} {$i<100} {incr i} {
   .l insert end "Line $i of 100"
   }
i����NtheightitcolumnitrowtstickytnwestcommandtorienttverticaltyscrollcommanditnsttextsStatus message heretanchortwtwetsetweightidtendsLine %d of 100(t__doc__tTkintertttktTktroottListboxtltgridt	ScrollbartyviewtstsettLabeltstattSizegriptsztgrid_columnconfiguretgrid_rowconfiguretrangetitinserttmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/ttk/listbox_scrollcmd.pyt<module>s"
PK��Zxa��##ttk/roundframe.pyonu�[����
��^c	@s�dZddlZddlZej�Zejddd�Zejddd�Zej�Z	e	j
dd	dd%ddd
d�e	jddidd
6fg�e	jddd�ej
dddd�Zejdd�ej
dddd�Zejdddd�ejedd�Zejdd�ejdd��ejdd��ejeddd d!d"d�Zejdddd�ejdd#��ejdd$��ej�dS(&shTtk Frame with rounded corners.

Based on an example by Bryan Oakley, found at: http://wiki.tcl.tk/20152i����NtframeFocusBordertdatas�
R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICZlizat3KtatX
rAsiCNDgtCJClQkoFMgqsu3ArBkoZDgA8uDJAwk4bGDmtm9BZgcYzK078m4D
Cgf4+l0skNkGCg3oUhR4d4GCDIoZM2ZWQMECyZQvLMggIbPmzQIyfCZ5YcME
AwFMn/bLLIKBCRtMHljQQcDV2ZqZTRDQYfWFAwMqUJANvC8zBhUWbDi5YUAB
Bsybt2VGoUKH3AcmdP+Im127xOcJih+oXsEDdvOLuQfIMGBD9QwBlsOnzcBD
hfrsuVfefgzJR599A+CnH4Hb9fcfgu29x6BIBgKYYH4DTojQc/5ZGGGGGhpU
IYIKghgiQRw+GKCEJxZIwXwWlthiQyl6KOCMLsJIIoY4LlQjhDf2mNCI9/Eo
5IYO2sjikX+9eGCRCzL5V5JALillY07GaOSVb1G5ookzEnlhlFx+8OOXZb6V
5Y5kcnlmckGmKaaMaZrpJZxWXjnnlmW++WGdZq5ZXQEetKmnlxPgl6eUYhJq
KKOI0imnoNbF2ScFHQJJwW99TsBAAAVYWEAAHEQAZoi1cQDqAAeEV0EACpT/
JqcACgRQAW6uNWCbYKcyyEwGDBgQwa2tTlBBAhYIQMFejC5AgQAWJNDABK3y
loEDEjCgV6/aOcYBAwp4kIF6rVkXgAEc8IQZVifCBRQHGqya23HGIpsTBgSU
OsFX/PbrVVjpYsCABA4kQCxHu11ogAQUIOAwATpBLDFQFE9sccUYS0wAxD5h
4DACFEggbAHk3jVBA/gtTIHHEADg8sswxyzzzDQDAAEECGAQsgHiTisZResN
gLIHBijwLQEYePzx0kw37fTSSjuMr7ZMzfcgYZUZi58DGsTKwbdgayt22GSP
bXbYY3MggQIaONDzAJ8R9kFlQheQQAAOWGCAARrwdt23Bn8H7vfggBMueOEG
WOBBAAkU0EB9oBGUdXIFZJBABAEEsPjmmnfO+eeeh/55BBEk0Ph/E8Q9meQq
bbDABAN00EADFRRQ++2254777rr3jrvjFTTQwQCpz7u6QRut5/oEzA/g/PPQ
Ry/99NIz//oGrZpUUEAAOw==tframeBorders�
R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICkVgHLoggQIPT
ighVJqBQIKvZghkoZDgA8uDJAwk4bDhLd+ABBmvbjnzbgMKBuoA/bKDQgC1F
gW8XKMgQOHABBQsMI76wIIOExo0FZIhM8sKGCQYCYA4cwcCEDSYPLOgg4Oro
uhMEdOB84cCAChReB2ZQYcGGkxsGFGCgGzCFCh1QH5jQIW3xugwSzD4QvIIH
4s/PUgiQYcCG4BkC5P/ObpaBhwreq18nb3Z79+8Dwo9nL9I8evjWsdOX6D59
fPH71Xeef/kFyB93/sln4EP2Ebjegg31B5+CEDLUIH4PVqiQhOABqKFCF6qn
34cHcfjffCQaFOJtGaZYkIkUuljQigXK+CKCE3po40A0trgjjDru+EGPI/6I
Y4co7kikkAMBmaSNSzL5gZNSDjkghkXaaGIBHjwpY4gThJeljFt2WSWYMQpZ
5pguUnClehS4tuMEDARQgH8FBMBBBExGwIGdAxywXAUBKHCZkAIoEEAFp33W
QGl47ZgBAwZEwKigE1SQgAUCUDCXiwtQIIAFCTQwgaCrZeCABAzIleIGHDD/
oIAHGUznmXABGMABT4xpmBYBHGgAKGq1ZbppThgAG8EEAW61KwYMSOBAApdy
pNp/BkhAAQLcEqCTt+ACJW645I5rLrgEeOsTBtwiQIEElRZg61sTNBBethSw
CwEA/Pbr778ABywwABBAgAAG7xpAq6mGUUTdAPZ6YIACsRKAAbvtZqzxxhxn
jDG3ybbKFHf36ZVYpuE5oIGhHMTqcqswvyxzzDS/HDMHEiiggQMLDxCZXh8k
BnEBCQTggAUGGKCB0ktr0PTTTEfttNRQT22ABR4EkEABDXgnGUEn31ZABglE
EEAAWaeN9tpqt832221HEEECW6M3wc+Hga3SBgtMODBABw00UEEBgxdO+OGG
J4744oZzXUEDHQxwN7F5G7QRdXxPoPkAnHfu+eeghw665n1vIKhJBQUEADs=tRoundedFrametimagetfocustborderitstickytnsewtTEntrytborderwidthitstyletpaddingi
tfilltxtbothtexpandittexttTests	<FocusIn>cCstjdg�S(NR(tframetstate(tevt((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyt<lambda>gts
<FocusOut>cCstjdg�S(Ns!focus(RR(R((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyRhRtbgtwhitethighlightthicknesscCstjdg�S(NR(tframe2R(R((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyRlRcCstjdg�S(Ns!focus(RR(R((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyRmR(RR(t__doc__tTkintertttktTktroott
PhotoImagetimg1timg2tStyleRtelement_createtlayoutt	configuretFrameRtpackRtEntrytentrytbindtTextRtmainloop(((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyt<module>s2&	$	 !PK��Z�/
QQttk/combo_themes.pynu�[���"""Ttk Theme Selector.

Although it is a theme selector, you won't notice many changes since
there is only a combobox and a frame around.
"""
import ttk

class App(ttk.Frame):
    def __init__(self):
        ttk.Frame.__init__(self)

        self.style = ttk.Style()
        self._setup_widgets()

    def _change_theme(self, event):
        if event.widget.current(): # value #0 is not a theme
            newtheme = event.widget.get()
            # change to the new theme and refresh all the widgets
            self.style.theme_use(newtheme)

    def _setup_widgets(self):
        themes = list(self.style.theme_names())
        themes.insert(0, "Pick a theme")
        # Create a readonly Combobox which will display 4 values at max,
        # which will cause it to create a scrollbar if there are more
        # than 4 values in total.
        themes_combo = ttk.Combobox(self, values=themes, state="readonly",
                                    height=4)
        themes_combo.set(themes[0]) # sets the combobox value to "Pick a theme"
        # Combobox widget generates a <<ComboboxSelected>> virtual event
        # when the user selects an element. This event is generated after
        # the listbox is unposted (after you select an item, the combobox's
        # listbox disappears, then it is said that listbox is now unposted).
        themes_combo.bind("<<ComboboxSelected>>", self._change_theme)
        themes_combo.pack(fill='x')

        self.pack(fill='both', expand=1)


def main():
    app = App()
    app.master.title("Ttk Combobox")
    app.mainloop()

if __name__ == "__main__":
    main()
PK��ZRh�|@@ttk/listbox_scrollcmd.pycnu�[����
��^c@sWdZddlZddlZej�Zejdd�Zejdddddd	�ejd
ej	dd�Z
e
jed
<e
jdddddd�ejdddd�Z
e
jdddddd�ej�Zejdddddd�ejddd�ejddd�x(ed�D]Zejdde�q+Wej�dS(sWSample taken from: http://www.tkdocs.com/tutorial/morewidgets.html and
converted to Python, mainly to demonstrate xscrollcommand option.

grid [tk::listbox .l -yscrollcommand ".s set" -height 5] -column 0 -row 0 -sticky nwes
grid [ttk::scrollbar .s -command ".l yview" -orient vertical] -column 1 -row 0 -sticky ns
grid [ttk::label .stat -text "Status message here" -anchor w] -column 0 -row 1 -sticky we
grid [ttk::sizegrip .sz] -column 1 -row 1 -sticky se
grid columnconfigure . 0 -weight 1; grid rowconfigure . 0 -weight 1
for {set i 0} {$i<100} {incr i} {
   .l insert end "Line $i of 100"
   }
i����NtheightitcolumnitrowtstickytnwestcommandtorienttverticaltyscrollcommanditnsttextsStatus message heretanchortwtwetsetweightidtendsLine %d of 100(t__doc__tTkintertttktTktroottListboxtltgridt	ScrollbartyviewtstsettLabeltstattSizegriptsztgrid_columnconfiguretgrid_rowconfiguretrangetitinserttmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/ttk/listbox_scrollcmd.pyt<module>s"
PK��Z�8�~ ~ ttk/ttkcalendar.pynu�[���"""
Simple calendar using ttk Treeview together with calendar and datetime
classes.
"""
import calendar
import Tkinter
import tkFont
import ttk

def get_calendar(locale, fwday):
    # instantiate proper calendar class
    if locale is None:
        return calendar.TextCalendar(fwday)
    else:
        return calendar.LocaleTextCalendar(fwday, locale)

class Calendar(ttk.Frame):
    # XXX ToDo: cget and configure

    datetime = calendar.datetime.datetime
    timedelta = calendar.datetime.timedelta

    def __init__(self, master=None, **kw):
        """
        WIDGET-SPECIFIC OPTIONS

            locale, firstweekday, year, month, selectbackground,
            selectforeground
        """
        # remove custom options from kw before initializating ttk.Frame
        fwday = kw.pop('firstweekday', calendar.MONDAY)
        year = kw.pop('year', self.datetime.now().year)
        month = kw.pop('month', self.datetime.now().month)
        locale = kw.pop('locale', None)
        sel_bg = kw.pop('selectbackground', '#ecffc4')
        sel_fg = kw.pop('selectforeground', '#05640e')

        self._date = self.datetime(year, month, 1)
        self._selection = None # no date selected

        ttk.Frame.__init__(self, master, **kw)

        self._cal = get_calendar(locale, fwday)

        self.__setup_styles()       # creates custom styles
        self.__place_widgets()      # pack/grid used widgets
        self.__config_calendar()    # adjust calendar columns and setup tags
        # configure a canvas, and proper bindings, for selecting dates
        self.__setup_selection(sel_bg, sel_fg)

        # store items ids, used for insertion later
        self._items = [self._calendar.insert('', 'end', values='')
                            for _ in range(6)]
        # insert dates in the currently empty calendar
        self._build_calendar()

        # set the minimal size for the widget
        self._calendar.bind('<Map>', self.__minsize)

    def __setitem__(self, item, value):
        if item in ('year', 'month'):
            raise AttributeError("attribute '%s' is not writeable" % item)
        elif item == 'selectbackground':
            self._canvas['background'] = value
        elif item == 'selectforeground':
            self._canvas.itemconfigure(self._canvas.text, item=value)
        else:
            ttk.Frame.__setitem__(self, item, value)

    def __getitem__(self, item):
        if item in ('year', 'month'):
            return getattr(self._date, item)
        elif item == 'selectbackground':
            return self._canvas['background']
        elif item == 'selectforeground':
            return self._canvas.itemcget(self._canvas.text, 'fill')
        else:
            r = ttk.tclobjs_to_py({item: ttk.Frame.__getitem__(self, item)})
            return r[item]

    def __setup_styles(self):
        # custom ttk styles
        style = ttk.Style(self.master)
        arrow_layout = lambda dir: (
            [('Button.focus', {'children': [('Button.%sarrow' % dir, None)]})]
        )
        style.layout('L.TButton', arrow_layout('left'))
        style.layout('R.TButton', arrow_layout('right'))

    def __place_widgets(self):
        # header frame and its widgets
        hframe = ttk.Frame(self)
        lbtn = ttk.Button(hframe, style='L.TButton', command=self._prev_month)
        rbtn = ttk.Button(hframe, style='R.TButton', command=self._next_month)
        self._header = ttk.Label(hframe, width=15, anchor='center')
        # the calendar
        self._calendar = ttk.Treeview(show='', selectmode='none', height=7)

        # pack the widgets
        hframe.pack(in_=self, side='top', pady=4, anchor='center')
        lbtn.grid(in_=hframe)
        self._header.grid(in_=hframe, column=1, row=0, padx=12)
        rbtn.grid(in_=hframe, column=2, row=0)
        self._calendar.pack(in_=self, expand=1, fill='both', side='bottom')

    def __config_calendar(self):
        cols = self._cal.formatweekheader(3).split()
        self._calendar['columns'] = cols
        self._calendar.tag_configure('header', background='grey90')
        self._calendar.insert('', 'end', values=cols, tag='header')
        # adjust its columns width
        font = tkFont.Font()
        maxwidth = max(font.measure(col) for col in cols)
        for col in cols:
            self._calendar.column(col, width=maxwidth, minwidth=maxwidth,
                anchor='e')

    def __setup_selection(self, sel_bg, sel_fg):
        self._font = tkFont.Font()
        self._canvas = canvas = Tkinter.Canvas(self._calendar,
            background=sel_bg, borderwidth=0, highlightthickness=0)
        canvas.text = canvas.create_text(0, 0, fill=sel_fg, anchor='w')

        canvas.bind('<ButtonPress-1>', lambda evt: canvas.place_forget())
        self._calendar.bind('<Configure>', lambda evt: canvas.place_forget())
        self._calendar.bind('<ButtonPress-1>', self._pressed)

    def __minsize(self, evt):
        width, height = self._calendar.master.geometry().split('x')
        height = height[:height.index('+')]
        self._calendar.master.minsize(width, height)

    def _build_calendar(self):
        year, month = self._date.year, self._date.month

        # update header text (Month, YEAR)
        header = self._cal.formatmonthname(year, month, 0)
        self._header['text'] = header.title()

        # update calendar shown dates
        cal = self._cal.monthdayscalendar(year, month)
        for indx, item in enumerate(self._items):
            week = cal[indx] if indx < len(cal) else []
            fmt_week = [('%02d' % day) if day else '' for day in week]
            self._calendar.item(item, values=fmt_week)

    def _show_selection(self, text, bbox):
        """Configure canvas for a new selection."""
        x, y, width, height = bbox

        textw = self._font.measure(text)

        canvas = self._canvas
        canvas.configure(width=width, height=height)
        canvas.coords(canvas.text, width - textw, height / 2 - 1)
        canvas.itemconfigure(canvas.text, text=text)
        canvas.place(in_=self._calendar, x=x, y=y)

    # Callbacks

    def _pressed(self, evt):
        """Clicked somewhere in the calendar."""
        x, y, widget = evt.x, evt.y, evt.widget
        item = widget.identify_row(y)
        column = widget.identify_column(x)

        if not column or not item in self._items:
            # clicked in the weekdays row or just outside the columns
            return

        item_values = widget.item(item)['values']
        if not len(item_values): # row is empty for this month
            return

        text = item_values[int(column[1]) - 1]
        if not text: # date is empty
            return

        bbox = widget.bbox(item, column)
        if not bbox: # calendar not visible yet
            return

        # update and then show selection
        text = '%02d' % text
        self._selection = (text, item, column)
        self._show_selection(text, bbox)

    def _prev_month(self):
        """Updated calendar to show the previous month."""
        self._canvas.place_forget()

        self._date = self._date - self.timedelta(days=1)
        self._date = self.datetime(self._date.year, self._date.month, 1)
        self._build_calendar() # reconstruct calendar

    def _next_month(self):
        """Update calendar to show the next month."""
        self._canvas.place_forget()

        year, month = self._date.year, self._date.month
        self._date = self._date + self.timedelta(
            days=calendar.monthrange(year, month)[1] + 1)
        self._date = self.datetime(self._date.year, self._date.month, 1)
        self._build_calendar() # reconstruct calendar

    # Properties

    @property
    def selection(self):
        """Return a datetime representing the current selected date."""
        if not self._selection:
            return None

        year, month = self._date.year, self._date.month
        return self.datetime(year, month, int(self._selection[0]))

def test():
    import sys
    root = Tkinter.Tk()
    root.title('Ttk Calendar')
    ttkcal = Calendar(firstweekday=calendar.SUNDAY)
    ttkcal.pack(expand=1, fill='both')

    if 'win' not in sys.platform:
        style = ttk.Style()
        style.theme_use('clam')

    root.mainloop()

if __name__ == '__main__':
    test()
PK��Z�O���ttk/dirbrowser.pyonu�[����
��^c	@s�dZddlZddlZddlZddlZd�Zd�Zd�Zd�Zd�Z	ej
�Zejdd	�Z
ejdd
�Zejdd)dddd�dd��Zeje
d<ejed<ejddddd�ejddddd�ejddddd�ee�ejde�ejd e�ejd!dd"dd#d$�e
jd!d%d"dd#d&�ejd!dd"d%d#d'�ejdd(d%�ejdd(d%�ej�dS(*s`A directory browser using Ttk Treeview.

Based on the demo found in Tk 8.5 library/demos/browse
i����Nc
	Cs�|j|d�dkrdS|j|d�}|j|j|��|j|�}|r_gntjd�tjd�}x1|tj|�D]}d}tjj	||�j
dd�}tjj|�r�d}ntjj|�r�d}ntjj
|�d	}|j|d
d|d||g�}|dkrs|dkr�|j|d
dd�|j|d|�q�q�|dkr�tj|�j}	|j|dd|	�q�q�WdS(Nttypet	directorytfullpatht.s..s\t/tfileitendttexttvaluesitdummytsizes%d bytes(Rs..(tsettdeletetget_childrentparenttglobtostlistdirtNonetpathtjointreplacetisdirtisfiletsplittinserttitemtstattst_size(
ttreetnodeRRtspecial_dirstptptypetfnametidR
((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt
populate_tree
s,(!		$cCsStjjd�jdd�}|jddd|d|dg�}t||�dS(	NRs\RtRRRR(RRtabspathRRR$(RtdirR((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pytpopulate_roots&s$cCs |j}t||j��dS(N(twidgetR$tfocus(teventR((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pytupdate_tree+s	cCs�|j}|j�}|j|�r�tjj|j|d��}tjj|�r�tj|�|j	|j
d��t|�q�ndS(NRR%(R)R*RRRR&RRtchdirRR
R((R+RRR((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt
change_dir/s	
cCs\t|�t|�}}|dkr>|dkr>|j�n
|j�|j||�dS(s"Hide and show scrollbar as needed.iiN(tfloattgrid_removetgridR(tsbartfirsttlast((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt
autoscroll9s


torienttverticalt
horizontaltcolumnsRRR
tdisplaycolumnstyscrollcommandcCstt||�S(N(R5tvsb(tftl((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt<lambda>HR%txscrollcommandcCstt||�S(N(R5thsb(R=R>((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyR?IR%tcommands#0RsDirectory Structuretanchortws	File Sizetstretchitwidthids<<TreeviewOpen>>s<Double-Button-1>tcolumntrowtstickytnsweitnstewtweight(RRR
(t__doc__RRtTkintertttkR$R(R,R.R5tTktroott	ScrollbarR<RAtTreeviewRtyviewtxviewtheadingRGtbindR1tgrid_columnconfiguretgrid_rowconfiguretmainloop(((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt<module>s:				
		


PK��Z#��ggttk/treeview_multicolumn.pyonu�[����
��^c@s�dZddlZddlZddlZd6Zd7d8d9d:d;d<d=d>d?d@dAdBdCdDdEgZd1�Zd2efd3��YZd4�Z	e
d5kr�e	�ndS(FsCDemo based on the demo mclist included with tk source distribution.i����Ntcountrytcapitaltcurrencyt	ArgentinasBuenos AirestARSt	AustraliatCanberratAUDtBraziltBraziliatBRLtCanadatOttawatCADtChinatBeijingtCNYtFrancetParistEURtGermanytBerlintIndias	New DelhitINRtItalytRometJapantTokyotJPYtMexicosMexico CitytMXNtRussiatMoscowtRUBsSouth AfricatPretoriatZARsUnited KingdomtLondontGBPs
United StatessWashington, D.C.tUSDcs�g�jd�D]}�j||�|f^q}|jd��x1t|�D]#\}}�j|dd|�qQW�j|d|��fd��dS(s/Sort tree contents when a column is clicked on.ttreverseitcommandcst�|t���S(N(tsortbytint(tcol(t
descendingttree(s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyt<lambda>%R'N(tget_childrentsettsortt	enumeratetmovetheading(R.R,R-tchildtdatatindxtitem((R-R.s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR*s4tAppcBs#eZd�Zd�Zd�ZRS(cCs!d|_|j�|j�dS(N(tNoneR.t_setup_widgetst_build_tree(tself((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyt__init__(s	
cCsetjdddddddd$dd�}|jd
d�tj�}|jd
ddt�tjdtdd�|_tjddd|jj	�}tjddd|jj
�}|jjd|jd|j�|jj
ddddddd|�|j
dd dddd!d|�|j
dddd dd"d|�|jdd#d �|jdd#d �dS(%Nt
wraplengtht4itjustifytlefttanchortntpaddingi
iittexts�Ttk is the new Tk themed widget set. One of the widgets it includes is a tree widget, which can be configured to display multiple columns of informational data without displaying the tree itself. This is a simple way to build a listbox that has multiple columns. Clicking on the heading for a column will sort the data by that column. You can also change the width of the columns by dragging the boundary between them.tfilltxtbothtexpandtcolumnstshowtheadingstorienttverticalR)t
horizontaltyscrollcommandtxscrollcommandtcolumnitrowtstickytnsewtin_itnstewtweight(i
ii
i(tttktLabeltpacktFrametTruetTreeviewttree_columnsR.t	Scrollbartyviewtxviewt	configureR1tgridtgrid_columnconfiguretgrid_rowconfigure(R>tmsgt	containertvsbthsb((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR<-s	%""c	s	xgtD]_}�jj|d|j�d|�fd���jj|dtj�j|j���qWx�tD]�}�jj	ddd|�xnt
|�D]`\}}tj�j|�}�jjt|dd�|kr��jjt|d|�q�q�WqqWdS(NRGR)cst�j|d�S(Ni(R*R.(tc(R>(s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR/MR'twidthR'tendtvalues(RbR.R5ttitleRTttkFonttFonttmeasuret	tree_datatinsertR3R;(R>R,R9R8tvaltilen((R>s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR=Js
/
"(t__name__t
__module__R?R<R=(((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR:'s		cCs�tj�}|jd�|jd�ddl}y|jd�Wn*tk
roddl}|jd�nXt	�}|j
�dS(NsMulti-Column Listtmclisti����s~/tile-themes/plastik/plastiks'plastik theme being used without images(tTkintertTktwm_titletwm_iconnamet
plastik_themetinstallt	ExceptiontwarningstwarnR:tmainloop(trootR�R�tapp((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pytmain[s


	t__main__(RRR(RsBuenos AiresR(RRR(RR	R
(RRR
(RRR(RRR(RRR(Rs	New DelhiR(RRR(RRR(RsMexico CityR(RR R!(sSouth AfricaR"R#(sUnited KingdomR$R%(s
United StatessWashington, D.C.R&(t__doc__R}RsR\RbRvR*tobjectR:R�Rz(((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyt<module>s0		4	PK��Z�-���ttk/listbox_scrollcmd.pynu�[���"""Sample taken from: http://www.tkdocs.com/tutorial/morewidgets.html and
converted to Python, mainly to demonstrate xscrollcommand option.

grid [tk::listbox .l -yscrollcommand ".s set" -height 5] -column 0 -row 0 -sticky nwes
grid [ttk::scrollbar .s -command ".l yview" -orient vertical] -column 1 -row 0 -sticky ns
grid [ttk::label .stat -text "Status message here" -anchor w] -column 0 -row 1 -sticky we
grid [ttk::sizegrip .sz] -column 1 -row 1 -sticky se
grid columnconfigure . 0 -weight 1; grid rowconfigure . 0 -weight 1
for {set i 0} {$i<100} {incr i} {
   .l insert end "Line $i of 100"
   }
"""
import Tkinter
import ttk

root = Tkinter.Tk()

l = Tkinter.Listbox(height=5)
l.grid(column=0, row=0, sticky='nwes')

s = ttk.Scrollbar(command=l.yview, orient='vertical')
l['yscrollcommand'] = s.set
s.grid(column=1, row=0, sticky="ns")

stat = ttk.Label(text="Status message here", anchor='w')
stat.grid(column=0, row=1, sticky='we')

sz = ttk.Sizegrip()
sz.grid(column=1, row=1, sticky='se')

root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

for i in range(100):
    l.insert('end', "Line %d of 100" % i)

root.mainloop()
PK��Z>���ttk/mac_searchentry.pyonu�[����
��^c
@sdZddlZddlZej�ZdZejddedd�Zejddedd	�Zej	�Z
e
jd
ddd!d
dddgdd�e
jdd
idd6dd
6didd6didd6fgd6fgd6fg�e
j
ddd�ej
dd�ejdddd�Zejdddd�Zejddd d�ejddd d�ej�dS("s\Mac style search widget

Translated from Tcl code by Schelte Bron, http://wiki.tcl.tk/18188
i����Ns�

R0lGODlhKgAaAOfnAFdZVllbWFpcWVtdWlxeW11fXF9hXmBiX2ZnZWhpZ2lraGxua25wbXJ0
cXR2c3V3dHZ4dXh6d3x+e31/fH6AfYSGg4eJhoiKh4qMiYuNio2PjHmUqnqVq3yXrZGTkJKU
kX+asJSWk32cuJWXlIGcs5aYlX6euZeZloOetZial4SftpqbmIWgt4GhvYahuIKivpudmYei
uYOjv5yem4ijuoSkwIWlwYmlu56gnYamwp+hnoenw4unvaCin4ioxJCnuZykrImpxZmlsoaq
zI2pv6KkoZGouoqqxpqms4erzaOloo6qwYurx5Kqu5untIiszqSmo5CrwoysyJeqtpOrvJyo
tZGsw42typSsvaaopZKtxJWtvp6qt4+uy6epppOuxZCvzKiqp5quuZSvxoyx06mrqJWwx42y
1JKxzpmwwaqsqZaxyI6z1ZqxwqutqpOzz4+01qyuq56yvpizypS00Jm0y5W10Zq1zJa20rCy
rpu3zqizwbGzr6C3yZy4z7K0saG4yp250LO1sqK5y5660Z+70qO7zKy4xaC806S8zba4taG9
1KW9zq66x6+7yLi6t6S/1rC8yrm7uLO8xLG9y7q8ubS9xabB2anB07K+zLW+xrO/za7CzrTA
zrjAyLXBz77BvbbC0K/G2LjD0bnE0rLK28TGw8bIxcLL07vP28HN28rMycvOyr/T38DU4cnR
2s/RztHT0NLU0cTY5MrW5MvX5dHX2c3Z59bY1dPb5Nbb3dLe7Nvd2t3f3NXh797g3d3j5dnl
9OPl4eTm4+Ln6tzo9uXn5Obo5eDp8efp5uHq8uXq7ejq5+nr6OPs9Ovu6unu8O3v6+vw8+7w
7ezx9O/x7vDy7/Hz8O/19/P18vT38/L3+fb49Pf59vX6/fj69/b7/vn7+Pr8+ff9//v9+vz/
+/7//P//////////////////////////////////////////////////////////////////
/////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJZAD/ACwC
AAIAKAAWAAAI/gD/CRz4bwUGCg8eQFjIsGHDBw4iTLAQgqBFgisuePCiyJOpUyBDihRpypMi
Lx8qaLhIMIyGFZ5sAUsmjZrNmzhzWpO2DJgtTysqfGDpxoMbW8ekeQsXzty4p1CjRjUXrps3
asJsuclQ4uKKSbamMR3n1JzZs2jRkh1HzuxVXX8y4CDYAwqua+DInVrRwMGJU2kDp31KThy1
XGWGDlxhi1rTPAUICBBAoEAesoIzn6Vm68MKgVAUHftmzhOCBCtQwQKSoABgzZnJdSMmyIPA
FbCotdUQAIhNa9B6DPCAGbZac+SowVIMRVe4pwkA4GpqDlwuAAmMZx4nTtfnf1mO5JEDNy46
MHJkxQEDgKC49rPjwC0bqGaZuOoZAKjBPE4NgAzUvYcWOc0QZF91imAnCDHJ5JFAAJN0I2Ba
4iRDUC/gOEVNDwIUcEABCAgAAATUTIgWOMBYRFp80ghiAQIIVAAEAwJIYI2JZnUji0XSYAYO
NcsQA8wy0hCTwAASXGOiONFcxAtpTokTHznfiLMNMAkcAMuE43jDC0vLeGOWe2R5o4sn1LgH
GzkWsvTPMgEOaA433Ag4TjjMuDkQMNi0tZ12sqWoJ0HATMPNffAZZ6U0wLAyqJ62RGoLLrhI
aqmlpzwaEAAh+QQJZAD/ACwAAAAAKgAaAAAI/gD/CRw40JEhQoEC+fGjcOHCMRAjRkxDsKLF
f5YcAcID582ZjyBDJhmZZIjJIUySEDHiBMhFghrtdNnRAgSHmzhz6sTZQcSLITx+CHn5bxSk
Nz5MCMGy55CjTVCjbuJEtSrVQ3uwqDBRQwrFi476SHHxow8qXcemVbPGtm21t3CnTaP27Jgu
VHtuiIjBsuImQkRiiEEFTNo2cOTMKV7MuLE5cN68QUOGSgwKG1EqJqJDY8+rZt8UjxtNunTj
cY3DgZOWS46KIFgGjiI0ZIsqaqNNjWjgYMUpx8Adc3v2aosNMAI1DbqyI9WycOb4IAggQEAB
A3lQBxet/TG4cMpI/tHwYeSfIzxM0uTKNs7UgAQrYL1akaDA7+3bueVqY4NJlUhIcQLNYx8E
AIQ01mwjTQ8DeNAdfouNA8440GBCQxJY3MEGD6p4Y844CQCAizcSgpMLAAlAuJ03qOyQRBR3
nEHEK+BMGKIui4kDDAAIPKiiYuSYSMQQRCDCxhiziPMYBgDkEaEaAGQA3Y+MjUPOLFoMoUUh
cKxRC4ngeILiH8Qkk0cCAUzSDZWpzbLEE1EwggcYqWCj2DNADFDAAQUgIAAAEFDDJmPYqNJF
F1s4cscTmCDjDTjdSPOHBQggUAEQDAgggTWDPoYMJkFoUdRmddyyjWLeULMMMcAsIw0x4wkM
IME1g25zyxpHxFYUHmyIggw4H4ojITnfiLMNMAkcAAub4BQjihRdDGTJHmvc4Qo1wD6Imje6
eILbj+BQ4wqu5Q3ECSJ0FOKKMtv4mBg33Pw4zjbKuBIIE1xYpIkhdQQiyi7OtAucj6dt48wu
otQhBRa6VvSJIRwhIkotvgRTzMUYZ6xxMcj4QkspeKDxxRhEmUfIHWjAgQcijEDissuXvCyz
zH7Q8YQURxDhUsn/bCInR3AELfTQZBRt9BBJkCGFFVhMwTNBlnBCSCGEIJQQIAklZMXWRBAR
RRRWENHwRQEBADs=tsearch1tdatatformatsgif -index 0tsearch2sgif -index 1sSearch.fieldtimagetfocustborderiiitstickytewsSearch.entrytnsweis
Entry.paddingsEntry.textareatchildrent
backgrounds#b2b2b2tstyletwidthitpadxi
tpady(RR(t__doc__tTkintertttktTktrootRt
PhotoImagets1ts2tStyleRtelement_createtlayoutt	configuretEntryte1te2tgridtmainloop(((s8/usr/lib64/python2.7/Demo/tkinter/ttk/mac_searchentry.pyt<module>s()	
+PK��Zy5�L��ttk/roundframe.pynu�[���"""Ttk Frame with rounded corners.

Based on an example by Bryan Oakley, found at: http://wiki.tcl.tk/20152"""
import Tkinter
import ttk

root = Tkinter.Tk()

img1 = Tkinter.PhotoImage("frameFocusBorder", data="""
R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICZlizat3KtatX
rAsiCNDgtCJClQkoFMgqsu3ArBkoZDgA8uDJAwk4bGDmtm9BZgcYzK078m4D
Cgf4+l0skNkGCg3oUhR4d4GCDIoZM2ZWQMECyZQvLMggIbPmzQIyfCZ5YcME
AwFMn/bLLIKBCRtMHljQQcDV2ZqZTRDQYfWFAwMqUJANvC8zBhUWbDi5YUAB
Bsybt2VGoUKH3AcmdP+Im127xOcJih+oXsEDdvOLuQfIMGBD9QwBlsOnzcBD
hfrsuVfefgzJR599A+CnH4Hb9fcfgu29x6BIBgKYYH4DTojQc/5ZGGGGGhpU
IYIKghgiQRw+GKCEJxZIwXwWlthiQyl6KOCMLsJIIoY4LlQjhDf2mNCI9/Eo
5IYO2sjikX+9eGCRCzL5V5JALillY07GaOSVb1G5ookzEnlhlFx+8OOXZb6V
5Y5kcnlmckGmKaaMaZrpJZxWXjnnlmW++WGdZq5ZXQEetKmnlxPgl6eUYhJq
KKOI0imnoNbF2ScFHQJJwW99TsBAAAVYWEAAHEQAZoi1cQDqAAeEV0EACpT/
JqcACgRQAW6uNWCbYKcyyEwGDBgQwa2tTlBBAhYIQMFejC5AgQAWJNDABK3y
loEDEjCgV6/aOcYBAwp4kIF6rVkXgAEc8IQZVifCBRQHGqya23HGIpsTBgSU
OsFX/PbrVVjpYsCABA4kQCxHu11ogAQUIOAwATpBLDFQFE9sccUYS0wAxD5h
4DACFEggbAHk3jVBA/gtTIHHEADg8sswxyzzzDQDAAEECGAQsgHiTisZResN
gLIHBijwLQEYePzx0kw37fTSSjuMr7ZMzfcgYZUZi58DGsTKwbdgayt22GSP
bXbYY3MggQIaONDzAJ8R9kFlQheQQAAOWGCAARrwdt23Bn8H7vfggBMueOEG
WOBBAAkU0EB9oBGUdXIFZJBABAEEsPjmmnfO+eeeh/55BBEk0Ph/E8Q9meQq
bbDABAN00EADFRRQ++2254777rr3jrvjFTTQwQCpz7u6QRut5/oEzA/g/PPQ
Ry/99NIz//oGrZpUUEAAOw==""")

img2 = Tkinter.PhotoImage("frameBorder", data="""
R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICkVgHLoggQIPT
ighVJqBQIKvZghkoZDgA8uDJAwk4bDhLd+ABBmvbjnzbgMKBuoA/bKDQgC1F
gW8XKMgQOHABBQsMI76wIIOExo0FZIhM8sKGCQYCYA4cwcCEDSYPLOgg4Oro
uhMEdOB84cCAChReB2ZQYcGGkxsGFGCgGzCFCh1QH5jQIW3xugwSzD4QvIIH
4s/PUgiQYcCG4BkC5P/ObpaBhwreq18nb3Z79+8Dwo9nL9I8evjWsdOX6D59
fPH71Xeef/kFyB93/sln4EP2Ebjegg31B5+CEDLUIH4PVqiQhOABqKFCF6qn
34cHcfjffCQaFOJtGaZYkIkUuljQigXK+CKCE3po40A0trgjjDru+EGPI/6I
Y4co7kikkAMBmaSNSzL5gZNSDjkghkXaaGIBHjwpY4gThJeljFt2WSWYMQpZ
5pguUnClehS4tuMEDARQgH8FBMBBBExGwIGdAxywXAUBKHCZkAIoEEAFp33W
QGl47ZgBAwZEwKigE1SQgAUCUDCXiwtQIIAFCTQwgaCrZeCABAzIleIGHDD/
oIAHGUznmXABGMABT4xpmBYBHGgAKGq1ZbppThgAG8EEAW61KwYMSOBAApdy
pNp/BkhAAQLcEqCTt+ACJW645I5rLrgEeOsTBtwiQIEElRZg61sTNBBethSw
CwEA/Pbr778ABywwABBAgAAG7xpAq6mGUUTdAPZ6YIACsRKAAbvtZqzxxhxn
jDG3ybbKFHf36ZVYpuE5oIGhHMTqcqswvyxzzDS/HDMHEiiggQMLDxCZXh8k
BnEBCQTggAUGGKCB0ktr0PTTTEfttNRQT22ABR4EkEABDXgnGUEn31ZABglE
EEAAWaeN9tpqt832221HEEECW6M3wc+Hga3SBgtMODBABw00UEEBgxdO+OGG
J4744oZzXUEDHQxwN7F5G7QRdXxPoPkAnHfu+eeghw665n1vIKhJBQUEADs=""")

style = ttk.Style()

style.element_create("RoundedFrame", "image", "frameBorder",
    ("focus", "frameFocusBorder"), border=16, sticky="nsew")

style.layout("RoundedFrame", [("RoundedFrame", {"sticky": "nsew"})])
style.configure("TEntry", borderwidth=0)

frame = ttk.Frame(style="RoundedFrame", padding=10)
frame.pack(fill='x')

frame2 = ttk.Frame(style="RoundedFrame", padding=10)
frame2.pack(fill='both', expand=1)

entry = ttk.Entry(frame, text='Test')
entry.pack(fill='x')
entry.bind("<FocusIn>", lambda evt: frame.state(["focus"]))
entry.bind("<FocusOut>", lambda evt: frame.state(["!focus"]))

text = Tkinter.Text(frame2, borderwidth=0, bg="white", highlightthickness=0)
text.pack(fill='both', expand=1)
text.bind("<FocusIn>", lambda evt: frame2.state(["focus"]))
text.bind("<FocusOut>", lambda evt: frame2.state(["!focus"]))

root.mainloop()
PK��Z#��ggttk/treeview_multicolumn.pycnu�[����
��^c@s�dZddlZddlZddlZd6Zd7d8d9d:d;d<d=d>d?d@dAdBdCdDdEgZd1�Zd2efd3��YZd4�Z	e
d5kr�e	�ndS(FsCDemo based on the demo mclist included with tk source distribution.i����Ntcountrytcapitaltcurrencyt	ArgentinasBuenos AirestARSt	AustraliatCanberratAUDtBraziltBraziliatBRLtCanadatOttawatCADtChinatBeijingtCNYtFrancetParistEURtGermanytBerlintIndias	New DelhitINRtItalytRometJapantTokyotJPYtMexicosMexico CitytMXNtRussiatMoscowtRUBsSouth AfricatPretoriatZARsUnited KingdomtLondontGBPs
United StatessWashington, D.C.tUSDcs�g�jd�D]}�j||�|f^q}|jd��x1t|�D]#\}}�j|dd|�qQW�j|d|��fd��dS(s/Sort tree contents when a column is clicked on.ttreverseitcommandcst�|t���S(N(tsortbytint(tcol(t
descendingttree(s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyt<lambda>%R'N(tget_childrentsettsortt	enumeratetmovetheading(R.R,R-tchildtdatatindxtitem((R-R.s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR*s4tAppcBs#eZd�Zd�Zd�ZRS(cCs!d|_|j�|j�dS(N(tNoneR.t_setup_widgetst_build_tree(tself((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyt__init__(s	
cCsetjdddddddd$dd�}|jd
d�tj�}|jd
ddt�tjdtdd�|_tjddd|jj	�}tjddd|jj
�}|jjd|jd|j�|jj
ddddddd|�|j
dd dddd!d|�|j
dddd dd"d|�|jdd#d �|jdd#d �dS(%Nt
wraplengtht4itjustifytlefttanchortntpaddingi
iittexts�Ttk is the new Tk themed widget set. One of the widgets it includes is a tree widget, which can be configured to display multiple columns of informational data without displaying the tree itself. This is a simple way to build a listbox that has multiple columns. Clicking on the heading for a column will sort the data by that column. You can also change the width of the columns by dragging the boundary between them.tfilltxtbothtexpandtcolumnstshowtheadingstorienttverticalR)t
horizontaltyscrollcommandtxscrollcommandtcolumnitrowtstickytnsewtin_itnstewtweight(i
ii
i(tttktLabeltpacktFrametTruetTreeviewttree_columnsR.t	Scrollbartyviewtxviewt	configureR1tgridtgrid_columnconfiguretgrid_rowconfigure(R>tmsgt	containertvsbthsb((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR<-s	%""c	s	xgtD]_}�jj|d|j�d|�fd���jj|dtj�j|j���qWx�tD]�}�jj	ddd|�xnt
|�D]`\}}tj�j|�}�jjt|dd�|kr��jjt|d|�q�q�WqqWdS(NRGR)cst�j|d�S(Ni(R*R.(tc(R>(s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR/MR'twidthR'tendtvalues(RbR.R5ttitleRTttkFonttFonttmeasuret	tree_datatinsertR3R;(R>R,R9R8tvaltilen((R>s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR=Js
/
"(t__name__t
__module__R?R<R=(((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyR:'s		cCs�tj�}|jd�|jd�ddl}y|jd�Wn*tk
roddl}|jd�nXt	�}|j
�dS(NsMulti-Column Listtmclisti����s~/tile-themes/plastik/plastiks'plastik theme being used without images(tTkintertTktwm_titletwm_iconnamet
plastik_themetinstallt	ExceptiontwarningstwarnR:tmainloop(trootR�R�tapp((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pytmain[s


	t__main__(RRR(RsBuenos AiresR(RRR(RR	R
(RRR
(RRR(RRR(RRR(Rs	New DelhiR(RRR(RRR(RsMexico CityR(RR R!(sSouth AfricaR"R#(sUnited KingdomR$R%(s
United StatessWashington, D.C.R&(t__doc__R}RsR\RbRvR*tobjectR:R�Rz(((s=/usr/lib64/python2.7/Demo/tkinter/ttk/treeview_multicolumn.pyt<module>s0		4	PK��Zn�nF�	�	ttk/notebook_closebtn.pynu�[���"""A Ttk Notebook with close buttons.

Based on an example by patthoyts, http://paste.tclers.tk/896
"""
import os
import Tkinter
import ttk

root = Tkinter.Tk()

imgdir = os.path.join(os.path.dirname(__file__), 'img')
i1 = Tkinter.PhotoImage("img_close", file=os.path.join(imgdir, 'close.gif'))
i2 = Tkinter.PhotoImage("img_closeactive",
    file=os.path.join(imgdir, 'close_active.gif'))
i3 = Tkinter.PhotoImage("img_closepressed",
    file=os.path.join(imgdir, 'close_pressed.gif'))

style = ttk.Style()

style.element_create("close", "image", "img_close",
    ("active", "pressed", "!disabled", "img_closepressed"),
    ("active", "!disabled", "img_closeactive"), border=8, sticky='')

style.layout("ButtonNotebook", [("ButtonNotebook.client", {"sticky": "nswe"})])
style.layout("ButtonNotebook.Tab", [
    ("ButtonNotebook.tab", {"sticky": "nswe", "children":
        [("ButtonNotebook.padding", {"side": "top", "sticky": "nswe",
                                     "children":
            [("ButtonNotebook.focus", {"side": "top", "sticky": "nswe",
                                       "children":
                [("ButtonNotebook.label", {"side": "left", "sticky": ''}),
                 ("ButtonNotebook.close", {"side": "left", "sticky": ''})]
            })]
        })]
    })]
)

def btn_press(event):
    x, y, widget = event.x, event.y, event.widget
    elem = widget.identify(x, y)
    index = widget.index("@%d,%d" % (x, y))

    if "close" in elem:
        widget.state(['pressed'])
        widget.pressed_index = index

def btn_release(event):
    x, y, widget = event.x, event.y, event.widget

    if not widget.instate(['pressed']):
        return

    elem =  widget.identify(x, y)
    index = widget.index("@%d,%d" % (x, y))

    if "close" in elem and widget.pressed_index == index:
        widget.forget(index)
        widget.event_generate("<<NotebookClosedTab>>")

    widget.state(["!pressed"])
    widget.pressed_index = None


root.bind_class("TNotebook", "<ButtonPress-1>", btn_press, True)
root.bind_class("TNotebook", "<ButtonRelease-1>", btn_release)

# create a ttk notebook with our custom style, and add some tabs to it
nb = ttk.Notebook(width=200, height=200, style="ButtonNotebook")
nb.pressed_index = None
f1 = Tkinter.Frame(nb, background="red")
f2 = Tkinter.Frame(nb, background="green")
f3 = Tkinter.Frame(nb, background="blue")
nb.add(f1, text='Red', padding=3)
nb.add(f2, text='Green', padding=3)
nb.add(f3, text='Blue', padding=3)
nb.pack(expand=1, fill='both')

root.mainloop()
PK��Z��yTt%t%ttk/plastik_theme.pynu�[���"""This demonstrates good part of the syntax accepted by theme_create.

This is a translation of plastik.tcl to python.
You will need the images used by the plastik theme to test this. The
images (and other tile themes) can be retrived by doing:

$ cvs -z3 -d:pserver:anonymous@tktable.cvs.sourceforge.net:/cvsroot/tktable \
  co tile-themes

To test this module you should do, for example:

import Tkinter
import plastik_theme

root = Tkinter.Tk()
plastik_theme.install(plastik_image_dir)
...

Where plastik_image_dir contains the path to the images directory used by
the plastik theme, something like: tile-themes/plastik/plastik
"""
import os
import glob
import ttk
from Tkinter import PhotoImage

__all__ = ['install']

colors = {
    "frame": "#efefef",
    "disabledfg": "#aaaaaa",
    "selectbg": "#657a9e",
    "selectfg": "#ffffff"
    }

imgs = {}
def _load_imgs(imgdir):
    imgdir = os.path.expanduser(imgdir)
    if not os.path.isdir(imgdir):
        raise Exception("%r is not a directory, can't load images" % imgdir)
    for f in glob.glob("%s/*.gif" % imgdir):
        img = os.path.split(f)[1]
        name = img[:-4]
        imgs[name] = PhotoImage(name, file=f, format="gif89")

def install(imgdir):
    _load_imgs(imgdir)
    style = ttk.Style()
    style.theme_create("plastik", "default", settings={
        ".": {
            "configure":
                {"background": colors['frame'],
                 "troughcolor": colors['frame'],
                 "selectbackground": colors['selectbg'],
                 "selectforeground": colors['selectfg'],
                 "fieldbackground": colors['frame'],
                 "font": "TkDefaultFont",
                 "borderwidth": 1},
            "map": {"foreground": [("disabled", colors['disabledfg'])]}
        },

        "Vertical.TScrollbar": {"layout": [
            ("Vertical.Scrollbar.uparrow", {"side": "top", "sticky": ''}),
            ("Vertical.Scrollbar.downarrow", {"side": "bottom", "sticky": ''}),
            ("Vertical.Scrollbar.uparrow", {"side": "bottom", "sticky": ''}),
            ("Vertical.Scrollbar.trough", {"sticky": "ns", "children":
                [("Vertical.Scrollbar.thumb", {"expand": 1, "unit": 1,
                    "children": [("Vertical.Scrollbar.grip", {"sticky": ''})]
                })]
            })]
        },

        "Horizontal.TScrollbar": {"layout": [
            ("Horizontal.Scrollbar.leftarrow", {"side": "left", "sticky": ''}),
            ("Horizontal.Scrollbar.rightarrow",
                {"side": "right", "sticky": ''}),
            ("Horizontal.Scrollbar.leftarrow",
                {"side": "right", "sticky": ''}),
            ("Horizontal.Scrollbar.trough", {"sticky": "ew", "children":
                [("Horizontal.Scrollbar.thumb", {"expand": 1, "unit": 1,
                    "children": [("Horizontal.Scrollbar.grip", {"sticky": ''})]
                })]
            })]
        },

        "TButton": {
            "configure": {"width": 10, "anchor": "center"},
            "layout": [
                ("Button.button", {"children":
                    [("Button.focus", {"children":
                        [("Button.padding", {"children":
                            [("Button.label", {"side": "left", "expand": 1})]
                        })]
                    })]
                })
            ]
        },

        "Toolbutton": {
            "configure": {"anchor": "center"},
            "layout": [
                ("Toolbutton.border", {"children":
                    [("Toolbutton.button", {"children":
                        [("Toolbutton.padding", {"children":
                            [("Toolbutton.label", {"side":"left", "expand":1})]
                        })]
                    })]
                })
            ]
        },

        "TMenubutton": {"layout": [
            ("Menubutton.button", {"children":
                [("Menubutton.indicator", {"side": "right"}),
                 ("Menubutton.focus", {"children":
                    [("Menubutton.padding", {"children":
                        [("Menubutton.label", {"side": "left", "expand": 1})]
                    })]
                })]
            })]
        },

        "TNotebook": {"configure": {"tabmargins": [0, 2, 0, 0]}},
        "TNotebook.tab": {
            "configure": {"padding": [6, 2, 6, 2], "expand": [0, 0, 2]},
            "map": {"expand": [("selected", [1, 2, 4, 2])]}
        },
        "Treeview": {"configure": {"padding": 0}},

        # elements
        "Button.button": {"element create":
            ("image", 'button-n',
                ("pressed", 'button-p'), ("active", 'button-h'),
                {"border": [4, 10], "padding": 4, "sticky":"ewns"}
            )
        },

        "Toolbutton.button": {"element create":
            ("image", 'tbutton-n',
                ("selected", 'tbutton-p'), ("pressed", 'tbutton-p'),
                ("active", 'tbutton-h'),
                {"border": [4, 9], "padding": 3, "sticky": "news"}
            )
        },

        "Checkbutton.indicator": {"element create":
            ("image", 'check-nu',
                ('active', 'selected', 'check-hc'),
                ('pressed', 'selected', 'check-pc'),
                ('active', 'check-hu'),
                ("selected", 'check-nc'),
                {"sticky": ''}
            )
        },

        "Radiobutton.indicator": {"element create":
            ("image", 'radio-nu',
                ('active', 'selected', 'radio-hc'),
                ('pressed', 'selected', 'radio-pc'),
                ('active', 'radio-hu'), ('selected', 'radio-nc'),
                {"sticky": ''}
            )
        },

        "Horizontal.Scrollbar.thumb": {"element create":
            ("image", 'hsb-n', {"border": 3, "sticky": "ew"})
        },

        "Horizontal.Scrollbar.grip": {"element create": ("image", 'hsb-g')},
        "Horizontal.Scrollbar.trough": {"element create": ("image", 'hsb-t')},
        "Vertical.Scrollbar.thumb": {"element create":
            ("image", 'vsb-n', {"border": 3, "sticky": "ns"})
        },
        "Vertical.Scrollbar.grip": {"element create": ("image", 'vsb-g')},
        "Vertical.Scrollbar.trough": {"element create": ("image", 'vsb-t')},
        "Scrollbar.uparrow": {"element create":
            ("image", 'arrowup-n', ("pressed", 'arrowup-p'), {"sticky": ''})
        },
        "Scrollbar.downarrow": {"element create":
            ("image", 'arrowdown-n',
            ("pressed", 'arrowdown-p'), {'sticky': ''})
        },
        "Scrollbar.leftarrow": {"element create":
            ("image", 'arrowleft-n',
            ("pressed", 'arrowleft-p'), {'sticky': ''})
        },
        "Scrollbar.rightarrow": {"element create":
            ("image", 'arrowright-n', ("pressed", 'arrowright-p'),
            {'sticky': ''})
        },

        "Horizontal.Scale.slider": {"element create":
            ("image", 'hslider-n', {'sticky': ''})
        },
        "Horizontal.Scale.trough": {"element create":
            ("image", 'hslider-t', {'border': 1, 'padding': 0})
        },
        "Vertical.Scale.slider": {"element create":
            ("image", 'vslider-n', {'sticky': ''})
        },
        "Vertical.Scale.trough": {"element create":
            ("image", 'vslider-t', {'border': 1, 'padding': 0})
        },

        "Entry.field": {"element create":
            ("image", 'entry-n',
                ("focus", 'entry-f'),
                {'border': 2, 'padding': [3, 4], 'sticky': 'news'}
            )
        },

        "Labelframe.border": {"element create":
            ("image", 'border', {'border': 4, 'padding': 4, 'sticky': 'news'})
        },

        "Menubutton.button": {"element create":
            ("image", 'combo-r',
                ('active', 'combo-ra'),
                {'sticky': 'news', 'border': [4, 6, 24, 15],
                 'padding': [4, 4, 5]}
            )
        },
        "Menubutton.indicator": {"element create":
            ("image", 'arrow-d', {"sticky": "e", "border": [15, 0, 0, 0]})
        },

        "Combobox.field": {"element create":
            ("image", 'combo-n',
                ('readonly', 'active', 'combo-ra'),
                ('focus', 'active', 'combo-fa'),
                ('active', 'combo-a'), ('!readonly', 'focus', 'combo-f'),
                ('readonly', 'combo-r'),
                {'border': [4, 6, 24, 15], 'padding': [4, 4, 5],
                 'sticky': 'news'}
            )
        },
        "Combobox.downarrow": {"element create":
            ("image", 'arrow-d', {'sticky': 'e', 'border': [15, 0, 0, 0]})
         },

        "Notebook.client": {"element create":
            ("image", 'notebook-c', {'border': 4})
        },
        "Notebook.tab": {"element create":
            ("image", 'notebook-tn',
                ("selected", 'notebook-ts'), ("active", 'notebook-ta'),
                {'padding': [0, 2, 0, 0], 'border': [4, 10, 4, 10]}
            )
        },

        "Progressbar.trough": {"element create":
            ("image", 'hprogress-t', {'border': 2})
        },
        "Horizontal.Progressbar.pbar": {"element create":
            ("image", 'hprogress-b', {'border': [2, 9]})
        },
        "Vertical.Progressbar.pbar": {"element create":
            ("image", 'vprogress-b', {'border': [9, 2]})
        },

        "Treeheading.cell": {"element create":
            ("image", 'tree-n',
                ("pressed", 'tree-p'),
                {'border': [4, 10], 'padding': 4, 'sticky': 'news'}
            )
        }

    })
    style.theme_use("plastik")
PK��Z�|!eettk/img/close_pressed.gifnu�[���GIF89a��**�ff���;;;;;;;;;;;;!�Created with GIMP!�
,0DJ�'!��	��晅a�A	;PK��Z�xU�eettk/img/close.gifnu�[���GIF89a�;;;������;;;;;;;;;;;;!�Created with GIMP!�
,0DJ�'!��	��晅a�A	;PK��Z�.�PPttk/img/close_active.gifnu�[���GIF89a�����4���������������!�
,0DJ�'!��	��晅a�A	;PK��Z��$&$&ttk/ttkcalendar.pyonu�[����
��^c@s{dZddlZddlZddlZddlZd�Zdejfd��YZd�Ze	dkrwe�ndS(sQ
Simple calendar using ttk Treeview together with calendar and datetime
classes.
i����NcCs-|dkrtj|�Stj||�SdS(N(tNonetcalendartTextCalendartLocaleTextCalendar(tlocaletfwday((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pytget_calendar
s
tCalendarcBs�eZejjZejjZdd�Zd�Zd�Zd�Z	d�Z
d�Zd�Zd�Z
d�Zd	�Zd
�Zd�Zd�Zed
��ZRS(c
KsY|jdtj�}|jd|jj�j�}|jd|jj�j�}|jdd�}|jdd�}|jdd�}|j||d	�|_d|_	t
jj|||�t
||�|_|j�|j�|j�|j||�gtd
�D]!}	|jjddd
d�^q|_|j�|jjd|j�dS(s�
        WIDGET-SPECIFIC OPTIONS

            locale, firstweekday, year, month, selectbackground,
            selectforeground
        tfirstweekdaytyeartmonthRtselectbackgrounds#ecffc4tselectforegrounds#05640eiittendtvaluess<Map>N(tpopRtMONDAYtdatetimetnowR	R
Rt_datet
_selectiontttktFramet__init__Rt_calt_Calendar__setup_stylest_Calendar__place_widgetst_Calendar__config_calendart_Calendar__setup_selectiontranget	_calendartinsertt_itemst_build_calendartbindt_Calendar__minsize(
tselftmastertkwRR	R
Rtsel_bgtsel_fgt_((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRs$	


4
cCs�|dkrtd|��n]|dkr;||jd<nA|dkrf|jj|jjd|�ntjj|||�dS(	NR	R
sattribute '%s' is not writeableRt
backgroundRtitem(R	R
(tAttributeErrort_canvast
itemconfigurettextRRt__setitem__(R%R,tvalue((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR1<scCs�|dkrt|j|�S|dkr3|jdS|dkrX|jj|jjd�Stjitjj||�|6�}||SdS(NR	R
RR+Rtfill(R	R
(	tgetattrRR.titemcgetR0Rt
tclobjs_to_pyRt__getitem__(R%R,tr((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR7Fs%cCsKtj|j�}d�}|jd|d��|jd|d��dS(NcSs!did|dfgd6fgS(NsButton.focussButton.%sarrowtchildren(R(tdir((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt<lambda>Tss	L.TButtontlefts	R.TButtontright(RtStyleR&tlayout(R%tstyletarrow_layout((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__setup_stylesQs	c	Cs&tj|�}tj|ddd|j�}tj|ddd|j�}tj|dddd�|_tjd	d
ddd
d�|_|j	d|dddddd�|j
d|�|jj
d|dddddd�|j
d|dddd�|jj	d|dddddd�dS(NR@s	L.TButtontcommands	R.TButtontwidthitanchortcentertshowR
t
selectmodetnonetheightitin_tsidettoptpadyitcolumnitrowitpadxiitexpandR3tbothtbottom(RRtButtont_prev_montht_next_monthtLabelt_headertTreeviewRtpacktgrid(R%thframetlbtntrbtn((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__place_widgetsZs!"%c	s�|jjd�j�}||jd<|jjddd�|jjddd|d	d�tj��t�fd
�|D��}x0|D](}|jj	|d|d|d
d�q�WdS(NitcolumnstheaderR+tgrey90R
RRttagc3s|]}�j|�VqdS(N(tmeasure(t.0tcol(tfont(s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pys	<genexpr>qsRDtminwidthREte(
RtformatweekheadertsplitRt
tag_configureR ttkFonttFonttmaxRO(R%tcolstmaxwidthRg((Rhs4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__config_calendarjs

cs�tj�|_tj|jd|dddd�|_��jddd|dd��_�j	d�fd	��|jj	d
�fd��|jj	d|j
�dS(NR+tborderwidthithighlightthicknessR3REtws<ButtonPress-1>cs
�j�S(N(tplace_forget(tevt(tcanvas(s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR;|R
s<Configure>cs
�j�S(N(Rw(Rx(Ry(s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR;}R
(RnRot_fonttTkintertCanvasRR.tcreate_textR0R#t_pressed(R%R(R)((Rys4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt__setup_selectionvs!cCsN|jjj�jd�\}}||jd� }|jjj||�dS(Ntxt+(RR&tgeometryRltindextminsize(R%RxRDRJ((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt	__minsize�s!c
Cs�|jj|jj}}|jj||d�}|j�|jd<|jj||�}x~t|j	�D]m\}}|t
|�kr�||ng}g|D]}|r�d|nd^q�}	|jj|d|	�qiWdS(NiR0s%02dR
R(
RR	R
RtformatmonthnamettitleRYtmonthdayscalendart	enumerateR!tlenRR,(
R%R	R
RbtcaltindxR,tweektdaytfmt_week((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR"�s")c	Cs�|\}}}}|jj|�}|j}|jd|d|�|j|j|||dd�|j|jd|�|jd|jd|d|�d	S(
s%Configure canvas for a new selection.RDRJiiR0RKR�tyN(	RzReR.t	configuretcoordsR0R/tplaceR(	R%R0tbboxR�R�RDRJttextwRy((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt_show_selection�s	"c
Cs�|j|j|j}}}|j|�}|j|�}|sQ||jkrUdS|j|�d}t|�sxdS|t|d�d}|s�dS|j	||�}	|	s�dSd|}|||f|_
|j||	�dS(s"Clicked somewhere in the calendar.NRis%02d(R�R�twidgettidentify_rowtidentify_columnR!R,R�tintR�RR�(
R%RxR�R�R�R,ROtitem_valuesR0R�((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyR~�s"
cCs[|jj�|j|jdd�|_|j|jj|jjd�|_|j�dS(s,Updated calendar to show the previous month.tdaysiN(R.RwRt	timedeltaRR	R
R"(R%((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRV�s
$cCs�|jj�|jj|jj}}|j|jdtj||�dd�|_|j|jj|jjd�|_|j	�dS(s'Update calendar to show the next month.R�iN(
R.RwRR	R
R�Rt
monthrangeRR"(R%R	R
((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRW�s
!$cCsF|js
dS|jj|jj}}|j||t|jd��S(s9Return a datetime representing the current selected date.iN(RRRR	R
RR�(R%R	R
((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt	selection�s	N(t__name__t
__module__RRR�RRR1R7RRRRR$R"R�R~RVRWtpropertyR�(((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyRs %	
						
						cCs�ddl}tj�}|jd�tdtj�}|jdddd�d|jkrxt	j
�}|jd	�n|j�dS(
Ni����sTtk CalendarRRRiR3RStwintclam(
tsysR{tTkR�RRtSUNDAYR[tplatformRR>t	theme_usetmainloop(R�troottttkcalR@((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyttest�s
t__main__(
t__doc__RR{RnRRRRR�R�(((s4/usr/lib64/python2.7/Demo/tkinter/ttk/ttkcalendar.pyt<module>s	�	
PK��Z��"�P
P
ttk/widget_state.pyonu�[����
��^c	@s�dZddlZddddddd	d
dg	Zx eD]Zejde�q;Wd
�Zdejfd��YZd�Ze	dkr�e�ndS(s8Sample demo showing widget states and some font styling.i����Ntactivetdisabledtfocustpressedtselectedt
backgroundtreadonlyt	alternatetinvalidt!cCs%ttt�d}|j|�dS(Ni(tstatestlentstate(twidgettnostate((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pytreset_state
stAppcBs2eZdd�Zdd�Zd�Zd�ZRS(cCstjj|dd�|jj|�tj�|_|jjdd�}t|j	j
d|��}|j	j
d|�|_d|jkr�d|j|_n|d	d
kr�|d	nd|_t
||d	d
kr�dnd	�|_g|_|j�dS(
NtborderwidthitTButtontfontsfont configure %s -sizesfont configure %s -familyt s{%s}it-ti(tttktFramet__init__tmasterttitletStyletstyletlookuptstrttktevaltfont_familytfsize_prefixtintt
base_fsizetupdate_widgetst_setup_widgets(tselfRtbtn_fonttfsize((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyRs#)	icCs4|jjddd|j|j|j|f�dS(NRRs%s %s%d(Rt	configureR"R#R%(R(textra((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyt	_set_font#scCs�|j|�}|s'dg}d}nGt|j��}g|D]}|tkr@|^q@}dt|�}x(|jD]}t|�|j|�qxW|j|�dS(NRiii(	tnametowidgettsettsplitR
RR&RRR-(R(R
tnewtextt
goodstatest
font_extrat	newstatesR((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyt
_new_state's		%

c	Cs�tj|dd�}tj|dddd�}|j|j�ddf|d	<|j�|jj|�|j�|j	d
ddd
�|j	dddd
dd
dd�|j	d
ddd�dS(NttextsEnter states and watchtcursortxtermtvalidatetkeys%Ws%Ptvalidatecommandtfilltxtpadxitsidetlefttpadytanchortntbothtexpandi(
RtButtontEntrytregisterR5RR&tappendR9tpack(R(tbtntentry((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyR'?s

"N(t__name__t
__module__tNoneRR-R5R'(((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyRs	cCstd�}|j�dS(NsWidget State Tester(Rtmainloop(tapp((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pytmainNst__main__(
t__doc__RR
RRIRRRRRRM(((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyt<module>s	@	PK��Zw�%>>ttk/theme_selector.pycnu�[����
��^c@sZdZddlZddlZdejfd��YZd�ZedkrVe�ndS(s�Ttk Theme Selector v2.

This is an improvement from the other theme selector (themes_combo.py)
since now you can notice theme changes in Ttk Combobox, Ttk Frame,
Ttk Label and Ttk Button.
i����NtAppcBs,eZd�Zd�Zd�Zd�ZRS(cCsHtjj|dd�tj�|_tj|d�|_|j�dS(Ntborderwidthii(	tttktFramet__init__tStyletstyletTkintertIntVarttheme_autochanget_setup_widgets(tself((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyRscCs|jj|jj��dS(N(Rt	theme_usetthemes_combotget(R((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyt
_change_themescCs |jj�r|j�ndS(N(R	RR(Rtwidget((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyt_theme_sel_changedscCs�tj|dd�}|jj�}tj|d|dd�|_|jj|d�|jjd|j�tj	|ddd	|j
�}tj|dd
d|j�}|j
dd
dd�|jj
dddddd
dd�|j
dddddd
dd�|j
dddddddd
�|j�}|jddd�|jddd�|jddd�|j
dddddddddd�dS(NttexttThemestvalueststatetreadonlyis<<ComboboxSelected>>sChange Themetcommands-Change themes when combobox item is activatedtvariabletipadxitstickytwtrowtcolumnitpadxtewitet
columnspanitpadytweighttnsewtrowspan(RtLabelRttheme_namestComboboxR
tsettbindRtButtonRtCheckbuttonR	tgridtwinfo_topleveltrowconfiguretcolumnconfigure(Rt
themes_lbltthemest
change_btnttheme_change_checkbtnttop((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyR
s&%""(t__name__t
__module__RRRR
(((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyR
s	
		cCs't�}|jjd�|j�dS(NsTheme Selector(Rtmasterttitletmainloop(tapp((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pytmain7s	t__main__(t__doc__RRRRR<R6(((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyt<module>s-	PK��Za�O���ttk/theme_selector.pynu�[���"""Ttk Theme Selector v2.

This is an improvement from the other theme selector (themes_combo.py)
since now you can notice theme changes in Ttk Combobox, Ttk Frame,
Ttk Label and Ttk Button.
"""
import Tkinter
import ttk

class App(ttk.Frame):
    def __init__(self):
        ttk.Frame.__init__(self, borderwidth=3)

        self.style = ttk.Style()

        # XXX Ideally I wouldn't want to create a Tkinter.IntVar to make
        #     it works with Checkbutton variable option.
        self.theme_autochange = Tkinter.IntVar(self, 0)
        self._setup_widgets()

    def _change_theme(self):
        self.style.theme_use(self.themes_combo.get())

    def _theme_sel_changed(self, widget):
        if self.theme_autochange.get():
            self._change_theme()

    def _setup_widgets(self):
        themes_lbl = ttk.Label(self, text="Themes")

        themes = self.style.theme_names()
        self.themes_combo = ttk.Combobox(self, values=themes, state="readonly")
        self.themes_combo.set(themes[0])
        self.themes_combo.bind("<<ComboboxSelected>>", self._theme_sel_changed)

        change_btn = ttk.Button(self, text='Change Theme',
            command=self._change_theme)

        theme_change_checkbtn = ttk.Checkbutton(self,
            text="Change themes when combobox item is activated",
            variable=self.theme_autochange)

        themes_lbl.grid(ipadx=6, sticky="w")
        self.themes_combo.grid(row=0, column=1, padx=6, sticky="ew")
        change_btn.grid(row=0, column=2, padx=6, sticky="e")
        theme_change_checkbtn.grid(row=1, columnspan=3, sticky="w", pady=6)

        top = self.winfo_toplevel()
        top.rowconfigure(0, weight=1)
        top.columnconfigure(0, weight=1)
        self.columnconfigure(1, weight=1)
        self.grid(row=0, column=0, sticky="nsew", columnspan=3, rowspan=2)


def main():
    app = App()
    app.master.title("Theme Selector")
    app.mainloop()

if __name__ == "__main__":
    main()
PK��Zxa��##ttk/roundframe.pycnu�[����
��^c	@s�dZddlZddlZej�Zejddd�Zejddd�Zej�Z	e	j
dd	dd%ddd
d�e	jddidd
6fg�e	jddd�ej
dddd�Zejdd�ej
dddd�Zejdddd�ejedd�Zejdd�ejdd��ejdd��ejeddd d!d"d�Zejdddd�ejdd#��ejdd$��ej�dS(&shTtk Frame with rounded corners.

Based on an example by Bryan Oakley, found at: http://wiki.tcl.tk/20152i����NtframeFocusBordertdatas�
R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICZlizat3KtatX
rAsiCNDgtCJClQkoFMgqsu3ArBkoZDgA8uDJAwk4bGDmtm9BZgcYzK078m4D
Cgf4+l0skNkGCg3oUhR4d4GCDIoZM2ZWQMECyZQvLMggIbPmzQIyfCZ5YcME
AwFMn/bLLIKBCRtMHljQQcDV2ZqZTRDQYfWFAwMqUJANvC8zBhUWbDi5YUAB
Bsybt2VGoUKH3AcmdP+Im127xOcJih+oXsEDdvOLuQfIMGBD9QwBlsOnzcBD
hfrsuVfefgzJR599A+CnH4Hb9fcfgu29x6BIBgKYYH4DTojQc/5ZGGGGGhpU
IYIKghgiQRw+GKCEJxZIwXwWlthiQyl6KOCMLsJIIoY4LlQjhDf2mNCI9/Eo
5IYO2sjikX+9eGCRCzL5V5JALillY07GaOSVb1G5ookzEnlhlFx+8OOXZb6V
5Y5kcnlmckGmKaaMaZrpJZxWXjnnlmW++WGdZq5ZXQEetKmnlxPgl6eUYhJq
KKOI0imnoNbF2ScFHQJJwW99TsBAAAVYWEAAHEQAZoi1cQDqAAeEV0EACpT/
JqcACgRQAW6uNWCbYKcyyEwGDBgQwa2tTlBBAhYIQMFejC5AgQAWJNDABK3y
loEDEjCgV6/aOcYBAwp4kIF6rVkXgAEc8IQZVifCBRQHGqya23HGIpsTBgSU
OsFX/PbrVVjpYsCABA4kQCxHu11ogAQUIOAwATpBLDFQFE9sccUYS0wAxD5h
4DACFEggbAHk3jVBA/gtTIHHEADg8sswxyzzzDQDAAEECGAQsgHiTisZResN
gLIHBijwLQEYePzx0kw37fTSSjuMr7ZMzfcgYZUZi58DGsTKwbdgayt22GSP
bXbYY3MggQIaONDzAJ8R9kFlQheQQAAOWGCAARrwdt23Bn8H7vfggBMueOEG
WOBBAAkU0EB9oBGUdXIFZJBABAEEsPjmmnfO+eeeh/55BBEk0Ph/E8Q9meQq
bbDABAN00EADFRRQ++2254777rr3jrvjFTTQwQCpz7u6QRut5/oEzA/g/PPQ
Ry/99NIz//oGrZpUUEAAOw==tframeBorders�
R0lGODlhQABAAPcAAHx+fMTCxKSipOTi5JSSlNTS1LSytPTy9IyKjMzKzKyq
rOzq7JyanNza3Ly6vPz6/ISChMTGxKSmpOTm5JSWlNTW1LS2tPT29IyOjMzO
zKyurOzu7JyenNze3Ly+vPz+/OkAKOUA5IEAEnwAAACuQACUAAFBAAB+AFYd
QAC0AABBAAB+AIjMAuEEABINAAAAAHMgAQAAAAAAAAAAAKjSxOIEJBIIpQAA
sRgBMO4AAJAAAHwCAHAAAAUAAJEAAHwAAP+eEP8CZ/8Aif8AAG0BDAUAAJEA
AHwAAIXYAOfxAIESAHwAAABAMQAbMBZGMAAAIEggJQMAIAAAAAAAfqgaXESI
5BdBEgB+AGgALGEAABYAAAAAAACsNwAEAAAMLwAAAH61MQBIAABCM8B+AAAU
AAAAAAAApQAAsf8Brv8AlP8AQf8Afv8AzP8A1P8AQf8AfgAArAAABAAADAAA
AACQDADjAAASAAAAAACAAADVABZBAAB+ALjMwOIEhxINUAAAANIgAOYAAIEA
AHwAAGjSAGEEABYIAAAAAEoBB+MAAIEAAHwCACABAJsAAFAAAAAAAGjJAGGL
AAFBFgB+AGmIAAAQAABHAAB+APQoAOE/ABIAAAAAAADQAADjAAASAAAAAPiF
APcrABKDAAB8ABgAGO4AAJAAqXwAAHAAAAUAAJEAAHwAAP8AAP8AAP8AAP8A
AG0pIwW3AJGSAHx8AEocI/QAAICpAHwAAAA0SABk6xaDEgB8AAD//wD//wD/
/wD//2gAAGEAABYAAAAAAAC0/AHj5AASEgAAAAA01gBkWACDTAB8AFf43PT3
5IASEnwAAOAYd+PuMBKQTwB8AGgAEGG35RaSEgB8AOj/NOL/ZBL/gwD/fMkc
q4sA5UGpEn4AAIg02xBk/0eD/358fx/4iADk5QASEgAAAALnHABkAACDqQB8
AMyINARkZA2DgwB8fBABHL0AAEUAqQAAAIAxKOMAPxIwAAAAAIScAOPxABIS
AAAAAIIAnQwA/0IAR3cAACwAAAAAQABAAAAI/wA/CBxIsKDBgwgTKlzIsKFD
gxceNnxAsaLFixgzUrzAsWPFCw8kDgy5EeQDkBxPolypsmXKlx1hXnS48UEH
CwooMCDAgIJOCjx99gz6k+jQnkWR9lRgYYDJkAk/DlAgIMICkVgHLoggQIPT
ighVJqBQIKvZghkoZDgA8uDJAwk4bDhLd+ABBmvbjnzbgMKBuoA/bKDQgC1F
gW8XKMgQOHABBQsMI76wIIOExo0FZIhM8sKGCQYCYA4cwcCEDSYPLOgg4Oro
uhMEdOB84cCAChReB2ZQYcGGkxsGFGCgGzCFCh1QH5jQIW3xugwSzD4QvIIH
4s/PUgiQYcCG4BkC5P/ObpaBhwreq18nb3Z79+8Dwo9nL9I8evjWsdOX6D59
fPH71Xeef/kFyB93/sln4EP2Ebjegg31B5+CEDLUIH4PVqiQhOABqKFCF6qn
34cHcfjffCQaFOJtGaZYkIkUuljQigXK+CKCE3po40A0trgjjDru+EGPI/6I
Y4co7kikkAMBmaSNSzL5gZNSDjkghkXaaGIBHjwpY4gThJeljFt2WSWYMQpZ
5pguUnClehS4tuMEDARQgH8FBMBBBExGwIGdAxywXAUBKHCZkAIoEEAFp33W
QGl47ZgBAwZEwKigE1SQgAUCUDCXiwtQIIAFCTQwgaCrZeCABAzIleIGHDD/
oIAHGUznmXABGMABT4xpmBYBHGgAKGq1ZbppThgAG8EEAW61KwYMSOBAApdy
pNp/BkhAAQLcEqCTt+ACJW645I5rLrgEeOsTBtwiQIEElRZg61sTNBBethSw
CwEA/Pbr778ABywwABBAgAAG7xpAq6mGUUTdAPZ6YIACsRKAAbvtZqzxxhxn
jDG3ybbKFHf36ZVYpuE5oIGhHMTqcqswvyxzzDS/HDMHEiiggQMLDxCZXh8k
BnEBCQTggAUGGKCB0ktr0PTTTEfttNRQT22ABR4EkEABDXgnGUEn31ZABglE
EEAAWaeN9tpqt832221HEEECW6M3wc+Hga3SBgtMODBABw00UEEBgxdO+OGG
J4744oZzXUEDHQxwN7F5G7QRdXxPoPkAnHfu+eeghw665n1vIKhJBQUEADs=tRoundedFrametimagetfocustborderitstickytnsewtTEntrytborderwidthitstyletpaddingi
tfilltxtbothtexpandittexttTests	<FocusIn>cCstjdg�S(NR(tframetstate(tevt((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyt<lambda>gts
<FocusOut>cCstjdg�S(Ns!focus(RR(R((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyRhRtbgtwhitethighlightthicknesscCstjdg�S(NR(tframe2R(R((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyRlRcCstjdg�S(Ns!focus(RR(R((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyRmR(RR(t__doc__tTkintertttktTktroott
PhotoImagetimg1timg2tStyleRtelement_createtlayoutt	configuretFrameRtpackRtEntrytentrytbindtTextRtmainloop(((s3/usr/lib64/python2.7/Demo/tkinter/ttk/roundframe.pyt<module>s2&	$	 !PK��Z�^��ttk/treeview_multicolumn.pynu�[���"""Demo based on the demo mclist included with tk source distribution."""
import Tkinter
import tkFont
import ttk

tree_columns = ("country", "capital", "currency")
tree_data = [
    ("Argentina",      "Buenos Aires",     "ARS"),
    ("Australia",      "Canberra",         "AUD"),
    ("Brazil",         "Brazilia",         "BRL"),
    ("Canada",         "Ottawa",           "CAD"),
    ("China",          "Beijing",          "CNY"),
    ("France",         "Paris",            "EUR"),
    ("Germany",        "Berlin",           "EUR"),
    ("India",          "New Delhi",        "INR"),
    ("Italy",          "Rome",             "EUR"),
    ("Japan",          "Tokyo",            "JPY"),
    ("Mexico",         "Mexico City",      "MXN"),
    ("Russia",         "Moscow",           "RUB"),
    ("South Africa",   "Pretoria",         "ZAR"),
    ("United Kingdom", "London",           "GBP"),
    ("United States",  "Washington, D.C.", "USD")
    ]

def sortby(tree, col, descending):
    """Sort tree contents when a column is clicked on."""
    # grab values to sort
    data = [(tree.set(child, col), child) for child in tree.get_children('')]

    # reorder data
    data.sort(reverse=descending)
    for indx, item in enumerate(data):
        tree.move(item[1], '', indx)

    # switch the heading so that it will sort in the opposite direction
    tree.heading(col,
        command=lambda col=col: sortby(tree, col, int(not descending)))

class App(object):
    def __init__(self):
        self.tree = None
        self._setup_widgets()
        self._build_tree()

    def _setup_widgets(self):
        msg = ttk.Label(wraplength="4i", justify="left", anchor="n",
            padding=(10, 2, 10, 6),
            text=("Ttk is the new Tk themed widget set. One of the widgets it "
                  "includes is a tree widget, which can be configured to "
                  "display multiple columns of informational data without "
                  "displaying the tree itself. This is a simple way to build "
                  "a listbox that has multiple columns. Clicking on the "
                  "heading for a column will sort the data by that column. "
                  "You can also change the width of the columns by dragging "
                  "the boundary between them."))
        msg.pack(fill='x')

        container = ttk.Frame()
        container.pack(fill='both', expand=True)

        # XXX Sounds like a good support class would be one for constructing
        #     a treeview with scrollbars.
        self.tree = ttk.Treeview(columns=tree_columns, show="headings")
        vsb = ttk.Scrollbar(orient="vertical", command=self.tree.yview)
        hsb = ttk.Scrollbar(orient="horizontal", command=self.tree.xview)
        self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)
        self.tree.grid(column=0, row=0, sticky='nsew', in_=container)
        vsb.grid(column=1, row=0, sticky='ns', in_=container)
        hsb.grid(column=0, row=1, sticky='ew', in_=container)

        container.grid_columnconfigure(0, weight=1)
        container.grid_rowconfigure(0, weight=1)

    def _build_tree(self):
        for col in tree_columns:
            self.tree.heading(col, text=col.title(),
                command=lambda c=col: sortby(self.tree, c, 0))
            # XXX tkFont.Font().measure expected args are incorrect according
            #     to the Tk docs
            self.tree.column(col, width=tkFont.Font().measure(col.title()))

        for item in tree_data:
            self.tree.insert('', 'end', values=item)

            # adjust columns lenghts if necessary
            for indx, val in enumerate(item):
                ilen = tkFont.Font().measure(val)
                if self.tree.column(tree_columns[indx], width=None) < ilen:
                    self.tree.column(tree_columns[indx], width=ilen)

def main():
    root = Tkinter.Tk()
    root.wm_title("Multi-Column List")
    root.wm_iconname("mclist")

    import plastik_theme
    try:
        plastik_theme.install('~/tile-themes/plastik/plastik')
    except Exception:
        import warnings
        warnings.warn("plastik theme being used without images")

    app = App()
    root.mainloop()

if __name__ == "__main__":
    main()
PK��Z�J"_��ttk/notebook_closebtn.pyonu�[����
��^c
@s�dZddlZddlZddlZej�Zejjejje	�d�Z
ejddejje
d��Zejddejje
d��Z
ejd	dejje
d
��Zej�Zejdddd8d9dddd�ejddidd6fg�ejddidd6didd6dd6didd6dd6didd6dd6fdidd6dd6fgd 6fgd 6fgd 6fg�d!�Zd"�Zejd#d$ee�ejd#d%e�ejd&d'd(d'd)d�Zde_ejed*d+�Zejed*d,�Zejed*d-�Zejed.d/d0d1�ejed.d2d0d1�ejed.d3d0d1�ej d4d5d6d7�ej!�dS(:saA Ttk Notebook with close buttons.

Based on an example by patthoyts, http://paste.tclers.tk/896
i����Ntimgt	img_closetfiles	close.giftimg_closeactivesclose_active.giftimg_closepressedsclose_pressed.giftclosetimagetactivetpresseds	!disabledtborderitstickyttButtonNotebooksButtonNotebook.clienttnswesButtonNotebook.TabsButtonNotebook.tabsButtonNotebook.paddingttoptsidesButtonNotebook.focussButtonNotebook.labeltleftsButtonNotebook.closetchildrencCst|j|j|j}}}|j||�}|jd||f�}d|krp|jdg�||_ndS(Ns@%d,%dRR(txtytwidgettidentifytindextstatet
pressed_index(teventRRRtelemR((s:/usr/lib64/python2.7/Demo/tkinter/ttk/notebook_closebtn.pyt	btn_press&scCs�|j|j|j}}}|jdg�s3dS|j||�}|jd||f�}d|kr�|j|kr�|j|�|jd�n|j	dg�d|_dS(NRs@%d,%dRs<<NotebookClosedTab>>s!pressed(RRRtinstateRRRtforgettevent_generateRtNone(RRRRRR((s:/usr/lib64/python2.7/Demo/tkinter/ttk/notebook_closebtn.pytbtn_release/s
t	TNotebooks<ButtonPress-1>s<ButtonRelease-1>twidthi�theighttstylet
backgroundtredtgreentbluettexttRedtpaddingitGreentBluetexpanditfilltboth(RRs	!disabledR(Rs	!disabledR("t__doc__tostTkintertttktTktroottpathtjointdirnamet__file__timgdirt
PhotoImageti1ti2ti3tStyleR$telement_createtlayoutRR t
bind_classtTruetNotebooktnbRRtFrametf1tf2tf3taddtpacktmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/ttk/notebook_closebtn.pyt<module>sF!$ 	
<				PK��Z�J"_��ttk/notebook_closebtn.pycnu�[����
��^c
@s�dZddlZddlZddlZej�Zejjejje	�d�Z
ejddejje
d��Zejddejje
d��Z
ejd	dejje
d
��Zej�Zejdddd8d9dddd�ejddidd6fg�ejddidd6didd6dd6didd6dd6didd6dd6fdidd6dd6fgd 6fgd 6fgd 6fg�d!�Zd"�Zejd#d$ee�ejd#d%e�ejd&d'd(d'd)d�Zde_ejed*d+�Zejed*d,�Zejed*d-�Zejed.d/d0d1�ejed.d2d0d1�ejed.d3d0d1�ej d4d5d6d7�ej!�dS(:saA Ttk Notebook with close buttons.

Based on an example by patthoyts, http://paste.tclers.tk/896
i����Ntimgt	img_closetfiles	close.giftimg_closeactivesclose_active.giftimg_closepressedsclose_pressed.giftclosetimagetactivetpresseds	!disabledtborderitstickyttButtonNotebooksButtonNotebook.clienttnswesButtonNotebook.TabsButtonNotebook.tabsButtonNotebook.paddingttoptsidesButtonNotebook.focussButtonNotebook.labeltleftsButtonNotebook.closetchildrencCst|j|j|j}}}|j||�}|jd||f�}d|krp|jdg�||_ndS(Ns@%d,%dRR(txtytwidgettidentifytindextstatet
pressed_index(teventRRRtelemR((s:/usr/lib64/python2.7/Demo/tkinter/ttk/notebook_closebtn.pyt	btn_press&scCs�|j|j|j}}}|jdg�s3dS|j||�}|jd||f�}d|kr�|j|kr�|j|�|jd�n|j	dg�d|_dS(NRs@%d,%dRs<<NotebookClosedTab>>s!pressed(RRRtinstateRRRtforgettevent_generateRtNone(RRRRRR((s:/usr/lib64/python2.7/Demo/tkinter/ttk/notebook_closebtn.pytbtn_release/s
t	TNotebooks<ButtonPress-1>s<ButtonRelease-1>twidthi�theighttstylet
backgroundtredtgreentbluettexttRedtpaddingitGreentBluetexpanditfilltboth(RRs	!disabledR(Rs	!disabledR("t__doc__tostTkintertttktTktroottpathtjointdirnamet__file__timgdirt
PhotoImageti1ti2ti3tStyleR$telement_createtlayoutRR t
bind_classtTruetNotebooktnbRRtFrametf1tf2tf3taddtpacktmainloop(((s:/usr/lib64/python2.7/Demo/tkinter/ttk/notebook_closebtn.pyt<module>sF!$ 	
<				PK��Z��"�P
P
ttk/widget_state.pycnu�[����
��^c	@s�dZddlZddddddd	d
dg	Zx eD]Zejde�q;Wd
�Zdejfd��YZd�Ze	dkr�e�ndS(s8Sample demo showing widget states and some font styling.i����Ntactivetdisabledtfocustpressedtselectedt
backgroundtreadonlyt	alternatetinvalidt!cCs%ttt�d}|j|�dS(Ni(tstatestlentstate(twidgettnostate((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pytreset_state
stAppcBs2eZdd�Zdd�Zd�Zd�ZRS(cCstjj|dd�|jj|�tj�|_|jjdd�}t|j	j
d|��}|j	j
d|�|_d|jkr�d|j|_n|d	d
kr�|d	nd|_t
||d	d
kr�dnd	�|_g|_|j�dS(
NtborderwidthitTButtontfontsfont configure %s -sizesfont configure %s -familyt s{%s}it-ti(tttktFramet__init__tmasterttitletStyletstyletlookuptstrttktevaltfont_familytfsize_prefixtintt
base_fsizetupdate_widgetst_setup_widgets(tselfRtbtn_fonttfsize((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyRs#)	icCs4|jjddd|j|j|j|f�dS(NRRs%s %s%d(Rt	configureR"R#R%(R(textra((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyt	_set_font#scCs�|j|�}|s'dg}d}nGt|j��}g|D]}|tkr@|^q@}dt|�}x(|jD]}t|�|j|�qxW|j|�dS(NRiii(	tnametowidgettsettsplitR
RR&RRR-(R(R
tnewtextt
goodstatest
font_extrat	newstatesR((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyt
_new_state's		%

c	Cs�tj|dd�}tj|dddd�}|j|j�ddf|d	<|j�|jj|�|j�|j	d
ddd
�|j	dddd
dd
dd�|j	d
ddd�dS(NttextsEnter states and watchtcursortxtermtvalidatetkeys%Ws%Ptvalidatecommandtfilltxtpadxitsidetlefttpadytanchortntbothtexpandi(
RtButtontEntrytregisterR5RR&tappendR9tpack(R(tbtntentry((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyR'?s

"N(t__name__t
__module__tNoneRR-R5R'(((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyRs	cCstd�}|j�dS(NsWidget State Tester(Rtmainloop(tapp((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pytmainNst__main__(
t__doc__RR
RRIRRRRRRM(((s5/usr/lib64/python2.7/Demo/tkinter/ttk/widget_state.pyt<module>s	@	PK��Z�j:�^^ttk/plastik_theme.pyonu�[����
��^c@s�dZddlZddlZddlZddlmZdgZidd6dd6d	d
6dd6ZiZd
�Z	d�Z
dS(ssThis demonstrates good part of the syntax accepted by theme_create.

This is a translation of plastik.tcl to python.
You will need the images used by the plastik theme to test this. The
images (and other tile themes) can be retrived by doing:

$ cvs -z3 -d:pserver:anonymous@tktable.cvs.sourceforge.net:/cvsroot/tktable   co tile-themes

To test this module you should do, for example:

import Tkinter
import plastik_theme

root = Tkinter.Tk()
plastik_theme.install(plastik_image_dir)
...

Where plastik_image_dir contains the path to the images directory used by
the plastik theme, something like: tile-themes/plastik/plastik
i����N(t
PhotoImagetinstalls#efefeftframes#aaaaaat
disabledfgs#657a9etselectbgs#fffffftselectfgcCs�tjj|�}tjj|�s7td|��nxWtjd|�D]B}tjj|�d}|d }t|d|dd�t|<qKWdS(Ns(%r is not a directory, can't load imagess%s/*.gifii����tfiletformattgif89(	tostpatht
expandusertisdirt	ExceptiontglobtsplitRtimgs(timgdirtftimgtname((s6/usr/lib64/python2.7/Demo/tkinter/ttk/plastik_theme.pyt
_load_imgs%s
cCs=t|�tj�}|jdddi'iitdd6tdd6tdd6td	d
6tdd6dd
6dd6d6idtdfgd6d6d6ididd6dd6fdidd6dd6fdidd6dd6fdidd6didd 6dd!6d"idd6fgd#6fgd#6fgd$6d%6id&id'd6dd6fd(id)d6dd6fd&id)d6dd6fd*id+d6d,idd 6dd!6d-idd6fgd#6fgd#6fgd$6d.6iid/d06d1d26d6d3id4id5id6id'd6dd 6fgd#6fgd#6fgd#6fgd$6d76iid1d26d6d8id9id:id;id'd6dd 6fgd#6fgd#6fgd#6fgd$6d<6id=id>id)d6fd?id@idAid'd6dd 6fgd#6fgd#6fgd#6fgd$6dB6iidCdDdCdCgdE6d6dF6iidGdDdGdDgdH6dCdCdDgd 6d6idIddDdJdDgfgd 6d6dK6iidCdH6d6dL6idMdNd�d�idJd/gdS6dJdH6dTd6fdU6d36idMdVd�d�d�idJdYgdS6dZdH6d[d6fdU6d96idMd\d�d�d�d�idd6fdU6da6idMdbd�d�d�d�idd6fdU6dg6idMdhidZdS6d+d6fdU6d,6id�dU6d-6id�dU6d*6idMdkidZdS6dd6fdU6d6id�dU6d"6id�dU6d6idMdnd�idd6fdU6dp6idMdqd�idd6fdU6ds6idMdtd�idd6fdU6dv6idMdwd�idd6fdU6dy6idMdzidd6fdU6d{6idMd|iddS6dCdH6fdU6d}6idMd~idd6fdU6d6idMd�iddS6dCdH6fdU6d�6idMd�d�idDdS6dZdJgdH6d[d6fdU6d�6idMdSidJdS6dJdH6d[d6fdU6d�6idMd�d�id[d6dJdGd�d�gdS6dJdJd�gdH6fdU6d=6idMd�id�d6d�dCdCdCgdS6fdU6d>6idMd�d�d�d�d�d�idJdGd�d�gdS6dJdJd�gdH6d[d6fdU6d�6idMd�id�d6d�dCdCdCgdS6fdU6d�6idMd�idJdS6fdU6d�6idMd�d�d�idCdDdCdCgdH6dJd/dJd/gdS6fdU6d�6idMd�idDdS6fdU6d�6idMd�idDdYgdS6fdU6d�6idMd�idYdDgdS6fdU6d�6idMd�d�idJd/gdS6dJdH6d[d6fdU6d�6�|jd�dS(�NtplastiktdefaulttsettingsRt
backgroundttroughcolorRtselectbackgroundRtselectforegroundtfieldbackgroundt
TkDefaultFonttfontitborderwidtht	configuretdisabledRt
foregroundtmapt.sVertical.Scrollbar.uparrowttoptsidettstickysVertical.Scrollbar.downarrowtbottomsVertical.Scrollbar.troughtnssVertical.Scrollbar.thumbtexpandtunitsVertical.Scrollbar.griptchildrentlayoutsVertical.TScrollbarsHorizontal.Scrollbar.leftarrowtleftsHorizontal.Scrollbar.rightarrowtrightsHorizontal.Scrollbar.troughtewsHorizontal.Scrollbar.thumbsHorizontal.Scrollbar.gripsHorizontal.TScrollbari
twidthtcentertanchors
Button.buttonsButton.focussButton.paddingsButton.labeltTButtonsToolbutton.bordersToolbutton.buttonsToolbutton.paddingsToolbutton.labelt
ToolbuttonsMenubutton.buttonsMenubutton.indicatorsMenubutton.focussMenubutton.paddingsMenubutton.labeltTMenubuttoniit
tabmarginst	TNotebookitpaddingtselectedis
TNotebook.tabtTreeviewtimagesbutton-ntpressedsbutton-ptactivesbutton-htbordertewnsselement creates	tbutton-ns	tbutton-ps	tbutton-hi	itnewsscheck-nuscheck-hcscheck-pcscheck-huscheck-ncsCheckbutton.indicatorsradio-nusradio-hcsradio-pcsradio-husradio-ncsRadiobutton.indicatorshsb-nshsb-gshsb-tsvsb-nsvsb-gsvsb-ts	arrowup-ns	arrowup-psScrollbar.uparrowsarrowdown-nsarrowdown-psScrollbar.downarrowsarrowleft-nsarrowleft-psScrollbar.leftarrowsarrowright-nsarrowright-psScrollbar.rightarrows	hslider-nsHorizontal.Scale.sliders	hslider-tsHorizontal.Scale.troughs	vslider-nsVertical.Scale.sliders	vslider-tsVertical.Scale.troughsentry-ntfocussentry-fsEntry.fieldsLabelframe.borderscombo-rscombo-raiiisarrow-dtescombo-ntreadonlyscombo-fascombo-as	!readonlyscombo-fsCombobox.fieldsCombobox.downarrows
notebook-csNotebook.clientsnotebook-tnsnotebook-tssnotebook-tasNotebook.tabshprogress-tsProgressbar.troughshprogress-bsHorizontal.Progressbar.pbarsvprogress-bsVertical.Progressbar.pbarstree-nstree-psTreeheading.cell(R?sbutton-p(R@sbutton-h(R<s	tbutton-p(R?s	tbutton-p(R@s	tbutton-h(R@R<scheck-hc(R?R<scheck-pc(R@scheck-hu(R<scheck-nc(R@R<sradio-hc(R?R<sradio-pc(R@sradio-hu(R<sradio-nc(R>shsb-g(R>shsb-t(R>svsb-g(R>svsb-t(R?s	arrowup-p(R?sarrowdown-p(R?sarrowleft-p(R?sarrowright-p(RDsentry-f(R@scombo-ra(RFR@scombo-ra(RDR@scombo-fa(R@scombo-a(s	!readonlyRDscombo-f(RFscombo-r(R<snotebook-ts(R@snotebook-ta(R?stree-p(RtttktStylettheme_createtcolorst	theme_use(Rtstyle((s6/usr/lib64/python2.7/Demo/tkinter/ttk/plastik_theme.pyR.s

/
/@@@!*'))""	"")).&.4!!-(t__doc__R	RRGtTkinterRt__all__RJRRR(((s6/usr/lib64/python2.7/Demo/tkinter/ttk/plastik_theme.pyt<module>s	
		PK��Zw�%>>ttk/theme_selector.pyonu�[����
��^c@sZdZddlZddlZdejfd��YZd�ZedkrVe�ndS(s�Ttk Theme Selector v2.

This is an improvement from the other theme selector (themes_combo.py)
since now you can notice theme changes in Ttk Combobox, Ttk Frame,
Ttk Label and Ttk Button.
i����NtAppcBs,eZd�Zd�Zd�Zd�ZRS(cCsHtjj|dd�tj�|_tj|d�|_|j�dS(Ntborderwidthii(	tttktFramet__init__tStyletstyletTkintertIntVarttheme_autochanget_setup_widgets(tself((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyRscCs|jj|jj��dS(N(Rt	theme_usetthemes_combotget(R((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyt
_change_themescCs |jj�r|j�ndS(N(R	RR(Rtwidget((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyt_theme_sel_changedscCs�tj|dd�}|jj�}tj|d|dd�|_|jj|d�|jjd|j�tj	|ddd	|j
�}tj|dd
d|j�}|j
dd
dd�|jj
dddddd
dd�|j
dddddd
dd�|j
dddddddd
�|j�}|jddd�|jddd�|jddd�|j
dddddddddd�dS(NttexttThemestvalueststatetreadonlyis<<ComboboxSelected>>sChange Themetcommands-Change themes when combobox item is activatedtvariabletipadxitstickytwtrowtcolumnitpadxtewitet
columnspanitpadytweighttnsewtrowspan(RtLabelRttheme_namestComboboxR
tsettbindRtButtonRtCheckbuttonR	tgridtwinfo_topleveltrowconfiguretcolumnconfigure(Rt
themes_lbltthemest
change_btnttheme_change_checkbtnttop((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyR
s&%""(t__name__t
__module__RRRR
(((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyR
s	
		cCs't�}|jjd�|j�dS(NsTheme Selector(Rtmasterttitletmainloop(tapp((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pytmain7s	t__main__(t__doc__RRRRR<R6(((s7/usr/lib64/python2.7/Demo/tkinter/ttk/theme_selector.pyt<module>s-	PK��Z>���ttk/mac_searchentry.pycnu�[����
��^c
@sdZddlZddlZej�ZdZejddedd�Zejddedd	�Zej	�Z
e
jd
ddd!d
dddgdd�e
jdd
idd6dd
6didd6didd6fgd6fgd6fg�e
j
ddd�ej
dd�ejdddd�Zejdddd�Zejddd d�ejddd d�ej�dS("s\Mac style search widget

Translated from Tcl code by Schelte Bron, http://wiki.tcl.tk/18188
i����Ns�

R0lGODlhKgAaAOfnAFdZVllbWFpcWVtdWlxeW11fXF9hXmBiX2ZnZWhpZ2lraGxua25wbXJ0
cXR2c3V3dHZ4dXh6d3x+e31/fH6AfYSGg4eJhoiKh4qMiYuNio2PjHmUqnqVq3yXrZGTkJKU
kX+asJSWk32cuJWXlIGcs5aYlX6euZeZloOetZial4SftpqbmIWgt4GhvYahuIKivpudmYei
uYOjv5yem4ijuoSkwIWlwYmlu56gnYamwp+hnoenw4unvaCin4ioxJCnuZykrImpxZmlsoaq
zI2pv6KkoZGouoqqxpqms4erzaOloo6qwYurx5Kqu5untIiszqSmo5CrwoysyJeqtpOrvJyo
tZGsw42typSsvaaopZKtxJWtvp6qt4+uy6epppOuxZCvzKiqp5quuZSvxoyx06mrqJWwx42y
1JKxzpmwwaqsqZaxyI6z1ZqxwqutqpOzz4+01qyuq56yvpizypS00Jm0y5W10Zq1zJa20rCy
rpu3zqizwbGzr6C3yZy4z7K0saG4yp250LO1sqK5y5660Z+70qO7zKy4xaC806S8zba4taG9
1KW9zq66x6+7yLi6t6S/1rC8yrm7uLO8xLG9y7q8ubS9xabB2anB07K+zLW+xrO/za7CzrTA
zrjAyLXBz77BvbbC0K/G2LjD0bnE0rLK28TGw8bIxcLL07vP28HN28rMycvOyr/T38DU4cnR
2s/RztHT0NLU0cTY5MrW5MvX5dHX2c3Z59bY1dPb5Nbb3dLe7Nvd2t3f3NXh797g3d3j5dnl
9OPl4eTm4+Ln6tzo9uXn5Obo5eDp8efp5uHq8uXq7ejq5+nr6OPs9Ovu6unu8O3v6+vw8+7w
7ezx9O/x7vDy7/Hz8O/19/P18vT38/L3+fb49Pf59vX6/fj69/b7/vn7+Pr8+ff9//v9+vz/
+/7//P//////////////////////////////////////////////////////////////////
/////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJZAD/ACwC
AAIAKAAWAAAI/gD/CRz4bwUGCg8eQFjIsGHDBw4iTLAQgqBFgisuePCiyJOpUyBDihRpypMi
Lx8qaLhIMIyGFZ5sAUsmjZrNmzhzWpO2DJgtTysqfGDpxoMbW8ekeQsXzty4p1CjRjUXrps3
asJsuclQ4uKKSbamMR3n1JzZs2jRkh1HzuxVXX8y4CDYAwqua+DInVrRwMGJU2kDp31KThy1
XGWGDlxhi1rTPAUICBBAoEAesoIzn6Vm68MKgVAUHftmzhOCBCtQwQKSoABgzZnJdSMmyIPA
FbCotdUQAIhNa9B6DPCAGbZac+SowVIMRVe4pwkA4GpqDlwuAAmMZx4nTtfnf1mO5JEDNy46
MHJkxQEDgKC49rPjwC0bqGaZuOoZAKjBPE4NgAzUvYcWOc0QZF91imAnCDHJ5JFAAJN0I2Ba
4iRDUC/gOEVNDwIUcEABCAgAAATUTIgWOMBYRFp80ghiAQIIVAAEAwJIYI2JZnUji0XSYAYO
NcsQA8wy0hCTwAASXGOiONFcxAtpTokTHznfiLMNMAkcAMuE43jDC0vLeGOWe2R5o4sn1LgH
GzkWsvTPMgEOaA433Ag4TjjMuDkQMNi0tZ12sqWoJ0HATMPNffAZZ6U0wLAyqJ62RGoLLrhI
aqmlpzwaEAAh+QQJZAD/ACwAAAAAKgAaAAAI/gD/CRw40JEhQoEC+fGjcOHCMRAjRkxDsKLF
f5YcAcID582ZjyBDJhmZZIjJIUySEDHiBMhFghrtdNnRAgSHmzhz6sTZQcSLITx+CHn5bxSk
Nz5MCMGy55CjTVCjbuJEtSrVQ3uwqDBRQwrFi476SHHxow8qXcemVbPGtm21t3CnTaP27Jgu
VHtuiIjBsuImQkRiiEEFTNo2cOTMKV7MuLE5cN68QUOGSgwKG1EqJqJDY8+rZt8UjxtNunTj
cY3DgZOWS46KIFgGjiI0ZIsqaqNNjWjgYMUpx8Adc3v2aosNMAI1DbqyI9WycOb4IAggQEAB
A3lQBxet/TG4cMpI/tHwYeSfIzxM0uTKNs7UgAQrYL1akaDA7+3bueVqY4NJlUhIcQLNYx8E
AIQ01mwjTQ8DeNAdfouNA8440GBCQxJY3MEGD6p4Y844CQCAizcSgpMLAAlAuJ03qOyQRBR3
nEHEK+BMGKIui4kDDAAIPKiiYuSYSMQQRCDCxhiziPMYBgDkEaEaAGQA3Y+MjUPOLFoMoUUh
cKxRC4ngeILiH8Qkk0cCAUzSDZWpzbLEE1EwggcYqWCj2DNADFDAAQUgIAAAEFDDJmPYqNJF
F1s4cscTmCDjDTjdSPOHBQggUAEQDAgggTWDPoYMJkFoUdRmddyyjWLeULMMMcAsIw0x4wkM
IME1g25zyxpHxFYUHmyIggw4H4ojITnfiLMNMAkcAAub4BQjihRdDGTJHmvc4Qo1wD6Imje6
eILbj+BQ4wqu5Q3ECSJ0FOKKMtv4mBg33Pw4zjbKuBIIE1xYpIkhdQQiyi7OtAucj6dt48wu
otQhBRa6VvSJIRwhIkotvgRTzMUYZ6xxMcj4QkspeKDxxRhEmUfIHWjAgQcijEDissuXvCyz
zH7Q8YQURxDhUsn/bCInR3AELfTQZBRt9BBJkCGFFVhMwTNBlnBCSCGEIJQQIAklZMXWRBAR
RRRWENHwRQEBADs=tsearch1tdatatformatsgif -index 0tsearch2sgif -index 1sSearch.fieldtimagetfocustborderiiitstickytewsSearch.entrytnsweis
Entry.paddingsEntry.textareatchildrent
backgrounds#b2b2b2tstyletwidthitpadxi
tpady(RR(t__doc__tTkintertttktTktrootRt
PhotoImagets1ts2tStyleRtelement_createtlayoutt	configuretEntryte1te2tgridtmainloop(((s8/usr/lib64/python2.7/Demo/tkinter/ttk/mac_searchentry.pyt<module>s()	
+PK��Z�O���ttk/dirbrowser.pycnu�[����
��^c	@s�dZddlZddlZddlZddlZd�Zd�Zd�Zd�Zd�Z	ej
�Zejdd	�Z
ejdd
�Zejdd)dddd�dd��Zeje
d<ejed<ejddddd�ejddddd�ejddddd�ee�ejde�ejd e�ejd!dd"dd#d$�e
jd!d%d"dd#d&�ejd!dd"d%d#d'�ejdd(d%�ejdd(d%�ej�dS(*s`A directory browser using Ttk Treeview.

Based on the demo found in Tk 8.5 library/demos/browse
i����Nc
	Cs�|j|d�dkrdS|j|d�}|j|j|��|j|�}|r_gntjd�tjd�}x1|tj|�D]}d}tjj	||�j
dd�}tjj|�r�d}ntjj|�r�d}ntjj
|�d	}|j|d
d|d||g�}|dkrs|dkr�|j|d
dd�|j|d|�q�q�|dkr�tj|�j}	|j|dd|	�q�q�WdS(Nttypet	directorytfullpatht.s..s\t/tfileitendttexttvaluesitdummytsizes%d bytes(Rs..(tsettdeletetget_childrentparenttglobtostlistdirtNonetpathtjointreplacetisdirtisfiletsplittinserttitemtstattst_size(
ttreetnodeRRtspecial_dirstptptypetfnametidR
((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt
populate_tree
s,(!		$cCsStjjd�jdd�}|jddd|d|dg�}t||�dS(	NRs\RtRRRR(RRtabspathRRR$(RtdirR((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pytpopulate_roots&s$cCs |j}t||j��dS(N(twidgetR$tfocus(teventR((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pytupdate_tree+s	cCs�|j}|j�}|j|�r�tjj|j|d��}tjj|�r�tj|�|j	|j
d��t|�q�ndS(NRR%(R)R*RRRR&RRtchdirRR
R((R+RRR((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt
change_dir/s	
cCs\t|�t|�}}|dkr>|dkr>|j�n
|j�|j||�dS(s"Hide and show scrollbar as needed.iiN(tfloattgrid_removetgridR(tsbartfirsttlast((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt
autoscroll9s


torienttverticalt
horizontaltcolumnsRRR
tdisplaycolumnstyscrollcommandcCstt||�S(N(R5tvsb(tftl((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt<lambda>HR%txscrollcommandcCstt||�S(N(R5thsb(R=R>((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyR?IR%tcommands#0RsDirectory Structuretanchortws	File Sizetstretchitwidthids<<TreeviewOpen>>s<Double-Button-1>tcolumntrowtstickytnsweitnstewtweight(RRR
(t__doc__RRtTkintertttkR$R(R,R.R5tTktroott	ScrollbarR<RAtTreeviewRtyviewtxviewtheadingRGtbindR1tgrid_columnconfiguretgrid_rowconfiguretmainloop(((s3/usr/lib64/python2.7/Demo/tkinter/ttk/dirbrowser.pyt<module>s:				
		


PK��Za�kJ�
�
ttk/widget_state.pynu�[���"""Sample demo showing widget states and some font styling."""
import ttk

states = ['active', 'disabled', 'focus', 'pressed', 'selected',
          'background', 'readonly', 'alternate', 'invalid']

for state in states[:]:
    states.append("!" + state)

def reset_state(widget):
    nostate = states[len(states) // 2:]
    widget.state(nostate)

class App(ttk.Frame):
    def __init__(self, title=None):
        ttk.Frame.__init__(self, borderwidth=6)
        self.master.title(title)

        self.style = ttk.Style()

        # get default font size and family
        btn_font = self.style.lookup("TButton", "font")
        fsize = str(self.tk.eval("font configure %s -size" % btn_font))
        self.font_family = self.tk.eval("font configure %s -family" % btn_font)
        if ' ' in self.font_family:
            self.font_family = '{%s}' % self.font_family
        self.fsize_prefix = fsize[0] if fsize[0] == '-' else ''
        self.base_fsize = int(fsize[1 if fsize[0] == '-' else 0:])

        # a list to hold all the widgets that will have their states changed
        self.update_widgets = []

        self._setup_widgets()

    def _set_font(self, extra=0):
        self.style.configure("TButton", font="%s %s%d" % (self.font_family,
            self.fsize_prefix, self.base_fsize + extra))

    def _new_state(self, widget, newtext):
        widget = self.nametowidget(widget)

        if not newtext:
            goodstates = ["disabled"]
            font_extra = 0
        else:
            # set widget state according to what has been entered in the entry
            newstates = set(newtext.split()) # eliminate duplicates

            # keep only the valid states
            goodstates = [state for state in newstates if state in states]
            # define a new font size based on amount of states
            font_extra = 2 * len(goodstates)

        # set new widget state
        for widget in self.update_widgets:
            reset_state(widget) # remove any previous state from the widget
            widget.state(goodstates)

        # update Ttk Button font size
        self._set_font(font_extra)
        return 1

    def _setup_widgets(self):
        btn = ttk.Button(self, text='Enter states and watch')

        entry = ttk.Entry(self, cursor='xterm', validate="key")
        entry['validatecommand'] = (self.register(self._new_state), '%W', '%P')
        entry.focus()

        self.update_widgets.append(btn)
        entry.validate()

        entry.pack(fill='x', padx=6)
        btn.pack(side='left', pady=6, padx=6, anchor='n')
        self.pack(fill='both', expand=1)


def main():
    app = App("Widget State Tester")
    app.mainloop()

if __name__ == "__main__":
    main()
PK��Z��qP�
�
ttk/dirbrowser.pynu�[���"""A directory browser using Ttk Treeview.

Based on the demo found in Tk 8.5 library/demos/browse
"""
import os
import glob
import Tkinter
import ttk

def populate_tree(tree, node):
    if tree.set(node, "type") != 'directory':
        return

    path = tree.set(node, "fullpath")
    tree.delete(*tree.get_children(node))

    parent = tree.parent(node)
    special_dirs = [] if parent else glob.glob('.') + glob.glob('..')

    for p in special_dirs + os.listdir(path):
        ptype = None
        p = os.path.join(path, p).replace('\\', '/')
        if os.path.isdir(p): ptype = "directory"
        elif os.path.isfile(p): ptype = "file"

        fname = os.path.split(p)[1]
        id = tree.insert(node, "end", text=fname, values=[p, ptype])

        if ptype == 'directory':
            if fname not in ('.', '..'):
                tree.insert(id, 0, text="dummy")
                tree.item(id, text=fname)
        elif ptype == 'file':
            size = os.stat(p).st_size
            tree.set(id, "size", "%d bytes" % size)


def populate_roots(tree):
    dir = os.path.abspath('.').replace('\\', '/')
    node = tree.insert('', 'end', text=dir, values=[dir, "directory"])
    populate_tree(tree, node)

def update_tree(event):
    tree = event.widget
    populate_tree(tree, tree.focus())

def change_dir(event):
    tree = event.widget
    node = tree.focus()
    if tree.parent(node):
        path = os.path.abspath(tree.set(node, "fullpath"))
        if os.path.isdir(path):
            os.chdir(path)
            tree.delete(tree.get_children(''))
            populate_roots(tree)

def autoscroll(sbar, first, last):
    """Hide and show scrollbar as needed."""
    first, last = float(first), float(last)
    if first <= 0 and last >= 1:
        sbar.grid_remove()
    else:
        sbar.grid()
    sbar.set(first, last)

root = Tkinter.Tk()

vsb = ttk.Scrollbar(orient="vertical")
hsb = ttk.Scrollbar(orient="horizontal")

tree = ttk.Treeview(columns=("fullpath", "type", "size"),
    displaycolumns="size", yscrollcommand=lambda f, l: autoscroll(vsb, f, l),
    xscrollcommand=lambda f, l:autoscroll(hsb, f, l))

vsb['command'] = tree.yview
hsb['command'] = tree.xview

tree.heading("#0", text="Directory Structure", anchor='w')
tree.heading("size", text="File Size", anchor='w')
tree.column("size", stretch=0, width=100)

populate_roots(tree)
tree.bind('<<TreeviewOpen>>', update_tree)
tree.bind('<Double-Button-1>', change_dir)

# Arrange the tree and its scrollbars in the toplevel
tree.grid(column=0, row=0, sticky='nswe')
vsb.grid(column=1, row=0, sticky='ns')
hsb.grid(column=0, row=1, sticky='ew')
root.grid_columnconfigure(0, weight=1)
root.grid_rowconfigure(0, weight=1)

root.mainloop()
PK��Z�j:�^^ttk/plastik_theme.pycnu�[����
��^c@s�dZddlZddlZddlZddlmZdgZidd6dd6d	d
6dd6ZiZd
�Z	d�Z
dS(ssThis demonstrates good part of the syntax accepted by theme_create.

This is a translation of plastik.tcl to python.
You will need the images used by the plastik theme to test this. The
images (and other tile themes) can be retrived by doing:

$ cvs -z3 -d:pserver:anonymous@tktable.cvs.sourceforge.net:/cvsroot/tktable   co tile-themes

To test this module you should do, for example:

import Tkinter
import plastik_theme

root = Tkinter.Tk()
plastik_theme.install(plastik_image_dir)
...

Where plastik_image_dir contains the path to the images directory used by
the plastik theme, something like: tile-themes/plastik/plastik
i����N(t
PhotoImagetinstalls#efefeftframes#aaaaaat
disabledfgs#657a9etselectbgs#fffffftselectfgcCs�tjj|�}tjj|�s7td|��nxWtjd|�D]B}tjj|�d}|d }t|d|dd�t|<qKWdS(Ns(%r is not a directory, can't load imagess%s/*.gifii����tfiletformattgif89(	tostpatht
expandusertisdirt	ExceptiontglobtsplitRtimgs(timgdirtftimgtname((s6/usr/lib64/python2.7/Demo/tkinter/ttk/plastik_theme.pyt
_load_imgs%s
cCs=t|�tj�}|jdddi'iitdd6tdd6tdd6td	d
6tdd6dd
6dd6d6idtdfgd6d6d6ididd6dd6fdidd6dd6fdidd6dd6fdidd6didd 6dd!6d"idd6fgd#6fgd#6fgd$6d%6id&id'd6dd6fd(id)d6dd6fd&id)d6dd6fd*id+d6d,idd 6dd!6d-idd6fgd#6fgd#6fgd$6d.6iid/d06d1d26d6d3id4id5id6id'd6dd 6fgd#6fgd#6fgd#6fgd$6d76iid1d26d6d8id9id:id;id'd6dd 6fgd#6fgd#6fgd#6fgd$6d<6id=id>id)d6fd?id@idAid'd6dd 6fgd#6fgd#6fgd#6fgd$6dB6iidCdDdCdCgdE6d6dF6iidGdDdGdDgdH6dCdCdDgd 6d6idIddDdJdDgfgd 6d6dK6iidCdH6d6dL6idMdNd�d�idJd/gdS6dJdH6dTd6fdU6d36idMdVd�d�d�idJdYgdS6dZdH6d[d6fdU6d96idMd\d�d�d�d�idd6fdU6da6idMdbd�d�d�d�idd6fdU6dg6idMdhidZdS6d+d6fdU6d,6id�dU6d-6id�dU6d*6idMdkidZdS6dd6fdU6d6id�dU6d"6id�dU6d6idMdnd�idd6fdU6dp6idMdqd�idd6fdU6ds6idMdtd�idd6fdU6dv6idMdwd�idd6fdU6dy6idMdzidd6fdU6d{6idMd|iddS6dCdH6fdU6d}6idMd~idd6fdU6d6idMd�iddS6dCdH6fdU6d�6idMd�d�idDdS6dZdJgdH6d[d6fdU6d�6idMdSidJdS6dJdH6d[d6fdU6d�6idMd�d�id[d6dJdGd�d�gdS6dJdJd�gdH6fdU6d=6idMd�id�d6d�dCdCdCgdS6fdU6d>6idMd�d�d�d�d�d�idJdGd�d�gdS6dJdJd�gdH6d[d6fdU6d�6idMd�id�d6d�dCdCdCgdS6fdU6d�6idMd�idJdS6fdU6d�6idMd�d�d�idCdDdCdCgdH6dJd/dJd/gdS6fdU6d�6idMd�idDdS6fdU6d�6idMd�idDdYgdS6fdU6d�6idMd�idYdDgdS6fdU6d�6idMd�d�idJd/gdS6dJdH6d[d6fdU6d�6�|jd�dS(�NtplastiktdefaulttsettingsRt
backgroundttroughcolorRtselectbackgroundRtselectforegroundtfieldbackgroundt
TkDefaultFonttfontitborderwidtht	configuretdisabledRt
foregroundtmapt.sVertical.Scrollbar.uparrowttoptsidettstickysVertical.Scrollbar.downarrowtbottomsVertical.Scrollbar.troughtnssVertical.Scrollbar.thumbtexpandtunitsVertical.Scrollbar.griptchildrentlayoutsVertical.TScrollbarsHorizontal.Scrollbar.leftarrowtleftsHorizontal.Scrollbar.rightarrowtrightsHorizontal.Scrollbar.troughtewsHorizontal.Scrollbar.thumbsHorizontal.Scrollbar.gripsHorizontal.TScrollbari
twidthtcentertanchors
Button.buttonsButton.focussButton.paddingsButton.labeltTButtonsToolbutton.bordersToolbutton.buttonsToolbutton.paddingsToolbutton.labelt
ToolbuttonsMenubutton.buttonsMenubutton.indicatorsMenubutton.focussMenubutton.paddingsMenubutton.labeltTMenubuttoniit
tabmarginst	TNotebookitpaddingtselectedis
TNotebook.tabtTreeviewtimagesbutton-ntpressedsbutton-ptactivesbutton-htbordertewnsselement creates	tbutton-ns	tbutton-ps	tbutton-hi	itnewsscheck-nuscheck-hcscheck-pcscheck-huscheck-ncsCheckbutton.indicatorsradio-nusradio-hcsradio-pcsradio-husradio-ncsRadiobutton.indicatorshsb-nshsb-gshsb-tsvsb-nsvsb-gsvsb-ts	arrowup-ns	arrowup-psScrollbar.uparrowsarrowdown-nsarrowdown-psScrollbar.downarrowsarrowleft-nsarrowleft-psScrollbar.leftarrowsarrowright-nsarrowright-psScrollbar.rightarrows	hslider-nsHorizontal.Scale.sliders	hslider-tsHorizontal.Scale.troughs	vslider-nsVertical.Scale.sliders	vslider-tsVertical.Scale.troughsentry-ntfocussentry-fsEntry.fieldsLabelframe.borderscombo-rscombo-raiiisarrow-dtescombo-ntreadonlyscombo-fascombo-as	!readonlyscombo-fsCombobox.fieldsCombobox.downarrows
notebook-csNotebook.clientsnotebook-tnsnotebook-tssnotebook-tasNotebook.tabshprogress-tsProgressbar.troughshprogress-bsHorizontal.Progressbar.pbarsvprogress-bsVertical.Progressbar.pbarstree-nstree-psTreeheading.cell(R?sbutton-p(R@sbutton-h(R<s	tbutton-p(R?s	tbutton-p(R@s	tbutton-h(R@R<scheck-hc(R?R<scheck-pc(R@scheck-hu(R<scheck-nc(R@R<sradio-hc(R?R<sradio-pc(R@sradio-hu(R<sradio-nc(R>shsb-g(R>shsb-t(R>svsb-g(R>svsb-t(R?s	arrowup-p(R?sarrowdown-p(R?sarrowleft-p(R?sarrowright-p(RDsentry-f(R@scombo-ra(RFR@scombo-ra(RDR@scombo-fa(R@scombo-a(s	!readonlyRDscombo-f(RFscombo-r(R<snotebook-ts(R@snotebook-ta(R?stree-p(RtttktStylettheme_createtcolorst	theme_use(Rtstyle((s6/usr/lib64/python2.7/Demo/tkinter/ttk/plastik_theme.pyR.s

/
/@@@!*'))""	"")).&.4!!-(t__doc__R	RRGtTkinterRt__all__RJRRR(((s6/usr/lib64/python2.7/Demo/tkinter/ttk/plastik_theme.pyt<module>s	
		PK��Z�Ծ��READMEnu�[���Several collections of example code for Tkinter.

See the toplevel README for an explanation of the difference between
Tkinter and _tkinter, how to enable the Python Tk interface, and where
to get Matt Conway's lifesaver document.

Subdirectories:

guido		my original example set (fairly random collection)
matt		Matt Conway's examples, to go with his lifesaver document
ttk         Examples using the ttk module
PK��Z�#��guido/imageview.pynu�[���from Tkinter import *
import sys

def main():
    filename = sys.argv[1]
    root = Tk()
    img = PhotoImage(file=filename)
    label = Label(root, image=img)
    label.pack()
    root.mainloop()

main()
PK��Z^�����guido/wish.pycnu�[����
��^c@sddlZddlZejejdddd�Zejd�dZx�er\dZndZyee�Z	Wne
k
r�PnXee	d	Zejejd
de��rMeje	�yejde�Z
Wnejk
r�Zd
GeGHnXe
re
GHndZqMqMWdS(i����NtDISPLAYtwishtTkitupdatets% s
tinfotcompletetevals	TclError:(t_tkintertostcreatetenvironttktcalltcmdtpromptt	raw_inputtlinetEOFErrort
getbooleantrecordtresulttTclErrortmsg(((s//usr/lib64/python2.7/Demo/tkinter/guido/wish.pyt<module>s,
	


PK��ZM�dUUguido/MimeViewer.pycnu�[����
Afc@soddlZddlTddlTddlmZdd	d��YZd�Zd�Zedkrke�ndS(
i����N(t*(tScrolledTextt
MimeViewercBsGeZd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(c	Cs�||_||_t|idd6dd6�|_idd6dd6|j_t|ji|d	6|jd
6�|_|jjidd6�|j	d
��}t
|d�}|r"t|ji|d6dd6dd6dd6dd6�|_idd6dd6|jd6|j_|jj
d|�nNt|jidd6dd6�|_idd6dd6dd6|jd6|j_|j�}t|�tkr)d|_t
|d�}|rt|ji|d6dd6dd6dd6dd6�|_idd6dd6|j_|jj
d|�n	d|_d|_n�t|jidd6dd6�|_idd6dd6dd6|jd6|j_g|_xQtt|��D]=}t|jd ||df||�}|jj|�q�Wd|_d|_dS(!NtraisedtreliefitbditexpandtbothtfillttexttcommandtwtanchorcSs|dko|d dkS(Ntreceivedisx400-((tx((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyt<lambda>titheightiPtwidthtnonetwrapitaftertendttoptsidetipadyRi
tflattlefttipadxtys%s.%d(ttitletmsgtFrametframetpackingtCheckbuttonttoggletbuttontpackt
getheadertextt
countlinesRthtexttinserttgetbodyttypet
StringTypetNonetpadtbtexttpartstrangetlenRtappendt	collapsed(	tselftparentRRt
headertextRtbodytitp((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyt__init__sn		 	
	
	
		

				
	cCs|jj|jj�dS(N(R!R&R"(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR&GscCs|jj�dS(N(R!tdestroy(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR=IscCs|jr|jj�ndS(N(R5R%tinvoke(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pytshowKs	cCs$|jr|j�n
|j�dS(N(R5texplodetcollapse(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR$Ns	
cCs�d|_x3|j|j|jfD]}|r"|j�q"q"W|jrlx!|jD]}|jj�qRWn|jjidd6�dS(NiiR(R5R)R0R/tforgetR1R!R&(R6tcomptpart((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyRASs		cCs�d|_x9|j|j|jfD]}|r"|j|j�q"q"W|jrox|jD]}|j�qXWn|jjidd6�dS(NiiR(R5R)R0R/R&R"R1R!(R6RCRD((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR@\s		(	t__name__t
__module__R<R&R=R?R$RAR@(((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyRs	;						cCs\d}d}xI||krWtj|d|�}|dkr@Pn|d}|d}qW|S(Nis
i(tstringtfind(tstrtlimitR:tn((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR(es
cCsBddl}ddl}ddl}|j|jdd�\}}x|D]\}}qJWd}d}x:|D]2}	|	d dkr�|	d}qmtj|	�}qmW|j�}
|
j|�}|s�|j	�}n|j
|�}t�}
|
j}t
|
d||f|�}|j�|j�|
jdd�|j�dS(Ni����iRtinboxt+s+%s/%d(tsystgetopttmhlibtargvR.RGtatoitMHt
openfoldert
getcurrenttopenmessagetTkttkRR&R?tminsizetmainloop(RNRORPtoptstargstotatmessagetfoldertargtmhtftmtrootRXR((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pytmainos0

		

t__main__((RGttypestTkinterRRR(RfRE(((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyt<module>s

Z	
	 PK��Z�X�\guido/ManPage.pycnu�[����
��^c@s�ddlZddlTddlmZddlmZdZdZejd�Zejd�Zejd	�Z	d
efd��YZ
de
fd
��YZeZd�Z
edkr�e
�ndS(i����N(t*(t_tkinter(tScrolledTexts*-Courier-Bold-R-Normal-*-120-*s!*-Courier-Medium-O-Normal-*-120-*s:^     Page [1-9][0-9]*[ 	]+\|^.*Last change:.*[1-9][0-9]*
s^[ 	]*
s^[ 	]*[Xv!_][Xv!_ 	]*
tEditableManPagecBsneZdd�Zd�Zd�Zd�ZeZd�Zd�Z	d�Z
d�Zd�Zd	d
�Z
RS(cKshttj||f|�|jddd�|jddt�|jddt�d|_d|_dS(NtXt	underlineit!tfontt_i(	tapplyRt__init__t
tag_configtBOLDFONTt
ITALICFONTtNonetfptlineno(tselftmastertcnf((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR
s	cCs
|jdkS(N(RR(R((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytbusy%scCs|j�r|j�ndS(N(Rt
_endparser(R((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytkill)scCs-|j|�|jj|tj|j�dS(N(t_startparserttktcreatefilehandlerRtREADABLEt_filehandler(RR((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytasyncparsefile.s
cCs4|jj�}|s#|j�dS|j|�dS(N(RtreadlineRt
_parseline(RRtmasktnextline((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR6s

cCszddlm}|d|d�}|j|d�}|j|�x'|j�}|s[Pn|j|�qEW|j�dS(Ni����(tselectgcSs||ggg|�dS(Ni((RttoutR!((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytavail@stheight(R!tgetintRRRR(RRR!R#R$R ((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyt
syncparsefile>s
cCs�|j�rtd�n|j�||_d|_d|_d|_d|_|d}t	|d<|j
dt�||d<dS(Nsstartparser: still busyitstates1.0(RtRuntimeErrortfilenoRRtoktemptyRtbuffertNORMALtdeletetEND(RRt	savestate((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRLs
					

cCs�|j�std�n|jr1|jd�ny|jj|j�Wntk
r]}nX|jj�d|_|`
|`|`dS(Nsendparser: not busyt(RR(R,RRtdeletefilehandlerRtTclErrortcloseRR*R+(Rtmsg((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR[s	
	cCs|js||_dStj|j�dkrDd|_||_dS|j}tj|�dkrt|}d|_nd}||_|js�d|_d|_dStj|�dkr�d|_d|_dS|d}t|d<t	dkr|j
dd�n|j
dt�|jrB|jd�|j
d|_
d|_n|sX|j|�n�d}d}xrttt|�t|���D]O}|||kr�||kr�|j|||!|�|}n||}q�q�W|j||�|j
d|_
||d<dS(	NiiR'g@tinsertsend-1cs
R1(R,t	emptyprogtmatchR+tulprogRR*t
footerprogR-t	TkVersiontmark_setR/t_insert_propRtrangetmintlen(RR ttextlinetproplineR0tptjti((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRisV											

	
(	t cCs�|jt��}|jt�|�tdkrj|j|�}x'|D]}|j||t��qGWn|dkr�|j||t��ndS(Ng@RF(tindextAtInsertR6R;t	tag_namest
tag_removettag_add(Rtstrtproptherettagsttag((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR=�s
N(t__name__t
__module__RR
RRRt	parsefileRR&RRRR=(((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRs								<tReadonlyManPagecBseZdd�ZRS(cKs't|d<ttj||f|�dS(NR'(tDISABLEDR	RR
(RRR((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR
�s
N(RQRRRR
(((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRT�sc	CsNddl}ddl}d}d}d}|jdr]|jddkr]d}|jd=n|jdrz|jd}n|}|s�|dd!dkr�|d	}n|jj||�}nt�}|jdd�t|d
tdd�}|j	d
ddt
�|rt|d�}n|jd|d�}|j
|�|j�dS(Ni����s/usr/local/man/manntTcliis-fi����t.s.ntrelieftborderwidthitexpandtfilltrsnroff -man %s | ul -i(tostsystargvtpathtjointTktminsizetManPagetSUNKENtpacktBOTHtopentpopenRStmainloop(	R]R^tMANDIRtDEFAULTPAGEt	formattedtnametroottmanpageR((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyttest�s0 


	
t__main__(tretTkinterRRRR
tcompileR:R7R9RRTRdRqRQ(((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyt<module>s
	�	PK��Z��kK�\�\guido/sortvisu.pyonu�[����
Afc@s�dZddlTddlmZmZddlZdZdZdZddd��YZ	d	dd
��YZ
d�Zd�Zd
�Z
d�Zd�Zd�Zd�Zd�Zd�Zd�Zddd��YZd�Zedkr�e�ndS(sjSorting algorithms visualizer using Tkinter.

This module is comprised of three ``components'':

- an array visualizer with methods that implement basic sorting
operations (compare, swap) as well as methods for ``annotating'' the
sorting algorithm (e.g. to show the pivot element);

- a number of sorting algorithms (currently quicksort, insertion sort,
selection sort and bubble sort, as well as a randomization function),
all using the array visualizer for its basic operations and with calls
to its annotation methods;

- and a ``driver'' class which can be used as a Grail applet or as a
stand-alone application.

i����(t*(tLinet	RectangleNi
itArraycBs�eZdd�Zd�ZdZd�Zd�ZdZdZ	d�Z
d�ZdZd	�Z
d
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs||_t|j�|_|jjdt�t|j�|_|jj�t|j�|_|jj�t|j�|_	|j	j�t
|jdddd�|_t
|jdddd�|_t
|jdddd�|_
g|_d|_|_|r|j|�ndS(Ntfilli(tmastertFrametframetpacktXtLabeltlabeltCanvastcanvastreportRtlefttrighttpivottitemstsizetmaxvaluetsetdata(tselfRtdata((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt__init__"s 	


	cCs�|j}g|_x|D]}|j�qWt|�|_t|�|_|jjd|jdtd|jdt	�x7t
|j�D]&}|jjt||||��q�W|j
d|j�dS(NtwidthitheightsSort demo, size %d(RtdeletetlenRtmaxRR
tconfigtXGRIDtYGRIDtrangetappendt	ArrayItemtreset(RRtolditemstitemti((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR4s		
$tnormalcCs
||_dS(N(tspeed(RR)((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytsetspeedCscCs|jj�dS(N(Rtdestroy(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR+FsicCs&d|_|jr"|jj�ndS(Ni(t
stop_mainlooptin_mainloopRtquit(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytcancelLs		cCs|jr|jj�ndS(N(R-RR.(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytstepQs	sArray.CancelledcCs�|jdkrd}n4|jdkr4|d}n|jdkrLd}n|js�|jj�|jj||jj�}d|_|jj�|jj|�d|_n|jr�d|_|j	d�t
j�ndS(	Ntfastestitfasti
ssingle-stepiʚ;it	Cancelled(R)R,RtupdatetafterR.R-tmainlooptafter_canceltmessageRR3(Rtmsecstid((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytwaitWs"	
		
	
		
cCs|jS(N(R(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytgetsizejscCszxit|j�D]X}|j|}||ko:|knrU|jjdd�q|jjdd�qW|j�dS(NRtredtorange(R!RRR&Rthide_left_right_pivot(RtfirsttlastR'R&((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytshow_partitionms
cCsHx7t|j�D]&}|j|}|jjdd�qW|j�dS(NRR=(R!RRR&RR?(RR'R&((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pythide_partitionvs
cCs�d|ko|jkns-|j�dS|j|j�\}}}}|jj|ddf|ddfg�|jj�dS(Niii'(Rt	hide_leftRtpositionRtcoordsRR4(RRtx1ty1tx2ty2((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt	show_left|s
*cCs�d|ko|jkns-|j�dS|j|j�\}}}}|jj|ddf|ddff�|jj�dS(Niii'(Rt
hide_rightRRERRFRR4(RRRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
show_right�s
*cCs"|j�|j�|j�dS(N(RDRLt
hide_pivot(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR?�s

cCs|jjddf�dS(Ni(ii(ii(RRF(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRD�scCs|jjddf�dS(Ni(ii(ii(RRF(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRL�scCsM|j|j�\}}}}|jjd|dfd|dff�dS(Niii'(RRERRF(RRRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
show_pivot�scCs|jjddf�dS(Ni(ii(ii(RRF(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRN�scCs`||krdS|j�|j|}|j|}|||j|<|j|<|j|�dS(N(t	countswapRtswapwith(RR'tjR&tother((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytswap�s


cCs1|j�|j|}|j|}|j|�S(N(tcountcompareRt	compareto(RR'RRR&RS((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytcompare�s


cCs7d|_d|_|j|�|j�|j�dS(Ni(t	ncomparestnswapsR8tupdatereportRC(Rtmsg((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR$�s
		

cCs|jjd|�dS(Nttext(RR(RR[((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR8�scCs|jd|_|j�dS(Ni(RYRZ(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRP�scCs|jd|_|j�dS(Ni(RXRZ(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRU�scCs-d|j|jf}|jjd|�dS(Ns%d cmps, %d swapsR\(RXRYRR(RR\((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRZ�sN(t__name__t
__module__tNoneRRR)R*R+R-R,R/R0R3R;R<RBRCRKRMR?RDRLRORNRTRWR$R8RPRURZ(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR s8	
																							R#cBsbeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�ZRS(
cCs�||_||_||_|j�\}}}}t|j||||dddddd�|_|jjd|j�|jjd|j	�|jjd	|j
�dS(
NRR=toutlinetblackRis
<Button-1>s<Button1-Motion>s<ButtonRelease-1>(tarraytindextvalueRERR
R&tbindt
mouse_downt
mouse_movetmouse_up(RRbRcRdRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�s			cCs)|j}d|_d|_|j�dS(N(R&R_RbR(RR&((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�s			cCsA|j|_|j|_|j|_|j|_|jj�dS(N(txtlastxtytlastytorigxtorigyR&ttkraise(Rtevent((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRf�s
cCsC|jj|j|j|j|j�|j|_|j|_dS(N(R&tmoveRiRjRkRl(RRp((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRg�s'c	Cs�|j|j�}||jj�kr=|jj�d}n|dkrRd}n|jj|}|j}|||jj|<|jj|<||_|j�\}}}}|jj||f||ff�|j	|�dS(Nii(
tnearestindexRiRbR<RRcRER&RFtsetindex(	RRpR'RSthereRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRh�s		!	"cCs�t|j|�}|sdS|jjdkr7d}n|j�}||_|j�}t|||�}|jj�x<|D]4}|jj|d |df�|jj	d�q~WdS(NR1iii2(
tstepsRcRbR)REtinterpolateR&RoRFR;(RRctnstepstoldptstnewptst
trajectorytpts((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRs�s		

cCs�t|j|j�}|sdS|jjdkr:d}n|j�}|j�}|j|j|_|_|j�}|j�}|jd}|jd}|jjdd�|jjdd�|jjj�|jjdkrk|jj	|d |df�|jj	|d |df�|jjj�|jjd|�|jjd|�|jj
d�dSt|||�}	t|||�}
|j|jkr�|jj
�|jj
�n|jj
�|jj
�z�xztt|	��D]f}|	|}|
|}
|jj	|d |df�|jj	|
d |
df�|jj
d�q�WWd|	d	}|
d	}
|jj	|d |df�|jj	|
d |
df�|jjd|�|jjd|�XdS(
NR1iRtgreentyellowssingle-stepii2i����(RuRcRbR)RER&RRR4RFR;RvRdRoR!R(RRSRwtmyoldptstotheroldptstmynewptstothernewptstmyfillt	otherfilltmytrajectorytothertrajectoryR'tmyptstotherpts((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRQ�sV	








cCs�|jd}|jd}t|j|j�}|dkrJd}d}n%|dkred}d}n
d}}z:|jjd|�|jjd|�|jjd�Wd|jjd|�|jjd|�X|S(NRitwhiteRatgreyi�(R&tcmpRdRRbR;(RRSR�R�toutcometmyflasht
otherflash((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRV-s"

		
cCsX|jdttd}|t}|jjdt}||jt}||||fS(Nii(RcRtWIDTHRbRR Rd(RRGRIRJRH((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyREBs

cCsttt|�t��dS(Ni(tinttroundtfloatR(RRi((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRrIs(R]R^RRRfRgRhRsRQRVRERr(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR#�s							.		cCs[t||�}|dkr)|d}n.|dkrB|d}n|dkrWd}n|S(Niiii
(tabs(RttthereRw((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRuOs

	cCs�t|�t|�kr$td�ndgt|�}t|�g}xmtd|�D]\}x@tt|��D],}||||||||||<qoW|jt|��qVW|jt|��|S(Ns,can't interpolate arrays of different lengthii(Rt
ValueErrorttupleR!R"(RxRytnR{tresR'tk((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRvYs*cCs=|j�}|j|ddg|�|jd|�dS(NiisUniform data, size %d(R<RR$(RbR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytuniformhscCs;|j�}|jtd|d��|jd|�dS(NisDistinct data, size %d(R<RR!R$(RbR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytdistinctmscCsg|jd�|j�}x:t|�D],}tjd|d�}|j||�q&W|jd�dS(NtRandomizingiit
Randomized(R$R<R!trandomtrandintRTR8(RbR�R'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt	randomizers
cCs�|j�}|jd�xrtd|�D]a}|d}xN|dkr�|j||d�dkrhPn|j||d�|d}q<Wq)W|jd�dS(NsInsertion sortiitSorted(R<R$R!RWRTR8(RbRR'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
insertionsortzs

cCs�|j�}|jd�z�xmt|�D]_}|j||�xFt|d|�D]1}|j||�dkrS|j||�qSqSWq)W|jd�Wd|j�XdS(NsSelection sortiiR�(R<R$R!RBRWRTR8RC(RbRR'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
selectionsort�s
cCs�|j�}|jd�xat|�D]S}xJtd|�D]9}|j|d|�dkr<|j|d|�q<q<Wq&W|jd�dS(NsBubble sortiiR�(R<R$R!RWRTR8(RbRR'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
bubblesort�s
c
Cs�|j�}|jd�zYd|fg}x6|rc|d\}}|d=|j||�||dkr�|jd�xvt|d|�D]a}|d}xN||kr�|j||d�dkr�Pn|j||d�|d}q�Wq�Wq.n|jd�|||d|d}}}|j||�dkrO|j||�n|j||�dkrz|j||�n|j||�dkr�|j||�n|}|j|�|jd	�|jd
�|}	|}
x
|jd�|
d}
|j	|
�x?|
|krF|j|
|�dkrF|
d}
|j	|
�qW|jd�|	d}	|j
|	�x?|	|kr�|j|	|�dkr�|	d}	|j
|	�qnW|	|
kr�|jd
�Pn|jd�|j|	|
�q�W|jd�|j||
�|
|}||	}|dkr>|j||
f�n|dkr.|j|	|f�q.q.W|jd�Wd|j�XdS(Nt	Quicksortii����isInsertion sortisChoosing pivotisPivot at left of partitioni�sSweep right pointersSweep left pointersEnd of partitions
Swap itemssSwap pivot backR�(
R<R$RBR8R!RWRTROR;RMRKR"RC(
RbRtstackR@RAR'RRR�RRRtn1tn2((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt	quicksort�sx
	


 





'



'





cCs<x5x.ttttgD]}t|�||�qWqWdS(N(R�R�R�R�R�(Rbtalg((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytdemosort�s
tSortDemocBs�eZdd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�ZRS(icCs||_||_d|_t|j�|_t|�|_|jjdt�t|j�|_	|j	jdt
dt�t|j�|_|jjdt
dt�t|j	ddd|j�|_|jjdt�t|j	ddd|j�|_|jjdt�t|j	ddd|j�|_|jjdt�t|j	dd	d|j�|_|jjdt�d
tfd��Y}||j|�|_|jj|�dd
ddgtddd�}|j|kr�|j|j�|j�ntt|j	|jft |��|_!|j!jdt�t"|j�|_#|j#jd�t|j	|j#dddd�|_$|j$jdt�t|j	ddd|j%�|_&|j&jdt�t|jddd|j'�|_(|j(jdt�t|jddd|j)�|_*|j*jdt�t|jddd|j+�|_,|j,jdt�t|jddd|j-�|_.|j.jdt�t|jddd|j/�|_0|j0jdt�|j0j1dt2�t|jddd|j3�|_4|j4jdt�dS(NitsideRR\R�tcommandsInsertion sortsSelection sortsBubble sorttMyIntVarcBseZd�Zd�ZRS(cSs||_tj||�dS(N(tdemotIntVarR(RRR�((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRs	cSs9tj||�t|�dkr5|jj|�ndS(Nt0(R�tsettstrR�tresize(RRd((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�s(R]R^RR�(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR��s	iiiiii7R(ssingle-stepR2R1tStept	RandomizetUniformtDistincttDemotCanceltstatetQuit(5RRtbusyRRbRtbotframeRtBOTTOMtbotleftframetLEFTtYt
botrightframetRIGHTtButtontc_qsorttb_qsortR	tc_isorttb_isorttc_ssorttb_ssorttc_bsorttb_bsortR�tv_sizeR�R!R"tsorttapplyt
OptionMenuR�tm_sizet	StringVartv_speedtm_speedtc_steptb_steptc_randomizetb_randomizet	c_uniformt	b_uniformt
c_distinctt
b_distincttc_demotb_demotc_canceltb_cancelRtDISABLEDtc_quittb_quit(RRRR�tsizes((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�sv				"
"cCsG|jr|jj�dS||_|jjtd|jd��dS(Ni(R�RtbellRRbRR!(Rtnewsize((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�0s
	
	cCs|jt�dS(N(trunR�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�7scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�:scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�=scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�@scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�CscCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�FscCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�IscCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�LscCs�|jr|jj�dSd|_|jj|jj��|jjdt	�y||j�Wnt
jk
rvnX|jjdt�d|_dS(NiR�i(
R�RR�RbR*R�tgetR�RtNORMALRR3R�(Rtfunc((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�Os	
	cCs+|js|jj�dS|jj�dS(N(R�RR�RbR/(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�]s	
cCsK|js|jj�dS|jjd�|jjd�|jj�dS(Nssingle-step(R�RR�R�R�RbR*R0(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�cs	
cCs3|jr|jj�n|jj|jj�dS(N(R�RbR/Rt
after_idleR.(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�ks	(R]R^RR�R�R�R�R�R�R�R�R�R�R�R�R�(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR��sL												cCs6t�}t|�}|jd|j�|j�dS(NtWM_DELETE_WINDOW(tTkR�tprotocolR�R6(trootR�((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytmainss	t__main__((((t__doc__tTkinterRRRR�RR R�RR#RuRvR�R�R�R�R�R�R�R�R�R�R](((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt<module>s,
��	
						
			=		�	PK��Z%L��guido/brownian2.pycnu�[����
��^c@s�ddlTddlZddlZdZdZdZdZdZdZdZ	da
dad	�Z
d
�Zd�Zedkr�e�ndS(
i����(t*Ni�i,i
itrediccs�t}tjtdt�}tjtdt�}|j||||||||dt�}x_ts�tjdt	�}tjdt	�}y|j
|||�Wntk
r�PqcXdVqcWdS(Ng@tfilli(
tRADIUStrandomtgausstWIDTHtSIGMAtHEIGHTtcreate_ovaltFILLtstoptBUZZtmovetTclErrortNone(tcanvastrtxtytptdxtdy((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pytparticles.	
cCs:|j�tjt�}tjt|d�t|�dS(Ni�(tnextRtexpovariatetLAMBDAtroottaftertintR
(Rtdt((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pyR
"s
cCs�t�attdtdt�}|jdddd�d}tjdr`ttjd�}nx$t	|�D]}t
t|��qmWztj�Wdda
XdS(NtwidththeightRtbothtexpandii(tTkRtCanvasRRtpacktsystargvRtrangeR
RtmainloopR(Rtnpti((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pytmain's	
t__main__(tTkinterRR&RRRRRRR
RRRRR
R,t__name__(((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pyt<module>s 
			PK��Z�+�$RRguido/optionmenu.pycnu�[����
��^c@s�ddlTe�Ze�Zejd�eeeddd�Zej�dZ	e�Z
e
je	d
�eeee
fee	��Z
e
j�ej�dS(
i����(t*tOnetTwotThreetAahtBeetCeetDeetEffiN(RRRRR(tTkintertTktroott	StringVartvar1tsett
OptionMenutmenu1tpacktCHOICEStvar2tapplyttupletmenu2tmainloop(((s5/usr/lib64/python2.7/Demo/tkinter/guido/optionmenu.pyt<module>s
		

	
PK��Z�^u�iiguido/switch.pyonu�[����
��^c@sfddlTddd��YZddd��YZdd
d��YZd�Zed	krbe�nd
S(i����(t*tAppcBs)eZddd�Zd�Zd�ZRS(cCs�|dkr3|dkr$t�}q3t|�}n||_t|�|_|jj�t|dddt�|_|jjdddt	�i|_
d|_dS(Ntborderwidthitrelieftexpanditfill(tNonetTktToplevelttoptFrametbuttonframetpacktGROOVEt
panelframetBOTHtpanelstcurpanel(tselfR	tmaster((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyt__init__s	
	cCs�t|jd|d||d��}|jdt�t|j�}||�}|||f|j|<|jdkr�|j	|�ndS(NttexttcommandcSs
|j|�S(N(tshow(Rtname((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyt<lambda>ttside(
tButtonRRtLEFTR
RRRRR(RRtklasstbuttontframetinstance((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pytaddpanelscCsR|j|\}}}|jr/|jj�n||_|jdddd�dS(NRiRtboth(RRtpack_forgetR(RRRR R!((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyRs
		N(t__name__t
__module__RRR"R(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyRs	
t
LabelPanelcBseZd�ZRS(cCs&t|dd�|_|jj�dS(NRsHello world(tLabeltlabelR(RR ((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR's(R%R&R(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR'&stButtonPanelcBseZd�ZRS(cCs&t|dd�|_|jj�dS(NRsPress me(RRR(RR ((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR,s(R%R&R(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR*+scCs:t�}|jdt�|jdt�|jj�dS(NR)R(RR"R'R*R	tmainloop(tapp((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pytmain0s	t__main__N((((tTkinterRR'R*R-R%(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyt<module>s
!	PK��Z-���88guido/AttrDialog.pynu�[���
# The options of a widget are described by the following attributes
# of the Pack and Widget dialogs:
#
# Dialog.current: {name: value}
# -- changes during Widget's lifetime
#
# Dialog.options: {name: (default, klass)}
# -- depends on widget class only
#
# Dialog.classes: {klass: (v0, v1, v2, ...) | 'boolean' | 'other'}
# -- totally static, though different between PackDialog and WidgetDialog
#    (but even that could be unified)

from Tkinter import *

class Option:

    varclass = StringVar            # May be overridden

    def __init__(self, dialog, option):
        self.dialog = dialog
        self.option = option
        self.master = dialog.top
        self.default, self.klass = dialog.options[option]
        self.var = self.varclass(self.master)
        self.frame = Frame(self.master)
        self.frame.pack(fill=X)
        self.label = Label(self.frame, text=(option + ":"))
        self.label.pack(side=LEFT)
        self.update()
        self.addoption()

    def refresh(self):
        self.dialog.refresh()
        self.update()

    def update(self):
        try:
            self.current = self.dialog.current[self.option]
        except KeyError:
            self.current = self.default
        self.var.set(self.current)

    def set(self, e=None):          # Should be overridden
        pass

class BooleanOption(Option):

    varclass = BooleanVar

    def addoption(self):
        self.button = Checkbutton(self.frame,
                                 text='on/off',
                                 onvalue=1,
                                 offvalue=0,
                                 variable=self.var,
                                 relief=RAISED,
                                 borderwidth=2,
                                 command=self.set)
        self.button.pack(side=RIGHT)

class EnumOption(Option):

    def addoption(self):
        self.button = Menubutton(self.frame,
                                 textvariable=self.var,
                                 relief=RAISED, borderwidth=2)
        self.button.pack(side=RIGHT)
        self.menu = Menu(self.button)
        self.button['menu'] = self.menu
        for v in self.dialog.classes[self.klass]:
            self.menu.add_radiobutton(
                label=v,
                variable=self.var,
                value=v,
                command=self.set)

class StringOption(Option):

    def addoption(self):
        self.entry = Entry(self.frame,
                           textvariable=self.var,
                           width=10,
                           relief=SUNKEN,
                           borderwidth=2)
        self.entry.pack(side=RIGHT, fill=X, expand=1)
        self.entry.bind('<Return>', self.set)

class ReadonlyOption(Option):

    def addoption(self):
        self.label = Label(self.frame, textvariable=self.var,
                           anchor=E)
        self.label.pack(side=RIGHT)

class Dialog:

    def __init__(self, master):
        self.master = master
        self.fixclasses()
        self.refresh()
        self.top = Toplevel(self.master)
        self.top.title(self.__class__.__name__)
        self.top.minsize(1, 1)
        self.addchoices()

    def refresh(self): pass         # Must override

    def fixclasses(self): pass      # May override

    def addchoices(self):
        self.choices = {}
        list = []
        for k, dc in self.options.items():
            list.append((k, dc))
        list.sort()
        for k, (d, c) in list:
            try:
                cl = self.classes[c]
            except KeyError:
                cl = 'unknown'
            if type(cl) == TupleType:
                cl = self.enumoption
            elif cl == 'boolean':
                cl = self.booleanoption
            elif cl == 'readonly':
                cl = self.readonlyoption
            else:
                cl = self.stringoption
            self.choices[k] = cl(self, k)

    # Must override:
    options = {}
    classes = {}

    # May override:
    booleanoption = BooleanOption
    stringoption = StringOption
    enumoption = EnumOption
    readonlyoption = ReadonlyOption

class PackDialog(Dialog):

    def __init__(self, widget):
        self.widget = widget
        Dialog.__init__(self, widget)

    def refresh(self):
        self.current = self.widget.info()
        self.current['.class'] = self.widget.winfo_class()
        self.current['.name'] = self.widget._w

    class packoption: # Mix-in class
        def set(self, e=None):
            self.current = self.var.get()
            try:
                apply(self.dialog.widget.pack, (),
                      {self.option: self.current})
            except TclError, msg:
                print msg
                self.refresh()

    class booleanoption(packoption, BooleanOption): pass
    class enumoption(packoption, EnumOption): pass
    class stringoption(packoption, StringOption): pass
    class readonlyoption(packoption, ReadonlyOption): pass

    options = {
            '.class': (None, 'Class'),
            '.name': (None, 'Name'),
            'after': (None, 'Widget'),
            'anchor': ('center', 'Anchor'),
            'before': (None, 'Widget'),
            'expand': ('no', 'Boolean'),
            'fill': ('none', 'Fill'),
            'in': (None, 'Widget'),
            'ipadx': (0, 'Pad'),
            'ipady': (0, 'Pad'),
            'padx': (0, 'Pad'),
            'pady': (0, 'Pad'),
            'side': ('top', 'Side'),
            }

    classes = {
            'Anchor': (N, NE, E, SE, S, SW, W, NW, CENTER),
            'Boolean': 'boolean',
            'Class': 'readonly',
            'Expand': 'boolean',
            'Fill': (NONE, X, Y, BOTH),
            'Name': 'readonly',
            'Pad': 'pixel',
            'Side': (TOP, RIGHT, BOTTOM, LEFT),
            'Widget': 'readonly',
            }

class RemotePackDialog(PackDialog):

    def __init__(self, master, app, widget):
        self.master = master
        self.app = app
        self.widget = widget
        self.refresh()
        self.top = Toplevel(self.master)
        self.top.title(self.app + ' PackDialog')
        self.top.minsize(1, 1)
        self.addchoices()

    def refresh(self):
        try:
            words = self.master.tk.splitlist(
                    self.master.send(self.app,
                                     'pack',
                                     'info',
                                     self.widget))
        except TclError, msg:
            print msg
            return
        dict = {}
        for i in range(0, len(words), 2):
            key = words[i][1:]
            value = words[i+1]
            dict[key] = value
        dict['.class'] = self.master.send(self.app,
                                          'winfo',
                                          'class',
                                          self.widget)
        dict['.name'] = self.widget
        self.current = dict

    class remotepackoption: # Mix-in class
        def set(self, e=None):
            self.current = self.var.get()
            try:
                self.dialog.master.send(
                        self.dialog.app,
                        'pack',
                        'config',
                        self.dialog.widget,
                        '-'+self.option,
                        self.dialog.master.tk.merge(
                                self.current))
            except TclError, msg:
                print msg
                self.refresh()

    class booleanoption(remotepackoption, BooleanOption): pass
    class enumoption(remotepackoption, EnumOption): pass
    class stringoption(remotepackoption, StringOption): pass
    class readonlyoption(remotepackoption, ReadonlyOption): pass

class WidgetDialog(Dialog):

    def __init__(self, widget):
        self.widget = widget
        self.klass = widget.winfo_class()
        Dialog.__init__(self, widget)

    def fixclasses(self):
        if self.addclasses.has_key(self.klass):
            classes = {}
            for c in (self.classes,
                      self.addclasses[self.klass]):
                for k in c.keys():
                    classes[k] = c[k]
            self.classes = classes

    def refresh(self):
        self.configuration = self.widget.config()
        self.update()
        self.current['.class'] = self.widget.winfo_class()
        self.current['.name'] = self.widget._w

    def update(self):
        self.current = {}
        self.options = {}
        for k, v in self.configuration.items():
            if len(v) > 4:
                self.current[k] = v[4]
                self.options[k] = v[3], v[2] # default, klass
        self.options['.class'] = (None, 'Class')
        self.options['.name'] = (None, 'Name')

    class widgetoption: # Mix-in class
        def set(self, e=None):
            self.current = self.var.get()
            try:
                self.dialog.widget[self.option] = self.current
            except TclError, msg:
                print msg
                self.refresh()

    class booleanoption(widgetoption, BooleanOption): pass
    class enumoption(widgetoption, EnumOption): pass
    class stringoption(widgetoption, StringOption): pass
    class readonlyoption(widgetoption, ReadonlyOption): pass

    # Universal classes
    classes = {
            'Anchor': (N, NE, E, SE, S, SW, W, NW, CENTER),
            'Aspect': 'integer',
            'Background': 'color',
            'Bitmap': 'bitmap',
            'BorderWidth': 'pixel',
            'Class': 'readonly',
            'CloseEnough': 'double',
            'Command': 'command',
            'Confine': 'boolean',
            'Cursor': 'cursor',
            'CursorWidth': 'pixel',
            'DisabledForeground': 'color',
            'ExportSelection': 'boolean',
            'Font': 'font',
            'Foreground': 'color',
            'From': 'integer',
            'Geometry': 'geometry',
            'Height': 'pixel',
            'InsertWidth': 'time',
            'Justify': (LEFT, CENTER, RIGHT),
            'Label': 'string',
            'Length': 'pixel',
            'MenuName': 'widget',
            'Name': 'readonly',
            'OffTime': 'time',
            'OnTime': 'time',
            'Orient': (HORIZONTAL, VERTICAL),
            'Pad': 'pixel',
            'Relief': (RAISED, SUNKEN, FLAT, RIDGE, GROOVE),
            'RepeatDelay': 'time',
            'RepeatInterval': 'time',
            'ScrollCommand': 'command',
            'ScrollIncrement': 'pixel',
            'ScrollRegion': 'rectangle',
            'ShowValue': 'boolean',
            'SetGrid': 'boolean',
            'Sliderforeground': 'color',
            'SliderLength': 'pixel',
            'Text': 'string',
            'TickInterval': 'integer',
            'To': 'integer',
            'Underline': 'index',
            'Variable': 'variable',
            'Value': 'string',
            'Width': 'pixel',
            'Wrap': (NONE, CHAR, WORD),
            }

    # Classes that (may) differ per widget type
    _tristate = {'State': (NORMAL, ACTIVE, DISABLED)}
    _bistate = {'State': (NORMAL, DISABLED)}
    addclasses = {
            'Button': _tristate,
            'Radiobutton': _tristate,
            'Checkbutton': _tristate,
            'Entry': _bistate,
            'Text': _bistate,
            'Menubutton': _tristate,
            'Slider': _bistate,
            }

class RemoteWidgetDialog(WidgetDialog):

    def __init__(self, master, app, widget):
        self.app = app
        self.widget = widget
        self.klass = master.send(self.app,
                                 'winfo',
                                 'class',
                                 self.widget)
        Dialog.__init__(self, master)

    def refresh(self):
        try:
            items = self.master.tk.splitlist(
                    self.master.send(self.app,
                                     self.widget,
                                     'config'))
        except TclError, msg:
            print msg
            return
        dict = {}
        for item in items:
            words = self.master.tk.splitlist(item)
            key = words[0][1:]
            value = (key,) + words[1:]
            dict[key] = value
        self.configuration = dict
        self.update()
        self.current['.class'] = self.klass
        self.current['.name'] = self.widget

    class remotewidgetoption: # Mix-in class
        def set(self, e=None):
            self.current = self.var.get()
            try:
                self.dialog.master.send(
                        self.dialog.app,
                        self.dialog.widget,
                        'config',
                        '-'+self.option,
                        self.current)
            except TclError, msg:
                print msg
                self.refresh()

    class booleanoption(remotewidgetoption, BooleanOption): pass
    class enumoption(remotewidgetoption, EnumOption): pass
    class stringoption(remotewidgetoption, StringOption): pass
    class readonlyoption(remotewidgetoption, ReadonlyOption): pass

def test():
    import sys
    root = Tk()
    root.minsize(1, 1)
    if sys.argv[1:]:
        remotetest(root, sys.argv[1])
    else:
        frame = Frame(root, name='frame')
        frame.pack(expand=1, fill=BOTH)
        button = Button(frame, name='button', text='button')
        button.pack(expand=1)
        canvas = Canvas(frame, name='canvas')
        canvas.pack()
        fpd = PackDialog(frame)
        fwd = WidgetDialog(frame)
        bpd = PackDialog(button)
        bwd = WidgetDialog(button)
        cpd = PackDialog(canvas)
        cwd = WidgetDialog(canvas)
    root.mainloop()

def remotetest(root, app):
    from listtree import listtree
    list = listtree(root, app)
    list.bind('<Any-Double-1>', opendialogs)
    list.app = app                  # Pass it on to handler

def opendialogs(e):
    import string
    list = e.widget
    sel = list.curselection()
    for i in sel:
        item = list.get(i)
        widget = string.split(item)[0]
        RemoteWidgetDialog(list, list.app, widget)
        if widget == '.': continue
        try:
            RemotePackDialog(list, list.app, widget)
        except TclError, msg:
            print msg

test()
PK��Z��V���
guido/rmt.pyonu�[����
Afc
@s�ddlTddlZe�ZejZeededd�Zejde	�ee�Z
e
jddde�ee
de
�Zejd	ede�ee
deddd
ejdd�Zejd	ededd�ejdd
d�ejed<ejd�ejd�eedddd�Zejd	e�ee�Zeed<eedd�Zejddddde�ejdddddej �d�Z!ej"de!�d�Z#ej"de#�d�Z$ej"d e$�d!�Z%ej"d"e%�d#�Z&ej"d$e&�d%�Z'ej"d&e'�ej"d'e'�ej"d(e'�d)�Z(d*�Z)d+�Z*d,�Z+e+ed-<ej,e�ej-�a.e)�ej/�ej0�dS(.i����(t*Ntrelieftborderwidthitfilltexpanditsidetyscrollcommandtsetgridtboldtfonts$-Adobe-Courier-Bold-R-Normal-*-120-*tcommandsTk Remote Controllers	Tk RemotettexttFilet	underlineitmenuttearofftlabelsSelect ApplicationtQuitcCs?|j}|j}tjdd�tjdt||��dS(Nstk_priv(selectMode)tchartanchor(txtytttsetvartmark_settAt(teRR((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytsingle15s		s<1>cCs<|j}|j}tjdd�tjt||��dS(Nstk_priv(selectMode)tword(RRRRttk_textSelectToR(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytdouble1=s		s
<Double-1>cCs<|j}|j}tjdd�tjt||��dS(Nstk_priv(selectMode)tline(RRRRRR(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyttriple1Ds		s
<Triple-1>cCstjt�d�t�dS(Ns
(RtinserttAtInserttinvoke(R((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt	returnkeyKss<Return>cCsStjt�tj��tjt��tjt��ddkrOt�ndS(Ni����s.0(RR!R"t
selection_gettyview_pickplacetindexR#(R((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytcontrolvPss<Control-v>cCsHtjd�tjd�krDtjdt��tjt��ndS(Nt	promptEndsinsert - 1 char(RR'tdeleteR"R&(R((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt	backspaceZss<BackSpace>s<Control-h>s<Delete>cCs�tjdt��}tjtjdd|��r�ttj�krZtjd|�}ntj	t|�}|r�tj
t�|d�nt�ntjt��dS(NspromptEnd + 1 chartinfotcompletetevals
(
RtgetR"t
getbooleanttktcalltapptroott
winfo_nametsendR!tpromptR&(tcmdtmsg((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyR#is
cCs>tjt�td�tjdd�tjddd�dS(Ns: R)sinsert - 1 charRsinsert linestart(RR!R"R3Rttag_add(((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyR7uscCsA|atjdd�tjd|d�tjddd�dS(NspromptEnd linestartR)t:R(R3RR*R!R:(tappName((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytnewApp~scCs�tjd�tjdd�tj�}t|�}|j�xR|D]J}ytj|d�Wntk
rsqFXtj	d|d|d��qFWdS(NR
itlastswinfo name .RcSs
t|�S(N(R=(tname((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt<lambda>�t(
tfile_m_appstaddR*R4t
winfo_interpstlisttsortR6tTclErrortadd_command(tnamesR?((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytfillAppsMenu�s



	tpostcommand(1tTkintertsystTkR4R1tFrametRAISEDtmBartpacktXtftBOTHt	ScrollbartFLATtstRIGHTtYtTexttsetRtLEFTt
tag_configtyviewttitleticonnamet
MenubuttontfiletMenutfile_mRBtadd_cascadeRHtexitRtbindRR R$R(R+R#R7R=RJt
tk_menuBarR5R3tfocustmainloop(((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt<module>s^
		'



												


PK��Z���,�)�)guido/canvasevents.pycnu�[����
Afc@s�ddlTddlmZmZmZdefd��YZddd��YZdefd��YZd	dd
��YZdefd��YZd
efd��YZ	de	fd��YZ
ddd��YZd�Ze
dkr�e�ndS(i����(t*(tOvaltGroupt
CanvasTextRcBseZddd�ZRS(cCs|jj|j||�S(N(tcanvasttag_bindtid(tselftsequencetcommand((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytbindsN(t__name__t
__module__tNoneR
(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR
stObjectcBsYeZdZddddd�Zd�Zd�Zd�Zd�Zd	�Zd
�Z	RS(s�Base class for composite graphical objects.

    Objects belong to a canvas, and can be moved around on the canvas.
    They also belong to at most one ``pile'' of objects, and can be
    transferred between piles (or removed from their pile).

    Objects have a canonical ``x, y'' position which is moved when the
    object is moved.  Where the object is relative to this position
    depends on the object; for simple objects, it may be their center.

    Objects have mouse sensitivity.  They can be clicked, dragged and
    double-clicked.  The behavior may actually be determined by the pile
    they are in.

    All instance attributes are public since the derived class may
    need them.

    itredtobjectcCsJ||_||_||_d|_t|j�|_|j||�dS(N(RtxtyR
tpileRtgrouptcreateitems(RRRRtfillttext((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyt__init__#s				cCs
t|j�S(N(tstrR(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyt__str__+sc
Cs�t|j|jd|jd|jd|jdd|dd�|_|jj|j�t|j|j|jd|�|_|jj|j�dS(Nii
RtwidthiR(	RRRRt
_Object__ovalRtaddtag_withtagRt
_Object__text(RRR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR.s	+	cCsW||kodknr dS|jj||�|j||_|j||_dS(Ni(RtmoveRR(Rtdxtdy((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytmoveby7s
cCs"|j||j||j�dS(N(R"RR(RRR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytmoveto>scCsN|jr%|jj|�d|_n||_|jrJ|jj|�ndS(N(RtdeleteR
tadd(RR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyttransferAs			cCs|jj�dS(N(Rttkraise(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR'Is(
RRt__doc__RRRR"R#R&R'(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRs						tBottomcBseZdZd�ZRS(s+An object to serve as the bottom of a pile.c
Gs]t|j|jd|jd|jd|jddddd�|_|jj|j�dS(Nii
Rtgraytoutlinet(RRRRt
_Bottom__ovalRR(Rtargs((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRQs	+(RRR(R(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR)MstPilecBsPeZdZdd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	sA group of graphical objects.cCs~||_||_||_g|_t|j|j|j�|_t|jd|�|_|jj|jj�|j	�dS(Nttag(
RRRtobjectsR)tbottomRRRtbindhandlers(RRRRR0((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR\s				cCs0|jjd|j�|jjd|j�dS(Ns<1>s
<Double-1>(RR
tclickhandlertdoubleclickhandler(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR3fscCs4|jj|�|jj|j�|j|�dS(N(R1tappendRRtposition(RR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR%jscCs'|jj|j�|jj|�dS(N(RtdtagR1tremove(RR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR$oscCsF|j�|jj|�}|j|j|d|j|d�dS(Nii(R'R1tindexR#RR(RRti((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR7ss
cCsdS(N((Rtevent((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR4xscCsdS(N((RR<((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR5{sN(RRR(R
RR3R%R$R7R4R5(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR/Xs
					t
MovingPilecBsAeZd�ZdZd�ZeZd�Zd�Zd�Z	RS(cCs=tj|�|jjd|j�|jjd|j�dS(Ns<B1-Motion>s<ButtonRelease-1>(R/R3RR
t
motionhandlertreleasehandler(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR3�s
cCs�|jjd�}xMtt|j��D])}|j|}|jj|kr(Pq(q(Wd|_dS|j||_x|jD]}|j	�q|W|j
|_|j|_
dS(Ntcurrent(RtgettagstrangetlenR1RR0R
tmovethisR'RtlastxRtlasty(RR<ttagsR;to((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR4�s
	cCsm|js
dS|j|j}|j|j}|j|_|j|_x!|jD]}|j||�qOWdS(N(RDRRERRFR"(RR<R R!RH((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR>�s	cCs-|j}|sdSd|_|j|�dS(N(RDR
t
finishmove(RR<R1((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR?�s
		cCs"x|D]}|j|�qWdS(N(R7(RR1RH((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRI�s
N(
RRR3R
RDR4R5R>R?RI(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR=s			
	tPile1cBs>eZdZdZdZd�Zd�Zd�Zd�ZRS(i2tp1cCs5||_tj||jj|j|j|j�dS(N(tdemoR=RRRRR0(RRL((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR�s	cCsMy|jd}Wntk
r%dSX|j|j��tj||�dS(Ni����(R1t
IndexErrorR&totherR=R5(RR<RH((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR5�s
cCs
|jjS(N(RLtp2(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRN�scCs�|d}|j�}|j|j}}||jd||jd||jd||jdkr�x.|D]}|j|�qpWntj||�dS(Nii(RNRRR&R=RI(RR1RHtpRR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRI�s
@
(	RRRRR0RR5RNRI(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRJ�s			tPile2cBs#eZdZdZdZd�ZRS(i�i2ROcCs
|jjS(N(RLRK(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRN�s(RRRRR0RN(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRQ�stDemocBseZd�ZRS(cCs�||_t|dddddddtdd�|_|jjd	d
dt�t|�|_t|�|_	t
|jddd
d�}t
|jddd
d�}t
|jddd
d�}|j|j�|j|j�|j|j	�dS(NRi�theightt
backgroundtyellowtrelieftborderwidthitexpandiRRRto1tgreento2s
light blueto3(tmastertCanvastSUNKENRtpacktBOTHRJRKRQRORR&(RR]RYR[R\((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR�s		(RRR(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRR�scCs6t�}t|�}|jd|j�|j�dS(NtWM_DELETE_WINDOW(tTkRRtprotocoltquittmainloop(trootRL((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytmain�s	t__main__N((((tTkinterR^RRRRR)R/R=RJRQRRRhR(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyt<module>s
?'0
	PK��Z)t�MIMIguido/AttrDialog.pycnu�[����
��^c@sddlTddd��YZdefd��YZdefd��YZdefd	��YZd
efd��YZddd
��YZdefd��YZdefd��YZdefd��YZ	de	fd��YZ
d�Zd�Zd�Z
e�dS(i����(t*tOptioncBs5eZeZd�Zd�Zd�Zdd�ZRS(cCs�||_||_|j|_|j|\|_|_|j|j�|_t	|j�|_
|j
jdt�t
|j
d|d�|_|jjdt�|j�|j�dS(Ntfillttextt:tside(tdialogtoptionttoptmastertoptionstdefaulttklasstvarclasstvartFrametframetpacktXtLabeltlabeltLEFTtupdatet	addoption(tselfRR((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyt__init__s		
cCs|jj�|j�dS(N(RtrefreshR(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR"s
cCsQy|jj|j|_Wntk
r9|j|_nX|jj|j�dS(N(RtcurrentRtKeyErrorRRtset(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR&s

cCsdS(N((Rte((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR-sN(	t__name__t
__module__t	StringVarR
RRRtNoneR(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRs
	
		t
BooleanOptioncBseZeZd�ZRS(cCsYt|jddddddd|jdtd	d
d|j�|_|jjdt�dS(
NRson/offtonvalueitoffvalueitvariabletrelieftborderwidthitcommandR(tCheckbuttonRRtRAISEDRtbuttonRtRIGHT(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR4s	(RR t
BooleanVarR
R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR#0st
EnumOptioncBseZd�ZRS(c
Cs�t|jd|jdtdd�|_|jjdt�t|j�|_|j|jd<xF|j	j
|jD]1}|jjd|d|jd	|d
|j
�qpWdS(NttextvariableR'R(iRtmenuRR&tvalueR)(t
MenubuttonRRR+R,RR-tMenuR1RtclassesRtadd_radiobuttonR(Rtv((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRAs		(RR R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR/?stStringOptioncBseZd�ZRS(c
Csft|jd|jdddtdd�|_|jjdtdtd	d
�|jjd|j	�dS(NR0twidthi
R'R(iRRtexpandis<Return>(
tEntryRRtSUNKENtentryRR-RtbindR(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRQs	(RR R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR8OstReadonlyOptioncBseZd�ZRS(cCs8t|jd|jdt�|_|jjdt�dS(NR0tanchorR(RRRtERRR-(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR\s(RR R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR?ZstDialogcBsPeZd�Zd�Zd�Zd�ZiZiZeZ	e
ZeZ
eZRS(cCsf||_|j�|j�t|j�|_|jj|jj�|jjdd�|j	�dS(Ni(
R	t
fixclassesRtToplevelRttitlet	__class__Rtminsizet
addchoices(RR	((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRcs	

cCsdS(N((R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRltcCsdS(N((R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRCnRIcCsi|_g}x0|jj�D]\}}|j||f�qW|j�x�|D]�\}\}}y|j|}Wntk
r�d}nXt|�tkr�|j	}n9|dkr�|j
}n!|dkr�|j}n	|j}|||�|j|<qSWdS(Ntunknowntbooleantreadonly(
tchoicesR
titemstappendtsortR5Rttypet	TupleTypet
enumoptiont
booleanoptiontreadonlyoptiontstringoption(Rtlisttktdctdtctcl((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRHps$	


	(RR RRRCRHR
R5R#RTR8RVR/RSR?RU(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRBas					t
PackDialogc
BsjeZd�Zd�Zdd*d��YZdeefd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZi
d,d
6d-d6d.d6d/d6d0d6d1d6d2d6d3d6d4d6d5d 6d6d!6d7d"6d8d%6Zi	eeeeeeeeef	d6d&d6d'd6d&d(6eeeefd6d'd6d)d6eeeefd$6d'd6Z RS(9cCs||_tj||�dS(N(twidgetRBR(RR^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s	cCs?|jj�|_|jj�|jd<|jj|jd<dS(Ns.classs.name(R^tinfoRtwinfo_classt_w(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�st
packoptioncBseZdd�ZRS(cCse|jj�|_y*t|jjjdi|j|j6�Wn"tk
r`}|GH|j	�nXdS(N((
RtgetRtapplyRR^RRtTclErrorR(RRtmsg((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�sN(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRb�sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT�sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS�sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV�sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU�stClasss.classtNames.nametWidgettaftertcentertAnchorR@tbeforetnotBooleanR:tnonetFillRtinitPadtipadxtipadytpadxtpadyRtSideRRKRLtExpandtpixel(N(NRg(NRh(NRi(RkRl(NRi(RnRo(RpRq(NRi(iRs(iRs(iRs(iRs(RRx(!RR RRRbR#RTR/RSR8RVR?RUR"R
tNtNERAtSEtStSWtWtNWtCENTERtNONERtYtBOTHtTOPR-tBOTTOMRR5(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR]�s>		

"tRemotePackDialogcBs�eZd�Zd�Zddd��YZdeefd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZRS(
cCso||_||_||_|j�t|j�|_|jj|jd�|jjdd�|j�dS(Ns PackDialogi(	R	tappR^RRDRRERGRH(RR	R�R^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s			
cCs�y4|jjj|jj|jdd|j��}Wntk
rO}|GHdSXi}xFtdt|�d�D],}||d}||d}|||<qoW|jj|jdd|j�|d<|j|d	<||_	dS(
NRR_iiitwinfotclasss.classs.name(
R	ttkt	splitlisttsendR�R^RetrangetlenR(RtwordsRftdicttitkeyR2((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s(
tremotepackoptioncBseZdd�ZRS(cCs�|jj�|_yN|jjj|jjdd|jjd|j|jjj	j
|j��Wn"tk
r�}|GH|j�nXdS(NRtconfigt-(
RRcRRR	R�R�R^RR�tmergeReR(RRRf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s		
N(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT�sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS�sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV�sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU�s((
RR RRR�R#RTR/RSR8RVR?RU(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��s	
	tWidgetDialogc
Bs�eZd�Zd�Zd�Zd�ZddTd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZdee
fd
��YZi.eeeeeeeeef	d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6dd!6dd"6dd#6d$d%6dd&6dd'6d(d)6dd*6d+d,6eeefd-6d.d/6dd06d1d26dd36d+d46d+d56eefd66dd76eeeee fd86d+d96d+d:6dd;6dd<6d=d>6dd?6dd@6ddA6ddB6d.dC6ddD6ddE6dFdG6dHdI6d.dJ6ddK6e!e"e#fdL6Z$ie%e&e'fdM6Z(ie%e'fdM6Z)ie(dN6e(dO6e(dP6e)dQ6e)dC6e(dR6e)dS6Z*RS(UcCs,||_|j�|_tj||�dS(N(R^R`RRBR(RR^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s	cCst|jj|j�rpi}xF|j|j|jfD]+}x"|j�D]}||||<qHWq5W||_ndS(N(t
addclassesthas_keyRR5tkeys(RR5R[RX((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRCs	cCsI|jj�|_|j�|jj�|jd<|jj|jd<dS(Ns.classs.name(R^R�t
configurationRR`RRa(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRs
cCs�i|_i|_x^|jj�D]M\}}t|�dkr"|d|j|<|d|df|j|<q"q"Wd|jd<d	|jd<dS(
NiiiRgs.classRhs.name(NRg(NRh(RR
R�RNR�R"(RRXR7((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRs		"
twidgetoptioncBseZdd�ZRS(cCsU|jj�|_y|j|jj|j<Wn"tk
rP}|GH|j�nXdS(N(RRcRRR^RReR(RRRf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRsN(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT%sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS&sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV'sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU(sRltintegertAspecttcolort
BackgroundtbitmaptBitmapRztBorderWidthRLRgtdoubletCloseEnoughR)tCommandRKtConfinetcursortCursortCursorWidthtDisabledForegroundtExportSelectiontfonttFontt
ForegroundtFromtgeometrytGeometrytHeightttimetInsertWidthtJustifytstringRtLengthR^tMenuNameRhtOffTimetOnTimetOrientRstRelieftRepeatDelaytRepeatIntervalt
ScrollCommandtScrollIncrementt	rectangletScrollRegiont	ShowValuetSetGridtSliderforegroundtSliderLengthtTexttTickIntervaltTotindext	UnderlineR&tVariabletValuetWidthtWraptStatetButtontRadiobuttonR*R;R3tSlider((+RR RRCRRR�R#RTR/RSR8RVR?RUR{R|RAR}R~RR�R�R�RR-t
HORIZONTALtVERTICALR+R<tFLATtRIDGEtGROOVER�tCHARtWORDR5tNORMALtACTIVEtDISABLEDt	_tristatet_bistateR�(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��s�					
	"
tRemoteWidgetDialogcBs�eZd�Zd�Zddd��YZdeefd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZRS(
cCsG||_||_|j|jdd|j�|_tj||�dS(NR�R�(R�R^R�RRBR(RR	R�R^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRks		cCs�y1|jjj|jj|j|jd��}Wntk
rL}|GHdSXi}xL|D]D}|jjj|�}|dd}|f|d}|||<qZW||_|j�|j	|j
d<|j|j
d<dS(NR�iis.classs.name(R	R�R�R�R�R^ReR�RRR(RRNRfR�titemR�R�R2((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRts$
	
tremotewidgetoptioncBseZdd�ZRS(cCst|jj�|_y9|jjj|jj|jjdd|j|j�Wn"t	k
ro}|GH|j
�nXdS(NR�R�(RRcRRR	R�R�R^RReR(RRRf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s		
N(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT�sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS�sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV�sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU�s((
RR RRR�R#RTR/RSR8RVR?RU(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�is			cCsddl}t�}|jdd�|jdrIt||jd�n�t|dd�}|jdddt�t|dddd�}|jdd�t	|dd	�}|j�t
|�}t|�}t
|�}t|�}t
|�}	t|�}
|j�dS(
Ni����itnameRR:RR,Rtcanvas(
tsystTkRGtargvt
remotetestRRR�R�tCanvasR]R�tmainloop(R�trootRR,R�tfpdtfwdtbpdtbwdtcpdtcwd((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyttest�s$	

cCs<ddlm}|||�}|jdt�||_dS(Ni����(tlisttrees<Any-Double-1>(R�R>topendialogsR�(R�R�R�RW((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��scCs�ddl}|j}|j�}x�|D]}|j|�}|j|�d}t||j|�|dkruq(nyt||j|�Wq(tk
r�}|GHq(Xq(WdS(Ni����it.(	R�R^tcurselectionRctsplitR�R�R�Re(RR�RWtselR�R�R^Rf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��s	
N(((tTkinterRR#R/R8R?RBR]R�R�R�R�R�R�(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyt<module>s
.67m2			PK��Z^�����guido/wish.pyonu�[����
��^c@sddlZddlZejejdddd�Zejd�dZx�er\dZndZyee�Z	Wne
k
r�PnXee	d	Zejejd
de��rMeje	�yejde�Z
Wnejk
r�Zd
GeGHnXe
re
GHndZqMqMWdS(i����NtDISPLAYtwishtTkitupdatets% s
tinfotcompletetevals	TclError:(t_tkintertostcreatetenvironttktcalltcmdtpromptt	raw_inputtlinetEOFErrort
getbooleantrecordtresulttTclErrortmsg(((s//usr/lib64/python2.7/Demo/tkinter/guido/wish.pyt<module>s,
	


PK��Z
Cx�jjguido/paint.pynu�[���""""Paint program by Dave Michell.

Subject: tkinter "paint" example
From: Dave Mitchell <davem@magnet.com>
To: python-list@cwi.nl
Date: Fri, 23 Jan 1998 12:18:05 -0500 (EST)

  Not too long ago (last week maybe?) someone posted a request
for an example of a paint program using Tkinter. Try as I might
I can't seem to find it in the archive, so i'll just post mine
here and hope that the person who requested it sees this!

  All this does is put up a canvas and draw a smooth black line
whenever you have the mouse button down, but hopefully it will
be enough to start with.. It would be easy enough to add some
options like other shapes or colors...

                                                yours,
                                                dave mitchell
                                                davem@magnet.com
"""

from Tkinter import *

"""paint.py: not exactly a paint program.. just a smooth line drawing demo."""

b1 = "up"
xold, yold = None, None

def main():
    root = Tk()
    drawing_area = Canvas(root)
    drawing_area.pack()
    drawing_area.bind("<Motion>", motion)
    drawing_area.bind("<ButtonPress-1>", b1down)
    drawing_area.bind("<ButtonRelease-1>", b1up)
    root.mainloop()

def b1down(event):
    global b1
    b1 = "down"           # you only want to draw when the button is down
                          # because "Motion" events happen -all the time-

def b1up(event):
    global b1, xold, yold
    b1 = "up"
    xold = None           # reset the line when you let go of the button
    yold = None

def motion(event):
    if b1 == "down":
        global xold, yold
        if xold is not None and yold is not None:
            event.widget.create_line(xold,yold,event.x,event.y,smooth=TRUE)
                          # here's where you draw it. smooth. neat.
        xold = event.x
        yold = event.y

if __name__ == "__main__":
    main()
PK��Z�X�\guido/ManPage.pyonu�[����
��^c@s�ddlZddlTddlmZddlmZdZdZejd�Zejd�Zejd	�Z	d
efd��YZ
de
fd
��YZeZd�Z
edkr�e
�ndS(i����N(t*(t_tkinter(tScrolledTexts*-Courier-Bold-R-Normal-*-120-*s!*-Courier-Medium-O-Normal-*-120-*s:^     Page [1-9][0-9]*[ 	]+\|^.*Last change:.*[1-9][0-9]*
s^[ 	]*
s^[ 	]*[Xv!_][Xv!_ 	]*
tEditableManPagecBsneZdd�Zd�Zd�Zd�ZeZd�Zd�Z	d�Z
d�Zd�Zd	d
�Z
RS(cKshttj||f|�|jddd�|jddt�|jddt�d|_d|_dS(NtXt	underlineit!tfontt_i(	tapplyRt__init__t
tag_configtBOLDFONTt
ITALICFONTtNonetfptlineno(tselftmastertcnf((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR
s	cCs
|jdkS(N(RR(R((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytbusy%scCs|j�r|j�ndS(N(Rt
_endparser(R((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytkill)scCs-|j|�|jj|tj|j�dS(N(t_startparserttktcreatefilehandlerRtREADABLEt_filehandler(RR((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytasyncparsefile.s
cCs4|jj�}|s#|j�dS|j|�dS(N(RtreadlineRt
_parseline(RRtmasktnextline((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR6s

cCszddlm}|d|d�}|j|d�}|j|�x'|j�}|s[Pn|j|�qEW|j�dS(Ni����(tselectgcSs||ggg|�dS(Ni((RttoutR!((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pytavail@stheight(R!tgetintRRRR(RRR!R#R$R ((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyt
syncparsefile>s
cCs�|j�rtd�n|j�||_d|_d|_d|_d|_|d}t	|d<|j
dt�||d<dS(Nsstartparser: still busyitstates1.0(RtRuntimeErrortfilenoRRtoktemptyRtbuffertNORMALtdeletetEND(RRt	savestate((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRLs
					

cCs�|j�std�n|jr1|jd�ny|jj|j�Wntk
r]}nX|jj�d|_|`
|`|`dS(Nsendparser: not busyt(RR(R,RRtdeletefilehandlerRtTclErrortcloseRR*R+(Rtmsg((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR[s	
	cCs|js||_dStj|j�dkrDd|_||_dS|j}tj|�dkrt|}d|_nd}||_|js�d|_d|_dStj|�dkr�d|_d|_dS|d}t|d<t	dkr|j
dd�n|j
dt�|jrB|jd�|j
d|_
d|_n|sX|j|�n�d}d}xrttt|�t|���D]O}|||kr�||kr�|j|||!|�|}n||}q�q�W|j||�|j
d|_
||d<dS(	NiiR'g@tinsertsend-1cs
R1(R,t	emptyprogtmatchR+tulprogRR*t
footerprogR-t	TkVersiontmark_setR/t_insert_propRtrangetmintlen(RR ttextlinetproplineR0tptjti((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRisV											

	
(	t cCs�|jt��}|jt�|�tdkrj|j|�}x'|D]}|j||t��qGWn|dkr�|j||t��ndS(Ng@RF(tindextAtInsertR6R;t	tag_namest
tag_removettag_add(Rtstrtproptherettagsttag((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR=�s
N(t__name__t
__module__RR
RRRt	parsefileRR&RRRR=(((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRs								<tReadonlyManPagecBseZdd�ZRS(cKs't|d<ttj||f|�dS(NR'(tDISABLEDR	RR
(RRR((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyR
�s
N(RQRRRR
(((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyRT�sc	CsNddl}ddl}d}d}d}|jdr]|jddkr]d}|jd=n|jdrz|jd}n|}|s�|dd!dkr�|d	}n|jj||�}nt�}|jdd�t|d
tdd�}|j	d
ddt
�|rt|d�}n|jd|d�}|j
|�|j�dS(Ni����s/usr/local/man/manntTcliis-fi����t.s.ntrelieftborderwidthitexpandtfilltrsnroff -man %s | ul -i(tostsystargvtpathtjointTktminsizetManPagetSUNKENtpacktBOTHtopentpopenRStmainloop(	R]R^tMANDIRtDEFAULTPAGEt	formattedtnametroottmanpageR((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyttest�s0 


	
t__main__(tretTkinterRRRR
tcompileR:R7R9RRTRdRqRQ(((s2/usr/lib64/python2.7/Demo/tkinter/guido/ManPage.pyt<module>s
	�	PK��Z���X�#�#guido/tkman.pyonu�[����
Afc@s�ddlZddlZddlZddlZddlTddlmZddgZddgZdZx/eD]'Z	ej
je	�roe	Zd	ZqoqoWdZ
x/eD]'Z	ej
je	�r�e	Zd	Z
q�q�Wes�e
r\ejjd
�esdejdZejjde�ne
sLd
ejdZejjde�nejd	�n[[
d�Zddd��YZd�Ze�dS(i����N(t*(tManPages/depot/sundry/man/manns/usr/local/man/manns/depot/sundry/man/man3s/usr/local/man/man3iis
sgFailed to find mann directory.
Please add the correct entry to the MANNDIRLIST
at the top of %s script.s%s

sgFailed to find man3 directory.
Please add the correct entry to the MAN3DIRLIST
at the top of %s script.cCsktj|�}g}xE|D]=}|dd!dkr|ddkr|j|d �qqW|j�|S(Ni����i����t.tln123456789(tostlistdirtappendtsort(tmandirtfilestnamestfile((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pytlistmanpages0s
#
tSelectionBoxcBs�eZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�ZRS(cCs�g|_t|dd�|_|jjdddt�|jj|_t|jdd�|_|jjdddt�t|jdd�|_|jjd	tdddt�t|jdd
�|_	|j	jd	t
dddt�t|�|_t
|j	dddd
dtdd�|_|jjd	t�t|jdd�|_|jjdddtd|jd|j�|jjdddtd|jd|j�|j|jd<t|j	dddtdddddd�|_|jjdddt�t|jddddd|j�|_|jjd	t�t|jdd dtdddd�|_|jjdddt�t|jdd!�|_ |j jdddt!�t|j dd"dd#d|j"�|_#|j#jd	t�t$�|_%t&|j dd$dd%d|j%dt'�|_(|j(jd	t�t|jdd&dtdddd�|_)|j)jdddt�t*|jdd'dd(�|_+|j+jd	t,�t-|jdddtddd)t!dd*d+d,�|_.|j.jdddt�|jj/d-|j�|j)j/d-|j"�|jj/d.|j0�|jj/d/|j1�|j)j/d/|j2�|j.j/d/|j3�|jj4�|jj5t�|j�dS(0Ntnametframetexpanditfilltsubframeitleftsubframetsidet
rightsubframetchapterttextt	DirectorytrelieftborderwidthitchaptermenutlabelsC functionstvaluetvariabletcommandsTcl/Tk functionstmenutlistboxtwidthitheightitl1sDisplay manual page named:tentrytl2frametl2sSearch regexp:t	casesensesCase sensitivetsearchttitles(none)twrapiHtselectbackgroundtpinks<Return>s
<Double-1>s<Tab>(6tchoicestFrameRtpacktBOTHtmasterRRtLEFTRtRIGHTt	StringVart
chaptervart
MenubuttontRAISEDRtTOPtMenuRtadd_radiobuttontMAN3DIRt
newchaptertMANNDIRtListboxtSUNKENR!tButtontentry_cbR$tEntryR%tXR&tNONEt	search_cbR't
BooleanVartcasevartCheckbuttontFLATR(R)tLabelR*tBOTTOMRRtbindt
listbox_cbt	entry_tabt
search_tabttext_tabt	focus_settset(tselfR2((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt__init__;s�		
	
	
cCs/|jj�}g|_|jt|��dS(N(R6tgetR.taddlistR(RTR((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyR=�s	cCs=||jkr/|jj|�|jj�n|j�dS(N(R.RRtupdate(RTtchoice((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt	addchoice�scCs1||jt|j�)|jj�|j�dS(N(R.tlenRRX(RTtlist((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRW�s
cGs|j�dS(N(RX(RTte((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRB�scCsQ|jj�}|rMt|�dkrM|jj|d�}|j|�ndS(Nii(R!tcurselectionR[RVt	show_page(RTR]t	selectionR((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRN�scGs|j|jj��dS(N(t
search_stringR)RV(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRF�scCs|jj�dS(N(R)RR(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRO�scCs|jj�dS(N(R%RR(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRP�scCs|jj�dS(N(R%RR(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRQ�scCs�|jj�}t|t|�d�|j�}|sF|jj�n|jjdt	��d}x9|D]1}||kr�d}n|jj
t	�|�qiW|r�|S|jj�}|dkr�|jjd�SdS(NcSs|| |kS(N((Rtkeytn((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt<lambda>�tii(R%RVtfilterR[R.RtbellR!tdeletetAtEndtinserttsize(RTRbtokt
exactmatchtitemRc((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt
updatelist�s 
	cCsF|j�}|rB|j|�|jjdt��|j�ndS(Ni(RoR_R%RhRi(RTR((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRX�s

cCs]d|jj�|f}tjd|d�}|jj�||jd<|jj|�dS(Ns%s/%s.?snroff -man %s | ul -itrR(R6RVRtpopenRtkillR*t	parsefile(RTRRtfp((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyR_�s


cCs`|s|jj�dGHdS|jj�s7tj}nd}y.|r[tj||�}ntj|�}Wn-tjk
r�}|jj�dG|GHdSX|j	j
t��}tj
|tj|d� �}|j	j
t��}tj
|tj|d� �}|}	d}
x4|d}||krM|	dkr8Pn|	}d}d}	n|j	jd|d|�}|j|�}|dkrd}
tdt|jd���}
y |j	jdt�t��Wntk
r�nX|j	jdd	||fd	|||
f�|j	jt�d	||f�|j	jt��PqqW|
s\|jj�ndS(
NsEmpty search stringsRegex error:Riis%d.0 linestarts%d.0 lineendtsels%d.%d(RRgRHRVtret
IGNORECASEtNonetcompileterrorRtindextAtInserttstringtatoitfindRiR)tmaxR[tgroupt
tag_removet
AtSelFirstt	AtSelLasttTclErrorttag_addtmark_settyview_pickplace(RTR)tmaptprogtmsgtheretlinenotendt	endlinenot
wraplinenotfoundtlinetiRc((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRa�sd

	
	


N(t__name__t
__module__RxRUR=RZRWRBRNRFRORPRQRoRXR_Ra(((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyR
9sM												cCsWt�}t|�}tjdr9|jtjd�n|jdd�|j�dS(Ni(tTkR
tsystargvR_tminsizetmainloop(troottsb((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pytmains	
((R�RR}RvtTkinterRtMANNDIRLISTtMAN3DIRLISTtfoundmanndirtdirtpathtexistsR>tfoundman3dirR<tstderrtwriteR�R�texitRR
R�(((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt<module>sD




		�	PK��Z27O�::guido/imageview.pycnu�[����
��^c@s*ddlTddlZd�Ze�dS(i����(t*NcCsOtjd}t�}td|�}t|d|�}|j�|j�dS(Nitfiletimage(tsystargvtTkt
PhotoImagetLabeltpacktmainloop(tfilenametroottimgtlabel((s4/usr/lib64/python2.7/Demo/tkinter/guido/imageview.pytmains
	
(tTkinterRR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/imageview.pyt<module>s
	PK��Z����YYguido/brownian.pyonu�[����
��^c@s�ddlTddlZddlZddlZddlZdZdZdZdZdZ	dZ
dZdad	�Z
d
�Ze�dS(i����(t*Ni�i,i
itredicCs�t}tjtdt�}tjtdt�}|j||||||||dt�}xvts�tjdt	�}tjdt	�}tj
t�}y|j|||�Wnt
k
r�PnXtj|�qcWdS(Ng@tfilli(tRADIUStrandomtgausstWIDTHtSIGMAtHEIGHTtcreate_ovaltFILLtstoptBUZZtexpovariatetLAMBDAtmovetTclErrorttimetsleep(tcanvastrtxtytptdxtdytdt((s3/usr/lib64/python2.7/Demo/tkinter/guido/brownian.pytparticles.	
cCs�t�}t|dtdt�}|jdddd�d}tjdr`ttjd�}nx9t|�D]+}t	j
dtd	|f�}|j�qmWz|j
�WddaXdS(
NtwidththeightRtbothtexpandiittargettargs(tTktCanvasRRtpacktsystargvtinttranget	threadingtThreadRtstarttmainloopR(trootRtnptitt((s3/usr/lib64/python2.7/Demo/tkinter/guido/brownian.pytmain"s	
(tTkinterRR)RR%RRRRRRR
RRR1(((s3/usr/lib64/python2.7/Demo/tkinter/guido/brownian.pyt<module>s
		PK��ZM�dUUguido/MimeViewer.pyonu�[����
Afc@soddlZddlTddlTddlmZdd	d��YZd�Zd�Zedkrke�ndS(
i����N(t*(tScrolledTextt
MimeViewercBsGeZd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(c	Cs�||_||_t|idd6dd6�|_idd6dd6|j_t|ji|d	6|jd
6�|_|jjidd6�|j	d
��}t
|d�}|r"t|ji|d6dd6dd6dd6dd6�|_idd6dd6|jd6|j_|jj
d|�nNt|jidd6dd6�|_idd6dd6dd6|jd6|j_|j�}t|�tkr)d|_t
|d�}|rt|ji|d6dd6dd6dd6dd6�|_idd6dd6|j_|jj
d|�n	d|_d|_n�t|jidd6dd6�|_idd6dd6dd6|jd6|j_g|_xQtt|��D]=}t|jd ||df||�}|jj|�q�Wd|_d|_dS(!NtraisedtreliefitbditexpandtbothtfillttexttcommandtwtanchorcSs|dko|d dkS(Ntreceivedisx400-((tx((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyt<lambda>titheightiPtwidthtnonetwrapitaftertendttoptsidetipadyRi
tflattlefttipadxtys%s.%d(ttitletmsgtFrametframetpackingtCheckbuttonttoggletbuttontpackt
getheadertextt
countlinesRthtexttinserttgetbodyttypet
StringTypetNonetpadtbtexttpartstrangetlenRtappendt	collapsed(	tselftparentRRt
headertextRtbodytitp((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyt__init__sn		 	
	
	
		

				
	cCs|jj|jj�dS(N(R!R&R"(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR&GscCs|jj�dS(N(R!tdestroy(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR=IscCs|jr|jj�ndS(N(R5R%tinvoke(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pytshowKs	cCs$|jr|j�n
|j�dS(N(R5texplodetcollapse(R6((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR$Ns	
cCs�d|_x3|j|j|jfD]}|r"|j�q"q"W|jrlx!|jD]}|jj�qRWn|jjidd6�dS(NiiR(R5R)R0R/tforgetR1R!R&(R6tcomptpart((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyRASs		cCs�d|_x9|j|j|jfD]}|r"|j|j�q"q"W|jrox|jD]}|j�qXWn|jjidd6�dS(NiiR(R5R)R0R/R&R"R1R!(R6RCRD((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR@\s		(	t__name__t
__module__R<R&R=R?R$RAR@(((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyRs	;						cCs\d}d}xI||krWtj|d|�}|dkr@Pn|d}|d}qW|S(Nis
i(tstringtfind(tstrtlimitR:tn((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyR(es
cCsBddl}ddl}ddl}|j|jdd�\}}x|D]\}}qJWd}d}x:|D]2}	|	d dkr�|	d}qmtj|	�}qmW|j�}
|
j|�}|s�|j	�}n|j
|�}t�}
|
j}t
|
d||f|�}|j�|j�|
jdd�|j�dS(Ni����iRtinboxt+s+%s/%d(tsystgetopttmhlibtargvR.RGtatoitMHt
openfoldert
getcurrenttopenmessagetTkttkRR&R?tminsizetmainloop(RNRORPtoptstargstotatmessagetfoldertargtmhtftmtrootRXR((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pytmainos0

		

t__main__((RGttypestTkinterRRR(RfRE(((s5/usr/lib64/python2.7/Demo/tkinter/guido/MimeViewer.pyt<module>s

Z	
	 PK��Z.��55guido/svkill.pycnu�[����
Afc@s�ddlTedkr"ed�nddlmZddlmZddlZddlZejdZ	de
fd	��YZd
efd��YZ
edkr�e
dd
d�Zej�jd�ej�jdd�ej�ndS(i����(t*g@s/This version of svkill requires Tk 4.0 or later(tsplitfields(tsplitNtLOGNAMEt	BarButtoncBseZdd�ZRS(cKsOttj||f|�|jdt�t|dd�|_|j|d<dS(Ntsidetnametmenu(tapplyt
Menubuttont__init__tpacktLEFTtMenuR(tselftmastertcnf((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyR
sN(t__name__t
__module__tNoneR
(((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyRstKillcBs|eZdddd ded	efgZd!d"d#d$d%d&gZd�Zd�Zd�Zd�Zd�Z	d'd�ZRS((tDefaultts
Every (-e)s-esNon process group leaders (-d)s-dsNon leaders with tty (-a)s-asFor this user (-u %s)s-u %sis	Long (-l)s-lis	Full (-f)s-fisFull Long (-f -l)s-l -fsSession and group ID (-j)s-jsScheduler properties (-c)s-ccCsI|j|jj�d}t|�|}tjd|�|j�dS(Niskill -9 (tformat_listtformattgetRtostsystemt	do_update(Rtselectedtctpid((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pytkill)scCs�|j|jj�d}|j|jj�d}tjd||f�}t|d�}|jj	|dd�|d=|j
jjdt
��x$|D]}|j
jjd|�q�WdS(Nisps %s %ss
is
          (RRRt	view_listtviewtcommandst	getoutputRtheadertsettframetlisttdeletetAtEndtinsert(RRR"tsR(tline((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyR.s
cCs6|jjdd�|jj|jj|j��dS(Nt0tend(twidgettselect_cleart
select_settnearestty(Rte((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyt	do_motion8scCs|jjdd�dS(NR.R/(R0R1(RR5((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pytdo_leave;scCs,|j|jj|jj|j���dS(N(R R0RR3R4(RR5((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pytdo_1=scKs�ttj||f|�|jdddt�t|dddtdd�|_|jjdt�t|jd	d
�|j_	|jj	j
jddd
|j�t|jd	d�|j_
t|jd	d�|j_t|�|_
|j
jd�t|�|_|jjd�xatt|j��D]J}|j|\}}|jj
j
jd|d
|jd|j
d|�q*Wxdtt|j��D]M}|j|\}}}|jjj
jd|d
|jd|jd|�q�W|jj|jj	|jj
|jj�t|dtdd�|_|jjdddt�t|�|_t|jdtdtddddd|j�|j_|jjjdtdt �t!|jdt"�|j_#t$|jdt%ddddddddddd t&d!|jj#j�|j_'|jj'j(|jj#d
<|jj#jd"t)dt�|jj'jdddt�t*|d	d#d
|j�|_+|j+jdt�|jj'j,d$|j-�|jj'j,d%|j.�|jj'j,d&|j/�|j�dS('NtexpanditfillRtbartrelieftborderwidthittexttFiletlabeltQuittcommandtViewtFormatitvariabletvaluetanchortfonts*-Courier-Bold-R-Normal-*-120-*ttextvariabletorients!*-Courier-Medium-R-Normal-*-120-*twidthi(theighti
tselectbackgrounds#eed5b7tselectborderwidtht
selectmodetyscrollRtUpdates<Motion>s<Leave>s<1>(0RtFrameR
RtBOTHtRAISEDR;tXRtfileRtadd_commandtquitR"RtIntVarR&trangetlenR!tadd_radiobuttonRRt
tk_menuBarR't	StringVarR%tLabeltFLATtNWR@tYtWt	ScrollbartVERTICALtvscrolltListboxtSUNKENtBROWSER(tyviewtRIGHTtButtontupdatetbindR6R7R8(RRRtnumR@toptiontcol((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyR
?sv					
	(RR(s
Every (-e)s-e(sNon process group leaders (-d)s-d(sNon leaders with tty (-a)s-a(RRi(s	Long (-l)s-li(s	Full (-f)s-fi(sFull Long (-f -l)s-l -fi(sSession and group ID (-j)s-ji(sScheduler properties (-c)s-ciN(RRtuserR!RR RR6R7R8RR
(((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyRs"			
			t__main__R=isTkinter Process Killer (SYSV)i(tTkintert	TkVersiontImportErrortstringRRR#RtenvironRrR	RRRRRRR twinfo_toplevelttitletminsizetmainloop(((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyt<module>s

dPK��Zv����guido/canvasevents.pynuȯ��#! /usr/bin/python2.7

from Tkinter import *
from Canvas import Oval, Group, CanvasText


# Fix a bug in Canvas.Group as distributed in Python 1.4.  The
# distributed bind() method is broken.  This is what should be used:

class Group(Group):
    def bind(self, sequence=None, command=None):
        return self.canvas.tag_bind(self.id, sequence, command)

class Object:

    """Base class for composite graphical objects.

    Objects belong to a canvas, and can be moved around on the canvas.
    They also belong to at most one ``pile'' of objects, and can be
    transferred between piles (or removed from their pile).

    Objects have a canonical ``x, y'' position which is moved when the
    object is moved.  Where the object is relative to this position
    depends on the object; for simple objects, it may be their center.

    Objects have mouse sensitivity.  They can be clicked, dragged and
    double-clicked.  The behavior may actually be determined by the pile
    they are in.

    All instance attributes are public since the derived class may
    need them.

    """

    def __init__(self, canvas, x=0, y=0, fill='red', text='object'):
        self.canvas = canvas
        self.x = x
        self.y = y
        self.pile = None
        self.group = Group(self.canvas)
        self.createitems(fill, text)

    def __str__(self):
        return str(self.group)

    def createitems(self, fill, text):
        self.__oval = Oval(self.canvas,
                           self.x-20, self.y-10, self.x+20, self.y+10,
                           fill=fill, width=3)
        self.group.addtag_withtag(self.__oval)
        self.__text = CanvasText(self.canvas,
                           self.x, self.y, text=text)
        self.group.addtag_withtag(self.__text)

    def moveby(self, dx, dy):
        if dx == dy == 0:
            return
        self.group.move(dx, dy)
        self.x = self.x + dx
        self.y = self.y + dy

    def moveto(self, x, y):
        self.moveby(x - self.x, y - self.y)

    def transfer(self, pile):
        if self.pile:
            self.pile.delete(self)
            self.pile = None
        self.pile = pile
        if self.pile:
            self.pile.add(self)

    def tkraise(self):
        self.group.tkraise()


class Bottom(Object):

    """An object to serve as the bottom of a pile."""

    def createitems(self, *args):
        self.__oval = Oval(self.canvas,
                           self.x-20, self.y-10, self.x+20, self.y+10,
                           fill='gray', outline='')
        self.group.addtag_withtag(self.__oval)


class Pile:

    """A group of graphical objects."""

    def __init__(self, canvas, x, y, tag=None):
        self.canvas = canvas
        self.x = x
        self.y = y
        self.objects = []
        self.bottom = Bottom(self.canvas, self.x, self.y)
        self.group = Group(self.canvas, tag=tag)
        self.group.addtag_withtag(self.bottom.group)
        self.bindhandlers()

    def bindhandlers(self):
        self.group.bind('<1>', self.clickhandler)
        self.group.bind('<Double-1>', self.doubleclickhandler)

    def add(self, object):
        self.objects.append(object)
        self.group.addtag_withtag(object.group)
        self.position(object)

    def delete(self, object):
        object.group.dtag(self.group)
        self.objects.remove(object)

    def position(self, object):
        object.tkraise()
        i = self.objects.index(object)
        object.moveto(self.x + i*4, self.y + i*8)

    def clickhandler(self, event):
        pass

    def doubleclickhandler(self, event):
        pass


class MovingPile(Pile):

    def bindhandlers(self):
        Pile.bindhandlers(self)
        self.group.bind('<B1-Motion>', self.motionhandler)
        self.group.bind('<ButtonRelease-1>', self.releasehandler)

    movethis = None

    def clickhandler(self, event):
        tags = self.canvas.gettags('current')
        for i in range(len(self.objects)):
            o = self.objects[i]
            if o.group.tag in tags:
                break
        else:
            self.movethis = None
            return
        self.movethis = self.objects[i:]
        for o in self.movethis:
            o.tkraise()
        self.lastx = event.x
        self.lasty = event.y

    doubleclickhandler = clickhandler

    def motionhandler(self, event):
        if not self.movethis:
            return
        dx = event.x - self.lastx
        dy = event.y - self.lasty
        self.lastx = event.x
        self.lasty = event.y
        for o in self.movethis:
            o.moveby(dx, dy)

    def releasehandler(self, event):
        objects = self.movethis
        if not objects:
            return
        self.movethis = None
        self.finishmove(objects)

    def finishmove(self, objects):
        for o in objects:
            self.position(o)


class Pile1(MovingPile):

    x = 50
    y = 50
    tag = 'p1'

    def __init__(self, demo):
        self.demo = demo
        MovingPile.__init__(self, self.demo.canvas, self.x, self.y, self.tag)

    def doubleclickhandler(self, event):
        try:
            o = self.objects[-1]
        except IndexError:
            return
        o.transfer(self.other())
        MovingPile.doubleclickhandler(self, event)

    def other(self):
        return self.demo.p2

    def finishmove(self, objects):
        o = objects[0]
        p = self.other()
        x, y = o.x, o.y
        if (x-p.x)**2 + (y-p.y)**2 < (x-self.x)**2 + (y-self.y)**2:
            for o in objects:
                o.transfer(p)
        else:
            MovingPile.finishmove(self, objects)

class Pile2(Pile1):

    x = 150
    y = 50
    tag = 'p2'

    def other(self):
        return self.demo.p1


class Demo:

    def __init__(self, master):
        self.master = master
        self.canvas = Canvas(master,
                             width=200, height=200,
                             background='yellow',
                             relief=SUNKEN, borderwidth=2)
        self.canvas.pack(expand=1, fill=BOTH)
        self.p1 = Pile1(self)
        self.p2 = Pile2(self)
        o1 = Object(self.canvas, fill='red', text='o1')
        o2 = Object(self.canvas, fill='green', text='o2')
        o3 = Object(self.canvas, fill='light blue', text='o3')
        o1.transfer(self.p1)
        o2.transfer(self.p1)
        o3.transfer(self.p2)


# Main function, run when invoked as a stand-alone Python program.

def main():
    root = Tk()
    demo = Demo(root)
    root.protocol('WM_DELETE_WINDOW', root.quit)
    root.mainloop()

if __name__ == '__main__':
    main()
PK��Z`�xIIguido/hanoi.pyonu�[����
��^c@sIddlTd�Zddd��YZd�ZedkrEe�ndS(	i����(t*cCsX|dkrdSt|d||||�||||�t|d||||�dS(Nii(thanoi(tntatbtctreport((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyRs
tTkhanoicBs&eZdd�Zd�Zd�ZRS(cCs�||_t�|_}t|�|_}|j�|j|d�|j|d�}}|r�|j|d|dd|dd�|_nd}|d}|d}	|	|d|d	d}
}|
|||}}
g|_	|j
|
|||
d
d�}|j	j|�|
|	||	}
}|j
|
|||
d
d�}|j	j|�|
|	||	}
}|j
|
|||
d
d�}|j	j|�|jj�|d}|	dd}d|}gggg|_
i|_|	|d|
|d}
}|
|||}}
||dtd	|d	�}x�t|d
d�D]�}|j
|
|||
d
d�}||j|<|j
d
j|�|
|||}
}||d|
|d}}
|jj�|jjd�qFWdS(Ntwidththeightitbitmapt
foregroundtbluei
iitfilltblackiii����tredi(RtTkttktCanvastcanvastpacktgetintt
create_bitmapR
tpegstcreate_rectangletappendtupdatetpegstatetpiecestmaxtrangetafter(tselfRR
RRRR	tpegwidtht	pegheighttpegdisttx1ty1tx2ty2tptpieceheightt
maxpiecewidtht
minpiecewidthtdxti((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyt__init__sP	
'

	


	

cCs�x�t|jddd|j�t|jddd|j�t|jddd|j�t|jddd|j�t|jddd|j�t|jddd|j�qWdS(Niii(RRR(R ((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pytrunNscCs�|j|d|kr t�n|j|d=|j|}|j}|j|j|�\}}}}	xO|j|�\}
}}}
|
|kr�Pn|j|dd�|jj�qiW|j|j|�\}}}}||d}x|j|�\}
}}}
|
|d}||kr$Pn||krF|j|dd�n|j|dd�|jj�q�W|
|}||t	|j|�d}xO|j|�\}
}}}
|
|kr�Pn|j|dd�|jj�q�W|j|j
|�dS(Ni����iii(RtRuntimeErrorRRtbboxRtmoveRRtlenR(R R-RRR(Rtax1tay1tax2tay2R$R%R&R'tbx1tby1tbx2tby2t	newcentertcenterR)t	newbottom((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyRXs@	
	""
N(t__name__t
__module__tNoneR.R/R(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyRs1	
cCs�ddl}ddl}|jdr>|j|jd�}nd}|jdr�|jd}|ddkr{|d}q�d|}nd}t||�}|j�dS(Ni����iiiit@(tsyststringtargvtatoiRARR/(RCRDRR
th((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pytmains




t__main__N((tTkinterRRRHR?(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyt<module>
s

	e	PK��Zn�`�		guido/electrons.pynuȯ��#! /usr/bin/python2.7

# Simulate "electrons" migrating across the screen.
# An optional bitmap file in can be in the background.
#
# Usage: electrons [n [bitmapfile]]
#
# n is the number of electrons to animate; default is 30.
#
# The bitmap file can be any X11 bitmap file (look in
# /usr/include/X11/bitmaps for samples); it is displayed as the
# background of the animation.  Default is no bitmap.

from Tkinter import *
import random


# The graphical interface
class Electrons:

    # Create our objects
    def __init__(self, n, bitmap = None):
        self.n = n
        self.tk = tk = Tk()
        self.canvas = c = Canvas(tk)
        c.pack()
        width, height = tk.getint(c['width']), tk.getint(c['height'])

        # Add background bitmap
        if bitmap:
            self.bitmap = c.create_bitmap(width/2, height/2,
                                          bitmap=bitmap,
                                          foreground='blue')

        self.pieces = []
        x1, y1, x2, y2 = 10,70,14,74
        for i in range(n):
            p = c.create_oval(x1, y1, x2, y2, fill='red')
            self.pieces.append(p)
            y1, y2 = y1 +2, y2 + 2
        self.tk.update()

    def random_move(self, n):
        c = self.canvas
        for p in self.pieces:
            x = random.choice(range(-2,4))
            y = random.choice(range(-3,4))
            c.move(p, x, y)
        self.tk.update()

    # Run -- allow 500 movemens
    def run(self):
        try:
            for i in range(500):
                self.random_move(self.n)
        except TclError:
            try:
                self.tk.destroy()
            except TclError:
                pass


# Main program
def main():
    import sys, string

    # First argument is number of electrons, default 30
    if sys.argv[1:]:
        n = string.atoi(sys.argv[1])
    else:
        n = 30

    # Second argument is bitmap file, default none
    if sys.argv[2:]:
        bitmap = sys.argv[2]
        # Reverse meaning of leading '@' compared to Tk
        if bitmap[0] == '@': bitmap = bitmap[1:]
        else: bitmap = '@' + bitmap
    else:
        bitmap = None

    # Create the graphical objects...
    h = Electrons(n, bitmap)

    # ...and run!
    h.run()


# Call main when run as script
if __name__ == '__main__':
    main()
PK��Z-�ɖ55
guido/mbox.pynuȯ��#! /usr/bin/python2.7

# Scan MH folder, display results in window

import os
import sys
import re
import getopt
import string
import mhlib

from Tkinter import *

from dialog import dialog

mailbox = os.environ['HOME'] + '/Mail'

def main():
    global root, tk, top, mid, bot
    global folderbox, foldermenu, scanbox, scanmenu, viewer
    global folder, seq
    global mh, mhf

    # Parse command line options

    folder = 'inbox'
    seq = 'all'
    try:
        opts, args = getopt.getopt(sys.argv[1:], '')
    except getopt.error, msg:
        print msg
        sys.exit(2)
    for arg in args:
        if arg[:1] == '+':
            folder = arg[1:]
        else:
            seq = arg

    # Initialize MH

    mh = mhlib.MH()
    mhf = mh.openfolder(folder)

    # Build widget hierarchy

    root = Tk()
    tk = root.tk

    top = Frame(root)
    top.pack({'expand': 1, 'fill': 'both'})

    # Build right part: folder list

    right = Frame(top)
    right.pack({'fill': 'y', 'side': 'right'})

    folderbar = Scrollbar(right, {'relief': 'sunken', 'bd': 2})
    folderbar.pack({'fill': 'y', 'side': 'right'})

    folderbox = Listbox(right, {'exportselection': 0})
    folderbox.pack({'expand': 1, 'fill': 'both', 'side': 'left'})

    foldermenu = Menu(root)
    foldermenu.add('command',
                   {'label': 'Open Folder',
                    'command': open_folder})
    foldermenu.add('separator')
    foldermenu.add('command',
                   {'label': 'Quit',
                    'command': 'exit'})
    foldermenu.bind('<ButtonRelease-3>', folder_unpost)

    folderbox['yscrollcommand'] = (folderbar, 'set')
    folderbar['command'] = (folderbox, 'yview')
    folderbox.bind('<Double-1>', open_folder, 1)
    folderbox.bind('<3>', folder_post)

    # Build left part: scan list

    left = Frame(top)
    left.pack({'expand': 1, 'fill': 'both', 'side': 'left'})

    scanbar = Scrollbar(left, {'relief': 'sunken', 'bd': 2})
    scanbar.pack({'fill': 'y', 'side': 'right'})

    scanbox = Listbox(left, {'font': 'fixed'})
    scanbox.pack({'expand': 1, 'fill': 'both', 'side': 'left'})

    scanmenu = Menu(root)
    scanmenu.add('command',
                 {'label': 'Open Message',
                  'command': open_message})
    scanmenu.add('command',
                 {'label': 'Remove Message',
                  'command': remove_message})
    scanmenu.add('command',
                 {'label': 'Refile Message',
                  'command': refile_message})
    scanmenu.add('separator')
    scanmenu.add('command',
                 {'label': 'Quit',
                  'command': 'exit'})
    scanmenu.bind('<ButtonRelease-3>', scan_unpost)

    scanbox['yscrollcommand'] = (scanbar, 'set')
    scanbar['command'] = (scanbox, 'yview')
    scanbox.bind('<Double-1>', open_message)
    scanbox.bind('<3>', scan_post)

    # Separator between middle and bottom part

    rule2 = Frame(root, {'bg': 'black'})
    rule2.pack({'fill': 'x'})

    # Build bottom part: current message

    bot = Frame(root)
    bot.pack({'expand': 1, 'fill': 'both'})
    #
    viewer = None

    # Window manager commands

    root.minsize(800, 1) # Make window resizable

    # Fill folderbox with text

    setfolders()

    # Fill scanbox with text

    rescan()

    # Enter mainloop

    root.mainloop()

def folder_post(e):
    x, y = e.x_root, e.y_root
    foldermenu.post(x - 10, y - 10)
    foldermenu.grab_set()

def folder_unpost(e):
    tk.call('update', 'idletasks')
    foldermenu.grab_release()
    foldermenu.unpost()
    foldermenu.invoke('active')

def scan_post(e):
    x, y = e.x_root, e.y_root
    scanmenu.post(x - 10, y - 10)
    scanmenu.grab_set()

def scan_unpost(e):
    tk.call('update', 'idletasks')
    scanmenu.grab_release()
    scanmenu.unpost()
    scanmenu.invoke('active')

scanparser = re.compile('^ *([0-9]+)')

def open_folder(e=None):
    global folder, mhf
    sel = folderbox.curselection()
    if len(sel) != 1:
        if len(sel) > 1:
            msg = "Please open one folder at a time"
        else:
            msg = "Please select a folder to open"
        dialog(root, "Can't Open Folder", msg, "", 0, "OK")
        return
    i = sel[0]
    folder = folderbox.get(i)
    mhf = mh.openfolder(folder)
    rescan()

def open_message(e=None):
    global viewer
    sel = scanbox.curselection()
    if len(sel) != 1:
        if len(sel) > 1:
            msg = "Please open one message at a time"
        else:
            msg = "Please select a message to open"
        dialog(root, "Can't Open Message", msg, "", 0, "OK")
        return
    cursor = scanbox['cursor']
    scanbox['cursor'] = 'watch'
    tk.call('update', 'idletasks')
    i = sel[0]
    line = scanbox.get(i)
    if scanparser.match(line) >= 0:
        num = string.atoi(scanparser.group(1))
        m = mhf.openmessage(num)
        if viewer: viewer.destroy()
        from MimeViewer import MimeViewer
        viewer = MimeViewer(bot, '+%s/%d' % (folder, num), m)
        viewer.pack()
        viewer.show()
    scanbox['cursor'] = cursor

def interestingheader(header):
    return header != 'received'

def remove_message(e=None):
    itop = scanbox.nearest(0)
    sel = scanbox.curselection()
    if not sel:
        dialog(root, "No Message To Remove",
               "Please select a message to remove", "", 0, "OK")
        return
    todo = []
    for i in sel:
        line = scanbox.get(i)
        if scanparser.match(line) >= 0:
            todo.append(string.atoi(scanparser.group(1)))
    mhf.removemessages(todo)
    rescan()
    fixfocus(min(todo), itop)

lastrefile = ''
tofolder = None
def refile_message(e=None):
    global lastrefile, tofolder
    itop = scanbox.nearest(0)
    sel = scanbox.curselection()
    if not sel:
        dialog(root, "No Message To Refile",
               "Please select a message to refile", "", 0, "OK")
        return
    foldersel = folderbox.curselection()
    if len(foldersel) != 1:
        if not foldersel:
            msg = "Please select a folder to refile to"
        else:
            msg = "Please select exactly one folder to refile to"
        dialog(root, "No Folder To Refile", msg, "", 0, "OK")
        return
    refileto = folderbox.get(foldersel[0])
    todo = []
    for i in sel:
        line = scanbox.get(i)
        if scanparser.match(line) >= 0:
            todo.append(string.atoi(scanparser.group(1)))
    if lastrefile != refileto or not tofolder:
        lastrefile = refileto
        tofolder = None
        tofolder = mh.openfolder(lastrefile)
    mhf.refilemessages(todo, tofolder)
    rescan()
    fixfocus(min(todo), itop)

def fixfocus(near, itop):
    n = scanbox.size()
    for i in range(n):
        line = scanbox.get(repr(i))
        if scanparser.match(line) >= 0:
            num = string.atoi(scanparser.group(1))
            if num >= near:
                break
    else:
        i = 'end'
    scanbox.select_from(i)
    scanbox.yview(itop)

def setfolders():
    folderbox.delete(0, 'end')
    for fn in mh.listallfolders():
        folderbox.insert('end', fn)

def rescan():
    global viewer
    if viewer:
        viewer.destroy()
        viewer = None
    scanbox.delete(0, 'end')
    for line in scanfolder(folder, seq):
        scanbox.insert('end', line)

def scanfolder(folder = 'inbox', sequence = 'all'):
    return map(
            lambda line: line[:-1],
            os.popen('scan +%s %s' % (folder, sequence), 'r').readlines())

main()
PK��Z��LLguido/ShellWindow.pynu�[���import os
import sys
import string
from Tkinter import *
from ScrolledText import ScrolledText
from Dialog import Dialog
import signal

BUFSIZE = 512

class ShellWindow(ScrolledText):

    def __init__(self, master=None, shell=None, **cnf):
        if not shell:
            try:
                shell = os.environ['SHELL']
            except KeyError:
                shell = '/bin/sh'
            shell = shell + ' -i'
        args = string.split(shell)
        shell = args[0]

        apply(ScrolledText.__init__, (self, master), cnf)
        self.pos = '1.0'
        self.bind('<Return>', self.inputhandler)
        self.bind('<Control-c>', self.sigint)
        self.bind('<Control-t>', self.sigterm)
        self.bind('<Control-k>', self.sigkill)
        self.bind('<Control-d>', self.sendeof)

        self.pid, self.fromchild, self.tochild = spawn(shell, args)
        self.tk.createfilehandler(self.fromchild, READABLE,
                                  self.outputhandler)

    def outputhandler(self, file, mask):
        data = os.read(file, BUFSIZE)
        if not data:
            self.tk.deletefilehandler(file)
            pid, sts = os.waitpid(self.pid, 0)
            print 'pid', pid, 'status', sts
            self.pid = None
            detail = sts>>8
            cause = sts & 0xff
            if cause == 0:
                msg = "exit status %d" % detail
            else:
                msg = "killed by signal %d" % (cause & 0x7f)
                if cause & 0x80:
                    msg = msg + " -- core dumped"
            Dialog(self.master,
                   text=msg,
                   title="Exit status",
                   bitmap='warning',
                   default=0,
                   strings=('OK',))
            return
        self.insert(END, data)
        self.pos = self.index("end - 1 char")
        self.yview_pickplace(END)

    def inputhandler(self, *args):
        if not self.pid:
            self.no_process()
            return "break"
        self.insert(END, "\n")
        line = self.get(self.pos, "end - 1 char")
        self.pos = self.index(END)
        os.write(self.tochild, line)
        return "break"

    def sendeof(self, *args):
        if not self.pid:
            self.no_process()
            return "break"
        os.close(self.tochild)
        return "break"

    def sendsig(self, sig):
        if not self.pid:
            self.no_process()
            return "break"
        os.kill(self.pid, sig)
        return "break"

    def sigint(self, *args):
        return self.sendsig(signal.SIGINT)

    def sigquit(self, *args):
        return self.sendsig(signal.SIGQUIT)

    def sigterm(self, *args):
        return self.sendsig(signal.SIGTERM)

    def sigkill(self, *args):
        return self.sendsig(signal.SIGKILL)

    def no_process(self):
        Dialog(self.master,
               text="No active process",
               title="No process",
               bitmap='error',
               default=0,
               strings=('OK',))

MAXFD = 100     # Max number of file descriptors (os.getdtablesize()???)

def spawn(prog, args):
    p2cread, p2cwrite = os.pipe()
    c2pread, c2pwrite = os.pipe()
    pid = os.fork()
    if pid == 0:
        # Child
        for i in 0, 1, 2:
            try:
                os.close(i)
            except os.error:
                pass
        if os.dup(p2cread) <> 0:
            sys.stderr.write('popen2: bad read dup\n')
        if os.dup(c2pwrite) <> 1:
            sys.stderr.write('popen2: bad write dup\n')
        if os.dup(c2pwrite) <> 2:
            sys.stderr.write('popen2: bad write dup\n')
        os.closerange(3, MAXFD)
        try:
            os.execvp(prog, args)
        finally:
            sys.stderr.write('execvp failed\n')
            os._exit(1)
    os.close(p2cread)
    os.close(c2pwrite)
    return pid, c2pread, p2cwrite

def test():
    shell = string.join(sys.argv[1:])
    root = Tk()
    root.minsize(1, 1)
    if shell:
        w = ShellWindow(root, shell=shell)
    else:
        w = ShellWindow(root)
    w.pack(expand=1, fill=BOTH)
    w.focus_set()
    w.tk.mainloop()

if __name__ == '__main__':
    test()
PK��Zj'��guido/imagedraw.pynu�[���"""Draw on top of an image"""

from Tkinter import *
import sys

def main():
    filename = sys.argv[1]
    root = Tk()
    img = PhotoImage(file=filename)
    w, h = img.width(), img.height()
    canv = Canvas(root, width=w, height=h)
    canv.create_image(0, 0, anchor=NW, image=img)
    canv.pack()
    canv.bind('<Button-1>', blob)
    root.mainloop()

def blob(event):
    x, y = event.x, event.y
    canv = event.widget
    r = 5
    canv.create_oval(x-r, y-r, x+r, y+r, fill='red', outline="")

main()
PK��Z&�S�}E}Eguido/solitaire.pynuȯ��#! /usr/bin/python2.7

"""Solitaire game, much like the one that comes with MS Windows.

Limitations:

- No cute graphical images for the playing cards faces or backs.
- No scoring or timer.
- No undo.
- No option to turn 3 cards at a time.
- No keyboard shortcuts.
- Less fancy animation when you win.
- The determination of which stack you drag to is more relaxed.

Apology:

I'm not much of a card player, so my terminology in these comments may
at times be a little unusual.  If you have suggestions, please let me
know!

"""

# Imports

import math
import random

from Tkinter import *
from Canvas import Rectangle, CanvasText, Group, Window


# Fix a bug in Canvas.Group as distributed in Python 1.4.  The
# distributed bind() method is broken.  Rather than asking you to fix
# the source, we fix it here by deriving a subclass:

class Group(Group):
    def bind(self, sequence=None, command=None):
        return self.canvas.tag_bind(self.id, sequence, command)


# Constants determining the size and lay-out of cards and stacks.  We
# work in a "grid" where each card/stack is surrounded by MARGIN
# pixels of space on each side, so adjacent stacks are separated by
# 2*MARGIN pixels.  OFFSET is the offset used for displaying the
# face down cards in the row stacks.

CARDWIDTH = 100
CARDHEIGHT = 150
MARGIN = 10
XSPACING = CARDWIDTH + 2*MARGIN
YSPACING = CARDHEIGHT + 4*MARGIN
OFFSET = 5

# The background color, green to look like a playing table.  The
# standard green is way too bright, and dark green is way to dark, so
# we use something in between.  (There are a few more colors that
# could be customized, but they are less controversial.)

BACKGROUND = '#070'


# Suits and colors.  The values of the symbolic suit names are the
# strings used to display them (you change these and VALNAMES to
# internationalize the game).  The COLOR dictionary maps suit names to
# colors (red and black) which must be Tk color names.  The keys() of
# the COLOR dictionary conveniently provides us with a list of all
# suits (in arbitrary order).

HEARTS = 'Heart'
DIAMONDS = 'Diamond'
CLUBS = 'Club'
SPADES = 'Spade'

RED = 'red'
BLACK = 'black'

COLOR = {}
for s in (HEARTS, DIAMONDS):
    COLOR[s] = RED
for s in (CLUBS, SPADES):
    COLOR[s] = BLACK

ALLSUITS = COLOR.keys()
NSUITS = len(ALLSUITS)


# Card values are 1-13.  We also define symbolic names for the picture
# cards.  ALLVALUES is a list of all card values.

ACE = 1
JACK = 11
QUEEN = 12
KING = 13
ALLVALUES = range(1, 14) # (one more than the highest value)
NVALUES = len(ALLVALUES)


# VALNAMES is a list that maps a card value to string.  It contains a
# dummy element at index 0 so it can be indexed directly with the card
# value.

VALNAMES = ["", "A"] + map(str, range(2, 11)) + ["J", "Q", "K"]


# Solitaire constants.  The only one I can think of is the number of
# row stacks.

NROWS = 7


# The rest of the program consists of class definitions.  These are
# further described in their documentation strings.


class Card:

    """A playing card.

    A card doesn't record to which stack it belongs; only the stack
    records this (it turns out that we always know this from the
    context, and this saves a ``double update'' with potential for
    inconsistencies).

    Public methods:

    moveto(x, y) -- move the card to an absolute position
    moveby(dx, dy) -- move the card by a relative offset
    tkraise() -- raise the card to the top of its stack
    showface(), showback() -- turn the card face up or down & raise it

    Public read-only instance variables:

    suit, value, color -- the card's suit, value and color
    face_shown -- true when the card is shown face up, else false

    Semi-public read-only instance variables (XXX should be made
    private):

    group -- the Canvas.Group representing the card
    x, y -- the position of the card's top left corner

    Private instance variables:

    __back, __rect, __text -- the canvas items making up the card

    (To show the card face up, the text item is placed in front of
    rect and the back is placed behind it.  To show it face down, this
    is reversed.  The card is created face down.)

    """

    def __init__(self, suit, value, canvas):
        """Card constructor.

        Arguments are the card's suit and value, and the canvas widget.

        The card is created at position (0, 0), with its face down
        (adding it to a stack will position it according to that
        stack's rules).

        """
        self.suit = suit
        self.value = value
        self.color = COLOR[suit]
        self.face_shown = 0

        self.x = self.y = 0
        self.group = Group(canvas)

        text = "%s  %s" % (VALNAMES[value], suit)
        self.__text = CanvasText(canvas, CARDWIDTH//2, 0,
                               anchor=N, fill=self.color, text=text)
        self.group.addtag_withtag(self.__text)

        self.__rect = Rectangle(canvas, 0, 0, CARDWIDTH, CARDHEIGHT,
                              outline='black', fill='white')
        self.group.addtag_withtag(self.__rect)

        self.__back = Rectangle(canvas, MARGIN, MARGIN,
                              CARDWIDTH-MARGIN, CARDHEIGHT-MARGIN,
                              outline='black', fill='blue')
        self.group.addtag_withtag(self.__back)

    def __repr__(self):
        """Return a string for debug print statements."""
        return "Card(%r, %r)" % (self.suit, self.value)

    def moveto(self, x, y):
        """Move the card to absolute position (x, y)."""
        self.moveby(x - self.x, y - self.y)

    def moveby(self, dx, dy):
        """Move the card by (dx, dy)."""
        self.x = self.x + dx
        self.y = self.y + dy
        self.group.move(dx, dy)

    def tkraise(self):
        """Raise the card above all other objects in its canvas."""
        self.group.tkraise()

    def showface(self):
        """Turn the card's face up."""
        self.tkraise()
        self.__rect.tkraise()
        self.__text.tkraise()
        self.face_shown = 1

    def showback(self):
        """Turn the card's face down."""
        self.tkraise()
        self.__rect.tkraise()
        self.__back.tkraise()
        self.face_shown = 0


class Stack:

    """A generic stack of cards.

    This is used as a base class for all other stacks (e.g. the deck,
    the suit stacks, and the row stacks).

    Public methods:

    add(card) -- add a card to the stack
    delete(card) -- delete a card from the stack
    showtop() -- show the top card (if any) face up
    deal() -- delete and return the top card, or None if empty

    Method that subclasses may override:

    position(card) -- move the card to its proper (x, y) position

        The default position() method places all cards at the stack's
        own (x, y) position.

    userclickhandler(), userdoubleclickhandler() -- called to do
    subclass specific things on single and double clicks

        The default user (single) click handler shows the top card
        face up.  The default user double click handler calls the user
        single click handler.

    usermovehandler(cards) -- called to complete a subpile move

        The default user move handler moves all moved cards back to
        their original position (by calling the position() method).

    Private methods:

    clickhandler(event), doubleclickhandler(event),
    motionhandler(event), releasehandler(event) -- event handlers

        The default event handlers turn the top card of the stack with
        its face up on a (single or double) click, and also support
        moving a subpile around.

    startmoving(event) -- begin a move operation
    finishmoving() -- finish a move operation

    """

    def __init__(self, x, y, game=None):
        """Stack constructor.

        Arguments are the stack's nominal x and y position (the top
        left corner of the first card placed in the stack), and the
        game object (which is used to get the canvas; subclasses use
        the game object to find other stacks).

        """
        self.x = x
        self.y = y
        self.game = game
        self.cards = []
        self.group = Group(self.game.canvas)
        self.group.bind('<1>', self.clickhandler)
        self.group.bind('<Double-1>', self.doubleclickhandler)
        self.group.bind('<B1-Motion>', self.motionhandler)
        self.group.bind('<ButtonRelease-1>', self.releasehandler)
        self.makebottom()

    def makebottom(self):
        pass

    def __repr__(self):
        """Return a string for debug print statements."""
        return "%s(%d, %d)" % (self.__class__.__name__, self.x, self.y)

    # Public methods

    def add(self, card):
        self.cards.append(card)
        card.tkraise()
        self.position(card)
        self.group.addtag_withtag(card.group)

    def delete(self, card):
        self.cards.remove(card)
        card.group.dtag(self.group)

    def showtop(self):
        if self.cards:
            self.cards[-1].showface()

    def deal(self):
        if not self.cards:
            return None
        card = self.cards[-1]
        self.delete(card)
        return card

    # Subclass overridable methods

    def position(self, card):
        card.moveto(self.x, self.y)

    def userclickhandler(self):
        self.showtop()

    def userdoubleclickhandler(self):
        self.userclickhandler()

    def usermovehandler(self, cards):
        for card in cards:
            self.position(card)

    # Event handlers

    def clickhandler(self, event):
        self.finishmoving()             # In case we lost an event
        self.userclickhandler()
        self.startmoving(event)

    def motionhandler(self, event):
        self.keepmoving(event)

    def releasehandler(self, event):
        self.keepmoving(event)
        self.finishmoving()

    def doubleclickhandler(self, event):
        self.finishmoving()             # In case we lost an event
        self.userdoubleclickhandler()
        self.startmoving(event)

    # Move internals

    moving = None

    def startmoving(self, event):
        self.moving = None
        tags = self.game.canvas.gettags('current')
        for i in range(len(self.cards)):
            card = self.cards[i]
            if card.group.tag in tags:
                break
        else:
            return
        if not card.face_shown:
            return
        self.moving = self.cards[i:]
        self.lastx = event.x
        self.lasty = event.y
        for card in self.moving:
            card.tkraise()

    def keepmoving(self, event):
        if not self.moving:
            return
        dx = event.x - self.lastx
        dy = event.y - self.lasty
        self.lastx = event.x
        self.lasty = event.y
        if dx or dy:
            for card in self.moving:
                card.moveby(dx, dy)

    def finishmoving(self):
        cards = self.moving
        self.moving = None
        if cards:
            self.usermovehandler(cards)


class Deck(Stack):

    """The deck is a stack with support for shuffling.

    New methods:

    fill() -- create the playing cards
    shuffle() -- shuffle the playing cards

    A single click moves the top card to the game's open deck and
    moves it face up; if we're out of cards, it moves the open deck
    back to the deck.

    """

    def makebottom(self):
        bottom = Rectangle(self.game.canvas,
                           self.x, self.y,
                           self.x+CARDWIDTH, self.y+CARDHEIGHT,
                           outline='black', fill=BACKGROUND)
        self.group.addtag_withtag(bottom)

    def fill(self):
        for suit in ALLSUITS:
            for value in ALLVALUES:
                self.add(Card(suit, value, self.game.canvas))

    def shuffle(self):
        n = len(self.cards)
        newcards = []
        for i in randperm(n):
            newcards.append(self.cards[i])
        self.cards = newcards

    def userclickhandler(self):
        opendeck = self.game.opendeck
        card = self.deal()
        if not card:
            while 1:
                card = opendeck.deal()
                if not card:
                    break
                self.add(card)
                card.showback()
        else:
            self.game.opendeck.add(card)
            card.showface()


def randperm(n):
    """Function returning a random permutation of range(n)."""
    r = range(n)
    x = []
    while r:
        i = random.choice(r)
        x.append(i)
        r.remove(i)
    return x


class OpenStack(Stack):

    def acceptable(self, cards):
        return 0

    def usermovehandler(self, cards):
        card = cards[0]
        stack = self.game.closeststack(card)
        if not stack or stack is self or not stack.acceptable(cards):
            Stack.usermovehandler(self, cards)
        else:
            for card in cards:
                self.delete(card)
                stack.add(card)
            self.game.wincheck()

    def userdoubleclickhandler(self):
        if not self.cards:
            return
        card = self.cards[-1]
        if not card.face_shown:
            self.userclickhandler()
            return
        for s in self.game.suits:
            if s.acceptable([card]):
                self.delete(card)
                s.add(card)
                self.game.wincheck()
                break


class SuitStack(OpenStack):

    def makebottom(self):
        bottom = Rectangle(self.game.canvas,
                           self.x, self.y,
                           self.x+CARDWIDTH, self.y+CARDHEIGHT,
                           outline='black', fill='')

    def userclickhandler(self):
        pass

    def userdoubleclickhandler(self):
        pass

    def acceptable(self, cards):
        if len(cards) != 1:
            return 0
        card = cards[0]
        if not self.cards:
            return card.value == ACE
        topcard = self.cards[-1]
        return card.suit == topcard.suit and card.value == topcard.value + 1


class RowStack(OpenStack):

    def acceptable(self, cards):
        card = cards[0]
        if not self.cards:
            return card.value == KING
        topcard = self.cards[-1]
        if not topcard.face_shown:
            return 0
        return card.color != topcard.color and card.value == topcard.value - 1

    def position(self, card):
        y = self.y
        for c in self.cards:
            if c == card:
                break
            if c.face_shown:
                y = y + 2*MARGIN
            else:
                y = y + OFFSET
        card.moveto(self.x, y)


class Solitaire:

    def __init__(self, master):
        self.master = master

        self.canvas = Canvas(self.master,
                             background=BACKGROUND,
                             highlightthickness=0,
                             width=NROWS*XSPACING,
                             height=3*YSPACING + 20 + MARGIN)
        self.canvas.pack(fill=BOTH, expand=TRUE)

        self.dealbutton = Button(self.canvas,
                                 text="Deal",
                                 highlightthickness=0,
                                 background=BACKGROUND,
                                 activebackground="green",
                                 command=self.deal)
        Window(self.canvas, MARGIN, 3*YSPACING + 20,
               window=self.dealbutton, anchor=SW)

        x = MARGIN
        y = MARGIN

        self.deck = Deck(x, y, self)

        x = x + XSPACING
        self.opendeck = OpenStack(x, y, self)

        x = x + XSPACING
        self.suits = []
        for i in range(NSUITS):
            x = x + XSPACING
            self.suits.append(SuitStack(x, y, self))

        x = MARGIN
        y = y + YSPACING

        self.rows = []
        for i in range(NROWS):
            self.rows.append(RowStack(x, y, self))
            x = x + XSPACING

        self.openstacks = [self.opendeck] + self.suits + self.rows

        self.deck.fill()
        self.deal()

    def wincheck(self):
        for s in self.suits:
            if len(s.cards) != NVALUES:
                return
        self.win()
        self.deal()

    def win(self):
        """Stupid animation when you win."""
        cards = []
        for s in self.openstacks:
            cards = cards + s.cards
        while cards:
            card = random.choice(cards)
            cards.remove(card)
            self.animatedmoveto(card, self.deck)

    def animatedmoveto(self, card, dest):
        for i in range(10, 0, -1):
            dx, dy = (dest.x-card.x)//i, (dest.y-card.y)//i
            card.moveby(dx, dy)
            self.master.update_idletasks()

    def closeststack(self, card):
        closest = None
        cdist = 999999999
        # Since we only compare distances,
        # we don't bother to take the square root.
        for stack in self.openstacks:
            dist = (stack.x - card.x)**2 + (stack.y - card.y)**2
            if dist < cdist:
                closest = stack
                cdist = dist
        return closest

    def deal(self):
        self.reset()
        self.deck.shuffle()
        for i in range(NROWS):
            for r in self.rows[i:]:
                card = self.deck.deal()
                r.add(card)
        for r in self.rows:
            r.showtop()

    def reset(self):
        for stack in self.openstacks:
            while 1:
                card = stack.deal()
                if not card:
                    break
                self.deck.add(card)
                card.showback()


# Main function, run when invoked as a stand-alone Python program.

def main():
    root = Tk()
    game = Solitaire(root)
    root.protocol('WM_DELETE_WINDOW', root.quit)
    root.mainloop()

if __name__ == '__main__':
    main()
PK��Z"��@@guido/kill.pycnu�[����
Afc@s�ddlTddlmZddlmZddlZddlZdefd��YZdefd��YZ	e
d	kr�e	dd
d�Zej
�jd�ej
�jd
d
�ej�ndS(i����(t*(tsplitfields(tsplitNt	BarButtoncBseZdd�ZRS(cKsOttj||f|�|jdt�t|dd�|_|j|d<dS(Ntsidetnametmenu(tapplyt
Menubuttont__init__tpacktLEFTtMenuR(tselftmastertcnf((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR	sN(t__name__t
__module__tNoneR	(((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR
stKillc
Bs_eZdddddddd gZd�Zd�Zd�Zd�Zd�Zd!d�Z	RS("tDefaulttitLongs-litUsers-uitJobss-jtSignals-stMemorys-mtVMs-vtHexs-XcCsI|j|jj�d}t|�|}tjd|�|j�dS(Niskill -9 (tformat_listtformattgetRtostsystemt	do_update(R
tselectedtctpid((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pytkillscCs�|j|jj�\}}}tjd|�}t|d�}|jj|d�|d=|jj	j�d}|jj
jdt��x$|D]}|jj
j
d|�q�W|jj
jt|��dS(Nsps -w s
i(RRRtcommandst	getoutputRtheadertsettframetvscrolltlisttdeletetAtEndtinserttyviewtint(R
RtoptiontcolumntsR-tytline((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR" s
cCs6|jjdt�|jj|jj|j��dS(Ni(twidgettselect_cleartENDt
select_settnearestR6(R
te((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyt	do_motion+scCs|jjdt�dS(Ni(R8R9R:(R
R=((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pytdo_leave.scCs,|j|jj|jj|j���dS(N(R&R8RR<R6(R
R=((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pytdo_10sc
Ks
tj|||�|jdddt�t|dddtdd�|_|jjdt�t|jd	d
�|j_|jjj	j
ddd
|j�t|jd	d�|j_t
|�|_|jjd�xYtt|j��D]B}|jjj	jd|j|dd
|jd|jd|�q�W|jj|jj|jj�t|dtdd�|_|jjdddt�t|�|_t|jdtdtddd|j�|j_|jjjdt�t|jdt�|j_t |jdt!ddddd|jjj�|j_"|jj"j#|jjd
<|jjjdt$dt%�|jj"jdddt�t&|d	dd
|j�|_'|j'jdddt�|jj"j(d|j)�|jj"j(d|j*�|jj"j(d|j+�|j�dS(NtexpanditfillRtbartrelieftborderwidthittexttFiletlabeltQuittcommandtViewitvariabletvaluetanchorttextvariabletorienttselectbackgrounds#eed5b7tselectborderwidthtyscrollRtUpdates<Motion>s<Leave>s<1>(,tFrameR	R
tBOTHtRAISEDRCtXRtfileRtadd_commandtquittviewtIntVarRR*trangetlenRtadd_radiobuttonR"t
tk_menuBarR+t	StringVarR)tLabeltFLATtNWRHt	ScrollbartVERTICALR,tListboxtSUNKENR-R1tRIGHTtYtButtontupdatetbindR>R?R@(R
RRtnum((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR	2sP		(RRi(Rs-li(Rs-ui(Rs-ji(Rs-si(Rs-mi(Rs-vi(Rs-XiN(
RRRR&R"R>R?R@RR	(((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyRs						t__main__REisTkinter Process Killeri(tTkintertstringRRR'R RRRURRRR&twinfo_toplevelttitletminsizetmainloop(((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyt<module>s
MPK��Z�^u�iiguido/switch.pycnu�[����
��^c@sfddlTddd��YZddd��YZdd
d��YZd�Zed	krbe�nd
S(i����(t*tAppcBs)eZddd�Zd�Zd�ZRS(cCs�|dkr3|dkr$t�}q3t|�}n||_t|�|_|jj�t|dddt�|_|jjdddt	�i|_
d|_dS(Ntborderwidthitrelieftexpanditfill(tNonetTktToplevelttoptFrametbuttonframetpacktGROOVEt
panelframetBOTHtpanelstcurpanel(tselfR	tmaster((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyt__init__s	
	cCs�t|jd|d||d��}|jdt�t|j�}||�}|||f|j|<|jdkr�|j	|�ndS(NttexttcommandcSs
|j|�S(N(tshow(Rtname((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyt<lambda>ttside(
tButtonRRtLEFTR
RRRRR(RRtklasstbuttontframetinstance((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pytaddpanelscCsR|j|\}}}|jr/|jj�n||_|jdddd�dS(NRiRtboth(RRtpack_forgetR(RRRR R!((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyRs
		N(t__name__t
__module__RRR"R(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyRs	
t
LabelPanelcBseZd�ZRS(cCs&t|dd�|_|jj�dS(NRsHello world(tLabeltlabelR(RR ((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR's(R%R&R(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR'&stButtonPanelcBseZd�ZRS(cCs&t|dd�|_|jj�dS(NRsPress me(RRR(RR ((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR,s(R%R&R(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyR*+scCs:t�}|jdt�|jdt�|jj�dS(NR)R(RR"R'R*R	tmainloop(tapp((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pytmain0s	t__main__N((((tTkinterRR'R*R-R%(((s1/usr/lib64/python2.7/Demo/tkinter/guido/switch.pyt<module>s
!	PK��Z��1guido/switch.pynu�[���# Show how to do switchable panels.

from Tkinter import *

class App:

    def __init__(self, top=None, master=None):
        if top is None:
            if master is None:
                top = Tk()
            else:
                top = Toplevel(master)
        self.top = top
        self.buttonframe = Frame(top)
        self.buttonframe.pack()
        self.panelframe = Frame(top,  borderwidth=2, relief=GROOVE)
        self.panelframe.pack(expand=1, fill=BOTH)
        self.panels = {}
        self.curpanel = None

    def addpanel(self, name, klass):
        button = Button(self.buttonframe, text=name,
                        command=lambda self=self, name=name: self.show(name))
        button.pack(side=LEFT)
        frame = Frame(self.panelframe)
        instance = klass(frame)
        self.panels[name] = (button, frame, instance)
        if self.curpanel is None:
            self.show(name)

    def show(self, name):
        (button, frame, instance) = self.panels[name]
        if self.curpanel:
            self.curpanel.pack_forget()
        self.curpanel = frame
        frame.pack(expand=1, fill="both")

class LabelPanel:
    def __init__(self, frame):
        self.label = Label(frame, text="Hello world")
        self.label.pack()

class ButtonPanel:
    def __init__(self, frame):
        self.button = Button(frame, text="Press me")
        self.button.pack()

def main():
    app = App()
    app.addpanel("label", LabelPanel)
    app.addpanel("button", ButtonPanel)
    app.top.mainloop()

if __name__ == '__main__':
    main()
PK��Z~H�+��guido/ShellWindow.pyonu�[����
��^c@s�ddlZddlZddlZddlTddlmZddlmZddlZdZdefd��YZdZ	d	�Z
d
�Zedkr�e�ndS(i����N(t*(tScrolledText(tDialogitShellWindowcBsheZd
d
d�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�ZRS(cKs|s>ytjd}Wntk
r0d}nX|d}ntj|�}|d}ttj||f|�d|_|j	d|j
�|j	d|j�|j	d|j�|j	d	|j
�|j	d
|j�t||�\|_|_|_|jj|jt|j�dS(NtSHELLs/bin/shs -iis1.0s<Return>s<Control-c>s<Control-t>s<Control-k>s<Control-d>(tostenvirontKeyErrortstringtsplittapplyRt__init__tpostbindtinputhandlertsiginttsigtermtsigkilltsendeoftspawntpidt	fromchildttochildttktcreatefilehandlertREADABLEt
outputhandler(tselftmastertshelltcnftargs((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR
s$



	!c	Cstj|t�}|s�|jj|�tj|jd�\}}dG|GdG|GHd|_|d?}|d@}|dkr�d|}n%d|d@}|d	@r�|d
}nt|j	d|dd
dddddd�dS|j
t|�|jd�|_
|jt�dS(NiRtstatusii�sexit status %dskilled by signal %dii�s -- core dumpedttextttitlesExit statustbitmaptwarningtdefaulttstringstOKsend - 1 char(R'(RtreadtBUFSIZERtdeletefilehandlertwaitpidRtNoneRRtinserttENDtindexRtyview_pickplace(	RtfiletmasktdataRtststdetailtcausetmsg((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR#s.	




cGse|js|j�dS|jtd�|j|jd�}|jt�|_tj|j	|�dS(Ntbreaks
send - 1 char(
Rt
no_processR-R.tgetRR/RtwriteR(RRtline((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR=s	
cGs+|js|j�dStj|j�dS(NR8(RR9RtcloseR(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRGs
	
cCs.|js|j�dStj|j|�dS(NR8(RR9Rtkill(Rtsig((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pytsendsigNs
	
cGs|jtj�S(N(R@tsignaltSIGINT(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRUscGs|jtj�S(N(R@RAtSIGQUIT(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pytsigquitXscGs|jtj�S(N(R@RAtSIGTERM(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR[scGs|jtj�S(N(R@RAtSIGKILL(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR^scCs/t|jddddddddd	d�dS(NR!sNo active processR"s
No processR#terrorR%iR&R'(R'(RR(R((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR9asN(
t__name__t
__module__R,RRRRR@RRDRRR9(((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRs		
						idcCs\tj�\}}tj�\}}tj�}|dkr5x6dD].}ytj|�WqCtjk
rpqCXqCWtj|�dkr�tjjd�ntj|�dkr�tjjd�ntj|�dkr�tjjd�ntj	dt
�ztj||�Wdtjjd�tjd�Xntj|�tj|�|||fS(	Niiispopen2: bad read dup
spopen2: bad write dup
isexecvp failed
(iii(
RtpipetforkR=RGtduptsyststderrR;t
closerangetMAXFDtexecvpt_exit(tprogRtp2creadtp2cwritetc2preadtc2pwriteRti((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRks.


cCs�tjtjd�}t�}|jdd�|rJt|d|�}nt|�}|jdddt�|j	�|j
j�dS(NiRtexpandtfill(RtjoinRMtargvtTktminsizeRtpacktBOTHt	focus_setRtmainloop(Rtroottw((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyttest�s	
t__main__(
RRMRtTkinterRRRAR)RRPRReRH(((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyt<module>s
^		PK��ZD����guido/optionmenu.pynu�[���# option menu sample (Fredrik Lundh, September 1997)

from Tkinter import *

root = Tk()

#
# standard usage

var1  = StringVar()
var1.set("One") # default selection

menu1 = OptionMenu(root, var1, "One", "Two", "Three")
menu1.pack()

#
# initialize from a sequence

CHOICES = "Aah", "Bee", "Cee", "Dee", "Eff"

var2  = StringVar()
var2.set(CHOICES[0])

menu2 = apply(OptionMenu, (root, var2) + tuple(CHOICES))
menu2.pack()

root.mainloop()
PK��Z��kK�\�\guido/sortvisu.pycnu�[����
Afc@s�dZddlTddlmZmZddlZdZdZdZddd��YZ	d	dd
��YZ
d�Zd�Zd
�Z
d�Zd�Zd�Zd�Zd�Zd�Zd�Zddd��YZd�Zedkr�e�ndS(sjSorting algorithms visualizer using Tkinter.

This module is comprised of three ``components'':

- an array visualizer with methods that implement basic sorting
operations (compare, swap) as well as methods for ``annotating'' the
sorting algorithm (e.g. to show the pivot element);

- a number of sorting algorithms (currently quicksort, insertion sort,
selection sort and bubble sort, as well as a randomization function),
all using the array visualizer for its basic operations and with calls
to its annotation methods;

- and a ``driver'' class which can be used as a Grail applet or as a
stand-alone application.

i����(t*(tLinet	RectangleNi
itArraycBs�eZdd�Zd�ZdZd�Zd�ZdZdZ	d�Z
d�ZdZd	�Z
d
�Zd�Zd�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs||_t|j�|_|jjdt�t|j�|_|jj�t|j�|_|jj�t|j�|_	|j	j�t
|jdddd�|_t
|jdddd�|_t
|jdddd�|_
g|_d|_|_|r|j|�ndS(Ntfilli(tmastertFrametframetpacktXtLabeltlabeltCanvastcanvastreportRtlefttrighttpivottitemstsizetmaxvaluetsetdata(tselfRtdata((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt__init__"s 	


	cCs�|j}g|_x|D]}|j�qWt|�|_t|�|_|jjd|jdtd|jdt	�x7t
|j�D]&}|jjt||||��q�W|j
d|j�dS(NtwidthitheightsSort demo, size %d(RtdeletetlenRtmaxRR
tconfigtXGRIDtYGRIDtrangetappendt	ArrayItemtreset(RRtolditemstitemti((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR4s		
$tnormalcCs
||_dS(N(tspeed(RR)((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytsetspeedCscCs|jj�dS(N(Rtdestroy(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR+FsicCs&d|_|jr"|jj�ndS(Ni(t
stop_mainlooptin_mainloopRtquit(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytcancelLs		cCs|jr|jj�ndS(N(R-RR.(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytstepQs	sArray.CancelledcCs�|jdkrd}n4|jdkr4|d}n|jdkrLd}n|js�|jj�|jj||jj�}d|_|jj�|jj|�d|_n|jr�d|_|j	d�t
j�ndS(	Ntfastestitfasti
ssingle-stepiʚ;it	Cancelled(R)R,RtupdatetafterR.R-tmainlooptafter_canceltmessageRR3(Rtmsecstid((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytwaitWs"	
		
	
		
cCs|jS(N(R(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytgetsizejscCszxit|j�D]X}|j|}||ko:|knrU|jjdd�q|jjdd�qW|j�dS(NRtredtorange(R!RRR&Rthide_left_right_pivot(RtfirsttlastR'R&((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytshow_partitionms
cCsHx7t|j�D]&}|j|}|jjdd�qW|j�dS(NRR=(R!RRR&RR?(RR'R&((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pythide_partitionvs
cCs�d|ko|jkns-|j�dS|j|j�\}}}}|jj|ddf|ddfg�|jj�dS(Niii'(Rt	hide_leftRtpositionRtcoordsRR4(RRtx1ty1tx2ty2((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt	show_left|s
*cCs�d|ko|jkns-|j�dS|j|j�\}}}}|jj|ddf|ddff�|jj�dS(Niii'(Rt
hide_rightRRERRFRR4(RRRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
show_right�s
*cCs"|j�|j�|j�dS(N(RDRLt
hide_pivot(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR?�s

cCs|jjddf�dS(Ni(ii(ii(RRF(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRD�scCs|jjddf�dS(Ni(ii(ii(RRF(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRL�scCsM|j|j�\}}}}|jjd|dfd|dff�dS(Niii'(RRERRF(RRRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
show_pivot�scCs|jjddf�dS(Ni(ii(ii(RRF(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRN�scCs`||krdS|j�|j|}|j|}|||j|<|j|<|j|�dS(N(t	countswapRtswapwith(RR'tjR&tother((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytswap�s


cCs1|j�|j|}|j|}|j|�S(N(tcountcompareRt	compareto(RR'RRR&RS((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytcompare�s


cCs7d|_d|_|j|�|j�|j�dS(Ni(t	ncomparestnswapsR8tupdatereportRC(Rtmsg((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR$�s
		

cCs|jjd|�dS(Nttext(RR(RR[((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR8�scCs|jd|_|j�dS(Ni(RYRZ(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRP�scCs|jd|_|j�dS(Ni(RXRZ(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRU�scCs-d|j|jf}|jjd|�dS(Ns%d cmps, %d swapsR\(RXRYRR(RR\((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRZ�sN(t__name__t
__module__tNoneRRR)R*R+R-R,R/R0R3R;R<RBRCRKRMR?RDRLRORNRTRWR$R8RPRURZ(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR s8	
																							R#cBsbeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�ZRS(
cCs�||_||_||_|j�\}}}}t|j||||dddddd�|_|jjd|j�|jjd|j	�|jjd	|j
�dS(
NRR=toutlinetblackRis
<Button-1>s<Button1-Motion>s<ButtonRelease-1>(tarraytindextvalueRERR
R&tbindt
mouse_downt
mouse_movetmouse_up(RRbRcRdRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�s			cCs)|j}d|_d|_|j�dS(N(R&R_RbR(RR&((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�s			cCsA|j|_|j|_|j|_|j|_|jj�dS(N(txtlastxtytlastytorigxtorigyR&ttkraise(Rtevent((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRf�s
cCsC|jj|j|j|j|j�|j|_|j|_dS(N(R&tmoveRiRjRkRl(RRp((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRg�s'c	Cs�|j|j�}||jj�kr=|jj�d}n|dkrRd}n|jj|}|j}|||jj|<|jj|<||_|j�\}}}}|jj||f||ff�|j	|�dS(Nii(
tnearestindexRiRbR<RRcRER&RFtsetindex(	RRpR'RSthereRGRHRIRJ((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRh�s		!	"cCs�t|j|�}|sdS|jjdkr7d}n|j�}||_|j�}t|||�}|jj�x<|D]4}|jj|d |df�|jj	d�q~WdS(NR1iii2(
tstepsRcRbR)REtinterpolateR&RoRFR;(RRctnstepstoldptstnewptst
trajectorytpts((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRs�s		

cCs�t|j|j�}|sdS|jjdkr:d}n|j�}|j�}|j|j|_|_|j�}|j�}|jd}|jd}|jjdd�|jjdd�|jjj�|jjdkrk|jj	|d |df�|jj	|d |df�|jjj�|jjd|�|jjd|�|jj
d�dSt|||�}	t|||�}
|j|jkr�|jj
�|jj
�n|jj
�|jj
�z�xztt|	��D]f}|	|}|
|}
|jj	|d |df�|jj	|
d |
df�|jj
d�q�WWd|	d	}|
d	}
|jj	|d |df�|jj	|
d |
df�|jjd|�|jjd|�XdS(
NR1iRtgreentyellowssingle-stepii2i����(RuRcRbR)RER&RRR4RFR;RvRdRoR!R(RRSRwtmyoldptstotheroldptstmynewptstothernewptstmyfillt	otherfilltmytrajectorytothertrajectoryR'tmyptstotherpts((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRQ�sV	








cCs�|jd}|jd}t|j|j�}|dkrJd}d}n%|dkred}d}n
d}}z:|jjd|�|jjd|�|jjd�Wd|jjd|�|jjd|�X|S(NRitwhiteRatgreyi�(R&tcmpRdRRbR;(RRSR�R�toutcometmyflasht
otherflash((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRV-s"

		
cCsX|jdttd}|t}|jjdt}||jt}||||fS(Nii(RcRtWIDTHRbRR Rd(RRGRIRJRH((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyREBs

cCsttt|�t��dS(Ni(tinttroundtfloatR(RRi((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRrIs(R]R^RRRfRgRhRsRQRVRERr(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR#�s							.		cCs[t||�}|dkr)|d}n.|dkrB|d}n|dkrWd}n|S(Niiii
(tabs(RttthereRw((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRuOs

	cCs�t|�t|�kr$td�ndgt|�}t|�g}xmtd|�D]\}x@tt|��D],}||||||||||<qoW|jt|��qVW|jt|��|S(Ns,can't interpolate arrays of different lengthii(Rt
ValueErrorttupleR!R"(RxRytnR{tresR'tk((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRvYs*cCs=|j�}|j|ddg|�|jd|�dS(NiisUniform data, size %d(R<RR$(RbR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytuniformhscCs;|j�}|jtd|d��|jd|�dS(NisDistinct data, size %d(R<RR!R$(RbR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytdistinctmscCsg|jd�|j�}x:t|�D],}tjd|d�}|j||�q&W|jd�dS(NtRandomizingiit
Randomized(R$R<R!trandomtrandintRTR8(RbR�R'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt	randomizers
cCs�|j�}|jd�xrtd|�D]a}|d}xN|dkr�|j||d�dkrhPn|j||d�|d}q<Wq)W|jd�dS(NsInsertion sortiitSorted(R<R$R!RWRTR8(RbRR'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
insertionsortzs

cCs�|j�}|jd�z�xmt|�D]_}|j||�xFt|d|�D]1}|j||�dkrS|j||�qSqSWq)W|jd�Wd|j�XdS(NsSelection sortiiR�(R<R$R!RBRWRTR8RC(RbRR'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
selectionsort�s
cCs�|j�}|jd�xat|�D]S}xJtd|�D]9}|j|d|�dkr<|j|d|�q<q<Wq&W|jd�dS(NsBubble sortiiR�(R<R$R!RWRTR8(RbRR'RR((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt
bubblesort�s
c
Cs�|j�}|jd�zYd|fg}x6|rc|d\}}|d=|j||�||dkr�|jd�xvt|d|�D]a}|d}xN||kr�|j||d�dkr�Pn|j||d�|d}q�Wq�Wq.n|jd�|||d|d}}}|j||�dkrO|j||�n|j||�dkrz|j||�n|j||�dkr�|j||�n|}|j|�|jd	�|jd
�|}	|}
x
|jd�|
d}
|j	|
�x?|
|krF|j|
|�dkrF|
d}
|j	|
�qW|jd�|	d}	|j
|	�x?|	|kr�|j|	|�dkr�|	d}	|j
|	�qnW|	|
kr�|jd
�Pn|jd�|j|	|
�q�W|jd�|j||
�|
|}||	}|dkr>|j||
f�n|dkr.|j|	|f�q.q.W|jd�Wd|j�XdS(Nt	Quicksortii����isInsertion sortisChoosing pivotisPivot at left of partitioni�sSweep right pointersSweep left pointersEnd of partitions
Swap itemssSwap pivot backR�(
R<R$RBR8R!RWRTROR;RMRKR"RC(
RbRtstackR@RAR'RRR�RRRtn1tn2((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt	quicksort�sx
	


 





'



'





cCs<x5x.ttttgD]}t|�||�qWqWdS(N(R�R�R�R�R�(Rbtalg((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytdemosort�s
tSortDemocBs�eZdd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�ZRS(icCs||_||_d|_t|j�|_t|�|_|jjdt�t|j�|_	|j	jdt
dt�t|j�|_|jjdt
dt�t|j	ddd|j�|_|jjdt�t|j	ddd|j�|_|jjdt�t|j	ddd|j�|_|jjdt�t|j	dd	d|j�|_|jjdt�d
tfd��Y}||j|�|_|jj|�dd
ddgtddd�}|j|kr�|j|j�|j�ntt|j	|jft |��|_!|j!jdt�t"|j�|_#|j#jd�t|j	|j#dddd�|_$|j$jdt�t|j	ddd|j%�|_&|j&jdt�t|jddd|j'�|_(|j(jdt�t|jddd|j)�|_*|j*jdt�t|jddd|j+�|_,|j,jdt�t|jddd|j-�|_.|j.jdt�t|jddd|j/�|_0|j0jdt�|j0j1dt2�t|jddd|j3�|_4|j4jdt�dS(NitsideRR\R�tcommandsInsertion sortsSelection sortsBubble sorttMyIntVarcBseZd�Zd�ZRS(cSs||_tj||�dS(N(tdemotIntVarR(RRR�((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyRs	cSs9tj||�t|�dkr5|jj|�ndS(Nt0(R�tsettstrR�tresize(RRd((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�s(R]R^RR�(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR��s	iiiiii7R(ssingle-stepR2R1tStept	RandomizetUniformtDistincttDemotCanceltstatetQuit(5RRtbusyRRbRtbotframeRtBOTTOMtbotleftframetLEFTtYt
botrightframetRIGHTtButtontc_qsorttb_qsortR	tc_isorttb_isorttc_ssorttb_ssorttc_bsorttb_bsortR�tv_sizeR�R!R"tsorttapplyt
OptionMenuR�tm_sizet	StringVartv_speedtm_speedtc_steptb_steptc_randomizetb_randomizet	c_uniformt	b_uniformt
c_distinctt
b_distincttc_demotb_demotc_canceltb_cancelRtDISABLEDtc_quittb_quit(RRRR�tsizes((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�sv				"
"cCsG|jr|jj�dS||_|jjtd|jd��dS(Ni(R�RtbellRRbRR!(Rtnewsize((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�0s
	
	cCs|jt�dS(N(trunR�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�7scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�:scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�=scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�@scCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�CscCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�FscCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�IscCs|jt�dS(N(R�R�(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�LscCs�|jr|jj�dSd|_|jj|jj��|jjdt	�y||j�Wnt
jk
rvnX|jjdt�d|_dS(NiR�i(
R�RR�RbR*R�tgetR�RtNORMALRR3R�(Rtfunc((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�Os	
	cCs+|js|jj�dS|jj�dS(N(R�RR�RbR/(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�]s	
cCsK|js|jj�dS|jjd�|jjd�|jj�dS(Nssingle-step(R�RR�R�R�RbR*R0(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�cs	
cCs3|jr|jj�n|jj|jj�dS(N(R�RbR/Rt
after_idleR.(R((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR�ks	(R]R^RR�R�R�R�R�R�R�R�R�R�R�R�R�(((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyR��sL												cCs6t�}t|�}|jd|j�|j�dS(NtWM_DELETE_WINDOW(tTkR�tprotocolR�R6(trootR�((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pytmainss	t__main__((((t__doc__tTkinterRRRR�RR R�RR#RuRvR�R�R�R�R�R�R�R�R�R�R](((s3/usr/lib64/python2.7/Demo/tkinter/guido/sortvisu.pyt<module>s,
��	
						
			=		�	PK��Z�˗*KKguido/hello.pynu�[���# Display hello, world in a button; clicking it quits the program

import sys
from Tkinter import *

def main():
    root = Tk()
    button = Button(root)
    button['text'] = 'Hello, world'
    button['command'] = quit_callback       # See below
    button.pack()
    root.mainloop()

def quit_callback():
    sys.exit(0)

main()
PK��Z)�Yz�K�Kguido/sortvisu.pynuȯ��#! /usr/bin/python2.7

"""Sorting algorithms visualizer using Tkinter.

This module is comprised of three ``components'':

- an array visualizer with methods that implement basic sorting
operations (compare, swap) as well as methods for ``annotating'' the
sorting algorithm (e.g. to show the pivot element);

- a number of sorting algorithms (currently quicksort, insertion sort,
selection sort and bubble sort, as well as a randomization function),
all using the array visualizer for its basic operations and with calls
to its annotation methods;

- and a ``driver'' class which can be used as a Grail applet or as a
stand-alone application.

"""


from Tkinter import *
from Canvas import Line, Rectangle
import random


XGRID = 10
YGRID = 10
WIDTH = 6


class Array:

    def __init__(self, master, data=None):
        self.master = master
        self.frame = Frame(self.master)
        self.frame.pack(fill=X)
        self.label = Label(self.frame)
        self.label.pack()
        self.canvas = Canvas(self.frame)
        self.canvas.pack()
        self.report = Label(self.frame)
        self.report.pack()
        self.left = Line(self.canvas, 0, 0, 0, 0)
        self.right = Line(self.canvas, 0, 0, 0, 0)
        self.pivot = Line(self.canvas, 0, 0, 0, 0)
        self.items = []
        self.size = self.maxvalue = 0
        if data:
            self.setdata(data)

    def setdata(self, data):
        olditems = self.items
        self.items = []
        for item in olditems:
            item.delete()
        self.size = len(data)
        self.maxvalue = max(data)
        self.canvas.config(width=(self.size+1)*XGRID,
                           height=(self.maxvalue+1)*YGRID)
        for i in range(self.size):
            self.items.append(ArrayItem(self, i, data[i]))
        self.reset("Sort demo, size %d" % self.size)

    speed = "normal"

    def setspeed(self, speed):
        self.speed = speed

    def destroy(self):
        self.frame.destroy()

    in_mainloop = 0
    stop_mainloop = 0

    def cancel(self):
        self.stop_mainloop = 1
        if self.in_mainloop:
            self.master.quit()

    def step(self):
        if self.in_mainloop:
            self.master.quit()

    Cancelled = "Array.Cancelled"       # Exception

    def wait(self, msecs):
        if self.speed == "fastest":
            msecs = 0
        elif self.speed == "fast":
            msecs = msecs//10
        elif self.speed == "single-step":
            msecs = 1000000000
        if not self.stop_mainloop:
            self.master.update()
            id = self.master.after(msecs, self.master.quit)
            self.in_mainloop = 1
            self.master.mainloop()
            self.master.after_cancel(id)
            self.in_mainloop = 0
        if self.stop_mainloop:
            self.stop_mainloop = 0
            self.message("Cancelled")
            raise Array.Cancelled

    def getsize(self):
        return self.size

    def show_partition(self, first, last):
        for i in range(self.size):
            item = self.items[i]
            if first <= i < last:
                item.item.config(fill='red')
            else:
                item.item.config(fill='orange')
        self.hide_left_right_pivot()

    def hide_partition(self):
        for i in range(self.size):
            item = self.items[i]
            item.item.config(fill='red')
        self.hide_left_right_pivot()

    def show_left(self, left):
        if not 0 <= left < self.size:
            self.hide_left()
            return
        x1, y1, x2, y2 = self.items[left].position()
##      top, bot = HIRO
        self.left.coords([(x1-2, 0), (x1-2, 9999)])
        self.master.update()

    def show_right(self, right):
        if not 0 <= right < self.size:
            self.hide_right()
            return
        x1, y1, x2, y2 = self.items[right].position()
        self.right.coords(((x2+2, 0), (x2+2, 9999)))
        self.master.update()

    def hide_left_right_pivot(self):
        self.hide_left()
        self.hide_right()
        self.hide_pivot()

    def hide_left(self):
        self.left.coords(((0, 0), (0, 0)))

    def hide_right(self):
        self.right.coords(((0, 0), (0, 0)))

    def show_pivot(self, pivot):
        x1, y1, x2, y2 = self.items[pivot].position()
        self.pivot.coords(((0, y1-2), (9999, y1-2)))

    def hide_pivot(self):
        self.pivot.coords(((0, 0), (0, 0)))

    def swap(self, i, j):
        if i == j: return
        self.countswap()
        item = self.items[i]
        other = self.items[j]
        self.items[i], self.items[j] = other, item
        item.swapwith(other)

    def compare(self, i, j):
        self.countcompare()
        item = self.items[i]
        other = self.items[j]
        return item.compareto(other)

    def reset(self, msg):
        self.ncompares = 0
        self.nswaps = 0
        self.message(msg)
        self.updatereport()
        self.hide_partition()

    def message(self, msg):
        self.label.config(text=msg)

    def countswap(self):
        self.nswaps = self.nswaps + 1
        self.updatereport()

    def countcompare(self):
        self.ncompares = self.ncompares + 1
        self.updatereport()

    def updatereport(self):
        text = "%d cmps, %d swaps" % (self.ncompares, self.nswaps)
        self.report.config(text=text)


class ArrayItem:

    def __init__(self, array, index, value):
        self.array = array
        self.index = index
        self.value = value
        x1, y1, x2, y2 = self.position()
        self.item = Rectangle(array.canvas, x1, y1, x2, y2,
                              fill='red', outline='black', width=1)
        self.item.bind('<Button-1>', self.mouse_down)
        self.item.bind('<Button1-Motion>', self.mouse_move)
        self.item.bind('<ButtonRelease-1>', self.mouse_up)

    def delete(self):
        item = self.item
        self.array = None
        self.item = None
        item.delete()

    def mouse_down(self, event):
        self.lastx = event.x
        self.lasty = event.y
        self.origx = event.x
        self.origy = event.y
        self.item.tkraise()

    def mouse_move(self, event):
        self.item.move(event.x - self.lastx, event.y - self.lasty)
        self.lastx = event.x
        self.lasty = event.y

    def mouse_up(self, event):
        i = self.nearestindex(event.x)
        if i >= self.array.getsize():
            i = self.array.getsize() - 1
        if i < 0:
            i = 0
        other = self.array.items[i]
        here = self.index
        self.array.items[here], self.array.items[i] = other, self
        self.index = i
        x1, y1, x2, y2 = self.position()
        self.item.coords(((x1, y1), (x2, y2)))
        other.setindex(here)

    def setindex(self, index):
        nsteps = steps(self.index, index)
        if not nsteps: return
        if self.array.speed == "fastest":
            nsteps = 0
        oldpts = self.position()
        self.index = index
        newpts = self.position()
        trajectory = interpolate(oldpts, newpts, nsteps)
        self.item.tkraise()
        for pts in trajectory:
            self.item.coords((pts[:2], pts[2:]))
            self.array.wait(50)

    def swapwith(self, other):
        nsteps = steps(self.index, other.index)
        if not nsteps: return
        if self.array.speed == "fastest":
            nsteps = 0
        myoldpts = self.position()
        otheroldpts = other.position()
        self.index, other.index = other.index, self.index
        mynewpts = self.position()
        othernewpts = other.position()
        myfill = self.item['fill']
        otherfill = other.item['fill']
        self.item.config(fill='green')
        other.item.config(fill='yellow')
        self.array.master.update()
        if self.array.speed == "single-step":
            self.item.coords((mynewpts[:2], mynewpts[2:]))
            other.item.coords((othernewpts[:2], othernewpts[2:]))
            self.array.master.update()
            self.item.config(fill=myfill)
            other.item.config(fill=otherfill)
            self.array.wait(0)
            return
        mytrajectory = interpolate(myoldpts, mynewpts, nsteps)
        othertrajectory = interpolate(otheroldpts, othernewpts, nsteps)
        if self.value > other.value:
            self.item.tkraise()
            other.item.tkraise()
        else:
            other.item.tkraise()
            self.item.tkraise()
        try:
            for i in range(len(mytrajectory)):
                mypts = mytrajectory[i]
                otherpts = othertrajectory[i]
                self.item.coords((mypts[:2], mypts[2:]))
                other.item.coords((otherpts[:2], otherpts[2:]))
                self.array.wait(50)
        finally:
            mypts = mytrajectory[-1]
            otherpts = othertrajectory[-1]
            self.item.coords((mypts[:2], mypts[2:]))
            other.item.coords((otherpts[:2], otherpts[2:]))
            self.item.config(fill=myfill)
            other.item.config(fill=otherfill)

    def compareto(self, other):
        myfill = self.item['fill']
        otherfill = other.item['fill']
        outcome = cmp(self.value, other.value)
        if outcome < 0:
            myflash = 'white'
            otherflash = 'black'
        elif outcome > 0:
            myflash = 'black'
            otherflash = 'white'
        else:
            myflash = otherflash = 'grey'
        try:
            self.item.config(fill=myflash)
            other.item.config(fill=otherflash)
            self.array.wait(500)
        finally:
            self.item.config(fill=myfill)
            other.item.config(fill=otherfill)
        return outcome

    def position(self):
        x1 = (self.index+1)*XGRID - WIDTH//2
        x2 = x1+WIDTH
        y2 = (self.array.maxvalue+1)*YGRID
        y1 = y2 - (self.value)*YGRID
        return x1, y1, x2, y2

    def nearestindex(self, x):
        return int(round(float(x)/XGRID)) - 1


# Subroutines that don't need an object

def steps(here, there):
    nsteps = abs(here - there)
    if nsteps <= 3:
        nsteps = nsteps * 3
    elif nsteps <= 5:
        nsteps = nsteps * 2
    elif nsteps > 10:
        nsteps = 10
    return nsteps

def interpolate(oldpts, newpts, n):
    if len(oldpts) != len(newpts):
        raise ValueError, "can't interpolate arrays of different length"
    pts = [0]*len(oldpts)
    res = [tuple(oldpts)]
    for i in range(1, n):
        for k in range(len(pts)):
            pts[k] = oldpts[k] + (newpts[k] - oldpts[k])*i//n
        res.append(tuple(pts))
    res.append(tuple(newpts))
    return res


# Various (un)sorting algorithms

def uniform(array):
    size = array.getsize()
    array.setdata([(size+1)//2] * size)
    array.reset("Uniform data, size %d" % size)

def distinct(array):
    size = array.getsize()
    array.setdata(range(1, size+1))
    array.reset("Distinct data, size %d" % size)

def randomize(array):
    array.reset("Randomizing")
    n = array.getsize()
    for i in range(n):
        j = random.randint(0, n-1)
        array.swap(i, j)
    array.message("Randomized")

def insertionsort(array):
    size = array.getsize()
    array.reset("Insertion sort")
    for i in range(1, size):
        j = i-1
        while j >= 0:
            if array.compare(j, j+1) <= 0:
                break
            array.swap(j, j+1)
            j = j-1
    array.message("Sorted")

def selectionsort(array):
    size = array.getsize()
    array.reset("Selection sort")
    try:
        for i in range(size):
            array.show_partition(i, size)
            for j in range(i+1, size):
                if array.compare(i, j) > 0:
                    array.swap(i, j)
        array.message("Sorted")
    finally:
        array.hide_partition()

def bubblesort(array):
    size = array.getsize()
    array.reset("Bubble sort")
    for i in range(size):
        for j in range(1, size):
            if array.compare(j-1, j) > 0:
                array.swap(j-1, j)
    array.message("Sorted")

def quicksort(array):
    size = array.getsize()
    array.reset("Quicksort")
    try:
        stack = [(0, size)]
        while stack:
            first, last = stack[-1]
            del stack[-1]
            array.show_partition(first, last)
            if last-first < 5:
                array.message("Insertion sort")
                for i in range(first+1, last):
                    j = i-1
                    while j >= first:
                        if array.compare(j, j+1) <= 0:
                            break
                        array.swap(j, j+1)
                        j = j-1
                continue
            array.message("Choosing pivot")
            j, i, k = first, (first+last)//2, last-1
            if array.compare(k, i) < 0:
                array.swap(k, i)
            if array.compare(k, j) < 0:
                array.swap(k, j)
            if array.compare(j, i) < 0:
                array.swap(j, i)
            pivot = j
            array.show_pivot(pivot)
            array.message("Pivot at left of partition")
            array.wait(1000)
            left = first
            right = last
            while 1:
                array.message("Sweep right pointer")
                right = right-1
                array.show_right(right)
                while right > first and array.compare(right, pivot) >= 0:
                    right = right-1
                    array.show_right(right)
                array.message("Sweep left pointer")
                left = left+1
                array.show_left(left)
                while left < last and array.compare(left, pivot) <= 0:
                    left = left+1
                    array.show_left(left)
                if left > right:
                    array.message("End of partition")
                    break
                array.message("Swap items")
                array.swap(left, right)
            array.message("Swap pivot back")
            array.swap(pivot, right)
            n1 = right-first
            n2 = last-left
            if n1 > 1: stack.append((first, right))
            if n2 > 1: stack.append((left, last))
        array.message("Sorted")
    finally:
        array.hide_partition()

def demosort(array):
    while 1:
        for alg in [quicksort, insertionsort, selectionsort, bubblesort]:
            randomize(array)
            alg(array)


# Sort demo class -- usable as a Grail applet

class SortDemo:

    def __init__(self, master, size=15):
        self.master = master
        self.size = size
        self.busy = 0
        self.array = Array(self.master)

        self.botframe = Frame(master)
        self.botframe.pack(side=BOTTOM)
        self.botleftframe = Frame(self.botframe)
        self.botleftframe.pack(side=LEFT, fill=Y)
        self.botrightframe = Frame(self.botframe)
        self.botrightframe.pack(side=RIGHT, fill=Y)

        self.b_qsort = Button(self.botleftframe,
                              text="Quicksort", command=self.c_qsort)
        self.b_qsort.pack(fill=X)
        self.b_isort = Button(self.botleftframe,
                              text="Insertion sort", command=self.c_isort)
        self.b_isort.pack(fill=X)
        self.b_ssort = Button(self.botleftframe,
                              text="Selection sort", command=self.c_ssort)
        self.b_ssort.pack(fill=X)
        self.b_bsort = Button(self.botleftframe,
                              text="Bubble sort", command=self.c_bsort)
        self.b_bsort.pack(fill=X)

        # Terrible hack to overcome limitation of OptionMenu...
        class MyIntVar(IntVar):
            def __init__(self, master, demo):
                self.demo = demo
                IntVar.__init__(self, master)
            def set(self, value):
                IntVar.set(self, value)
                if str(value) != '0':
                    self.demo.resize(value)

        self.v_size = MyIntVar(self.master, self)
        self.v_size.set(size)
        sizes = [1, 2, 3, 4] + range(5, 55, 5)
        if self.size not in sizes:
            sizes.append(self.size)
            sizes.sort()
        self.m_size = apply(OptionMenu,
                            (self.botleftframe, self.v_size) + tuple(sizes))
        self.m_size.pack(fill=X)

        self.v_speed = StringVar(self.master)
        self.v_speed.set("normal")
        self.m_speed = OptionMenu(self.botleftframe, self.v_speed,
                                  "single-step", "normal", "fast", "fastest")
        self.m_speed.pack(fill=X)

        self.b_step = Button(self.botleftframe,
                             text="Step", command=self.c_step)
        self.b_step.pack(fill=X)

        self.b_randomize = Button(self.botrightframe,
                                  text="Randomize", command=self.c_randomize)
        self.b_randomize.pack(fill=X)
        self.b_uniform = Button(self.botrightframe,
                                  text="Uniform", command=self.c_uniform)
        self.b_uniform.pack(fill=X)
        self.b_distinct = Button(self.botrightframe,
                                  text="Distinct", command=self.c_distinct)
        self.b_distinct.pack(fill=X)
        self.b_demo = Button(self.botrightframe,
                             text="Demo", command=self.c_demo)
        self.b_demo.pack(fill=X)
        self.b_cancel = Button(self.botrightframe,
                               text="Cancel", command=self.c_cancel)
        self.b_cancel.pack(fill=X)
        self.b_cancel.config(state=DISABLED)
        self.b_quit = Button(self.botrightframe,
                             text="Quit", command=self.c_quit)
        self.b_quit.pack(fill=X)

    def resize(self, newsize):
        if self.busy:
            self.master.bell()
            return
        self.size = newsize
        self.array.setdata(range(1, self.size+1))

    def c_qsort(self):
        self.run(quicksort)

    def c_isort(self):
        self.run(insertionsort)

    def c_ssort(self):
        self.run(selectionsort)

    def c_bsort(self):
        self.run(bubblesort)

    def c_demo(self):
        self.run(demosort)

    def c_randomize(self):
        self.run(randomize)

    def c_uniform(self):
        self.run(uniform)

    def c_distinct(self):
        self.run(distinct)

    def run(self, func):
        if self.busy:
            self.master.bell()
            return
        self.busy = 1
        self.array.setspeed(self.v_speed.get())
        self.b_cancel.config(state=NORMAL)
        try:
            func(self.array)
        except Array.Cancelled:
            pass
        self.b_cancel.config(state=DISABLED)
        self.busy = 0

    def c_cancel(self):
        if not self.busy:
            self.master.bell()
            return
        self.array.cancel()

    def c_step(self):
        if not self.busy:
            self.master.bell()
            return
        self.v_speed.set("single-step")
        self.array.setspeed("single-step")
        self.array.step()

    def c_quit(self):
        if self.busy:
            self.array.cancel()
        self.master.after_idle(self.master.quit)


# Main program -- for stand-alone operation outside Grail

def main():
    root = Tk()
    demo = SortDemo(root)
    root.protocol('WM_DELETE_WINDOW', demo.c_quit)
    root.mainloop()

if __name__ == '__main__':
    main()
PK��Z�h��guido/imagedraw.pycnu�[����
��^c@s9dZddlTddlZd�Zd�Ze�dS(sDraw on top of an imagei����(t*NcCs�tjd}t�}td|�}|j�|j�}}t|d|d|�}|jdddtd|�|j	�|j
dt�|j�dS(	Nitfiletwidththeightitanchortimages
<Button-1>(
tsystargvtTkt
PhotoImageRRtCanvastcreate_imagetNWtpacktbindtblobtmainloop(tfilenametroottimgtwthtcanv((s4/usr/lib64/python2.7/Demo/tkinter/guido/imagedraw.pytmains
	
c	CsX|j|j}}|j}d}|j||||||||dddd�dS(Nitfilltredtoutlinet(txtytwidgettcreate_oval(teventRRRtr((s4/usr/lib64/python2.7/Demo/tkinter/guido/imagedraw.pyRs	(t__doc__tTkinterRRR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/imagedraw.pyt<module>s

		PK��ZXj|0J|J|
guido/ss1.pyonu�[����
��^c@s�dZddlZddlZddlZddlZddlZddlmZdddf\ZZ	Z
d�Zd�Zd	�Z
iee6ee	6e
e
6Zid
e6de	6de
6Zied
6e	d6e
d6Zid
e6de	6de
6Zd�Zdfd��YZdfd��YZdfd��YZdefd��YZdefd��YZdefd��YZd�Zd�Zd�Zd�ZddlZd fd!��YZd"�Z d#�Z!e"d$kr�e!�ndS(%sSS1 -- a spreadsheet.i����N(texpattLEFTtCENTERtRIGHTcCs
|j|�S(N(tljust(txtn((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRscCs
|j|�S(N(tcenter(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRscCs
|j|�S(N(trjust(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRstleftRtrighttwtecCs4d}x'|D]}|dk	r
||7}q
q
W|S(Ni(tNone(tseqttotalR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytsums

tSheetcBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCsOi|_tj�|_|jjd�}|j|_|j|_t|_dS(Nt__main__(tcellstrexectRExect
add_modulet	cellvaluetcelltmulticellvalueR(tselftm((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt__init__"s	cCs9|j||�}t|d�r1|j|j�S|SdS(Ntrecalc(tgetcellthasattrRR(RRtyR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR*scCs�||kr||}}n||kr8||}}ng}xRt||d�D]=}x4t||d�D]}|j|j||��qlWqRW|S(Ni(trangetappendR(Rtx1ty1tx2ty2RR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR1s!cCs|jj||f�S(N(Rtget(RRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR<scCs||j||f<dS(N(R(RRR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytsetcell?scCs,y|j||f=Wntk
r'nXdS(N(RtKeyError(RRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	clearcellDs
cCs1x*|j||||�D]}|j|=qWdS(N(tselectcellsR(RR#R$R%R&txy((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
clearcellsJscCs|jd|tj|�dS(Ni(R-tsystmaxint(RR$R&((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	clearrowsNscCs|j|d|tj�dS(Ni(R-R.R/(RR#R%((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytclearcolumnsQscCs�||kr||}}n||kr8||}}ng|jD]P\}}||koe|knrB||ko�|knrB||f^qBS(N(R(RR#R$R%R&RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR+TscCs#|dkr|dkrdS||kr8||}}n||krT||}}ni}x�|jD]�\}}	|j||	f}
t|
d�r�|
j||||||�}
n||ko�|knr||	ko�|knr||7}|	|7}	n|
|||	f<qdW||_dS(Nitrenumber(RRR2(RR#R$R%R&tdxtdytnewRR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	movecells\s !8

cCs&|jd|tjtjd|�dS(Ni(R6R.R/(RR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
insertrowsoscCs^||kr||}}n|j||�|jd|dtjtjd||d�dS(Nii(R0R6R.R/(RR$R&((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
deleterowssscCs&|j|dtjtj|d�dS(Ni(R6R.R/(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
insertcolumnsyscCs^||kr||}}n|j||�|j|ddtjtj||dd�dS(Nii(R-R6R.R/(RR#R%((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
deletecolumns}scCsLd}}x5|jD]*\}}t||�}t||�}qW||fS(Ni(Rtmax(RtmaxxtmaxyRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytgetsize�s

cCs:x3|jj�D]"}t|d�r|j�qqWdS(Ntreset(Rt
itervaluesRR?(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR?�scCsJ|j�x9|jj�D](}t|d�r|j|j�qqWdS(NR(R?RR@RRR(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s
cCs�|j�\}}|d|d}}dg|}i}xZtd|�D]I}t|�tf||df<\}}	t||t|��||<qJWxZtd|�D]I}
t|
�tf|d|
f<\}}	t|dt|��|d<q�Wx�|jj�D]�\\}}
}|dks|
dkr4qnt	|d�rV|j
|j�nt	|d�rz|j�\}}	n*t|�}t
|t�r�t}	nt}	||	f|||
f<t||t|��||<qWd}x9t|�D]+}|r|d7}n|d||7}q�Wx�t|�D]�}
d}
xot|�D]a}|j||
f�pgdtf\}}	t|	|||�}|
r�|
d7}
n|
|7}
qCW|
GH|
dkr*|GHq*q*WdS(	NiiRtformattt+t-t|(R>R!tcolnum2nameRR;tlentstrRt	iteritemsRRRRAt
isinstanceRR'talign2action(RR<R=twidththeighttcolwidthtfullRttextt	alignmentR Rtseptline((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytdisplay�sP
&!&!"	!
'
cCs�dg}xn|jj�D]]\\}}}t|d�rI|j�}ndtj|�}|jd|||f�qW|jd�dj|�S(Ns
<spreadsheet>txmls<value>%s</value>s%<cell row="%s" col="%s">
  %s
</cell>s</spreadsheet>s
(RRIRRUtcgitescapeR"tjoin(RtoutRR Rtcellxml((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRU�s	"	
cCs\|j�}t|d�}|j|�|rN|jd�rN|jd�n|j�dS(NRs
(RUtopentwritetendswithtclose(RtfilenameRPtf((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytsave�s
cCs0t|d�}t|�j|�|j�dS(Ntr(R[tSheetParsert	parsefileR^(RR_R`((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytload�s(t__name__t
__module__RRRRR(R*R-R0R1R+R6R7R8R9R:R>R?RRTRURaRe(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR s,																			2		RccBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�ZeZ	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�ZRS(cCs
||_dS(N(tsheet(RRh((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�scCsAtj�}|j|_|j|_|j|_|j|�dS(N(	RtParserCreatetstartelementtStartElementHandlert
endelementtEndElementHandlertdatatCharacterDataHandlert	ParseFile(RR`tparser((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRd�s
cCsct|d|d�}|rVx*|j�D]\}}t|�||<q)W||�ng|_dS(Ntstart_(tgetattrR
RIRHttexts(Rttagtattrstmethodtkeytvalue((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRj�s
cCs t|�}|jj|�dS(N(RHRtR"(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRn�scCs9t|d|d�}|r5|dj|j��ndS(Ntend_RB(RsR
RXRt(RRuRw((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRl�scCs4t|jd��|_t|jd��|_dS(Ntrowtcol(tintR'R R(RRv((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
start_cell�scCs1|jd�|_tj|jd��|_dS(NRAtalign(R'tfmtt	xml2alignRQ(RRv((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytstart_valuescCs*yt|�|_Wnd|_nXdS(N(R}RyR
(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_intscCs*yt|�|_Wnd|_nXdS(N(tlongRyR
(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_long
scCs*yt|�|_Wnd|_nXdS(N(tfloatRyR
(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
end_doublescCs*yt|�|_Wnd|_nXdS(N(tcomplexRyR
(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_complexscCs$y
||_Wnd|_nXdS(N(RyR
(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
end_strings
cCs�t|jt�r!|j|_nit|jt�r`t|j|jpHd|jpTt�|_n*t	|j|jpud|jp�t
�|_dS(Ns%s(RJRytBaseCellRRHt
StringCellR�RQRtNumericCellR(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	end_value%s		cCs+t||jpd|jpt�|_dS(Ns%s(tFormulaCellR�RQRR(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_formula1scCs#|jj|j|j|j�dS(N(RhR(RR R(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_cell6s(RfRgRRdRjRnRlR~R�t
start_formulaR�R�R�R�R�R�R�R�(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRc�s 														R�cBseZdZRS(N(RfRgR
R(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�9s	R�cBsVeZded�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	s%scCs||_||_||_dS(N(RyR�RQ(RRyR�RQ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRGs		cCs|jS(N(Ry(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRNscCs:y|j|j}Wnt|j�}nX||jfS(N(R�RyRHRQ(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRAQs
cCs=t|dt|j�j�}dt|j|j|�fS(Nt_xml_s(<value align="%s" format="%s">%s</value>(RsttypeRyRft	align2xmlRQR�(RRw((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRUXs

cCs8d|jkodknr*d|jS|j�SdS(Niis
<int>%s</int>I�i�I�(Ryt	_xml_long(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt_xml_int_scCsd|jS(Ns<long>%s</long>(Ry(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�escCsdt|j�S(Ns<double>%s</double>(treprRy(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
_xml_floathscCsdt|j�S(Ns<complex>%s</double>(R�Ry(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt_xml_complexks(RfRgRRRRARUR�R�R�R�(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�Es						R�cBs2eZded�Zd�Zd�Zd�ZRS(s%scCs||_||_||_dS(N(RPR�RQ(RRPR�RQ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRps		cCs|jS(N(RP(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRwscCs|j|jfS(N(RPRQ(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRAzscCs-d}|t|j|jtj|j�fS(Ns9<value align="%s" format="%s"><string>%s</string></value>(R�RQR�RVRWRP(Rts((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRU}s

(RfRgRRRRARU(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�ns		R�cBsDeZded�Zd�Zd�Zd�Zd�Zd�ZRS(s%scCs;||_t|j�|_||_||_|j�dS(N(tformulat	translatet
translatedR�RQR?(RR�R�RQ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s
			cCs
d|_dS(N(R
Ry(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR?�scCs�|jdkr�y4|jddt|j��|jd�|_Wq�tj�d}t|d�rw|j	|_q�t
|�|_q�Xn|jS(Ns from __future__ import division
s__value__ = eval(%s)t	__value__iRf(RyR
tr_execR�R�tr_evalR.texc_infoRRfRH(RRtexc((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s	cCs:y|j|j}Wnt|j�}nX||jfS(N(R�RyRHRQ(RRP((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRA�s
cCsdt|j|j|jfS(Ns,<formula align="%s" format="%s">%s</formula>(R�RQR�R�(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRU�s
cCs�g}x�tjd|j�D]�}tjd|�}	|	dk	r�|	j�\}
}t|
�}t|�}
||ko�|knr�||
ko�|knr�t|||
|�}q�n|j	|�qWt
dj|�|j|j
�S(Ns(\w+)s^([A-Z]+)([1-9][0-9]*)$RB(tretsplitR�tmatchR
tgroupstcolname2numR}tcellnameR"R�RXR�RQ(RR#R$R%R&R3R4RYtpartRtsxtsyRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR2�s8(	RfRgRRR?RRARUR2(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s				c	Cs�g}x�tjd|�D]�}tjd|�}|dkrM|j|�q|j�\}}}}t|�}|dkr�d||f}n"t|�}d||||f}|j|�qWdj|�S(s�Translate a formula containing fancy cell names to valid Python code.

    Examples:
        B4 -> cell(2, 4)
        B4:Z100 -> cells(2, 4, 26, 100)
    s(\w+(?::\w+)?)s2^([A-Z]+)([1-9][0-9]*)(?::([A-Z]+)([1-9][0-9]*))?$scell(%s, %s)scells(%s, %s, %s, %s)RBN(R�R�R�R
R"R�R�RX(	R�RYR�RR#R$R%R&R�((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCst|�t|�S(sETranslate a cell coordinate to a fancy cell name (e.g. (1, 1)->'A1').(RFRH(RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsI|j�}d}x0|D](}|dt|�td�d}qW|S(sCTranslate a column name to number (e.g. 'A'->1, 'Z'->26, 'AA'->27).iitAi(tuppertord(R�Rtc((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s

&cCsJd}x=|rEt|dd�\}}t|td��|}q	W|S(s6Translate a column number to name (e.g. 1->'A', etc.).RBiiR�(tdivmodtchrR�(RR�R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRF�s
	tSheetGUIcBs�eZdZdddd�Zd�Zd�Zd�Zd�Zd	�Zd
�Z	d�Z
d�Zd
�Zd�Z
d�ZeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(s7Beginnings of a GUI for a spreadsheet.

    TO DO:
    - clear multiple cells
    - Insert, clear, remove rows or columns
    - Show new contents while typing
    - Scroll bars
    - Grow grid when window is grown
    - Proper menus
    - Undo, redo
    - Cut, copy and paste
    - Formatting and alignment
    s
sheet1.xmli
icCs*||_t�|_tjj|�r:|jj|�n|jj�\}}t||�}t||�}t	j	�|_
|j
jd|j�t	j|j
dddd�|_
t	j|j
�|_t	j|j
ddd	|j�|_t	j|j
�|_|jjd
ddd
dd�|j
jd
d�|jjd
d�|jjd
ddd
dd�|jjd|j�|jjd|j�|jjd|j�|jjd|j�|jjd|j�|jjd|j�|j||�d|_d|_ |j!d
d
�|j"�dS(slConstructor.

        Load the sheet from the filename argument.
        Set up the Tk widget tree.
        sSpreadsheet: %sRPtA1tfontt	helveticaitboldtSavetcommandtsidetbottomtexpanditfilltbothR	R
Rs<Return>s<Shift-Return>s<Tab>s<Shift-Tab>s<Delete>s<Escape>N(R�iR�(#R_RRhtostpathtisfileReR>R;tTktroottwm_titletLabeltbeacontEntrytentrytButtonRat
savebuttontFrametcellgridtpacktbindtreturn_eventtshift_return_eventt	tab_eventtshift_tab_eventtdelete_eventtescape_eventtmakegridR
t	currentxytcornerxyt
setcurrenttsync(RR_trowstcolumnsR<R=((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s<			cCsr|j|jkr>|jdk	r>|jj|j|j�n|jj|j�|j�|jjdd�dS(Nitendtbreak(	R�R�R
RhR-R*R�R�tdelete(Rtevent((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�'s!
cCs#|j\}}|j||�dS(N(R�t
load_entry(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�0scCs�|jj||�}|dkr*d}n1t|t�rId|j}n|j�\}}|jjdd�|jj	d|�|jj
dd�dS(NRBt=iR�(RhRR
RJR�R�RAR�R�tinserttselection_range(RRR RRPRQ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�4s	c
Cs||_||_i|_tj|jdd�}|jdddddd�|jd|j�x�t	d	|d	�D]�}|jj
|d
d�tj|jdt|�dd�}|jd|dddd
�||j|df<||_d|_
|jd|j�|jd|j�|jd|j�|jd|j�qvWx�t	d	|d	�D]�}tj|jdt|�dd�}|jddd|dd
�||jd|f<d|_||_
|jd|j�|jd|j�|jd|j�|jd|j�q[Wx�t	d	|d	�D]�}x�t	d	|d	�D]�}tj|jdddddd�}|jd|d|dd�||j||f<||_||_
|jd|j�|jd|j�|jd|j�|jd|j�qDWq*WdS(s�Helper to create the grid of GUI cells.

        The edge (x==0 or y==0) is filled with labels; the rest is real cells.
        trelieftraisedtcolumniR{tstickytNSWEs<ButtonPress-1>itminsizei@RPtWEs<B1-Motion>s<ButtonRelease-1>s<Shift-Button-1>tsunkentbgtwhitetfgtblackN(R�R�t	gridcellsR�R�R�tgrid_configureR�t	selectallR!tgrid_columnconfigureRFt_SheetGUI__xt_SheetGUI__ytselectcolumntextendcolumnRHt	selectrowt	extendrowtpresstmotiontrelease(RR�R�RRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�@sN			$		$				cCs*|jdd�|jtjtj�dS(Ni(R�t	setcornerR.R/(RR�((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�rscCs<|j|�\}}|j|d�|j|tj�dS(Ni(twhichxyR�R�R.R/(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�vscCsR|j|�\}}|dkrN|j|jdd�|j|tj�ndS(Nii(R�R�R�R�R.R/(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�{scCs<|j|�\}}|jd|�|jtj|�dS(Ni(R�R�R�R.R/(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsR|j|�\}}|dkrN|jd|jd�|jtj|�ndS(Nii(R�R�R�R�R.R/(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsD|j|�\}}|dkr@|dkr@|j||�ndS(Ni(R�R�(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsD|j|�\}}|dkr@|dkr@|j||�ndS(Ni(R�R�(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsh|jj|j|j�}|dk	rdt|tj�rdy|j|j	fSWqdt
k
r`qdXndS(Ni(ii(R�twinfo_containingtx_rootty_rootR
RJR�R�R�R�tAttributeError(RR�R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs|jj|j�dS(N(RhRaR_(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRa�scCs�|jdk	r|j�n|j�t||�|jd<|j||�|jj�||f|_d|_	|j
j|j�}|dk	r�d|d<ndS(sMake (x, y) the current cell.RPtyellowR�N(R�R
tchange_cellt
clearfocusR�R�R�R�t	focus_setR�R�R'(RRR tgridcell((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s


	c	Csc|jdks$|j||fkr8|j||�dS|j�||f|_|j\}}|jpo|j\}}||kr�||}}n||kr�||}}nxh|jj�D]W\\}}}||ko�|knr�||ko|knr�d|d<q�q�W|jj|j�}|dk	rId|d<n|j||||�dS(Nt	lightBlueR�R(	R�R
R�RR�R�RIR't	setbeacon(	RRR R#R$R%R&RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s$$
"8
cCs#||kodknrD||ko6tjknrDd}n�||fdtjfkr�||krxd|}qd||f}n�||fdtjfkr�||kr�dt|�}qdt|�t|�f}n.t|j�}t|j�}d||f}||jd<dS(Nit:s%ds%d:%ds%ss%s:%sRP(R.R/RFR�R�R�R�(RR#R$R%R&tnametname1tname2((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR	�s;	
cCs�|jdk	r�|j\}}|jp-|j\}}||krR||}}n||krn||}}nxk|jj�D]W\\}}}||ko�|knr~||ko�|knr~d|d<q~q~WndS(NR�R�(R�R
R�R�RI(RR#R$R%R&RR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s"8cCs1|j�|j\}}|j||d�dS(sCallback for the Return key.iR�(RR�R�(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs:|j�|j\}}|j|td|d��dS(s0Callback for the Return key with Shift modifier.iR�(RR�R�R;(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs1|j�|j\}}|j|d|�dS(sCallback for the Tab key.iR�(RR�R�(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs:|j�|j\}}|jtd|d�|�dS(s-Callback for the Tab key with Shift modifier.iR�(RR�R�R;(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs�|j\}}|jj�}d}|jd�rFt|d�}nGxDtttt	fD]0}y||�}Wn
qYqYXt
|�}PqYW|dkr�|r�t|�}n|dkr�|jj
||�n|jj|||�|j�dS(s+Set the current cell from the entry widget.R�iN(R�R�R'R
t
startswithR�R}R�R�R�R�R�RhR*R(R�(RRR RPRtclsRy((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRs$cCs�|jj�x�|jj�D]�\\}}}|dks|dkrMqn|jj||�}|dkr{d|d<qt|d�r�|j�\}}nt|�t	}}||d<t
||d<qWdS(s(Fill the GUI cells from the sheet cells.iRBRPRAtanchorN(RhRR�RIRR
RRARHRtalign2anchor(RRR RRRPRQ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s
"

(RfRgt__doc__RR�R�R�R�R�R�R�R�R�R�R�R�R�RaR�R�R	RR�R�R�R�RR�(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s4-					2																			cCs�ddl}t�}x�tdd�D]�}x�tdd�D]�}|dkr\t|�}nU|dkrwt|�}n:t|d�}td|�}d||f}t|�}|j|||�q;Wq%W|j�|jd�dS(sBasic non-gui self-test.i����Niis%s*%ss
sheet1.xml(	R�RR!R�R�R�R(RTRa(R�taRR Rtc1tc2R�((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
test_basic,s	
cCs@tjdrtjd}nd}t|�}|jj�dS(s	GUI test.is
sheet1.xmlN(R.targvR�R�tmainloop(R_tg((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyttest_guiBs

R(#RR�R�R.RVRtxml.parsersRRRRRRRRKR�R�RRRRcR�R�R�R�R�R�R�RFtTkinterR�R�RRRf(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt<module>s@				�Y)6						�C			PK��Z&Y���guido/listtree.pycnu�[����
��^c@sWddlZddlZddlTd�Zd�Zd�ZedkrSe�ndS(i����N(t*cCs?t|dd�}|jdddt�t||dd�|S(Ntnametlisttexpanditfillt.i(tListboxtpacktBOTHt	listnodes(tmastertappR((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pytlisttreescCs�|j|dd|�}|jtd||f�|jj|j|dd|��}x%|D]}t||||d�q]WdS(Ntwinfotclasss%s (%s)tchildreni(tsendtinserttENDttkt	splitlistR	(RRtwidgettleveltklassRtc((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pyR	s	
cCs�tjds-tjjd�tjd�ntjd}t�}|jdd�t|dd�}|jdddt	�t
||�}|j�dS(NisUsage: listtree appname
iRtfRR(tsystargvtstderrtwritetexittTktminsizetFrameRRRtmainloop(RRRR((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pytmains

	t__main__(RtstringtTkinterRR	R#t__name__(((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pyt<module>s
		
	PK��ZKѴ�Q�Qguido/solitaire.pycnu�[����
Afc@sCdZddlZddlZddlTddlmZmZmZmZdefd��YZdZ	dZ
d	Ze	d
eZe
deZ
dZd
ZdZdZdZdZdZdZiZxeefD]Zeee<q�WxeefD]Zeee<q�Wej�Zee�ZdZdZdZdZe dd�Z!ee!�Z"ddge#e$e d
d��dddgZ%dZ&dd0d ��YZ'd!d1d"��YZ(d#e(fd$��YZ)d%�Z*d&e(fd'��YZ+d(e+fd)��YZ,d*e+fd+��YZ-d,d2d-��YZ.d.�Z/e0d/kr?e/�ndS(3s�Solitaire game, much like the one that comes with MS Windows.

Limitations:

- No cute graphical images for the playing cards faces or backs.
- No scoring or timer.
- No undo.
- No option to turn 3 cards at a time.
- No keyboard shortcuts.
- Less fancy animation when you win.
- The determination of which stack you drag to is more relaxed.

Apology:

I'm not much of a card player, so my terminology in these comments may
at times be a little unusual.  If you have suggestions, please let me
know!

i����N(t*(t	Rectanglet
CanvasTexttGrouptWindowRcBseZddd�ZRS(cCs|jj|j||�S(N(tcanvasttag_bindtid(tselftsequencetcommand((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytbind%sN(t__name__t
__module__tNoneR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR$sidi�i
iiis#070tHearttDiamondtClubtSpadetredtblackiiii
ittAtJtQtKitCardcBsMeZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	RS(s�A playing card.

    A card doesn't record to which stack it belongs; only the stack
    records this (it turns out that we always know this from the
    context, and this saves a ``double update'' with potential for
    inconsistencies).

    Public methods:

    moveto(x, y) -- move the card to an absolute position
    moveby(dx, dy) -- move the card by a relative offset
    tkraise() -- raise the card to the top of its stack
    showface(), showback() -- turn the card face up or down & raise it

    Public read-only instance variables:

    suit, value, color -- the card's suit, value and color
    face_shown -- true when the card is shown face up, else false

    Semi-public read-only instance variables (XXX should be made
    private):

    group -- the Canvas.Group representing the card
    x, y -- the position of the card's top left corner

    Private instance variables:

    __back, __rect, __text -- the canvas items making up the card

    (To show the card face up, the text item is placed in front of
    rect and the back is placed behind it.  To show it face down, this
    is reversed.  The card is created face down.)

    c
Cs||_||_t||_d|_d|_|_t|�|_dt	||f}t
|tdddtd|jd|�|_
|jj|j
�t|ddttdddd	�|_|jj|j�t|ttttttdddd
�|_|jj|j�dS(sCard constructor.

        Arguments are the card's suit and value, and the canvas widget.

        The card is created at position (0, 0), with its face down
        (adding it to a stack will position it according to that
        stack's rules).

        is%s  %sitanchortfillttexttoutlineRtwhitetblueN(tsuittvaluetCOLORtcolort
face_showntxtyRtgrouptVALNAMESRt	CARDWIDTHtNt_Card__texttaddtag_withtagRt
CARDHEIGHTt_Card__recttMARGINt_Card__back(RR!R"RR((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt__init__�s"
		
	cCsd|j|jfS(s+Return a string for debug print statements.sCard(%r, %r)(R!R"(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt__repr__�scCs"|j||j||j�dS(s*Move the card to absolute position (x, y).N(tmovebyR&R'(RR&R'((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytmoveto�scCs7|j||_|j||_|jj||�dS(sMove the card by (dx, dy).N(R&R'R(tmove(Rtdxtdy((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR4�scCs|jj�dS(s5Raise the card above all other objects in its canvas.N(R(ttkraise(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR9�scCs1|j�|jj�|jj�d|_dS(sTurn the card's face up.iN(R9R/R,R%(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshowface�s


cCs1|j�|jj�|jj�d|_dS(sTurn the card's face down.iN(R9R/R1R%(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshowback�s


(
RR
t__doc__R2R3R5R4R9R:R;(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRss#	 					tStackcBs�eZdZdd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�Zd�ZdZd�Zd�Zd�ZRS(s�A generic stack of cards.

    This is used as a base class for all other stacks (e.g. the deck,
    the suit stacks, and the row stacks).

    Public methods:

    add(card) -- add a card to the stack
    delete(card) -- delete a card from the stack
    showtop() -- show the top card (if any) face up
    deal() -- delete and return the top card, or None if empty

    Method that subclasses may override:

    position(card) -- move the card to its proper (x, y) position

        The default position() method places all cards at the stack's
        own (x, y) position.

    userclickhandler(), userdoubleclickhandler() -- called to do
    subclass specific things on single and double clicks

        The default user (single) click handler shows the top card
        face up.  The default user double click handler calls the user
        single click handler.

    usermovehandler(cards) -- called to complete a subpile move

        The default user move handler moves all moved cards back to
        their original position (by calling the position() method).

    Private methods:

    clickhandler(event), doubleclickhandler(event),
    motionhandler(event), releasehandler(event) -- event handlers

        The default event handlers turn the top card of the stack with
        its face up on a (single or double) click, and also support
        moving a subpile around.

    startmoving(event) -- begin a move operation
    finishmoving() -- finish a move operation

    cCs�||_||_||_g|_t|jj�|_|jjd|j�|jjd|j	�|jjd|j
�|jjd|j�|j�dS(sStack constructor.

        Arguments are the stack's nominal x and y position (the top
        left corner of the first card placed in the stack), and the
        game object (which is used to get the canvas; subclasses use
        the game object to find other stacks).

        s<1>s
<Double-1>s<B1-Motion>s<ButtonRelease-1>N(
R&R'tgametcardsRRR(Rtclickhandlertdoubleclickhandlert
motionhandlertreleasehandlert
makebottom(RR&R'R>((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR2s					cCsdS(N((R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRDscCsd|jj|j|jfS(s+Return a string for debug print statements.s
%s(%d, %d)(t	__class__RR&R'(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR3scCs>|jj|�|j�|j|�|jj|j�dS(N(R?tappendR9tpositionR(R-(Rtcard((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytadd%s

cCs'|jj|�|jj|j�dS(N(R?tremoveR(tdtag(RRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytdelete+scCs!|jr|jdj�ndS(Ni����(R?R:(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshowtop/s	cCs+|js
dS|jd}|j|�|S(Ni����(R?RRL(RRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytdeal3s
	

cCs|j|j|j�dS(N(R5R&R'(RRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRG<scCs|j�dS(N(RM(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytuserclickhandler?scCs|j�dS(N(RO(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytuserdoubleclickhandlerBscCs"x|D]}|j|�qWdS(N(RG(RR?RH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytusermovehandlerEs
cCs%|j�|j�|j|�dS(N(tfinishmovingROtstartmoving(Rtevent((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR@Ks

cCs|j|�dS(N(t
keepmoving(RRT((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRBPscCs|j|�|j�dS(N(RURR(RRT((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRCSs
cCs%|j�|j�|j|�dS(N(RRRPRS(RRT((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRAWs

cCs�d|_|jjjd�}xDtt|j��D])}|j|}|jj	|kr4Pq4q4WdS|j
srdS|j||_|j|_|j
|_x|jD]}|j�q�WdS(Ntcurrent(RtmovingR>RtgettagstrangetlenR?R(ttagR%R&tlastxR'tlastyR9(RRTttagstiRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRS`s	
	cCs||js
dS|j|j}|j|j}|j|_|j|_|sQ|rxx$|jD]}|j||�q[WndS(N(RWR&R\R'R]R4(RRTR7R8RH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRUqs	cCs,|j}d|_|r(|j|�ndS(N(RWRRQ(RR?((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRR|s		N(RR
R<RR2RDR3RIRLRMRNRGRORPRQR@RBRCRARWRSRURR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR=�s(-																	tDeckcBs2eZdZd�Zd�Zd�Zd�ZRS(s7The deck is a stack with support for shuffling.

    New methods:

    fill() -- create the playing cards
    shuffle() -- shuffle the playing cards

    A single click moves the top card to the game's open deck and
    moves it face up; if we're out of cards, it moves the open deck
    back to the deck.

    c
CsRt|jj|j|j|jt|jtdddt�}|jj	|�dS(NRRR(
RR>RR&R'R*R.t
BACKGROUNDR(R-(Rtbottom((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRD�s
cCsEx>tD]6}x-tD]%}|jt|||jj��qWqWdS(N(tALLSUITSt	ALLVALUESRIRR>R(RR!R"((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�s

cCsMt|j�}g}x(t|�D]}|j|j|�q"W||_dS(N(RZR?trandpermRF(RtntnewcardsR_((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshuffle�s
cCsv|jj}|j�}|sUxQ|j�}|s7Pn|j|�|j�q!Wn|jjj|�|j�dS(N(R>topendeckRNRIR;R:(RRiRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRO�s
(RR
R<RDRRhRO(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR`�s

			cCsLt|�}g}x3|rGtj|�}|j|�|j|�qW|S(s4Function returning a random permutation of range(n).(RYtrandomtchoiceRFRJ(RftrR&R_((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRe�s	
t	OpenStackcBs#eZd�Zd�Zd�ZRS(cCsdS(Ni((RR?((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt
acceptable�scCs�|d}|jj|�}|s?||ks?|j|�rRtj||�n8x(|D] }|j|�|j|�qYW|jj�dS(Ni(R>tcloseststackRnR=RQRLRItwincheck(RR?RHtstack((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRQ�s
#

cCs�|js
dS|jd}|js1|j�dSxQ|jjD]C}|j|g�r>|j|�|j|�|jj�Pq>q>WdS(Ni����(	R?R%ROR>tsuitsRnRLRIRp(RRHts((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRP�s	
	



(RR
RnRQRP(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRm�s		t	SuitStackcBs,eZd�Zd�Zd�Zd�ZRS(c
CsBt|jj|j|j|jt|jtdddd�}dS(NRRRR(RR>RR&R'R*R.(RRb((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRD�scCsdS(N((R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRO�scCsdS(N((R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRP�scCsit|�dkrdS|d}|js6|jtkS|jd}|j|jkoh|j|jdkS(Niii����(RZR?R"tACER!(RR?RHttopcard((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRn�s
	

(RR
RDRORPRn(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRt�s			tRowStackcBseZd�Zd�ZRS(cCs`|d}|js |jtkS|jd}|js:dS|j|jko_|j|jdkS(Nii����i(R?R"tKINGR%R$(RR?RHRv((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRn�s
	

	cCsh|j}xE|jD]:}||kr)Pn|jrC|dt}q|t}qW|j|j|�dS(Ni(R'R?R%R0tOFFSETR5R&(RRHR'tc((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRGs		(RR
RnRG(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRw�s		t	SolitairecBsGeZd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs�||_t|jdtdddttddtdt�|_|jjdt	d	t
�t|jd
ddddtdd
d|j�|_
t|jtdtdd|j
dt�t}t}t|||�|_|t}t|||�|_|t}g|_x:tt�D],}|t}|jjt|||��qWt}|t}g|_x:tt�D],}|jjt|||��|t}qoW|jg|j|j|_|jj�|j�dS(Nt
backgroundthighlightthicknessitwidththeightiiRtexpandRtDealtactivebackgroundtgreenR
twindowR(tmastertCanvasRatNROWStXSPACINGtYSPACINGR0RtpacktBOTHtTRUEtButtonRNt
dealbuttonRtSWR`tdeckRmRiRrRYtNSUITSRFRttrowsRwt
openstacksR(RR�R&R'R_((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR2sD	


	
 
	
cCsEx*|jD]}t|j�tkr
dSq
W|j�|j�dS(N(RrRZR?tNVALUEStwinRN(RRs((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRp=s

cCsgg}x|jD]}||j}qWx9|rbtj|�}|j|�|j||j�q*WdS(sStupid animation when you win.N(R�R?RjRkRJtanimatedmovetoR�(RR?RsRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�Ds	
cCsgx`tddd�D]L}|j|j||j|j|}}|j||�|jj�qWdS(Ni
ii����(RYR&R'R4R�tupdate_idletasks(RRHtdestR_R7R8((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�Ns)cCsed}d}xR|jD]G}|j|jd|j|jd}||kr|}|}qqW|S(Ni�ɚ;i(RR�R&R'(RRHtclosesttcdistRqtdist((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRoTs&
cCs�|j�|jj�xHtt�D]:}x1|j|D]"}|jj�}|j|�q8Wq$Wx|jD]}|j�qlWdS(N(	tresetR�RhRYR�R�RNRIRM(RR_RlRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRN`s

cCsOxH|jD]=}x4|j�}|s)Pn|jj|�|j�qWq
WdS(N(R�RNR�RIR;(RRqRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�js(	RR
R2RpR�R�RoRNR�(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR{
s	.		
			
cCs6t�}t|�}|jd|j�|j�dS(NtWM_DELETE_WINDOW(tTkR{tprotocoltquittmainloop(trootR>((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytmainvs	t__main__((((1R<tmathRjtTkinterR�RRRRR*R.R0R�R�RyRatHEARTStDIAMONDStCLUBStSPADEStREDtBLACKR#RstkeysRcRZR�RutJACKtQUEENRxRYRdR�tmaptstrR)R�RR=R`ReRmRtRwR{R�R(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt<module>sX
"
/f�1	i	PK��Z��sl�~�~
guido/ss1.pycnu�[����
��^c@s�dZddlZddlZddlZddlZddlZddlmZdddf\ZZ	Z
d�Zd�Zd	�Z
iee6ee	6e
e
6Zid
e6de	6de
6Zied
6e	d6e
d6Zid
e6de	6de
6Zd�Zdfd��YZdfd��YZdfd��YZdefd��YZdefd��YZdefd��YZd�Zd�Zd�Zd�ZddlZd fd!��YZd"�Z d#�Z!e"d$kr�e!�ndS(%sSS1 -- a spreadsheet.i����N(texpattLEFTtCENTERtRIGHTcCs
|j|�S(N(tljust(txtn((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRscCs
|j|�S(N(tcenter(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRscCs
|j|�S(N(trjust(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRstleftRtrighttwtecCs4d}x'|D]}|dk	r
||7}q
q
W|S(Ni(tNone(tseqttotalR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytsums

tSheetcBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zd
�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCsOi|_tj�|_|jjd�}|j|_|j|_t|_dS(Nt__main__(tcellstrexectRExect
add_modulet	cellvaluetcelltmulticellvalueR(tselftm((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt__init__"s	cCs9|j||�}t|d�r1|j|j�S|SdS(Ntrecalc(tgetcellthasattrRR(RRtyR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR*scCs�||kr||}}n||kr8||}}ng}xRt||d�D]=}x4t||d�D]}|j|j||��qlWqRW|S(Ni(trangetappendR(Rtx1ty1tx2ty2RR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR1s!cCs|jj||f�S(N(Rtget(RRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR<scCsJ|dkr|dkst�t|t�s3t�||j||f<dS(Ni(tAssertionErrort
isinstancetBaseCellR(RRR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytsetcell?scCs,y|j||f=Wntk
r'nXdS(N(RtKeyError(RRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	clearcellDs
cCs1x*|j||||�D]}|j|=qWdS(N(tselectcellsR(RR#R$R%R&txy((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
clearcellsJscCs|jd|tj|�dS(Ni(R0tsystmaxint(RR$R&((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	clearrowsNscCs|j|d|tj�dS(Ni(R0R1R2(RR#R%((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytclearcolumnsQscCs�||kr||}}n||kr8||}}ng|jD]P\}}||koe|knrB||ko�|knrB||f^qBS(N(R(RR#R$R%R&RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR.TscCsI|dkr|dkrdS||kr8||}}n||krT||}}n||dkrt||dkszt�i}x�|jD]�\}}	|j||	f}
t|
d�r�|
j||||||�}
n||ko�|knr(||	ko|knr(||7}|	|7}	n|
|||	f<q�W||_dS(Nitrenumber(R(RRR5(RR#R$R%R&tdxtdytnewRR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	movecells\s"&!8

cCs8|dkst�|jd|tjtjd|�dS(Ni(R(R9R1R2(RR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
insertrowsoscCs^||kr||}}n|j||�|jd|dtjtjd||d�dS(Nii(R3R9R1R2(RR$R&((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
deleterowssscCs8|dkst�|j|dtjtj|d�dS(Ni(R(R9R1R2(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
insertcolumnsyscCs^||kr||}}n|j||�|j|ddtjtj||dd�dS(Nii(R0R9R1R2(RR#R%((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
deletecolumns}scCsLd}}x5|jD]*\}}t||�}t||�}qW||fS(Ni(Rtmax(RtmaxxtmaxyRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytgetsize�s

cCs:x3|jj�D]"}t|d�r|j�qqWdS(Ntreset(Rt
itervaluesRRB(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRB�scCsJ|j�x9|jj�D](}t|d�r|j|j�qqWdS(NR(RBRRCRRR(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s
cCs�|j�\}}|d|d}}dg|}i}xZtd|�D]I}t|�tf||df<\}}	t||t|��||<qJWxZtd|�D]I}
t|
�tf|d|
f<\}}	t|dt|��|d<q�Wx|jj�D]\\}}
}|dks|
dkr4qnt	|d�rV|j
|j�nt	|d�r�|j�\}}	t
|t�s�t�|	tttfks�t�n*t|�}t
|t�r�t}	nt}	||	f|||
f<t||t|��||<qWd}x9t|�D]+}|r7|d7}n|d||7}qWx�t|�D]�}
d}
xot|�D]a}|j||
f�p�dtf\}}	t|	|||�}|
r�|
d7}
n|
|7}
qsW|
GH|
dkrZ|GHqZqZWdS(	NiiRtformattt+t-t|(RAR!tcolnum2nameRR>tlentstrRt	iteritemsRRRRDR)R(RRR'talign2action(RR?R@twidththeighttcolwidthtfullRttextt	alignmentR Rtseptline((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytdisplay�sR
&!&!"	!
'
cCs�dg}xn|jj�D]]\\}}}t|d�rI|j�}ndtj|�}|jd|||f�qW|jd�dj|�S(Ns
<spreadsheet>txmls<value>%s</value>s%<cell row="%s" col="%s">
  %s
</cell>s</spreadsheet>s
(RRLRRWtcgitescapeR"tjoin(RtoutRR Rtcellxml((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRW�s	"	
cCs\|j�}t|d�}|j|�|rN|jd�rN|jd�n|j�dS(NRs
(RWtopentwritetendswithtclose(RtfilenameRRtf((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytsave�s
cCs0t|d�}t|�j|�|j�dS(Ntr(R]tSheetParsert	parsefileR`(RRaRb((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytload�s(t__name__t
__module__RRRRR+R-R0R3R4R.R9R:R;R<R=RARBRRVRWRcRg(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR s,																			2		RecBs�eZd�Zd�Zd�Zd�Zd�Zd�Zd�ZeZ	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�ZRS(cCs
||_dS(N(tsheet(RRj((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�scCsAtj�}|j|_|j|_|j|_|j|�dS(N(	RtParserCreatetstartelementtStartElementHandlert
endelementtEndElementHandlertdatatCharacterDataHandlert	ParseFile(RRbtparser((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRf�s
cCsct|d|d�}|rVx*|j�D]\}}t|�||<q)W||�ng|_dS(Ntstart_(tgetattrR
RLRKttexts(Rttagtattrstmethodtkeytvalue((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRl�s
cCs t|�}|jj|�dS(N(RKRvR"(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRp�scCs9t|d|d�}|r5|dj|j��ndS(Ntend_RE(RuR
RZRv(RRwRy((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRn�scCs4t|jd��|_t|jd��|_dS(Ntrowtcol(tintR'R R(RRx((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
start_cell�scCs1|jd�|_tj|jd��|_dS(NRDtalign(R'tfmtt	xml2alignRS(RRx((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytstart_valuescCs*yt|�|_Wnd|_nXdS(N(RR{R
(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_intscCs*yt|�|_Wnd|_nXdS(N(tlongR{R
(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_long
scCs*yt|�|_Wnd|_nXdS(N(tfloatR{R
(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
end_doublescCs*yt|�|_Wnd|_nXdS(N(tcomplexR{R
(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_complexscCs$y
||_Wnd|_nXdS(N(R{R
(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
end_strings
cCs�t|jt�r!|j|_nit|jt�r`t|j|jpHd|jpTt�|_n*t	|j|jpud|jp�t
�|_dS(Ns%s(R)R{R*RRKt
StringCellR�RSRtNumericCellR(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt	end_value%s		cCs+t||jpd|jpt�|_dS(Ns%s(tFormulaCellR�RSRR(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_formula1scCs#|jj|j|j|j�dS(N(RjR+RR R(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pytend_cell6s(RhRiRRfRlRpRnR�R�t
start_formulaR�R�R�R�R�R�R�R�(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRe�s 														R*cBseZdZRS(N(RhRiR
R(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR*9s	R�cBsVeZded�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	s%scCs[t|ttttf�s!t�|tttfks<t�||_	||_
||_dS(N(R)RR�R�R�R(RRRR{R�RS(RR{R�RS((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRGs
!		cCs|jS(N(R{(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRNscCs:y|j|j}Wnt|j�}nX||jfS(N(R�R{RKRS(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRDQs
cCs=t|dt|j�j�}dt|j|j|�fS(Nt_xml_s(<value align="%s" format="%s">%s</value>(RuttypeR{Rht	align2xmlRSR�(RRy((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRWXs

cCs8d|jkodknr*d|jS|j�SdS(Niis
<int>%s</int>I�i�I�(R{t	_xml_long(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt_xml_int_scCsd|jS(Ns<long>%s</long>(R{(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�escCsdt|j�S(Ns<double>%s</double>(treprR{(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
_xml_floathscCsdt|j�S(Ns<complex>%s</double>(R�R{(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt_xml_complexks(RhRiRRRRDRWR�R�R�R�(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�Es						R�cBs2eZded�Zd�Zd�Zd�ZRS(s%scCsUt|ttf�st�|tttfks6t�||_||_||_	dS(N(
R)RKtunicodeR(RRRRRR�RS(RRRR�RS((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRps
		cCs|jS(N(RR(RR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRwscCs|j|jfS(N(RRRS(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRDzscCs-d}|t|j|jtj|j�fS(Ns9<value align="%s" format="%s"><string>%s</string></value>(R�RSR�RXRYRR(Rts((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRW}s

(RhRiRRRRDRW(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�ns		R�cBsDeZded�Zd�Zd�Zd�Zd�Zd�ZRS(s%scCsV|tttfkst�||_t|j�|_||_||_|j	�dS(N(
RRRR(tformulat	translatet
translatedR�RSRB(RR�R�RS((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s			cCs
d|_dS(N(R
R{(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRB�scCs�|jdkr�y4|jddt|j��|jd�|_Wq�tj�d}t|d�rw|j	|_q�t
|�|_q�Xn|jS(Ns from __future__ import division
s__value__ = eval(%s)t	__value__iRh(R{R
tr_execR�R�tr_evalR1texc_infoRRhRK(RRtexc((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s	cCs:y|j|j}Wnt|j�}nX||jfS(N(R�R{RKRS(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRD�s
cCsdt|j|j|jfS(Ns,<formula align="%s" format="%s">%s</formula>(R�RSR�R�(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRW�s
cCs�g}x�tjd|j�D]�}tjd|�}	|	dk	r�|	j�\}
}t|
�}t|�}
||ko�|knr�||
ko�|knr�t|||
|�}q�n|j	|�qWt
dj|�|j|j
�S(Ns(\w+)s^([A-Z]+)([1-9][0-9]*)$RE(tretsplitR�tmatchR
tgroupstcolname2numRtcellnameR"R�RZR�RS(RR#R$R%R&R6R7R[tpartRtsxtsyRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR5�s8(	RhRiRRRBRRDRWR5(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s				c	Cs�g}x�tjd|�D]�}tjd|�}|dkrM|j|�q|j�\}}}}t|�}|dkr�d||f}n"t|�}d||||f}|j|�qWdj|�S(s�Translate a formula containing fancy cell names to valid Python code.

    Examples:
        B4 -> cell(2, 4)
        B4:Z100 -> cells(2, 4, 26, 100)
    s(\w+(?::\w+)?)s2^([A-Z]+)([1-9][0-9]*)(?::([A-Z]+)([1-9][0-9]*))?$scell(%s, %s)scells(%s, %s, %s, %s)REN(R�R�R�R
R"R�R�RZ(	R�R[R�RR#R$R%R&R�((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCs&|dkst�t|�t|�S(sETranslate a cell coordinate to a fancy cell name (e.g. (1, 1)->'A1').i(R(RIRK(RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsk|j�}d}xR|D]J}d|ko6dknsAt�|dt|�td�d}qW|S(sCTranslate a column name to number (e.g. 'A'->1, 'Z'->26, 'AA'->27).itAtZii(tupperR(tord(R�Rtc((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
"&cCs\|dkst�d}x=|rWt|dd�\}}t|td��|}qW|S(s6Translate a column number to name (e.g. 1->'A', etc.).iREiiR�(R(tdivmodtchrR�(RR�R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRI�s	tSheetGUIcBs�eZdZdddd�Zd�Zd�Zd�Zd�Zd	�Zd
�Z	d�Z
d�Zd
�Zd�Z
d�ZeZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(s7Beginnings of a GUI for a spreadsheet.

    TO DO:
    - clear multiple cells
    - Insert, clear, remove rows or columns
    - Show new contents while typing
    - Scroll bars
    - Grow grid when window is grown
    - Proper menus
    - Undo, redo
    - Cut, copy and paste
    - Formatting and alignment
    s
sheet1.xmli
icCs*||_t�|_tjj|�r:|jj|�n|jj�\}}t||�}t||�}t	j	�|_
|j
jd|j�t	j|j
dddd�|_
t	j|j
�|_t	j|j
ddd	|j�|_t	j|j
�|_|jjd
ddd
dd�|j
jd
d�|jjd
d�|jjd
ddd
dd�|jjd|j�|jjd|j�|jjd|j�|jjd|j�|jjd|j�|jjd|j�|j||�d|_d|_ |j!d
d
�|j"�dS(slConstructor.

        Load the sheet from the filename argument.
        Set up the Tk widget tree.
        sSpreadsheet: %sRRtA1tfontt	helveticaitboldtSavetcommandtsidetbottomtexpanditfilltbothR	R
Rs<Return>s<Shift-Return>s<Tab>s<Shift-Tab>s<Delete>s<Escape>N(R�iR�(#RaRRjtostpathtisfileRgRAR>tTktroottwm_titletLabeltbeacontEntrytentrytButtonRct
savebuttontFrametcellgridtpacktbindtreturn_eventtshift_return_eventt	tab_eventtshift_tab_eventtdelete_eventtescape_eventtmakegridR
t	currentxytcornerxyt
setcurrenttsync(RRatrowstcolumnsR?R@((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s<			cCsr|j|jkr>|jdk	r>|jj|j|j�n|jj|j�|j�|jjdd�dS(Nitendtbreak(	R�R�R
RjR0R-R�R�tdelete(Rtevent((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�'s!
cCs#|j\}}|j||�dS(N(R�t
load_entry(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�0scCs�|jj||�}|dkr*d}n1t|t�rId|j}n|j�\}}|jjdd�|jj	d|�|jj
dd�dS(NREt=iR�(RjRR
R)R�R�RDR�R�tinserttselection_range(RRR RRRRS((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�4s	c
Cs||_||_i|_tj|jdd�}|jdddddd�|jd|j�x�t	d	|d	�D]�}|jj
|d
d�tj|jdt|�dd�}|jd|dddd
�||j|df<||_d|_
|jd|j�|jd|j�|jd|j�|jd|j�qvWx�t	d	|d	�D]�}tj|jdt|�dd�}|jddd|dd
�||jd|f<d|_||_
|jd|j�|jd|j�|jd|j�|jd|j�q[Wx�t	d	|d	�D]�}x�t	d	|d	�D]�}tj|jdddddd�}|jd|d|dd�||j||f<||_||_
|jd|j�|jd|j�|jd|j�|jd|j�qDWq*WdS(s�Helper to create the grid of GUI cells.

        The edge (x==0 or y==0) is filled with labels; the rest is real cells.
        trelieftraisedtcolumniR}tstickytNSWEs<ButtonPress-1>itminsizei@RRtWEs<B1-Motion>s<ButtonRelease-1>s<Shift-Button-1>tsunkentbgtwhitetfgtblackN(R�R�t	gridcellsR�R�R�tgrid_configureR�t	selectallR!tgrid_columnconfigureRIt_SheetGUI__xt_SheetGUI__ytselectcolumntextendcolumnRKt	selectrowt	extendrowtpresstmotiontrelease(RR�R�RRR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�@sN			$		$				cCs*|jdd�|jtjtj�dS(Ni(R�t	setcornerR1R2(RR�((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�rscCs<|j|�\}}|j|d�|j|tj�dS(Ni(twhichxyR�RR1R2(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�vscCsR|j|�\}}|dkrN|j|jdd�|j|tj�ndS(Nii(RR�R�RR1R2(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�{scCs<|j|�\}}|jd|�|jtj|�dS(Ni(RR�RR1R2(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsR|j|�\}}|dkrN|jd|jd�|jtj|�ndS(Nii(RR�R�RR1R2(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsD|j|�\}}|dkr@|dkr@|j||�ndS(Ni(RR�(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsD|j|�\}}|dkr@|dkr@|j||�ndS(Ni(RR(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��scCsh|jj|j|j�}|dk	rdt|tj�rdy|j|j	fSWqdt
k
r`qdXndS(Ni(ii(R�twinfo_containingtx_rootty_rootR
R)R�R�R�R�tAttributeError(RR�R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s
cCs|jj|j�dS(N(RjRcRa(R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRc�scCs�|jdk	r|j�n|j�t||�|jd<|j||�|jj�||f|_d|_	|j
j|j�}|dk	r�d|d<ndS(sMake (x, y) the current cell.RRtyellowR�N(R�R
tchange_cellt
clearfocusR�R�R�R�t	focus_setR�R�R'(RRR tgridcell((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s


	c	Csc|jdks$|j||fkr8|j||�dS|j�||f|_|j\}}|jpo|j\}}||kr�||}}n||kr�||}}nxh|jj�D]W\\}}}||ko�|knr�||ko|knr�d|d<q�q�W|jj|j�}|dk	rId|d<n|j||||�dS(Nt	lightBlueR�R(	R�R
R�RR�R�RLR't	setbeacon(	RRR R#R$R%R&RR
((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s$$
"8
cCs#||kodknrD||ko6tjknrDd}n�||fdtjfkr�||krxd|}qd||f}n�||fdtjfkr�||kr�dt|�}qdt|�t|�f}n.t|j�}t|j�}d||f}||jd<dS(Nit:s%ds%d:%ds%ss%s:%sRR(R1R2RIR�R�R�R�(RR#R$R%R&tnametname1tname2((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s;	
cCs�|jdk	r�|j\}}|jp-|j\}}||krR||}}n||krn||}}nxk|jj�D]W\\}}}||ko�|knr~||ko�|knr~d|d<q~q~WndS(NR�R�(R�R
R�R�RL(RR#R$R%R&RR R((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s"8cCs1|j�|j\}}|j||d�dS(sCallback for the Return key.iR�(RR�R�(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs:|j�|j\}}|j|td|d��dS(s0Callback for the Return key with Shift modifier.iR�(RR�R�R>(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs1|j�|j\}}|j|d|�dS(sCallback for the Tab key.iR�(RR�R�(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs:|j�|j\}}|jtd|d�|�dS(s-Callback for the Tab key with Shift modifier.iR�(RR�R�R>(RR�RR ((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s
cCs�|j\}}|jj�}d}|jd�rFt|d�}nGxDtttt	fD]0}y||�}Wn
qYqYXt
|�}PqYW|dkr�|r�t|�}n|dkr�|jj
||�n|jj|||�|j�dS(s+Set the current cell from the entry widget.R�iN(R�R�R'R
t
startswithR�RR�R�R�R�R�RjR-R+R�(RRR RRRtclsR{((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyRs$cCs�|jj�x�|jj�D]�\\}}}|dks|dkrMqn|jj||�}|dkr{d|d<qt|d�r�|j�\}}nt|�t	}}||d<t
||d<qWdS(s(Fill the GUI cells from the sheet cells.iRERRRDtanchorN(RjRR�RLRR
RRDRKRtalign2anchor(RRR R
RRRRS((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR�s
"

(RhRit__doc__RR�R�R�R�R�R�R�R�R�R�R�R�RRcR�RRRR�R�R�R�RR�(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyR��s4-					2																			cCs�ddl}t�}x�tdd�D]�}x�tdd�D]�}|dkr\t|�}nU|dkrwt|�}n:t|d�}td|�}d||f}t|�}|j|||�q;Wq%W|j�|jd�dS(sBasic non-gui self-test.i����Niis%s*%ss
sheet1.xml(	R�RR!R�R�R�R+RVRc(R�taRR Rtc1tc2R�((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt
test_basic,s	
cCs@tjdrtjd}nd}t|�}|jj�dS(s	GUI test.is
sheet1.xmlN(R1targvR�R�tmainloop(Ratg((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyttest_guiBs

R(#RR�R�R1RXRtxml.parsersRRRRRRRRMR�R�RRRReR*R�R�R�R�R�R�RItTkinterR�R�RRRh(((s./usr/lib64/python2.7/Demo/tkinter/guido/ss1.pyt<module>s@				�Y)6						�C			PK��Z�m.,,
guido/kill.pynuȯ��#! /usr/bin/python2.7
# Tkinter interface to Linux `kill' command.

from Tkinter import *
from string import splitfields
from string import split
import commands
import os

class BarButton(Menubutton):
    def __init__(self, master=None, **cnf):
        apply(Menubutton.__init__, (self, master), cnf)
        self.pack(side=LEFT)
        self.menu = Menu(self, name='menu')
        self['menu'] = self.menu

class Kill(Frame):
    # List of (name, option, pid_column)
    format_list = [('Default', '', 0),
                   ('Long', '-l', 2),
                   ('User', '-u', 1),
                   ('Jobs', '-j', 1),
                   ('Signal', '-s', 1),
                   ('Memory', '-m', 0),
                   ('VM', '-v', 0),
                   ('Hex', '-X', 0)]
    def kill(self, selected):
        c = self.format_list[self.format.get()][2]
        pid = split(selected)[c]
        os.system('kill -9 ' + pid)
        self.do_update()
    def do_update(self):
        name, option, column = self.format_list[self.format.get()]
        s = commands.getoutput('ps -w ' + option)
        list = splitfields(s, '\n')
        self.header.set(list[0])
        del list[0]
        y = self.frame.vscroll.get()[0]
        self.frame.list.delete(0, AtEnd())
        for line in list:
            self.frame.list.insert(0, line)
        self.frame.list.yview(int(y))
    def do_motion(self, e):
        e.widget.select_clear(0, END)
        e.widget.select_set(e.widget.nearest(e.y))
    def do_leave(self, e):
        e.widget.select_clear(0, END)
    def do_1(self, e):
        self.kill(e.widget.get(e.widget.nearest(e.y)))
    def __init__(self, master=None, **cnf):
        Frame.__init__(self, master, cnf)
        self.pack(expand=1, fill=BOTH)
        self.bar = Frame(self, name='bar', relief=RAISED,
                         borderwidth=2)
        self.bar.pack(fill=X)
        self.bar.file = BarButton(self.bar, text='File')
        self.bar.file.menu.add_command(
                label='Quit', command=self.quit)
        self.bar.view = BarButton(self.bar, text='View')
        self.format = IntVar(self)
        self.format.set(2)
        for num in range(len(self.format_list)):
            self.bar.view.menu.add_radiobutton(
                    label=self.format_list[num][0],
                    command=self.do_update,
                    variable=self.format,
                    value=num)
        #self.bar.view.menu.add_separator()
        #XXX ...
        self.bar.tk_menuBar(self.bar.file, self.bar.view)
        self.frame = Frame(self, relief=RAISED, borderwidth=2)
        self.frame.pack(expand=1, fill=BOTH)
        self.header = StringVar(self)
        self.frame.label = Label(self.frame, relief=FLAT, anchor=NW,
                                 borderwidth=0,
                                 textvariable=self.header)
        self.frame.label.pack(fill=X)
        self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
        self.frame.list = Listbox(self.frame, relief=SUNKEN,
                                  selectbackground='#eed5b7',
                                  selectborderwidth=0,
                                  yscroll=self.frame.vscroll.set)
        self.frame.vscroll['command'] = self.frame.list.yview
        self.frame.vscroll.pack(side=RIGHT, fill=Y)
        self.frame.list.pack(expand=1, fill=BOTH)
        self.update = Button(self, text="Update",
                             command=self.do_update)
        self.update.pack(expand=1, fill=X)
        self.frame.list.bind('<Motion>', self.do_motion)
        self.frame.list.bind('<Leave>', self.do_leave)
        self.frame.list.bind('<1>', self.do_1)
        self.do_update()

if __name__ == '__main__':
    kill = Kill(None, borderwidth=5)
    kill.winfo_toplevel().title('Tkinter Process Killer')
    kill.winfo_toplevel().minsize(1, 1)
    kill.mainloop()
PK��Z�+�$RRguido/optionmenu.pyonu�[����
��^c@s�ddlTe�Ze�Zejd�eeeddd�Zej�dZ	e�Z
e
je	d
�eeee
fee	��Z
e
j�ej�dS(
i����(t*tOnetTwotThreetAahtBeetCeetDeetEffiN(RRRRR(tTkintertTktroott	StringVartvar1tsett
OptionMenutmenu1tpacktCHOICEStvar2tapplyttupletmenu2tmainloop(((s5/usr/lib64/python2.7/Demo/tkinter/guido/optionmenu.pyt<module>s
		

	
PK��Z���X�#�#guido/tkman.pycnu�[����
Afc@s�ddlZddlZddlZddlZddlTddlmZddgZddgZdZx/eD]'Z	ej
je	�roe	Zd	ZqoqoWdZ
x/eD]'Z	ej
je	�r�e	Zd	Z
q�q�Wes�e
r\ejjd
�esdejdZejjde�ne
sLd
ejdZejjde�nejd	�n[[
d�Zddd��YZd�Ze�dS(i����N(t*(tManPages/depot/sundry/man/manns/usr/local/man/manns/depot/sundry/man/man3s/usr/local/man/man3iis
sgFailed to find mann directory.
Please add the correct entry to the MANNDIRLIST
at the top of %s script.s%s

sgFailed to find man3 directory.
Please add the correct entry to the MAN3DIRLIST
at the top of %s script.cCsktj|�}g}xE|D]=}|dd!dkr|ddkr|j|d �qqW|j�|S(Ni����i����t.tln123456789(tostlistdirtappendtsort(tmandirtfilestnamestfile((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pytlistmanpages0s
#
tSelectionBoxcBs�eZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�ZRS(cCs�g|_t|dd�|_|jjdddt�|jj|_t|jdd�|_|jjdddt�t|jdd�|_|jjd	tdddt�t|jdd
�|_	|j	jd	t
dddt�t|�|_t
|j	dddd
dtdd�|_|jjd	t�t|jdd�|_|jjdddtd|jd|j�|jjdddtd|jd|j�|j|jd<t|j	dddtdddddd�|_|jjdddt�t|jddddd|j�|_|jjd	t�t|jdd dtdddd�|_|jjdddt�t|jdd!�|_ |j jdddt!�t|j dd"dd#d|j"�|_#|j#jd	t�t$�|_%t&|j dd$dd%d|j%dt'�|_(|j(jd	t�t|jdd&dtdddd�|_)|j)jdddt�t*|jdd'dd(�|_+|j+jd	t,�t-|jdddtddd)t!dd*d+d,�|_.|j.jdddt�|jj/d-|j�|j)j/d-|j"�|jj/d.|j0�|jj/d/|j1�|j)j/d/|j2�|j.j/d/|j3�|jj4�|jj5t�|j�dS(0Ntnametframetexpanditfilltsubframeitleftsubframetsidet
rightsubframetchapterttextt	DirectorytrelieftborderwidthitchaptermenutlabelsC functionstvaluetvariabletcommandsTcl/Tk functionstmenutlistboxtwidthitheightitl1sDisplay manual page named:tentrytl2frametl2sSearch regexp:t	casesensesCase sensitivetsearchttitles(none)twrapiHtselectbackgroundtpinks<Return>s
<Double-1>s<Tab>(6tchoicestFrameRtpacktBOTHtmasterRRtLEFTRtRIGHTt	StringVart
chaptervart
MenubuttontRAISEDRtTOPtMenuRtadd_radiobuttontMAN3DIRt
newchaptertMANNDIRtListboxtSUNKENR!tButtontentry_cbR$tEntryR%tXR&tNONEt	search_cbR't
BooleanVartcasevartCheckbuttontFLATR(R)tLabelR*tBOTTOMRRtbindt
listbox_cbt	entry_tabt
search_tabttext_tabt	focus_settset(tselfR2((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt__init__;s�		
	
	
cCs/|jj�}g|_|jt|��dS(N(R6tgetR.taddlistR(RTR((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyR=�s	cCs=||jkr/|jj|�|jj�n|j�dS(N(R.RRtupdate(RTtchoice((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt	addchoice�scCs1||jt|j�)|jj�|j�dS(N(R.tlenRRX(RTtlist((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRW�s
cGs|j�dS(N(RX(RTte((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRB�scCsQ|jj�}|rMt|�dkrM|jj|d�}|j|�ndS(Nii(R!tcurselectionR[RVt	show_page(RTR]t	selectionR((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRN�scGs|j|jj��dS(N(t
search_stringR)RV(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRF�scCs|jj�dS(N(R)RR(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRO�scCs|jj�dS(N(R%RR(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRP�scCs|jj�dS(N(R%RR(RTR]((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRQ�scCs�|jj�}t|t|�d�|j�}|sF|jj�n|jjdt	��d}x9|D]1}||kr�d}n|jj
t	�|�qiW|r�|S|jj�}|dkr�|jjd�SdS(NcSs|| |kS(N((Rtkeytn((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt<lambda>�tii(R%RVtfilterR[R.RtbellR!tdeletetAtEndtinserttsize(RTRbtokt
exactmatchtitemRc((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt
updatelist�s 
	cCsF|j�}|rB|j|�|jjdt��|j�ndS(Ni(RoR_R%RhRi(RTR((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRX�s

cCs]d|jj�|f}tjd|d�}|jj�||jd<|jj|�dS(Ns%s/%s.?snroff -man %s | ul -itrR(R6RVRtpopenRtkillR*t	parsefile(RTRRtfp((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyR_�s


cCs`|s|jj�dGHdS|jj�s7tj}nd}y.|r[tj||�}ntj|�}Wn-tjk
r�}|jj�dG|GHdSX|j	j
t��}tj
|tj|d� �}|j	j
t��}tj
|tj|d� �}|}	d}
x4|d}||krM|	dkr8Pn|	}d}d}	n|j	jd|d|�}|j|�}|dkrd}
tdt|jd���}
y |j	jdt�t��Wntk
r�nX|j	jdd	||fd	|||
f�|j	jt�d	||f�|j	jt��PqqW|
s\|jj�ndS(
NsEmpty search stringsRegex error:Riis%d.0 linestarts%d.0 lineendtsels%d.%d(RRgRHRVtret
IGNORECASEtNonetcompileterrorRtindextAtInserttstringtatoitfindRiR)tmaxR[tgroupt
tag_removet
AtSelFirstt	AtSelLasttTclErrorttag_addtmark_settyview_pickplace(RTR)tmaptprogtmsgtheretlinenotendt	endlinenot
wraplinenotfoundtlinetiRc((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyRa�sd

	
	


N(t__name__t
__module__RxRUR=RZRWRBRNRFRORPRQRoRXR_Ra(((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyR
9sM												cCsWt�}t|�}tjdr9|jtjd�n|jdd�|j�dS(Ni(tTkR
tsystargvR_tminsizetmainloop(troottsb((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pytmains	
((R�RR}RvtTkinterRtMANNDIRLISTtMAN3DIRLISTtfoundmanndirtdirtpathtexistsR>tfoundman3dirR<tstderrtwriteR�R�texitRR
R�(((s0/usr/lib64/python2.7/Demo/tkinter/guido/tkman.pyt<module>sD




		�	PK��Z	�7E� � guido/mbox.pycnu�[����
Afc@s)ddlZddlZddlZddlZddlZddlZddlTddlmZejddZ	d�Z
d�Zd�Zd	�Z
d
�Zejd�Zdd�Zdd
�Zd�Zdd�Zdadadd�Zd�Zd�Zd�Zddd�Ze
�dS(i����N(t*(tdialogtHOMEs/Mailc	Cs#daday#tjtjdd�\}}Wn(tjk
rY}|GHtjd�nXx1|D])}|d dkr�|daqa|aqaWtj�a	t	j
t�at�a
t
jatt
�atjidd6dd	6�tt�}|jid
d	6dd6�t|id
d6dd6�}|jid
d	6dd6�t|idd6�atjidd6dd	6dd6�tt
�atjdidd6td6�tjd�tjdidd6dd6�tjdt�|dftd<tdf|d<tjdtd�tjdt�tt�}|jidd6dd	6dd6�t|id
d6dd6�}|jid
d	6dd6�t|idd 6�atjidd6dd	6dd6�tt
�atjdid!d6td6�tjdid"d6td6�tjdid#d6t d6�tjd�tjdidd6dd6�tjdt!�|dftd<tdf|d<tjdt�tjdt"�tt
id$d%6�}|jid&d	6�tt
�a#t#jidd6dd	6�da%t
j&d'd�t'�t(�t
j)�dS((Ntinboxtallitit+texpandtbothtfilltytrighttsidetsunkentrelieftbditexportselectiontlefttcommandsOpen Foldertlabelt	separatortQuittexits<ButtonRelease-3>tsettyscrollcommandtyviews
<Double-1>s<3>tfixedtfontsOpen MessagesRemove MessagesRefile Messagetblacktbgtxi (*tfoldertseqtgetopttsystargvterrorRtmhlibtMHtmht
openfoldertmhftTktrootttktFramettoptpackt	ScrollbartListboxt	folderboxtMenut
foldermenutaddtopen_foldertbindt
folder_unposttfolder_posttscanboxtscanmenutopen_messagetremove_messagetrefile_messagetscan_unpostt	scan_posttbottNonetviewertminsizet
setfolderstrescantmainloop(	toptstargstmsgtargRt	folderbarRtscanbartrule2((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pytmains�#


		"	

	
""	
	
	

	
cCs9|j|j}}tj|d|d�tj�dS(Ni
(tx_rootty_rootR4tposttgrab_set(teRR
((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR9�scCs5tjdd�tj�tj�tjd�dS(Ntupdatet	idletaskstactive(R,tcallR4tgrab_releasetunposttinvoke(RT((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR8�s

cCs9|j|j}}tj|d|d�tj�dS(Ni
(RPRQR;RRRS(RTRR
((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR@�scCs5tjdd�tj�tj�tjd�dS(NRURVRW(R,RXR;RYRZR[(RT((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR?�s

s^ *([0-9]+)cCs�tj�}t|�dkr\t|�dkr9d}nd}ttd|ddd�dS|d}tj|�atjt�a	t
�dS(Nis Please open one folder at a timesPlease select a folder to opensCan't Open FolderRitOK(R2tcurselectiontlenRR+tgetRR'R(R)RF(RTtselRJti((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR6�s	
c	Cs9tj�}t|�dkr\t|�dkr9d}nd}ttd|ddd�dStd}d	td<tjd
d�|d}tj|�}tj	|�dkr+t
jtjd��}t
j|�}tr�tj�ndd
lm}|tdt|f|�atj�tj�n|td<dS(Nis!Please open one message at a timesPlease select a message to opensCan't Open MessageRiR\tcursortwatchRURVi����(t
MimeViewers+%s/%d(R:R]R^RR+R,RXR_t
scanparsertmatchtstringtatoitgroupR)topenmessageRCtdestroyRdRARR/tshow(	RTR`RJRbRatlinetnumtmRd((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR<�s,	





cCs
|dkS(Ntreceived((theader((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pytinterestingheader�scCs�tjd�}tj�}|s>ttddddd�dSg}xT|D]L}tj|�}tj|�dkrK|jt	j
tjd���qKqKWtj
|�t�tt|�|�dS(NisNo Message To Removes!Please select a message to removeRR\i(R:tnearestR]RR+R_ReRftappendRgRhRiR)tremovemessagesRFtfixfocustmin(RTtitopR`ttodoRaRm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR=�s	
&
Rc	Cs]tjd�}tj�}|s>ttddddd�dStj�}t|�dkr�|skd}nd}ttd	|ddd�dStj|d�}g}xT|D]L}tj|�}tj	|�dkr�|j
tjtj
d���q�q�Wt|kstr/|adatjt�antj|t�t�tt|�|�dS(
NisNo Message To Refiles!Please select a message to refileRR\is#Please select a folder to refile tos-Please select exactly one folder to refile tosNo Folder To Refile(R:RsR]RR+R2R^R_ReRfRtRgRhRit
lastrefilettofolderRBR'R(R)trefilemessagesRFRvRw(	RTRxR`t	folderselRJtrefiletoRyRaRm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR>�s4		
&cCs�tj�}xot|�D][}tjt|��}tj|�dkrtjtj	d��}||krtPqtqqWd}tj
|�tj|�dS(Niitend(R:tsizetrangeR_treprReRfRgRhRitselect_fromR(tnearRxtnRaRmRn((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyRv�s
cCs;tjdd�x$tj�D]}tjd|�qWdS(NiR(R2tdeleteR'tlistallfolderstinsert(tfn((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyRE
scCsWtrtj�dantjdd�x'ttt�D]}tjd|�q9WdS(NiR(	RCRkRBR:R�t
scanfolderRR R�(Rm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyRFs
	RRcCs,td�tjd||fd�j��S(NcSs|d S(Ni����((Rm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyt<lambda>Rsscan +%s %str(tmaptostpopent	readlines(Rtsequence((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR�s(R�R"treR!RgR%tTkinterRtenvirontmailboxROR9R8R@R?tcompileReRBR6R<RrR=RzR{R>RvRERFR�(((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyt<module>s4
	x						
			PK��ZE`}eR	R	guido/electrons.pycnu�[����
Afc@sLddlTddlZddd��YZd�ZedkrHe�ndS(i����(t*Nt	ElectronscBs&eZdd�Zd�Zd�ZRS(c
Cs||_t�|_}t|�|_}|j�|j|d�|j|d�}}|r�|j|d|dd|dd�|_ng|_	d
\}}}	}
xWt
|�D]I}|j|||	|
dd�}|j	j|�|d|
d}}
q�W|jj
�dS(Ntwidththeightitbitmapt
foregroundtbluei
iFiiJtfilltred(i
iFiiJ(tntTkttktCanvastcanvastpacktgetintt
create_bitmapRtpiecestrangetcreate_ovaltappendtupdate(
tselfR	RRtcRRtx1ty1tx2ty2titp((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pyt__init__s 	
'	cCsq|j}xT|jD]I}tjtdd��}tjtdd��}|j|||�qW|jj�dS(Ni����ii����(R
RtrandomtchoiceRtmoveRR(RR	RRtxty((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pytrandom_move+s	cCshy+x$td�D]}|j|j�qWWn6tk
rcy|jj�Wqdtk
r_qdXnXdS(Ni�(RR$R	tTclErrorRtdestroy(RR((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pytrun4s

N(t__name__t
__module__tNoneRR$R'(((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pyRs		cCs�ddl}ddl}|jdr>|j|jd�}nd}|jdr�|jd}|ddkr{|d}q�d|}nd}t||�}|j�dS(Ni����iiiit@(tsyststringtargvtatoiR*RR'(R,R-R	Rth((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pytmain@s




t__main__((tTkinterRRR1R((((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pyt<module>s

-	PK��ZE�7��guido/listtree.pynu�[���# List a remote app's widget tree (names and classes only)

import sys
import string

from Tkinter import *

def listtree(master, app):
    list = Listbox(master, name='list')
    list.pack(expand=1, fill=BOTH)
    listnodes(list, app, '.', 0)
    return list

def listnodes(list, app, widget, level):
    klass = list.send(app, 'winfo', 'class', widget)
##      i = string.rindex(widget, '.')
##      list.insert(END, '%s%s (%s)' % ((level-1)*'.   ', widget[i:], klass))
    list.insert(END, '%s (%s)' % (widget, klass))
    children = list.tk.splitlist(
            list.send(app, 'winfo', 'children', widget))
    for c in children:
        listnodes(list, app, c, level+1)

def main():
    if not sys.argv[1:]:
        sys.stderr.write('Usage: listtree appname\n')
        sys.exit(2)
    app = sys.argv[1]
    tk = Tk()
    tk.minsize(1, 1)
    f = Frame(tk, name='f')
    f.pack(expand=1, fill=BOTH)
    list = listtree(f, app)
    tk.mainloop()

if __name__ == '__main__':
    main()
PK��Z.��55guido/svkill.pyonu�[����
Afc@s�ddlTedkr"ed�nddlmZddlmZddlZddlZejdZ	de
fd	��YZd
efd��YZ
edkr�e
dd
d�Zej�jd�ej�jdd�ej�ndS(i����(t*g@s/This version of svkill requires Tk 4.0 or later(tsplitfields(tsplitNtLOGNAMEt	BarButtoncBseZdd�ZRS(cKsOttj||f|�|jdt�t|dd�|_|j|d<dS(Ntsidetnametmenu(tapplyt
Menubuttont__init__tpacktLEFTtMenuR(tselftmastertcnf((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyR
sN(t__name__t
__module__tNoneR
(((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyRstKillcBs|eZdddd ded	efgZd!d"d#d$d%d&gZd�Zd�Zd�Zd�Zd�Z	d'd�ZRS((tDefaultts
Every (-e)s-esNon process group leaders (-d)s-dsNon leaders with tty (-a)s-asFor this user (-u %s)s-u %sis	Long (-l)s-lis	Full (-f)s-fisFull Long (-f -l)s-l -fsSession and group ID (-j)s-jsScheduler properties (-c)s-ccCsI|j|jj�d}t|�|}tjd|�|j�dS(Niskill -9 (tformat_listtformattgetRtostsystemt	do_update(Rtselectedtctpid((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pytkill)scCs�|j|jj�d}|j|jj�d}tjd||f�}t|d�}|jj	|dd�|d=|j
jjdt
��x$|D]}|j
jjd|�q�WdS(Nisps %s %ss
is
          (RRRt	view_listtviewtcommandst	getoutputRtheadertsettframetlisttdeletetAtEndtinsert(RRR"tsR(tline((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyR.s
cCs6|jjdd�|jj|jj|j��dS(Nt0tend(twidgettselect_cleart
select_settnearestty(Rte((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyt	do_motion8scCs|jjdd�dS(NR.R/(R0R1(RR5((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pytdo_leave;scCs,|j|jj|jj|j���dS(N(R R0RR3R4(RR5((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pytdo_1=scKs�ttj||f|�|jdddt�t|dddtdd�|_|jjdt�t|jd	d
�|j_	|jj	j
jddd
|j�t|jd	d�|j_
t|jd	d�|j_t|�|_
|j
jd�t|�|_|jjd�xatt|j��D]J}|j|\}}|jj
j
jd|d
|jd|j
d|�q*Wxdtt|j��D]M}|j|\}}}|jjj
jd|d
|jd|jd|�q�W|jj|jj	|jj
|jj�t|dtdd�|_|jjdddt�t|�|_t|jdtdtddddd|j�|j_|jjjdtdt �t!|jdt"�|j_#t$|jdt%ddddddddddd t&d!|jj#j�|j_'|jj'j(|jj#d
<|jj#jd"t)dt�|jj'jdddt�t*|d	d#d
|j�|_+|j+jdt�|jj'j,d$|j-�|jj'j,d%|j.�|jj'j,d&|j/�|j�dS('NtexpanditfillRtbartrelieftborderwidthittexttFiletlabeltQuittcommandtViewtFormatitvariabletvaluetanchortfonts*-Courier-Bold-R-Normal-*-120-*ttextvariabletorients!*-Courier-Medium-R-Normal-*-120-*twidthi(theighti
tselectbackgrounds#eed5b7tselectborderwidtht
selectmodetyscrollRtUpdates<Motion>s<Leave>s<1>(0RtFrameR
RtBOTHtRAISEDR;tXRtfileRtadd_commandtquitR"RtIntVarR&trangetlenR!tadd_radiobuttonRRt
tk_menuBarR't	StringVarR%tLabeltFLATtNWR@tYtWt	ScrollbartVERTICALtvscrolltListboxtSUNKENtBROWSER(tyviewtRIGHTtButtontupdatetbindR6R7R8(RRRtnumR@toptiontcol((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyR
?sv					
	(RR(s
Every (-e)s-e(sNon process group leaders (-d)s-d(sNon leaders with tty (-a)s-a(RRi(s	Long (-l)s-li(s	Full (-f)s-fi(sFull Long (-f -l)s-l -fi(sSession and group ID (-j)s-ji(sScheduler properties (-c)s-ciN(RRtuserR!RR RR6R7R8RR
(((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyRs"			
			t__main__R=isTkinter Process Killer (SYSV)i(tTkintert	TkVersiontImportErrortstringRRR#RtenvironRrR	RRRRRRR twinfo_toplevelttitletminsizetmainloop(((s1/usr/lib64/python2.7/Demo/tkinter/guido/svkill.pyt<module>s

dPK��Z��GfGfguido/ss1.pynu�[���"""SS1 -- a spreadsheet."""

import os
import re
import sys
import cgi
import rexec
from xml.parsers import expat

LEFT, CENTER, RIGHT = "LEFT", "CENTER", "RIGHT"

def ljust(x, n):
    return x.ljust(n)
def center(x, n):
    return x.center(n)
def rjust(x, n):
    return x.rjust(n)
align2action = {LEFT: ljust, CENTER: center, RIGHT: rjust}

align2xml = {LEFT: "left", CENTER: "center", RIGHT: "right"}
xml2align = {"left": LEFT, "center": CENTER, "right": RIGHT}

align2anchor = {LEFT: "w", CENTER: "center", RIGHT: "e"}

def sum(seq):
    total = 0
    for x in seq:
        if x is not None:
            total += x
    return total

class Sheet:

    def __init__(self):
        self.cells = {} # {(x, y): cell, ...}
        self.rexec = rexec.RExec()
        m = self.rexec.add_module('__main__')
        m.cell = self.cellvalue
        m.cells = self.multicellvalue
        m.sum = sum

    def cellvalue(self, x, y):
        cell = self.getcell(x, y)
        if hasattr(cell, 'recalc'):
            return cell.recalc(self.rexec)
        else:
            return cell

    def multicellvalue(self, x1, y1, x2, y2):
        if x1 > x2:
            x1, x2 = x2, x1
        if y1 > y2:
            y1, y2 = y2, y1
        seq = []
        for y in range(y1, y2+1):
            for x in range(x1, x2+1):
                seq.append(self.cellvalue(x, y))
        return seq

    def getcell(self, x, y):
        return self.cells.get((x, y))

    def setcell(self, x, y, cell):
        assert x > 0 and y > 0
        assert isinstance(cell, BaseCell)
        self.cells[x, y] = cell

    def clearcell(self, x, y):
        try:
            del self.cells[x, y]
        except KeyError:
            pass

    def clearcells(self, x1, y1, x2, y2):
        for xy in self.selectcells(x1, y1, x2, y2):
            del self.cells[xy]

    def clearrows(self, y1, y2):
        self.clearcells(0, y1, sys.maxint, y2)

    def clearcolumns(self, x1, x2):
        self.clearcells(x1, 0, x2, sys.maxint)

    def selectcells(self, x1, y1, x2, y2):
        if x1 > x2:
            x1, x2 = x2, x1
        if y1 > y2:
            y1, y2 = y2, y1
        return [(x, y) for x, y in self.cells
                if x1 <= x <= x2 and y1 <= y <= y2]

    def movecells(self, x1, y1, x2, y2, dx, dy):
        if dx == 0 and dy == 0:
            return
        if x1 > x2:
            x1, x2 = x2, x1
        if y1 > y2:
            y1, y2 = y2, y1
        assert x1+dx > 0 and y1+dy > 0
        new = {}
        for x, y in self.cells:
            cell = self.cells[x, y]
            if hasattr(cell, 'renumber'):
                cell = cell.renumber(x1, y1, x2, y2, dx, dy)
            if x1 <= x <= x2 and y1 <= y <= y2:
                x += dx
                y += dy
            new[x, y] = cell
        self.cells = new

    def insertrows(self, y, n):
        assert n > 0
        self.movecells(0, y, sys.maxint, sys.maxint, 0, n)

    def deleterows(self, y1, y2):
        if y1 > y2:
            y1, y2 = y2, y1
        self.clearrows(y1, y2)
        self.movecells(0, y2+1, sys.maxint, sys.maxint, 0, y1-y2-1)

    def insertcolumns(self, x, n):
        assert n > 0
        self.movecells(x, 0, sys.maxint, sys.maxint, n, 0)

    def deletecolumns(self, x1, x2):
        if x1 > x2:
            x1, x2 = x2, x1
        self.clearcells(x1, x2)
        self.movecells(x2+1, 0, sys.maxint, sys.maxint, x1-x2-1, 0)

    def getsize(self):
        maxx = maxy = 0
        for x, y in self.cells:
            maxx = max(maxx, x)
            maxy = max(maxy, y)
        return maxx, maxy

    def reset(self):
        for cell in self.cells.itervalues():
            if hasattr(cell, 'reset'):
                cell.reset()

    def recalc(self):
        self.reset()
        for cell in self.cells.itervalues():
            if hasattr(cell, 'recalc'):
                cell.recalc(self.rexec)

    def display(self):
        maxx, maxy = self.getsize()
        width, height = maxx+1, maxy+1
        colwidth = [1] * width
        full = {}
        # Add column heading labels in row 0
        for x in range(1, width):
            full[x, 0] = text, alignment = colnum2name(x), RIGHT
            colwidth[x] = max(colwidth[x], len(text))
        # Add row labels in column 0
        for y in range(1, height):
            full[0, y] = text, alignment = str(y), RIGHT
            colwidth[0] = max(colwidth[0], len(text))
        # Add sheet cells in columns with x>0 and y>0
        for (x, y), cell in self.cells.iteritems():
            if x <= 0 or y <= 0:
                continue
            if hasattr(cell, 'recalc'):
                cell.recalc(self.rexec)
            if hasattr(cell, 'format'):
                text, alignment = cell.format()
                assert isinstance(text, str)
                assert alignment in (LEFT, CENTER, RIGHT)
            else:
                text = str(cell)
                if isinstance(cell, str):
                    alignment = LEFT
                else:
                    alignment = RIGHT
            full[x, y] = (text, alignment)
            colwidth[x] = max(colwidth[x], len(text))
        # Calculate the horizontal separator line (dashes and dots)
        sep = ""
        for x in range(width):
            if sep:
                sep += "+"
            sep += "-"*colwidth[x]
        # Now print The full grid
        for y in range(height):
            line = ""
            for x in range(width):
                text, alignment = full.get((x, y)) or ("", LEFT)
                text = align2action[alignment](text, colwidth[x])
                if line:
                    line += '|'
                line += text
            print line
            if y == 0:
                print sep

    def xml(self):
        out = ['<spreadsheet>']
        for (x, y), cell in self.cells.iteritems():
            if hasattr(cell, 'xml'):
                cellxml = cell.xml()
            else:
                cellxml = '<value>%s</value>' % cgi.escape(cell)
            out.append('<cell row="%s" col="%s">\n  %s\n</cell>' %
                       (y, x, cellxml))
        out.append('</spreadsheet>')
        return '\n'.join(out)

    def save(self, filename):
        text = self.xml()
        f = open(filename, "w")
        f.write(text)
        if text and not text.endswith('\n'):
            f.write('\n')
        f.close()

    def load(self, filename):
        f = open(filename, 'r')
        SheetParser(self).parsefile(f)
        f.close()

class SheetParser:

    def __init__(self, sheet):
        self.sheet = sheet

    def parsefile(self, f):
        parser = expat.ParserCreate()
        parser.StartElementHandler = self.startelement
        parser.EndElementHandler = self.endelement
        parser.CharacterDataHandler = self.data
        parser.ParseFile(f)

    def startelement(self, tag, attrs):
        method = getattr(self, 'start_'+tag, None)
        if method:
            for key, value in attrs.iteritems():
                attrs[key] = str(value) # XXX Convert Unicode to 8-bit
            method(attrs)
        self.texts = []

    def data(self, text):
        text = str(text) # XXX Convert Unicode to 8-bit
        self.texts.append(text)

    def endelement(self, tag):
        method = getattr(self, 'end_'+tag, None)
        if method:
            method("".join(self.texts))

    def start_cell(self, attrs):
        self.y = int(attrs.get("row"))
        self.x = int(attrs.get("col"))

    def start_value(self, attrs):
        self.fmt = attrs.get('format')
        self.alignment = xml2align.get(attrs.get('align'))

    start_formula = start_value

    def end_int(self, text):
        try:
            self.value = int(text)
        except:
            self.value = None

    def end_long(self, text):
        try:
            self.value = long(text)
        except:
            self.value = None

    def end_double(self, text):
        try:
            self.value = float(text)
        except:
            self.value = None

    def end_complex(self, text):
        try:
            self.value = complex(text)
        except:
            self.value = None

    def end_string(self, text):
        try:
            self.value = text
        except:
            self.value = None

    def end_value(self, text):
        if isinstance(self.value, BaseCell):
            self.cell = self.value
        elif isinstance(self.value, str):
            self.cell = StringCell(self.value,
                                   self.fmt or "%s",
                                   self.alignment or LEFT)
        else:
            self.cell = NumericCell(self.value,
                                    self.fmt or "%s",
                                    self.alignment or RIGHT)

    def end_formula(self, text):
        self.cell = FormulaCell(text,
                                self.fmt or "%s",
                                self.alignment or RIGHT)

    def end_cell(self, text):
        self.sheet.setcell(self.x, self.y, self.cell)

class BaseCell:
    __init__ = None # Must provide
    """Abstract base class for sheet cells.

    Subclasses may but needn't provide the following APIs:

    cell.reset() -- prepare for recalculation
    cell.recalc(rexec) -> value -- recalculate formula
    cell.format() -> (value, alignment) -- return formatted value
    cell.xml() -> string -- return XML
    """

class NumericCell(BaseCell):

    def __init__(self, value, fmt="%s", alignment=RIGHT):
        assert isinstance(value, (int, long, float, complex))
        assert alignment in (LEFT, CENTER, RIGHT)
        self.value = value
        self.fmt = fmt
        self.alignment = alignment

    def recalc(self, rexec):
        return self.value

    def format(self):
        try:
            text = self.fmt % self.value
        except:
            text = str(self.value)
        return text, self.alignment

    def xml(self):
        method = getattr(self, '_xml_' + type(self.value).__name__)
        return '<value align="%s" format="%s">%s</value>' % (
                align2xml[self.alignment],
                self.fmt,
                method())

    def _xml_int(self):
        if -2**31 <= self.value < 2**31:
            return '<int>%s</int>' % self.value
        else:
            return self._xml_long()

    def _xml_long(self):
        return '<long>%s</long>' % self.value

    def _xml_float(self):
        return '<double>%s</double>' % repr(self.value)

    def _xml_complex(self):
        return '<complex>%s</double>' % repr(self.value)

class StringCell(BaseCell):

    def __init__(self, text, fmt="%s", alignment=LEFT):
        assert isinstance(text, (str, unicode))
        assert alignment in (LEFT, CENTER, RIGHT)
        self.text = text
        self.fmt = fmt
        self.alignment = alignment

    def recalc(self, rexec):
        return self.text

    def format(self):
        return self.text, self.alignment

    def xml(self):
        s = '<value align="%s" format="%s"><string>%s</string></value>'
        return s % (
            align2xml[self.alignment],
            self.fmt,
            cgi.escape(self.text))

class FormulaCell(BaseCell):

    def __init__(self, formula, fmt="%s", alignment=RIGHT):
        assert alignment in (LEFT, CENTER, RIGHT)
        self.formula = formula
        self.translated = translate(self.formula)
        self.fmt = fmt
        self.alignment = alignment
        self.reset()

    def reset(self):
        self.value = None

    def recalc(self, rexec):
        if self.value is None:
            try:
                # A hack to evaluate expressions using true division
                rexec.r_exec("from __future__ import division\n" +
                             "__value__ = eval(%s)" % repr(self.translated))
                self.value = rexec.r_eval("__value__")
            except:
                exc = sys.exc_info()[0]
                if hasattr(exc, "__name__"):
                    self.value = exc.__name__
                else:
                    self.value = str(exc)
        return self.value

    def format(self):
        try:
            text = self.fmt % self.value
        except:
            text = str(self.value)
        return text, self.alignment

    def xml(self):
        return '<formula align="%s" format="%s">%s</formula>' % (
            align2xml[self.alignment],
            self.fmt,
            self.formula)

    def renumber(self, x1, y1, x2, y2, dx, dy):
        out = []
        for part in re.split('(\w+)', self.formula):
            m = re.match('^([A-Z]+)([1-9][0-9]*)$', part)
            if m is not None:
                sx, sy = m.groups()
                x = colname2num(sx)
                y = int(sy)
                if x1 <= x <= x2 and y1 <= y <= y2:
                    part = cellname(x+dx, y+dy)
            out.append(part)
        return FormulaCell("".join(out), self.fmt, self.alignment)

def translate(formula):
    """Translate a formula containing fancy cell names to valid Python code.

    Examples:
        B4 -> cell(2, 4)
        B4:Z100 -> cells(2, 4, 26, 100)
    """
    out = []
    for part in re.split(r"(\w+(?::\w+)?)", formula):
        m = re.match(r"^([A-Z]+)([1-9][0-9]*)(?::([A-Z]+)([1-9][0-9]*))?$", part)
        if m is None:
            out.append(part)
        else:
            x1, y1, x2, y2 = m.groups()
            x1 = colname2num(x1)
            if x2 is None:
                s = "cell(%s, %s)" % (x1, y1)
            else:
                x2 = colname2num(x2)
                s = "cells(%s, %s, %s, %s)" % (x1, y1, x2, y2)
            out.append(s)
    return "".join(out)

def cellname(x, y):
    "Translate a cell coordinate to a fancy cell name (e.g. (1, 1)->'A1')."
    assert x > 0 # Column 0 has an empty name, so can't use that
    return colnum2name(x) + str(y)

def colname2num(s):
    "Translate a column name to number (e.g. 'A'->1, 'Z'->26, 'AA'->27)."
    s = s.upper()
    n = 0
    for c in s:
        assert 'A' <= c <= 'Z'
        n = n*26 + ord(c) - ord('A') + 1
    return n

def colnum2name(n):
    "Translate a column number to name (e.g. 1->'A', etc.)."
    assert n > 0
    s = ""
    while n:
        n, m = divmod(n-1, 26)
        s = chr(m+ord('A')) + s
    return s

import Tkinter as Tk

class SheetGUI:

    """Beginnings of a GUI for a spreadsheet.

    TO DO:
    - clear multiple cells
    - Insert, clear, remove rows or columns
    - Show new contents while typing
    - Scroll bars
    - Grow grid when window is grown
    - Proper menus
    - Undo, redo
    - Cut, copy and paste
    - Formatting and alignment
    """

    def __init__(self, filename="sheet1.xml", rows=10, columns=5):
        """Constructor.

        Load the sheet from the filename argument.
        Set up the Tk widget tree.
        """
        # Create and load the sheet
        self.filename = filename
        self.sheet = Sheet()
        if os.path.isfile(filename):
            self.sheet.load(filename)
        # Calculate the needed grid size
        maxx, maxy = self.sheet.getsize()
        rows = max(rows, maxy)
        columns = max(columns, maxx)
        # Create the widgets
        self.root = Tk.Tk()
        self.root.wm_title("Spreadsheet: %s" % self.filename)
        self.beacon = Tk.Label(self.root, text="A1",
                               font=('helvetica', 16, 'bold'))
        self.entry = Tk.Entry(self.root)
        self.savebutton = Tk.Button(self.root, text="Save",
                                    command=self.save)
        self.cellgrid = Tk.Frame(self.root)
        # Configure the widget lay-out
        self.cellgrid.pack(side="bottom", expand=1, fill="both")
        self.beacon.pack(side="left")
        self.savebutton.pack(side="right")
        self.entry.pack(side="left", expand=1, fill="x")
        # Bind some events
        self.entry.bind("<Return>", self.return_event)
        self.entry.bind("<Shift-Return>", self.shift_return_event)
        self.entry.bind("<Tab>", self.tab_event)
        self.entry.bind("<Shift-Tab>", self.shift_tab_event)
        self.entry.bind("<Delete>", self.delete_event)
        self.entry.bind("<Escape>", self.escape_event)
        # Now create the cell grid
        self.makegrid(rows, columns)
        # Select the top-left cell
        self.currentxy = None
        self.cornerxy = None
        self.setcurrent(1, 1)
        # Copy the sheet cells to the GUI cells
        self.sync()

    def delete_event(self, event):
        if self.cornerxy != self.currentxy and self.cornerxy is not None:
            self.sheet.clearcells(*(self.currentxy + self.cornerxy))
        else:
            self.sheet.clearcell(*self.currentxy)
        self.sync()
        self.entry.delete(0, 'end')
        return "break"

    def escape_event(self, event):
        x, y = self.currentxy
        self.load_entry(x, y)

    def load_entry(self, x, y):
        cell = self.sheet.getcell(x, y)
        if cell is None:
            text = ""
        elif isinstance(cell, FormulaCell):
            text = '=' + cell.formula
        else:
            text, alignment = cell.format()
        self.entry.delete(0, 'end')
        self.entry.insert(0, text)
        self.entry.selection_range(0, 'end')

    def makegrid(self, rows, columns):
        """Helper to create the grid of GUI cells.

        The edge (x==0 or y==0) is filled with labels; the rest is real cells.
        """
        self.rows = rows
        self.columns = columns
        self.gridcells = {}
        # Create the top left corner cell (which selects all)
        cell = Tk.Label(self.cellgrid, relief='raised')
        cell.grid_configure(column=0, row=0, sticky='NSWE')
        cell.bind("<ButtonPress-1>", self.selectall)
        # Create the top row of labels, and confiure the grid columns
        for x in range(1, columns+1):
            self.cellgrid.grid_columnconfigure(x, minsize=64)
            cell = Tk.Label(self.cellgrid, text=colnum2name(x), relief='raised')
            cell.grid_configure(column=x, row=0, sticky='WE')
            self.gridcells[x, 0] = cell
            cell.__x = x
            cell.__y = 0
            cell.bind("<ButtonPress-1>", self.selectcolumn)
            cell.bind("<B1-Motion>", self.extendcolumn)
            cell.bind("<ButtonRelease-1>", self.extendcolumn)
            cell.bind("<Shift-Button-1>", self.extendcolumn)
        # Create the leftmost column of labels
        for y in range(1, rows+1):
            cell = Tk.Label(self.cellgrid, text=str(y), relief='raised')
            cell.grid_configure(column=0, row=y, sticky='WE')
            self.gridcells[0, y] = cell
            cell.__x = 0
            cell.__y = y
            cell.bind("<ButtonPress-1>", self.selectrow)
            cell.bind("<B1-Motion>", self.extendrow)
            cell.bind("<ButtonRelease-1>", self.extendrow)
            cell.bind("<Shift-Button-1>", self.extendrow)
        # Create the real cells
        for x in range(1, columns+1):
            for y in range(1, rows+1):
                cell = Tk.Label(self.cellgrid, relief='sunken',
                                bg='white', fg='black')
                cell.grid_configure(column=x, row=y, sticky='NSWE')
                self.gridcells[x, y] = cell
                cell.__x = x
                cell.__y = y
                # Bind mouse events
                cell.bind("<ButtonPress-1>", self.press)
                cell.bind("<B1-Motion>", self.motion)
                cell.bind("<ButtonRelease-1>", self.release)
                cell.bind("<Shift-Button-1>", self.release)

    def selectall(self, event):
        self.setcurrent(1, 1)
        self.setcorner(sys.maxint, sys.maxint)

    def selectcolumn(self, event):
        x, y = self.whichxy(event)
        self.setcurrent(x, 1)
        self.setcorner(x, sys.maxint)

    def extendcolumn(self, event):
        x, y = self.whichxy(event)
        if x > 0:
            self.setcurrent(self.currentxy[0], 1)
            self.setcorner(x, sys.maxint)

    def selectrow(self, event):
        x, y = self.whichxy(event)
        self.setcurrent(1, y)
        self.setcorner(sys.maxint, y)

    def extendrow(self, event):
        x, y = self.whichxy(event)
        if y > 0:
            self.setcurrent(1, self.currentxy[1])
            self.setcorner(sys.maxint, y)

    def press(self, event):
        x, y = self.whichxy(event)
        if x > 0 and y > 0:
            self.setcurrent(x, y)

    def motion(self, event):
        x, y = self.whichxy(event)
        if x > 0 and y > 0:
            self.setcorner(x, y)

    release = motion

    def whichxy(self, event):
        w = self.cellgrid.winfo_containing(event.x_root, event.y_root)
        if w is not None and isinstance(w, Tk.Label):
            try:
                return w.__x, w.__y
            except AttributeError:
                pass
        return 0, 0

    def save(self):
        self.sheet.save(self.filename)

    def setcurrent(self, x, y):
        "Make (x, y) the current cell."
        if self.currentxy is not None:
            self.change_cell()
        self.clearfocus()
        self.beacon['text'] = cellname(x, y)
        self.load_entry(x, y)
        self.entry.focus_set()
        self.currentxy = x, y
        self.cornerxy = None
        gridcell = self.gridcells.get(self.currentxy)
        if gridcell is not None:
            gridcell['bg'] = 'yellow'

    def setcorner(self, x, y):
        if self.currentxy is None or self.currentxy == (x, y):
            self.setcurrent(x, y)
            return
        self.clearfocus()
        self.cornerxy = x, y
        x1, y1 = self.currentxy
        x2, y2 = self.cornerxy or self.currentxy
        if x1 > x2:
            x1, x2 = x2, x1
        if y1 > y2:
            y1, y2 = y2, y1
        for (x, y), cell in self.gridcells.iteritems():
            if x1 <= x <= x2 and y1 <= y <= y2:
                cell['bg'] = 'lightBlue'
        gridcell = self.gridcells.get(self.currentxy)
        if gridcell is not None:
            gridcell['bg'] = 'yellow'
        self.setbeacon(x1, y1, x2, y2)

    def setbeacon(self, x1, y1, x2, y2):
        if x1 == y1 == 1 and x2 == y2 == sys.maxint:
            name = ":"
        elif (x1, x2) == (1, sys.maxint):
            if y1 == y2:
                name = "%d" % y1
            else:
                name = "%d:%d" % (y1, y2)
        elif (y1, y2) == (1, sys.maxint):
            if x1 == x2:
                name = "%s" % colnum2name(x1)
            else:
                name = "%s:%s" % (colnum2name(x1), colnum2name(x2))
        else:
            name1 = cellname(*self.currentxy)
            name2 = cellname(*self.cornerxy)
            name = "%s:%s" % (name1, name2)
        self.beacon['text'] = name


    def clearfocus(self):
        if self.currentxy is not None:
            x1, y1 = self.currentxy
            x2, y2 = self.cornerxy or self.currentxy
            if x1 > x2:
                x1, x2 = x2, x1
            if y1 > y2:
                y1, y2 = y2, y1
            for (x, y), cell in self.gridcells.iteritems():
                if x1 <= x <= x2 and y1 <= y <= y2:
                    cell['bg'] = 'white'

    def return_event(self, event):
        "Callback for the Return key."
        self.change_cell()
        x, y = self.currentxy
        self.setcurrent(x, y+1)
        return "break"

    def shift_return_event(self, event):
        "Callback for the Return key with Shift modifier."
        self.change_cell()
        x, y = self.currentxy
        self.setcurrent(x, max(1, y-1))
        return "break"

    def tab_event(self, event):
        "Callback for the Tab key."
        self.change_cell()
        x, y = self.currentxy
        self.setcurrent(x+1, y)
        return "break"

    def shift_tab_event(self, event):
        "Callback for the Tab key with Shift modifier."
        self.change_cell()
        x, y = self.currentxy
        self.setcurrent(max(1, x-1), y)
        return "break"

    def change_cell(self):
        "Set the current cell from the entry widget."
        x, y = self.currentxy
        text = self.entry.get()
        cell = None
        if text.startswith('='):
            cell = FormulaCell(text[1:])
        else:
            for cls in int, long, float, complex:
                try:
                    value = cls(text)
                except:
                    continue
                else:
                    cell = NumericCell(value)
                    break
        if cell is None and text:
            cell = StringCell(text)
        if cell is None:
            self.sheet.clearcell(x, y)
        else:
            self.sheet.setcell(x, y, cell)
        self.sync()

    def sync(self):
        "Fill the GUI cells from the sheet cells."
        self.sheet.recalc()
        for (x, y), gridcell in self.gridcells.iteritems():
            if x == 0 or y == 0:
                continue
            cell = self.sheet.getcell(x, y)
            if cell is None:
                gridcell['text'] = ""
            else:
                if hasattr(cell, 'format'):
                    text, alignment = cell.format()
                else:
                    text, alignment = str(cell), LEFT
                gridcell['text'] = text
                gridcell['anchor'] = align2anchor[alignment]


def test_basic():
    "Basic non-gui self-test."
    import os
    a = Sheet()
    for x in range(1, 11):
        for y in range(1, 11):
            if x == 1:
                cell = NumericCell(y)
            elif y == 1:
                cell = NumericCell(x)
            else:
                c1 = cellname(x, 1)
                c2 = cellname(1, y)
                formula = "%s*%s" % (c1, c2)
                cell = FormulaCell(formula)
            a.setcell(x, y, cell)
##    if os.path.isfile("sheet1.xml"):
##        print "Loading from sheet1.xml"
##        a.load("sheet1.xml")
    a.display()
    a.save("sheet1.xml")

def test_gui():
    "GUI test."
    if sys.argv[1:]:
        filename = sys.argv[1]
    else:
        filename = "sheet1.xml"
    g = SheetGUI(filename)
    g.root.mainloop()

if __name__ == '__main__':
    #test_basic()
    test_gui()
PK��Zk>'��guido/hello.pyonu�[����
��^c@s3ddlZddlTd�Zd�Ze�dS(i����N(t*cCsAt�}t|�}d|d<t|d<|j�|j�dS(NsHello, worldttexttcommand(tTktButtont
quit_callbacktpacktmainloop(troottbutton((s0/usr/lib64/python2.7/Demo/tkinter/guido/hello.pytmains	


cCstjd�dS(Ni(tsystexit(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hello.pyRs(RtTkinterR
R(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hello.pyt<module>s
		PK��Z���ooguido/dialog.pycnu�[����
Afc@sKddlTddlZd�Zd�Zd�ZedkrGe�ndS(i����(t*NcGs�t|dd�}|j|�|jd�t|dtdd�}|jdtdt�t|dtdd�}|jdtdt�t	|dd	d
|dd�}	|	jdt
d
ddtdddd�|rt|d|�}
|
jdtdddd�nt
�}g}d}
x�|D]�}t|d
|d||
d��}|j|�|
|kr�t|dtdd�}|jdtd
ddddd�|j�|jd|dtdddddddd�n.|jdtd
ddddddddd�|
d}
q!W|dkrA|jd||||d��n|j�}|j�|j�|j|�|j�|r�|j�n|j�S(Ntclass_tDialogtrelieftborderwidthitsidetfilltwidtht3ittexttfonts$-Adobe-Times-Medium-R-Normal-*-180-*texpandtpadxt3mtpadytbitmapitcommandcSs
|j|�S(N(tset(tvti((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyt<lambda>(tt2mtin_tipadxtipadyt1ms<Return>cSs|j�|j|�fS(N(tflashR(tetbRR((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyR:s	(tToplevelttitleticonnametFrametRAISEDtpacktTOPtBOTHtBOTTOMtMessagetRIGHTtLabeltLEFTtIntVartButtontappendtSUNKENtlifttbindt	focus_gettgrab_sett	focus_settwaitvartdestroytget(tmasterRR	RtdefaulttargstwttoptbottmsgtbmtvartbuttonsRtbutRtbdtoldFocus((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pytdialogsN

	(	
!
"
	




c	CsRttddddd�}dG|GHttddd	d
ddd
�}dG|GHdS(NsNot Respondings=The file server isn't responding right now; I'll keep trying.Ri����tOKspressed buttons
File ModifiedswFile "tcl.h" has been modified since the last time it was saved. Do you want to save it before exiting the application?twarningis	Save FilesDiscard ChangessReturn To Editor(RDt
mainWidget(R((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pytgoLs 			cCs}ddl}t�atjt�ttdddt�}|j�ttddd|j�}|jdt	�tj
�dS(Ni����R	sPress Here To StartRtExitR(tsysR!RGtPacktconfigR,RHR#texitR%tmainloop(RJtstarttendit((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyttestas	

t__main__(tTkinterRJRDRHRQt__name__(((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyt<module>s
	A		PK��Z���,�)�)guido/canvasevents.pyonu�[����
Afc@s�ddlTddlmZmZmZdefd��YZddd��YZdefd��YZd	dd
��YZdefd��YZd
efd��YZ	de	fd��YZ
ddd��YZd�Ze
dkr�e�ndS(i����(t*(tOvaltGroupt
CanvasTextRcBseZddd�ZRS(cCs|jj|j||�S(N(tcanvasttag_bindtid(tselftsequencetcommand((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytbindsN(t__name__t
__module__tNoneR
(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR
stObjectcBsYeZdZddddd�Zd�Zd�Zd�Zd�Zd	�Zd
�Z	RS(s�Base class for composite graphical objects.

    Objects belong to a canvas, and can be moved around on the canvas.
    They also belong to at most one ``pile'' of objects, and can be
    transferred between piles (or removed from their pile).

    Objects have a canonical ``x, y'' position which is moved when the
    object is moved.  Where the object is relative to this position
    depends on the object; for simple objects, it may be their center.

    Objects have mouse sensitivity.  They can be clicked, dragged and
    double-clicked.  The behavior may actually be determined by the pile
    they are in.

    All instance attributes are public since the derived class may
    need them.

    itredtobjectcCsJ||_||_||_d|_t|j�|_|j||�dS(N(RtxtyR
tpileRtgrouptcreateitems(RRRRtfillttext((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyt__init__#s				cCs
t|j�S(N(tstrR(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyt__str__+sc
Cs�t|j|jd|jd|jd|jdd|dd�|_|jj|j�t|j|j|jd|�|_|jj|j�dS(Nii
RtwidthiR(	RRRRt
_Object__ovalRtaddtag_withtagRt
_Object__text(RRR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR.s	+	cCsW||kodknr dS|jj||�|j||_|j||_dS(Ni(RtmoveRR(Rtdxtdy((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytmoveby7s
cCs"|j||j||j�dS(N(R"RR(RRR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytmoveto>scCsN|jr%|jj|�d|_n||_|jrJ|jj|�ndS(N(RtdeleteR
tadd(RR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyttransferAs			cCs|jj�dS(N(Rttkraise(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR'Is(
RRt__doc__RRRR"R#R&R'(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRs						tBottomcBseZdZd�ZRS(s+An object to serve as the bottom of a pile.c
Gs]t|j|jd|jd|jd|jddddd�|_|jj|j�dS(Nii
Rtgraytoutlinet(RRRRt
_Bottom__ovalRR(Rtargs((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRQs	+(RRR(R(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR)MstPilecBsPeZdZdd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
RS(	sA group of graphical objects.cCs~||_||_||_g|_t|j|j|j�|_t|jd|�|_|jj|jj�|j	�dS(Nttag(
RRRtobjectsR)tbottomRRRtbindhandlers(RRRRR0((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR\s				cCs0|jjd|j�|jjd|j�dS(Ns<1>s
<Double-1>(RR
tclickhandlertdoubleclickhandler(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR3fscCs4|jj|�|jj|j�|j|�dS(N(R1tappendRRtposition(RR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR%jscCs'|jj|j�|jj|�dS(N(RtdtagR1tremove(RR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR$oscCsF|j�|jj|�}|j|j|d|j|d�dS(Nii(R'R1tindexR#RR(RRti((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR7ss
cCsdS(N((Rtevent((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR4xscCsdS(N((RR<((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR5{sN(RRR(R
RR3R%R$R7R4R5(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR/Xs
					t
MovingPilecBsAeZd�ZdZd�ZeZd�Zd�Zd�Z	RS(cCs=tj|�|jjd|j�|jjd|j�dS(Ns<B1-Motion>s<ButtonRelease-1>(R/R3RR
t
motionhandlertreleasehandler(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR3�s
cCs�|jjd�}xMtt|j��D])}|j|}|jj|kr(Pq(q(Wd|_dS|j||_x|jD]}|j	�q|W|j
|_|j|_
dS(Ntcurrent(RtgettagstrangetlenR1RR0R
tmovethisR'RtlastxRtlasty(RR<ttagsR;to((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR4�s
	cCsm|js
dS|j|j}|j|j}|j|_|j|_x!|jD]}|j||�qOWdS(N(RDRRERRFR"(RR<R R!RH((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR>�s	cCs-|j}|sdSd|_|j|�dS(N(RDR
t
finishmove(RR<R1((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR?�s
		cCs"x|D]}|j|�qWdS(N(R7(RR1RH((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRI�s
N(
RRR3R
RDR4R5R>R?RI(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR=s			
	tPile1cBs>eZdZdZdZd�Zd�Zd�Zd�ZRS(i2tp1cCs5||_tj||jj|j|j|j�dS(N(tdemoR=RRRRR0(RRL((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR�s	cCsMy|jd}Wntk
r%dSX|j|j��tj||�dS(Ni����(R1t
IndexErrorR&totherR=R5(RR<RH((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR5�s
cCs
|jjS(N(RLtp2(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRN�scCs�|d}|j�}|j|j}}||jd||jd||jd||jdkr�x.|D]}|j|�qpWntj||�dS(Nii(RNRRR&R=RI(RR1RHtpRR((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRI�s
@
(	RRRRR0RR5RNRI(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRJ�s			tPile2cBs#eZdZdZdZd�ZRS(i�i2ROcCs
|jjS(N(RLRK(R((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRN�s(RRRRR0RN(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRQ�stDemocBseZd�ZRS(cCs�||_t|dddddddtdd�|_|jjd	d
dt�t|�|_t|�|_	t
|jddd
d�}t
|jddd
d�}t
|jddd
d�}|j|j�|j|j�|j|j	�dS(NRi�theightt
backgroundtyellowtrelieftborderwidthitexpandiRRRto1tgreento2s
light blueto3(tmastertCanvastSUNKENRtpacktBOTHRJRKRQRORR&(RR]RYR[R\((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyR�s		(RRR(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyRR�scCs6t�}t|�}|jd|j�|j�dS(NtWM_DELETE_WINDOW(tTkRRtprotocoltquittmainloop(trootRL((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pytmain�s	t__main__N((((tTkinterR^RRRRR)R/R=RJRQRRRhR(((s7/usr/lib64/python2.7/Demo/tkinter/guido/canvasevents.pyt<module>s
?'0
	PK��Zqf�XXguido/newmenubardemo.pycnu�[����
Afc@sFdZddlTddd��YZd�ZedkrBe�ndS(	s.Play with the new Tk 8.0 toplevel menu option.i����(t*tAppcBseZd�ZRS(cCsu||_t|j�|_t|j�|_|jjdd�|jjdd�|jjdd�|jj�|jjddd|jj�t|j�|_|jjdd�|jjdd�|jjdd	�t|jd
d�|_|jjdd�|jj	dd
d|j�|jj	ddd|j�|jj	ddd|j�t
d|j�|_dS(NtlabeltNewsOpen...tClosetQuittcommandtCuttCopytPastetnamethelpsAbout...tFiletmenutEdittHelp(tmastertMenutmenubartfilemenutadd_commandt
add_separatortquitteditmenuthelpmenutadd_cascadetToplevelttop(tselfR((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pyt__init__	s$	
(t__name__t
__module__R(((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pyRscCs-t�}|j�t|�}|j�dS(N(tTktwithdrawRtmainloop(troottapp((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pytmain(s	
t__main__N((t__doc__tTkinterRR%R(((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pyt<module>s

!	PK��Z	�7E� � guido/mbox.pyonu�[����
Afc@s)ddlZddlZddlZddlZddlZddlZddlTddlmZejddZ	d�Z
d�Zd�Zd	�Z
d
�Zejd�Zdd�Zdd
�Zd�Zdd�Zdadadd�Zd�Zd�Zd�Zddd�Ze
�dS(i����N(t*(tdialogtHOMEs/Mailc	Cs#daday#tjtjdd�\}}Wn(tjk
rY}|GHtjd�nXx1|D])}|d dkr�|daqa|aqaWtj�a	t	j
t�at�a
t
jatt
�atjidd6dd	6�tt�}|jid
d	6dd6�t|id
d6dd6�}|jid
d	6dd6�t|idd6�atjidd6dd	6dd6�tt
�atjdidd6td6�tjd�tjdidd6dd6�tjdt�|dftd<tdf|d<tjdtd�tjdt�tt�}|jidd6dd	6dd6�t|id
d6dd6�}|jid
d	6dd6�t|idd 6�atjidd6dd	6dd6�tt
�atjdid!d6td6�tjdid"d6td6�tjdid#d6t d6�tjd�tjdidd6dd6�tjdt!�|dftd<tdf|d<tjdt�tjdt"�tt
id$d%6�}|jid&d	6�tt
�a#t#jidd6dd	6�da%t
j&d'd�t'�t(�t
j)�dS((Ntinboxtallitit+texpandtbothtfilltytrighttsidetsunkentrelieftbditexportselectiontlefttcommandsOpen Foldertlabelt	separatortQuittexits<ButtonRelease-3>tsettyscrollcommandtyviews
<Double-1>s<3>tfixedtfontsOpen MessagesRemove MessagesRefile Messagetblacktbgtxi (*tfoldertseqtgetopttsystargvterrorRtmhlibtMHtmht
openfoldertmhftTktrootttktFramettoptpackt	ScrollbartListboxt	folderboxtMenut
foldermenutaddtopen_foldertbindt
folder_unposttfolder_posttscanboxtscanmenutopen_messagetremove_messagetrefile_messagetscan_unpostt	scan_posttbottNonetviewertminsizet
setfolderstrescantmainloop(	toptstargstmsgtargRt	folderbarRtscanbartrule2((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pytmains�#


		"	

	
""	
	
	

	
cCs9|j|j}}tj|d|d�tj�dS(Ni
(tx_rootty_rootR4tposttgrab_set(teRR
((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR9�scCs5tjdd�tj�tj�tjd�dS(Ntupdatet	idletaskstactive(R,tcallR4tgrab_releasetunposttinvoke(RT((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR8�s

cCs9|j|j}}tj|d|d�tj�dS(Ni
(RPRQR;RRRS(RTRR
((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR@�scCs5tjdd�tj�tj�tjd�dS(NRURVRW(R,RXR;RYRZR[(RT((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR?�s

s^ *([0-9]+)cCs�tj�}t|�dkr\t|�dkr9d}nd}ttd|ddd�dS|d}tj|�atjt�a	t
�dS(Nis Please open one folder at a timesPlease select a folder to opensCan't Open FolderRitOK(R2tcurselectiontlenRR+tgetRR'R(R)RF(RTtselRJti((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR6�s	
c	Cs9tj�}t|�dkr\t|�dkr9d}nd}ttd|ddd�dStd}d	td<tjd
d�|d}tj|�}tj	|�dkr+t
jtjd��}t
j|�}tr�tj�ndd
lm}|tdt|f|�atj�tj�n|td<dS(Nis!Please open one message at a timesPlease select a message to opensCan't Open MessageRiR\tcursortwatchRURVi����(t
MimeViewers+%s/%d(R:R]R^RR+R,RXR_t
scanparsertmatchtstringtatoitgroupR)topenmessageRCtdestroyRdRARR/tshow(	RTR`RJRbRatlinetnumtmRd((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR<�s,	





cCs
|dkS(Ntreceived((theader((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pytinterestingheader�scCs�tjd�}tj�}|s>ttddddd�dSg}xT|D]L}tj|�}tj|�dkrK|jt	j
tjd���qKqKWtj
|�t�tt|�|�dS(NisNo Message To Removes!Please select a message to removeRR\i(R:tnearestR]RR+R_ReRftappendRgRhRiR)tremovemessagesRFtfixfocustmin(RTtitopR`ttodoRaRm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR=�s	
&
Rc	Cs]tjd�}tj�}|s>ttddddd�dStj�}t|�dkr�|skd}nd}ttd	|ddd�dStj|d�}g}xT|D]L}tj|�}tj	|�dkr�|j
tjtj
d���q�q�Wt|kstr/|adatjt�antj|t�t�tt|�|�dS(
NisNo Message To Refiles!Please select a message to refileRR\is#Please select a folder to refile tos-Please select exactly one folder to refile tosNo Folder To Refile(R:RsR]RR+R2R^R_ReRfRtRgRhRit
lastrefilettofolderRBR'R(R)trefilemessagesRFRvRw(	RTRxR`t	folderselRJtrefiletoRyRaRm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR>�s4		
&cCs�tj�}xot|�D][}tjt|��}tj|�dkrtjtj	d��}||krtPqtqqWd}tj
|�tj|�dS(Niitend(R:tsizetrangeR_treprReRfRgRhRitselect_fromR(tnearRxtnRaRmRn((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyRv�s
cCs;tjdd�x$tj�D]}tjd|�qWdS(NiR(R2tdeleteR'tlistallfolderstinsert(tfn((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyRE
scCsWtrtj�dantjdd�x'ttt�D]}tjd|�q9WdS(NiR(	RCRkRBR:R�t
scanfolderRR R�(Rm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyRFs
	RRcCs,td�tjd||fd�j��S(NcSs|d S(Ni����((Rm((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyt<lambda>Rsscan +%s %str(tmaptostpopent	readlines(Rtsequence((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyR�s(R�R"treR!RgR%tTkinterRtenvirontmailboxROR9R8R@R?tcompileReRBR6R<RrR=RzR{R>RvRERFR�(((s//usr/lib64/python2.7/Demo/tkinter/guido/mbox.pyt<module>s4
	x						
			PK��Z�|�D��guido/paint.pycnu�[����
��^c@s`dZddlTdad
\aad�Zd�Zd�Zd�Z	e
dkr\e�nd	S(sA"Paint program by Dave Michell.

Subject: tkinter "paint" example
From: Dave Mitchell <davem@magnet.com>
To: python-list@cwi.nl
Date: Fri, 23 Jan 1998 12:18:05 -0500 (EST)

  Not too long ago (last week maybe?) someone posted a request
for an example of a paint program using Tkinter. Try as I might
I can't seem to find it in the archive, so i'll just post mine
here and hope that the person who requested it sees this!

  All this does is put up a canvas and draw a smooth black line
whenever you have the mouse button down, but hopefully it will
be enough to start with.. It would be easy enough to add some
options like other shapes or colors...

                                                yours,
                                                dave mitchell
                                                davem@magnet.com
i����(t*tupcCs]t�}t|�}|j�|jdt�|jdt�|jdt�|j�dS(Ns<Motion>s<ButtonPress-1>s<ButtonRelease-1>(tTktCanvastpacktbindtmotiontb1downtb1uptmainloop(troottdrawing_area((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pytmains	
cCs
dadS(Ntdown(tb1(tevent((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyR'scCsdadadadS(NR(RtNonetxoldtyold(R((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyR,scCsetdkratdk	rLtdk	rL|jjtt|j|jdt�n|ja|jandS(NR
tsmooth(	RRRRtwidgettcreate_linetxtytTRUE(R((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyR2s
(	t__main__N(NN(t__doc__tTkinterRRRRRRRRt__name__(((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyt<module>s
						PK��Z�<J=guido/svkill.pynuȯ��#! /usr/bin/python2.7

# Tkinter interface to SYSV `ps' and `kill' commands.

from Tkinter import *

if TkVersion < 4.0:
    raise ImportError, "This version of svkill requires Tk 4.0 or later"

from string import splitfields
from string import split
import commands
import os

user = os.environ['LOGNAME']

class BarButton(Menubutton):
    def __init__(self, master=None, **cnf):
        apply(Menubutton.__init__, (self, master), cnf)
        self.pack(side=LEFT)
        self.menu = Menu(self, name='menu')
        self['menu'] = self.menu

class Kill(Frame):
    # List of (name, option, pid_column)
    view_list = [
            ('Default', ''),
            ('Every (-e)', '-e'),
            ('Non process group leaders (-d)', '-d'),
            ('Non leaders with tty (-a)', '-a'),
            ('For this user (-u %s)' % user, '-u %s' % user),
            ]
    format_list = [
            ('Default', '', 0),
            ('Long (-l)', '-l', 3),
            ('Full (-f)', '-f', 1),
            ('Full Long (-f -l)', '-l -f', 3),
            ('Session and group ID (-j)', '-j', 0),
            ('Scheduler properties (-c)', '-c', 0),
            ]
    def kill(self, selected):
        c = self.format_list[self.format.get()][2]
        pid = split(selected)[c]
        os.system('kill -9 ' + pid)
        self.do_update()
    def do_update(self):
        format = self.format_list[self.format.get()][1]
        view = self.view_list[self.view.get()][1]
        s = commands.getoutput('ps %s %s' % (view, format))
        list = splitfields(s, '\n')
        self.header.set(list[0] + '          ')
        del list[0]
        self.frame.list.delete(0, AtEnd())
        for line in list:
            self.frame.list.insert(0, line)
    def do_motion(self, e):
        e.widget.select_clear('0', 'end')
        e.widget.select_set(e.widget.nearest(e.y))
    def do_leave(self, e):
        e.widget.select_clear('0', 'end')
    def do_1(self, e):
        self.kill(e.widget.get(e.widget.nearest(e.y)))
    def __init__(self, master=None, **cnf):
        apply(Frame.__init__, (self, master), cnf)
        self.pack(expand=1, fill=BOTH)
        self.bar = Frame(self, name='bar', relief=RAISED,
                         borderwidth=2)
        self.bar.pack(fill=X)
        self.bar.file = BarButton(self.bar, text='File')
        self.bar.file.menu.add_command(
                label='Quit', command=self.quit)
        self.bar.view = BarButton(self.bar, text='View')
        self.bar.format = BarButton(self.bar, text='Format')
        self.view = IntVar(self)
        self.view.set(0)
        self.format = IntVar(self)
        self.format.set(0)
        for num in range(len(self.view_list)):
            label, option = self.view_list[num]
            self.bar.view.menu.add_radiobutton(
                    label=label,
                    command=self.do_update,
                    variable=self.view,
                    value=num)
        for num in range(len(self.format_list)):
            label, option, col = self.format_list[num]
            self.bar.format.menu.add_radiobutton(
                    label=label,
                    command=self.do_update,
                    variable=self.format,
                    value=num)
        self.bar.tk_menuBar(self.bar.file,
                            self.bar.view,
                            self.bar.format)
        self.frame = Frame(self, relief=RAISED, borderwidth=2)
        self.frame.pack(expand=1, fill=BOTH)
        self.header = StringVar(self)
        self.frame.label = Label(
                self.frame, relief=FLAT, anchor=NW, borderwidth=0,
                font='*-Courier-Bold-R-Normal-*-120-*',
                textvariable=self.header)
        self.frame.label.pack(fill=Y, anchor=W)
        self.frame.vscroll = Scrollbar(self.frame, orient=VERTICAL)
        self.frame.list = Listbox(
                self.frame,
                relief=SUNKEN,
                font='*-Courier-Medium-R-Normal-*-120-*',
                width=40, height=10,
                selectbackground='#eed5b7',
                selectborderwidth=0,
                selectmode=BROWSE,
                yscroll=self.frame.vscroll.set)
        self.frame.vscroll['command'] = self.frame.list.yview
        self.frame.vscroll.pack(side=RIGHT, fill=Y)
        self.frame.list.pack(expand=1, fill=BOTH)
        self.update = Button(self, text='Update',
                             command=self.do_update)
        self.update.pack(fill=X)
        self.frame.list.bind('<Motion>', self.do_motion)
        self.frame.list.bind('<Leave>', self.do_leave)
        self.frame.list.bind('<1>', self.do_1)
        self.do_update()

if __name__ == '__main__':
    kill = Kill(None, borderwidth=5)
    kill.winfo_toplevel().title('Tkinter Process Killer (SYSV)')
    kill.winfo_toplevel().minsize(1, 1)
    kill.mainloop()
PK��Z����YYguido/brownian.pycnu�[����
��^c@s�ddlTddlZddlZddlZddlZdZdZdZdZdZ	dZ
dZdad	�Z
d
�Ze�dS(i����(t*Ni�i,i
itredicCs�t}tjtdt�}tjtdt�}|j||||||||dt�}xvts�tjdt	�}tjdt	�}tj
t�}y|j|||�Wnt
k
r�PnXtj|�qcWdS(Ng@tfilli(tRADIUStrandomtgausstWIDTHtSIGMAtHEIGHTtcreate_ovaltFILLtstoptBUZZtexpovariatetLAMBDAtmovetTclErrorttimetsleep(tcanvastrtxtytptdxtdytdt((s3/usr/lib64/python2.7/Demo/tkinter/guido/brownian.pytparticles.	
cCs�t�}t|dtdt�}|jdddd�d}tjdr`ttjd�}nx9t|�D]+}t	j
dtd	|f�}|j�qmWz|j
�WddaXdS(
NtwidththeightRtbothtexpandiittargettargs(tTktCanvasRRtpacktsystargvtinttranget	threadingtThreadRtstarttmainloopR(trootRtnptitt((s3/usr/lib64/python2.7/Demo/tkinter/guido/brownian.pytmain"s	
(tTkinterRR)RR%RRRRRRR
RRR1(((s3/usr/lib64/python2.7/Demo/tkinter/guido/brownian.pyt<module>s
		PK��Z&Y���guido/listtree.pyonu�[����
��^c@sWddlZddlZddlTd�Zd�Zd�ZedkrSe�ndS(i����N(t*cCs?t|dd�}|jdddt�t||dd�|S(Ntnametlisttexpanditfillt.i(tListboxtpacktBOTHt	listnodes(tmastertappR((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pytlisttreescCs�|j|dd|�}|jtd||f�|jj|j|dd|��}x%|D]}t||||d�q]WdS(Ntwinfotclasss%s (%s)tchildreni(tsendtinserttENDttkt	splitlistR	(RRtwidgettleveltklassRtc((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pyR	s	
cCs�tjds-tjjd�tjd�ntjd}t�}|jdd�t|dd�}|jdddt	�t
||�}|j�dS(NisUsage: listtree appname
iRtfRR(tsystargvtstderrtwritetexittTktminsizetFrameRRRtmainloop(RRRR((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pytmains

	t__main__(RtstringtTkinterRR	R#t__name__(((s3/usr/lib64/python2.7/Demo/tkinter/guido/listtree.pyt<module>s
		
	PK��Z/	Ŕccguido/brownian2.pynu�[���# Brownian motion -- an example of a NON multi-threaded Tkinter program ;)
# By Michele Simoniato, inspired by brownian.py

from Tkinter import *
import random
import sys

WIDTH = 400
HEIGHT = 300
SIGMA = 10
BUZZ = 2
RADIUS = 2
LAMBDA = 10
FILL = 'red'

stop = 0                                # Set when main loop exits
root = None                             # main window

def particle(canvas):                   # particle = iterator over the moves
    r = RADIUS
    x = random.gauss(WIDTH/2.0, SIGMA)
    y = random.gauss(HEIGHT/2.0, SIGMA)
    p = canvas.create_oval(x-r, y-r, x+r, y+r, fill=FILL)
    while not stop:
        dx = random.gauss(0, BUZZ)
        dy = random.gauss(0, BUZZ)
        try:
            canvas.move(p, dx, dy)
        except TclError:
            break
        else:
            yield None

def move(particle): # move the particle at random time
    particle.next()
    dt = random.expovariate(LAMBDA)
    root.after(int(dt*1000), move, particle)

def main():
    global root, stop
    root = Tk()
    canvas = Canvas(root, width=WIDTH, height=HEIGHT)
    canvas.pack(fill='both', expand=1)
    np = 30
    if sys.argv[1:]:
        np = int(sys.argv[1])
    for i in range(np):                  # start the dance
        move(particle(canvas))
    try:
        root.mainloop()
    finally:
        stop = 1

if __name__ == '__main__':
    main()
PK��Z%L��guido/brownian2.pyonu�[����
��^c@s�ddlTddlZddlZdZdZdZdZdZdZdZ	da
dad	�Z
d
�Zd�Zedkr�e�ndS(
i����(t*Ni�i,i
itrediccs�t}tjtdt�}tjtdt�}|j||||||||dt�}x_ts�tjdt	�}tjdt	�}y|j
|||�Wntk
r�PqcXdVqcWdS(Ng@tfilli(
tRADIUStrandomtgausstWIDTHtSIGMAtHEIGHTtcreate_ovaltFILLtstoptBUZZtmovetTclErrortNone(tcanvastrtxtytptdxtdy((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pytparticles.	
cCs:|j�tjt�}tjt|d�t|�dS(Ni�(tnextRtexpovariatetLAMBDAtroottaftertintR
(Rtdt((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pyR
"s
cCs�t�attdtdt�}|jdddd�d}tjdr`ttjd�}nx$t	|�D]}t
t|��qmWztj�Wdda
XdS(NtwidththeightRtbothtexpandii(tTkRtCanvasRRtpacktsystargvRtrangeR
RtmainloopR(Rtnpti((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pytmain's	
t__main__(tTkinterRR&RRRRRRR
RRRRR
R,t__name__(((s4/usr/lib64/python2.7/Demo/tkinter/guido/brownian2.pyt<module>s 
			PK��Zե�))guido/hanoi.pynu�[���# Animated Towers of Hanoi using Tk with optional bitmap file in
# background.
#
# Usage: tkhanoi [n [bitmapfile]]
#
# n is the number of pieces to animate; default is 4, maximum 15.
#
# The bitmap file can be any X11 bitmap file (look in
# /usr/include/X11/bitmaps for samples); it is displayed as the
# background of the animation.  Default is no bitmap.

# This uses Steen Lumholt's Tk interface
from Tkinter import *


# Basic Towers-of-Hanoi algorithm: move n pieces from a to b, using c
# as temporary.  For each move, call report()
def hanoi(n, a, b, c, report):
    if n <= 0: return
    hanoi(n-1, a, c, b, report)
    report(n, a, b)
    hanoi(n-1, c, b, a, report)


# The graphical interface
class Tkhanoi:

    # Create our objects
    def __init__(self, n, bitmap = None):
        self.n = n
        self.tk = tk = Tk()
        self.canvas = c = Canvas(tk)
        c.pack()
        width, height = tk.getint(c['width']), tk.getint(c['height'])

        # Add background bitmap
        if bitmap:
            self.bitmap = c.create_bitmap(width//2, height//2,
                                          bitmap=bitmap,
                                          foreground='blue')

        # Generate pegs
        pegwidth = 10
        pegheight = height//2
        pegdist = width//3
        x1, y1 = (pegdist-pegwidth)//2, height*1//3
        x2, y2 = x1+pegwidth, y1+pegheight
        self.pegs = []
        p = c.create_rectangle(x1, y1, x2, y2, fill='black')
        self.pegs.append(p)
        x1, x2 = x1+pegdist, x2+pegdist
        p = c.create_rectangle(x1, y1, x2, y2, fill='black')
        self.pegs.append(p)
        x1, x2 = x1+pegdist, x2+pegdist
        p = c.create_rectangle(x1, y1, x2, y2, fill='black')
        self.pegs.append(p)
        self.tk.update()

        # Generate pieces
        pieceheight = pegheight//16
        maxpiecewidth = pegdist*2//3
        minpiecewidth = 2*pegwidth
        self.pegstate = [[], [], []]
        self.pieces = {}
        x1, y1 = (pegdist-maxpiecewidth)//2, y2-pieceheight-2
        x2, y2 = x1+maxpiecewidth, y1+pieceheight
        dx = (maxpiecewidth-minpiecewidth) // (2*max(1, n-1))
        for i in range(n, 0, -1):
            p = c.create_rectangle(x1, y1, x2, y2, fill='red')
            self.pieces[i] = p
            self.pegstate[0].append(i)
            x1, x2 = x1 + dx, x2-dx
            y1, y2 = y1 - pieceheight-2, y2-pieceheight-2
            self.tk.update()
            self.tk.after(25)

    # Run -- never returns
    def run(self):
        while 1:
            hanoi(self.n, 0, 1, 2, self.report)
            hanoi(self.n, 1, 2, 0, self.report)
            hanoi(self.n, 2, 0, 1, self.report)
            hanoi(self.n, 0, 2, 1, self.report)
            hanoi(self.n, 2, 1, 0, self.report)
            hanoi(self.n, 1, 0, 2, self.report)

    # Reporting callback for the actual hanoi function
    def report(self, i, a, b):
        if self.pegstate[a][-1] != i: raise RuntimeError # Assertion
        del self.pegstate[a][-1]
        p = self.pieces[i]
        c = self.canvas

        # Lift the piece above peg a
        ax1, ay1, ax2, ay2 = c.bbox(self.pegs[a])
        while 1:
            x1, y1, x2, y2 = c.bbox(p)
            if y2 < ay1: break
            c.move(p, 0, -1)
            self.tk.update()

        # Move it towards peg b
        bx1, by1, bx2, by2 = c.bbox(self.pegs[b])
        newcenter = (bx1+bx2)//2
        while 1:
            x1, y1, x2, y2 = c.bbox(p)
            center = (x1+x2)//2
            if center == newcenter: break
            if center > newcenter: c.move(p, -1, 0)
            else: c.move(p, 1, 0)
            self.tk.update()

        # Move it down on top of the previous piece
        pieceheight = y2-y1
        newbottom = by2 - pieceheight*len(self.pegstate[b]) - 2
        while 1:
            x1, y1, x2, y2 = c.bbox(p)
            if y2 >= newbottom: break
            c.move(p, 0, 1)
            self.tk.update()

        # Update peg state
        self.pegstate[b].append(i)


# Main program
def main():
    import sys, string

    # First argument is number of pegs, default 4
    if sys.argv[1:]:
        n = string.atoi(sys.argv[1])
    else:
        n = 4

    # Second argument is bitmap file, default none
    if sys.argv[2:]:
        bitmap = sys.argv[2]
        # Reverse meaning of leading '@' compared to Tk
        if bitmap[0] == '@': bitmap = bitmap[1:]
        else: bitmap = '@' + bitmap
    else:
        bitmap = None

    # Create the graphical objects...
    h = Tkhanoi(n, bitmap)

    # ...and run!
    h.run()


# Call main when run as script
if __name__ == '__main__':
    main()
PK��Z���ooguido/dialog.pyonu�[����
Afc@sKddlTddlZd�Zd�Zd�ZedkrGe�ndS(i����(t*NcGs�t|dd�}|j|�|jd�t|dtdd�}|jdtdt�t|dtdd�}|jdtdt�t	|dd	d
|dd�}	|	jdt
d
ddtdddd�|rt|d|�}
|
jdtdddd�nt
�}g}d}
x�|D]�}t|d
|d||
d��}|j|�|
|kr�t|dtdd�}|jdtd
ddddd�|j�|jd|dtdddddddd�n.|jdtd
ddddddddd�|
d}
q!W|dkrA|jd||||d��n|j�}|j�|j�|j|�|j�|r�|j�n|j�S(Ntclass_tDialogtrelieftborderwidthitsidetfilltwidtht3ittexttfonts$-Adobe-Times-Medium-R-Normal-*-180-*texpandtpadxt3mtpadytbitmapitcommandcSs
|j|�S(N(tset(tvti((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyt<lambda>(tt2mtin_tipadxtipadyt1ms<Return>cSs|j�|j|�fS(N(tflashR(tetbRR((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyR:s	(tToplevelttitleticonnametFrametRAISEDtpacktTOPtBOTHtBOTTOMtMessagetRIGHTtLabeltLEFTtIntVartButtontappendtSUNKENtlifttbindt	focus_gettgrab_sett	focus_settwaitvartdestroytget(tmasterRR	RtdefaulttargstwttoptbottmsgtbmtvartbuttonsRtbutRtbdtoldFocus((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pytdialogsN

	(	
!
"
	




c	CsRttddddd�}dG|GHttddd	d
ddd
�}dG|GHdS(NsNot Respondings=The file server isn't responding right now; I'll keep trying.Ri����tOKspressed buttons
File ModifiedswFile "tcl.h" has been modified since the last time it was saved. Do you want to save it before exiting the application?twarningis	Save FilesDiscard ChangessReturn To Editor(RDt
mainWidget(R((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pytgoLs 			cCs}ddl}t�atjt�ttdddt�}|j�ttddd|j�}|jdt	�tj
�dS(Ni����R	sPress Here To StartRtExitR(tsysR!RGtPacktconfigR,RHR#texitR%tmainloop(RJtstarttendit((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyttestas	

t__main__(tTkinterRJRDRHRQt__name__(((s1/usr/lib64/python2.7/Demo/tkinter/guido/dialog.pyt<module>s
	A		PK��Z��|
��guido/MimeViewer.pynuȯ��#! /usr/bin/python2.7

# View a single MIME multipart message.
# Display each part as a box.

import string
from types import *
from Tkinter import *
from ScrolledText import ScrolledText

class MimeViewer:
    def __init__(self, parent, title, msg):
        self.title = title
        self.msg = msg
        self.frame = Frame(parent, {'relief': 'raised', 'bd': 2})
        self.frame.packing = {'expand': 0, 'fill': 'both'}
        self.button = Checkbutton(self.frame,
                             {'text': title,
                              'command': self.toggle})
        self.button.pack({'anchor': 'w'})
        headertext = msg.getheadertext(
                lambda x: x != 'received' and x[:5] != 'x400-')
        height = countlines(headertext, 4)
        if height:
            self.htext = ScrolledText(self.frame,
                              {'height': height,
                               'width': 80,
                               'wrap': 'none',
                               'relief': 'raised',
                               'bd': 2})
            self.htext.packing = {'expand': 1, 'fill': 'both',
                                  'after': self.button}
            self.htext.insert('end', headertext)
        else:
            self.htext = Frame(self.frame,
                               {'relief': 'raised', 'bd': 2})
            self.htext.packing = {'side': 'top',
                                  'ipady': 2,
                                  'fill': 'x',
                                  'after': self.button}
        body = msg.getbody()
        if type(body) == StringType:
            self.pad = None
            height = countlines(body, 10)
            if height:
                self.btext = ScrolledText(self.frame,
                                  {'height': height,
                                   'width': 80,
                                   'wrap': 'none',
                                   'relief': 'raised',
                                   'bd': 2})
                self.btext.packing = {'expand': 1,
                                      'fill': 'both'}
                self.btext.insert('end', body)
            else:
                self.btext = None
            self.parts = None
        else:
            self.pad = Frame(self.frame,
                             {'relief': 'flat', 'bd': 2})
            self.pad.packing = {'side': 'left', 'ipadx': 10,
                                'fill': 'y', 'after': self.htext}
            self.parts = []
            for i in range(len(body)):
                p = MimeViewer(self.frame,
                               '%s.%d' % (title, i+1),
                               body[i])
                self.parts.append(p)
            self.btext = None
        self.collapsed = 1
    def pack(self):
        self.frame.pack(self.frame.packing)
    def destroy(self):
        self.frame.destroy()
    def show(self):
        if self.collapsed:
            self.button.invoke()
    def toggle(self):
        if self.collapsed:
            self.explode()
        else:
            self.collapse()
    def collapse(self):
        self.collapsed = 1
        for comp in self.htext, self.btext, self.pad:
            if comp:
                comp.forget()
        if self.parts:
            for part in self.parts:
                part.frame.forget()
        self.frame.pack({'expand': 0})
    def explode(self):
        self.collapsed = 0
        for comp in self.htext, self.btext, self.pad:
            if comp: comp.pack(comp.packing)
        if self.parts:
            for part in self.parts:
                part.pack()
        self.frame.pack({'expand': 1})

def countlines(str, limit):
    i = 0
    n = 0
    while  n < limit:
        i = string.find(str, '\n', i)
        if i < 0: break
        n = n+1
        i = i+1
    return n

def main():
    import sys
    import getopt
    import mhlib
    opts, args = getopt.getopt(sys.argv[1:], '')
    for o, a in opts:
        pass
    message = None
    folder = 'inbox'
    for arg in args:
        if arg[:1] == '+':
            folder = arg[1:]
        else:
            message = string.atoi(arg)

    mh = mhlib.MH()
    f = mh.openfolder(folder)
    if not message:
        message = f.getcurrent()
    m = f.openmessage(message)

    root = Tk()
    tk = root.tk

    top = MimeViewer(root, '+%s/%d' % (folder, message), m)
    top.pack()
    top.show()

    root.minsize(1, 1)

    tk.mainloop()

if __name__ == '__main__': main()
PK��Z�|�D��guido/paint.pyonu�[����
��^c@s`dZddlTdad
\aad�Zd�Zd�Zd�Z	e
dkr\e�nd	S(sA"Paint program by Dave Michell.

Subject: tkinter "paint" example
From: Dave Mitchell <davem@magnet.com>
To: python-list@cwi.nl
Date: Fri, 23 Jan 1998 12:18:05 -0500 (EST)

  Not too long ago (last week maybe?) someone posted a request
for an example of a paint program using Tkinter. Try as I might
I can't seem to find it in the archive, so i'll just post mine
here and hope that the person who requested it sees this!

  All this does is put up a canvas and draw a smooth black line
whenever you have the mouse button down, but hopefully it will
be enough to start with.. It would be easy enough to add some
options like other shapes or colors...

                                                yours,
                                                dave mitchell
                                                davem@magnet.com
i����(t*tupcCs]t�}t|�}|j�|jdt�|jdt�|jdt�|j�dS(Ns<Motion>s<ButtonPress-1>s<ButtonRelease-1>(tTktCanvastpacktbindtmotiontb1downtb1uptmainloop(troottdrawing_area((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pytmains	
cCs
dadS(Ntdown(tb1(tevent((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyR'scCsdadadadS(NR(RtNonetxoldtyold(R((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyR,scCsetdkratdk	rLtdk	rL|jjtt|j|jdt�n|ja|jandS(NR
tsmooth(	RRRRtwidgettcreate_linetxtytTRUE(R((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyR2s
(	t__main__N(NN(t__doc__tTkinterRRRRRRRRt__name__(((s0/usr/lib64/python2.7/Demo/tkinter/guido/paint.pyt<module>s
						PK��Z�(�V��guido/ManPage.pynu�[���# Widget to display a man page

import re
from Tkinter import *
from Tkinter import _tkinter
from ScrolledText import ScrolledText

# XXX These fonts may have to be changed to match your system
BOLDFONT = '*-Courier-Bold-R-Normal-*-120-*'
ITALICFONT = '*-Courier-Medium-O-Normal-*-120-*'

# XXX Recognizing footers is system dependent
# (This one works for IRIX 5.2 and Solaris 2.2)
footerprog = re.compile(
        '^     Page [1-9][0-9]*[ \t]+\|^.*Last change:.*[1-9][0-9]*\n')
emptyprog = re.compile('^[ \t]*\n')
ulprog = re.compile('^[ \t]*[Xv!_][Xv!_ \t]*\n')

# Basic Man Page class -- does not disable editing
class EditableManPage(ScrolledText):

    # Initialize instance
    def __init__(self, master=None, **cnf):
        # Initialize base class
        apply(ScrolledText.__init__, (self, master), cnf)

        # Define tags for formatting styles
        self.tag_config('X', underline=1)
        self.tag_config('!', font=BOLDFONT)
        self.tag_config('_', font=ITALICFONT)

        # Set state to idle
        self.fp = None
        self.lineno = 0

    # Test whether we are busy parsing a file
    def busy(self):
        return self.fp != None

    # Ensure we're not busy
    def kill(self):
        if self.busy():
            self._endparser()

    # Parse a file, in the background
    def asyncparsefile(self, fp):
        self._startparser(fp)
        self.tk.createfilehandler(fp, _tkinter.READABLE,
                                  self._filehandler)

    parsefile = asyncparsefile      # Alias

    # I/O handler used by background parsing
    def _filehandler(self, fp, mask):
        nextline = self.fp.readline()
        if not nextline:
            self._endparser()
            return
        self._parseline(nextline)

    # Parse a file, now (cannot be aborted)
    def syncparsefile(self, fp):
        from select import select
        def avail(fp=fp, tout=0.0, select=select):
            return select([fp], [], [], tout)[0]
        height = self.getint(self['height'])
        self._startparser(fp)
        while 1:
            nextline = fp.readline()
            if not nextline:
                break
            self._parseline(nextline)
        self._endparser()

    # Initialize parsing from a particular file -- must not be busy
    def _startparser(self, fp):
        if self.busy():
            raise RuntimeError, 'startparser: still busy'
        fp.fileno()             # Test for file-ness
        self.fp = fp
        self.lineno = 0
        self.ok = 0
        self.empty = 0
        self.buffer = None
        savestate = self['state']
        self['state'] = NORMAL
        self.delete('1.0', END)
        self['state'] = savestate

    # End parsing -- must be busy, need not be at EOF
    def _endparser(self):
        if not self.busy():
            raise RuntimeError, 'endparser: not busy'
        if self.buffer:
            self._parseline('')
        try:
            self.tk.deletefilehandler(self.fp)
        except TclError, msg:
            pass
        self.fp.close()
        self.fp = None
        del self.ok, self.empty, self.buffer

    # Parse a single line
    def _parseline(self, nextline):
        if not self.buffer:
            # Save this line -- we need one line read-ahead
            self.buffer = nextline
            return
        if emptyprog.match(self.buffer) >= 0:
            # Buffered line was empty -- set a flag
            self.empty = 1
            self.buffer = nextline
            return
        textline = self.buffer
        if ulprog.match(nextline) >= 0:
            # Next line is properties for buffered line
            propline = nextline
            self.buffer = None
        else:
            # Next line is read-ahead
            propline = None
            self.buffer = nextline
        if not self.ok:
            # First non blank line after footer must be header
            # -- skip that too
            self.ok = 1
            self.empty = 0
            return
        if footerprog.match(textline) >= 0:
            # Footer -- start skipping until next non-blank line
            self.ok = 0
            self.empty = 0
            return
        savestate = self['state']
        self['state'] = NORMAL
        if TkVersion >= 4.0:
            self.mark_set('insert', 'end-1c')
        else:
            self.mark_set('insert', END)
        if self.empty:
            # One or more previous lines were empty
            # -- insert one blank line in the text
            self._insert_prop('\n')
            self.lineno = self.lineno + 1
            self.empty = 0
        if not propline:
            # No properties
            self._insert_prop(textline)
        else:
            # Search for properties
            p = ''
            j = 0
            for i in range(min(len(propline), len(textline))):
                if propline[i] != p:
                    if j < i:
                        self._insert_prop(textline[j:i], p)
                        j = i
                    p = propline[i]
            self._insert_prop(textline[j:])
        self.lineno = self.lineno + 1
        self['state'] = savestate

    # Insert a string at the end, with at most one property (tag)
    def _insert_prop(self, str, prop = ' '):
        here = self.index(AtInsert())
        self.insert(AtInsert(), str)
        if TkVersion <= 4.0:
            tags = self.tag_names(here)
            for tag in tags:
                self.tag_remove(tag, here, AtInsert())
        if prop != ' ':
            self.tag_add(prop, here, AtInsert())

# Readonly Man Page class -- disables editing, otherwise the same
class ReadonlyManPage(EditableManPage):

    # Initialize instance
    def __init__(self, master=None, **cnf):
        cnf['state'] = DISABLED
        apply(EditableManPage.__init__, (self, master), cnf)

# Alias
ManPage = ReadonlyManPage

# Test program.
# usage: ManPage [manpage]; or ManPage [-f] file
# -f means that the file is nroff -man output run through ul -i
def test():
    import os
    import sys
    # XXX This directory may be different on your system
    MANDIR = '/usr/local/man/mann'
    DEFAULTPAGE = 'Tcl'
    formatted = 0
    if sys.argv[1:] and sys.argv[1] == '-f':
        formatted = 1
        del sys.argv[1]
    if sys.argv[1:]:
        name = sys.argv[1]
    else:
        name = DEFAULTPAGE
    if not formatted:
        if name[-2:-1] != '.':
            name = name + '.n'
        name = os.path.join(MANDIR, name)
    root = Tk()
    root.minsize(1, 1)
    manpage = ManPage(root, relief=SUNKEN, borderwidth=2)
    manpage.pack(expand=1, fill=BOTH)
    if formatted:
        fp = open(name, 'r')
    else:
        fp = os.popen('nroff -man %s | ul -i' % name, 'r')
    manpage.parsefile(fp)
    root.mainloop()

# Run the test program when called as a script
if __name__ == '__main__':
    test()
PK��Z`�xIIguido/hanoi.pycnu�[����
��^c@sIddlTd�Zddd��YZd�ZedkrEe�ndS(	i����(t*cCsX|dkrdSt|d||||�||||�t|d||||�dS(Nii(thanoi(tntatbtctreport((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyRs
tTkhanoicBs&eZdd�Zd�Zd�ZRS(cCs�||_t�|_}t|�|_}|j�|j|d�|j|d�}}|r�|j|d|dd|dd�|_nd}|d}|d}	|	|d|d	d}
}|
|||}}
g|_	|j
|
|||
d
d�}|j	j|�|
|	||	}
}|j
|
|||
d
d�}|j	j|�|
|	||	}
}|j
|
|||
d
d�}|j	j|�|jj�|d}|	dd}d|}gggg|_
i|_|	|d|
|d}
}|
|||}}
||dtd	|d	�}x�t|d
d�D]�}|j
|
|||
d
d�}||j|<|j
d
j|�|
|||}
}||d|
|d}}
|jj�|jjd�qFWdS(Ntwidththeightitbitmapt
foregroundtbluei
iitfilltblackiii����tredi(RtTkttktCanvastcanvastpacktgetintt
create_bitmapR
tpegstcreate_rectangletappendtupdatetpegstatetpiecestmaxtrangetafter(tselfRR
RRRR	tpegwidtht	pegheighttpegdisttx1ty1tx2ty2tptpieceheightt
maxpiecewidtht
minpiecewidthtdxti((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyt__init__sP	
'

	


	

cCs�x�t|jddd|j�t|jddd|j�t|jddd|j�t|jddd|j�t|jddd|j�t|jddd|j�qWdS(Niii(RRR(R ((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pytrunNscCs�|j|d|kr t�n|j|d=|j|}|j}|j|j|�\}}}}	xO|j|�\}
}}}
|
|kr�Pn|j|dd�|jj�qiW|j|j|�\}}}}||d}x|j|�\}
}}}
|
|d}||kr$Pn||krF|j|dd�n|j|dd�|jj�q�W|
|}||t	|j|�d}xO|j|�\}
}}}
|
|kr�Pn|j|dd�|jj�q�W|j|j
|�dS(Ni����iii(RtRuntimeErrorRRtbboxRtmoveRRtlenR(R R-RRR(Rtax1tay1tax2tay2R$R%R&R'tbx1tby1tbx2tby2t	newcentertcenterR)t	newbottom((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyRXs@	
	""
N(t__name__t
__module__tNoneR.R/R(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyRs1	
cCs�ddl}ddl}|jdr>|j|jd�}nd}|jdr�|jd}|ddkr{|d}q�d|}nd}t||�}|j�dS(Ni����iiiit@(tsyststringtargvtatoiRARR/(RCRDRR
th((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pytmains




t__main__N((tTkinterRRRHR?(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hanoi.pyt<module>
s

	e	PK��Zk>'��guido/hello.pycnu�[����
��^c@s3ddlZddlTd�Zd�Ze�dS(i����N(t*cCsAt�}t|�}d|d<t|d<|j�|j�dS(NsHello, worldttexttcommand(tTktButtont
quit_callbacktpacktmainloop(troottbutton((s0/usr/lib64/python2.7/Demo/tkinter/guido/hello.pytmains	


cCstjd�dS(Ni(tsystexit(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hello.pyRs(RtTkinterR
R(((s0/usr/lib64/python2.7/Demo/tkinter/guido/hello.pyt<module>s
		PK��Z�`&�CCguido/brownian.pynu�[���# Brownian motion -- an example of a multi-threaded Tkinter program.

from Tkinter import *
import random
import threading
import time
import sys

WIDTH = 400
HEIGHT = 300
SIGMA = 10
BUZZ = 2
RADIUS = 2
LAMBDA = 10
FILL = 'red'

stop = 0                                # Set when main loop exits

def particle(canvas):
    r = RADIUS
    x = random.gauss(WIDTH/2.0, SIGMA)
    y = random.gauss(HEIGHT/2.0, SIGMA)
    p = canvas.create_oval(x-r, y-r, x+r, y+r, fill=FILL)
    while not stop:
        dx = random.gauss(0, BUZZ)
        dy = random.gauss(0, BUZZ)
        dt = random.expovariate(LAMBDA)
        try:
            canvas.move(p, dx, dy)
        except TclError:
            break
        time.sleep(dt)

def main():
    global stop
    root = Tk()
    canvas = Canvas(root, width=WIDTH, height=HEIGHT)
    canvas.pack(fill='both', expand=1)
    np = 30
    if sys.argv[1:]:
        np = int(sys.argv[1])
    for i in range(np):
        t = threading.Thread(target=particle, args=(canvas,))
        t.start()
    try:
        root.mainloop()
    finally:
        stop = 1

main()
PK��Z�Ṁ��guido/dialog.pynuȯ��#! /usr/bin/python2.7

# A Python function that generates dialog boxes with a text message,
# optional bitmap, and any number of buttons.
# Cf. Ousterhout, Tcl and the Tk Toolkit, Figs. 27.2-3, pp. 269-270.

from Tkinter import *
import sys


def dialog(master, title, text, bitmap, default, *args):

    # 1. Create the top-level window and divide it into top
    # and bottom parts.

    w = Toplevel(master, class_='Dialog')
    w.title(title)
    w.iconname('Dialog')

    top = Frame(w, relief=RAISED, borderwidth=1)
    top.pack(side=TOP, fill=BOTH)
    bot = Frame(w, relief=RAISED, borderwidth=1)
    bot.pack(side=BOTTOM, fill=BOTH)

    # 2. Fill the top part with the bitmap and message.

    msg = Message(top, width='3i', text=text,
                  font='-Adobe-Times-Medium-R-Normal-*-180-*')
    msg.pack(side=RIGHT, expand=1, fill=BOTH, padx='3m', pady='3m')
    if bitmap:
        bm = Label(top, bitmap=bitmap)
        bm.pack(side=LEFT, padx='3m', pady='3m')

    # 3. Create a row of buttons at the bottom of the dialog.

    var = IntVar()
    buttons = []
    i = 0
    for but in args:
        b = Button(bot, text=but, command=lambda v=var,i=i: v.set(i))
        buttons.append(b)
        if i == default:
            bd = Frame(bot, relief=SUNKEN, borderwidth=1)
            bd.pack(side=LEFT, expand=1, padx='3m', pady='2m')
            b.lift()
            b.pack (in_=bd, side=LEFT,
                    padx='2m', pady='2m', ipadx='2m', ipady='1m')
        else:
            b.pack (side=LEFT, expand=1,
                    padx='3m', pady='3m', ipadx='2m', ipady='1m')
        i = i+1

    # 4. Set up a binding for <Return>, if there's a default,
    # set a grab, and claim the focus too.

    if default >= 0:
        w.bind('<Return>',
               lambda e, b=buttons[default], v=var, i=default:
               (b.flash(),
                v.set(i)))

    oldFocus = w.focus_get()
    w.grab_set()
    w.focus_set()

    # 5. Wait for the user to respond, then restore the focus
    # and return the index of the selected button.

    w.waitvar(var)
    w.destroy()
    if oldFocus: oldFocus.focus_set()
    return var.get()

# The rest is the test program.

def go():
    i = dialog(mainWidget,
               'Not Responding',
               "The file server isn't responding right now; "
               "I'll keep trying.",
               '',
               -1,
               'OK')
    print 'pressed button', i
    i = dialog(mainWidget,
               'File Modified',
               'File "tcl.h" has been modified since '
               'the last time it was saved. '
               'Do you want to save it before exiting the application?',
               'warning',
               0,
               'Save File',
               'Discard Changes',
               'Return To Editor')
    print 'pressed button', i

def test():
    import sys
    global mainWidget
    mainWidget = Frame()
    Pack.config(mainWidget)
    start = Button(mainWidget, text='Press Here To Start', command=go)
    start.pack()
    endit = Button(mainWidget, text="Exit", command=sys.exit)
    endit.pack(fill=BOTH)
    mainWidget.mainloop()

if __name__ == '__main__':
    test()
PK��Z�h��guido/imagedraw.pyonu�[����
��^c@s9dZddlTddlZd�Zd�Ze�dS(sDraw on top of an imagei����(t*NcCs�tjd}t�}td|�}|j�|j�}}t|d|d|�}|jdddtd|�|j	�|j
dt�|j�dS(	Nitfiletwidththeightitanchortimages
<Button-1>(
tsystargvtTkt
PhotoImageRRtCanvastcreate_imagetNWtpacktbindtblobtmainloop(tfilenametroottimgtwthtcanv((s4/usr/lib64/python2.7/Demo/tkinter/guido/imagedraw.pytmains
	
c	CsX|j|j}}|j}d}|j||||||||dddd�dS(Nitfilltredtoutlinet(txtytwidgettcreate_oval(teventRRRtr((s4/usr/lib64/python2.7/Demo/tkinter/guido/imagedraw.pyRs	(t__doc__tTkinterRRR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/imagedraw.pyt<module>s

		PK��Z)t�MIMIguido/AttrDialog.pyonu�[����
��^c@sddlTddd��YZdefd��YZdefd��YZdefd	��YZd
efd��YZddd
��YZdefd��YZdefd��YZdefd��YZ	de	fd��YZ
d�Zd�Zd�Z
e�dS(i����(t*tOptioncBs5eZeZd�Zd�Zd�Zdd�ZRS(cCs�||_||_|j|_|j|\|_|_|j|j�|_t	|j�|_
|j
jdt�t
|j
d|d�|_|jjdt�|j�|j�dS(Ntfillttextt:tside(tdialogtoptionttoptmastertoptionstdefaulttklasstvarclasstvartFrametframetpacktXtLabeltlabeltLEFTtupdatet	addoption(tselfRR((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyt__init__s		
cCs|jj�|j�dS(N(RtrefreshR(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR"s
cCsQy|jj|j|_Wntk
r9|j|_nX|jj|j�dS(N(RtcurrentRtKeyErrorRRtset(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR&s

cCsdS(N((Rte((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR-sN(	t__name__t
__module__t	StringVarR
RRRtNoneR(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRs
	
		t
BooleanOptioncBseZeZd�ZRS(cCsYt|jddddddd|jdtd	d
d|j�|_|jjdt�dS(
NRson/offtonvalueitoffvalueitvariabletrelieftborderwidthitcommandR(tCheckbuttonRRtRAISEDRtbuttonRtRIGHT(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR4s	(RR t
BooleanVarR
R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR#0st
EnumOptioncBseZd�ZRS(c
Cs�t|jd|jdtdd�|_|jjdt�t|j�|_|j|jd<xF|j	j
|jD]1}|jjd|d|jd	|d
|j
�qpWdS(NttextvariableR'R(iRtmenuRR&tvalueR)(t
MenubuttonRRR+R,RR-tMenuR1RtclassesRtadd_radiobuttonR(Rtv((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRAs		(RR R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR/?stStringOptioncBseZd�ZRS(c
Csft|jd|jdddtdd�|_|jjdtdtd	d
�|jjd|j	�dS(NR0twidthi
R'R(iRRtexpandis<Return>(
tEntryRRtSUNKENtentryRR-RtbindR(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRQs	(RR R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR8OstReadonlyOptioncBseZd�ZRS(cCs8t|jd|jdt�|_|jjdt�dS(NR0tanchorR(RRRtERRR-(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR\s(RR R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR?ZstDialogcBsPeZd�Zd�Zd�Zd�ZiZiZeZ	e
ZeZ
eZRS(cCsf||_|j�|j�t|j�|_|jj|jj�|jjdd�|j	�dS(Ni(
R	t
fixclassesRtToplevelRttitlet	__class__Rtminsizet
addchoices(RR	((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRcs	

cCsdS(N((R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRltcCsdS(N((R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRCnRIcCsi|_g}x0|jj�D]\}}|j||f�qW|j�x�|D]�\}\}}y|j|}Wntk
r�d}nXt|�tkr�|j	}n9|dkr�|j
}n!|dkr�|j}n	|j}|||�|j|<qSWdS(Ntunknowntbooleantreadonly(
tchoicesR
titemstappendtsortR5Rttypet	TupleTypet
enumoptiont
booleanoptiontreadonlyoptiontstringoption(Rtlisttktdctdtctcl((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRHps$	


	(RR RRRCRHR
R5R#RTR8RVR/RSR?RU(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRBas					t
PackDialogc
BsjeZd�Zd�Zdd*d��YZdeefd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZi
d,d
6d-d6d.d6d/d6d0d6d1d6d2d6d3d6d4d6d5d 6d6d!6d7d"6d8d%6Zi	eeeeeeeeef	d6d&d6d'd6d&d(6eeeefd6d'd6d)d6eeeefd$6d'd6Z RS(9cCs||_tj||�dS(N(twidgetRBR(RR^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s	cCs?|jj�|_|jj�|jd<|jj|jd<dS(Ns.classs.name(R^tinfoRtwinfo_classt_w(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�st
packoptioncBseZdd�ZRS(cCse|jj�|_y*t|jjjdi|j|j6�Wn"tk
r`}|GH|j	�nXdS(N((
RtgetRtapplyRR^RRtTclErrorR(RRtmsg((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�sN(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRb�sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT�sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS�sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV�sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU�stClasss.classtNames.nametWidgettaftertcentertAnchorR@tbeforetnotBooleanR:tnonetFillRtinitPadtipadxtipadytpadxtpadyRtSideRRKRLtExpandtpixel(N(NRg(NRh(NRi(RkRl(NRi(RnRo(RpRq(NRi(iRs(iRs(iRs(iRs(RRx(!RR RRRbR#RTR/RSR8RVR?RUR"R
tNtNERAtSEtStSWtWtNWtCENTERtNONERtYtBOTHtTOPR-tBOTTOMRR5(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR]�s>		

"tRemotePackDialogcBs�eZd�Zd�Zddd��YZdeefd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZRS(
cCso||_||_||_|j�t|j�|_|jj|jd�|jjdd�|j�dS(Ns PackDialogi(	R	tappR^RRDRRERGRH(RR	R�R^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s			
cCs�y4|jjj|jj|jdd|j��}Wntk
rO}|GHdSXi}xFtdt|�d�D],}||d}||d}|||<qoW|jj|jdd|j�|d<|j|d	<||_	dS(
NRR_iiitwinfotclasss.classs.name(
R	ttkt	splitlisttsendR�R^RetrangetlenR(RtwordsRftdicttitkeyR2((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s(
tremotepackoptioncBseZdd�ZRS(cCs�|jj�|_yN|jjj|jjdd|jjd|j|jjj	j
|j��Wn"tk
r�}|GH|j�nXdS(NRtconfigt-(
RRcRRR	R�R�R^RR�tmergeReR(RRRf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s		
N(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT�sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS�sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV�sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU�s((
RR RRR�R#RTR/RSR8RVR?RU(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��s	
	tWidgetDialogc
Bs�eZd�Zd�Zd�Zd�ZddTd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZdee
fd
��YZi.eeeeeeeeef	d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6dd!6dd"6dd#6d$d%6dd&6dd'6d(d)6dd*6d+d,6eeefd-6d.d/6dd06d1d26dd36d+d46d+d56eefd66dd76eeeee fd86d+d96d+d:6dd;6dd<6d=d>6dd?6dd@6ddA6ddB6d.dC6ddD6ddE6dFdG6dHdI6d.dJ6ddK6e!e"e#fdL6Z$ie%e&e'fdM6Z(ie%e'fdM6Z)ie(dN6e(dO6e(dP6e)dQ6e)dC6e(dR6e)dS6Z*RS(UcCs,||_|j�|_tj||�dS(N(R^R`RRBR(RR^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s	cCst|jj|j�rpi}xF|j|j|jfD]+}x"|j�D]}||||<qHWq5W||_ndS(N(t
addclassesthas_keyRR5tkeys(RR5R[RX((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRCs	cCsI|jj�|_|j�|jj�|jd<|jj|jd<dS(Ns.classs.name(R^R�t
configurationRR`RRa(R((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRs
cCs�i|_i|_x^|jj�D]M\}}t|�dkr"|d|j|<|d|df|j|<q"q"Wd|jd<d	|jd<dS(
NiiiRgs.classRhs.name(NRg(NRh(RR
R�RNR�R"(RRXR7((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRs		"
twidgetoptioncBseZdd�ZRS(cCsU|jj�|_y|j|jj|j<Wn"tk
rP}|GH|j�nXdS(N(RRcRRR^RReR(RRRf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRsN(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT%sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS&sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV'sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU(sRltintegertAspecttcolort
BackgroundtbitmaptBitmapRztBorderWidthRLRgtdoubletCloseEnoughR)tCommandRKtConfinetcursortCursortCursorWidthtDisabledForegroundtExportSelectiontfonttFontt
ForegroundtFromtgeometrytGeometrytHeightttimetInsertWidthtJustifytstringRtLengthR^tMenuNameRhtOffTimetOnTimetOrientRstRelieftRepeatDelaytRepeatIntervalt
ScrollCommandtScrollIncrementt	rectangletScrollRegiont	ShowValuetSetGridtSliderforegroundtSliderLengthtTexttTickIntervaltTotindext	UnderlineR&tVariabletValuetWidthtWraptStatetButtontRadiobuttonR*R;R3tSlider((+RR RRCRRR�R#RTR/RSR8RVR?RUR{R|RAR}R~RR�R�R�RR-t
HORIZONTALtVERTICALR+R<tFLATtRIDGEtGROOVER�tCHARtWORDR5tNORMALtACTIVEtDISABLEDt	_tristatet_bistateR�(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��s�					
	"
tRemoteWidgetDialogcBs�eZd�Zd�Zddd��YZdeefd��YZdeefd��YZdee	fd	��YZ
d
eefd��YZRS(
cCsG||_||_|j|jdd|j�|_tj||�dS(NR�R�(R�R^R�RRBR(RR	R�R^((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRks		cCs�y1|jjj|jj|j|jd��}Wntk
rL}|GHdSXi}xL|D]D}|jjj|�}|dd}|f|d}|||<qZW||_|j�|j	|j
d<|j|j
d<dS(NR�iis.classs.name(R	R�R�R�R�R^ReR�RRR(RRNRfR�titemR�R�R2((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRts$
	
tremotewidgetoptioncBseZdd�ZRS(cCst|jj�|_y9|jjj|jj|jjdd|j|j�Wn"t	k
ro}|GH|j
�nXdS(NR�R�(RRcRRR	R�R�R^RReR(RRRf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�s		
N(RR R"R(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��sRTcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRT�sRScBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRS�sRVcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRV�sRUcBseZRS((RR (((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyRU�s((
RR RRR�R#RTR/RSR8RVR?RU(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR�is			cCsddl}t�}|jdd�|jdrIt||jd�n�t|dd�}|jdddt�t|dddd�}|jdd�t	|dd	�}|j�t
|�}t|�}t
|�}t|�}t
|�}	t|�}
|j�dS(
Ni����itnameRR:RR,Rtcanvas(
tsystTkRGtargvt
remotetestRRR�R�tCanvasR]R�tmainloop(R�trootRR,R�tfpdtfwdtbpdtbwdtcpdtcwd((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyttest�s$	

cCs<ddlm}|||�}|jdt�||_dS(Ni����(tlisttrees<Any-Double-1>(R�R>topendialogsR�(R�R�R�RW((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��scCs�ddl}|j}|j�}x�|D]}|j|�}|j|�d}t||j|�|dkruq(nyt||j|�Wq(tk
r�}|GHq(Xq(WdS(Ni����it.(	R�R^tcurselectionRctsplitR�R�R�Re(RR�RWtselR�R�R^Rf((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyR��s	
N(((tTkinterRR#R/R8R?RBR]R�R�R�R�R�R�(((s5/usr/lib64/python2.7/Demo/tkinter/guido/AttrDialog.pyt<module>s
.67m2			PK��Z.�V�oo
guido/wish.pynu�[���# This is about all it requires to write a wish shell in Python!

import _tkinter
import os

tk = _tkinter.create(os.environ['DISPLAY'], 'wish', 'Tk', 1)
tk.call('update')

cmd = ''

while 1:
    if cmd: prompt = ''
    else: prompt = '% '
    try:
        line = raw_input(prompt)
    except EOFError:
        break
    cmd = cmd + (line + '\n')
    if tk.getboolean(tk.call('info', 'complete', cmd)):
        tk.record(line)
        try:
            result = tk.call('eval', cmd)
        except _tkinter.TclError, msg:
            print 'TclError:', msg
        else:
            if result: print result
        cmd = ''
PK��ZE`}eR	R	guido/electrons.pyonu�[����
Afc@sLddlTddlZddd��YZd�ZedkrHe�ndS(i����(t*Nt	ElectronscBs&eZdd�Zd�Zd�ZRS(c
Cs||_t�|_}t|�|_}|j�|j|d�|j|d�}}|r�|j|d|dd|dd�|_ng|_	d
\}}}	}
xWt
|�D]I}|j|||	|
dd�}|j	j|�|d|
d}}
q�W|jj
�dS(Ntwidththeightitbitmapt
foregroundtbluei
iFiiJtfilltred(i
iFiiJ(tntTkttktCanvastcanvastpacktgetintt
create_bitmapRtpiecestrangetcreate_ovaltappendtupdate(
tselfR	RRtcRRtx1ty1tx2ty2titp((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pyt__init__s 	
'	cCsq|j}xT|jD]I}tjtdd��}tjtdd��}|j|||�qW|jj�dS(Ni����ii����(R
RtrandomtchoiceRtmoveRR(RR	RRtxty((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pytrandom_move+s	cCshy+x$td�D]}|j|j�qWWn6tk
rcy|jj�Wqdtk
r_qdXnXdS(Ni�(RR$R	tTclErrorRtdestroy(RR((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pytrun4s

N(t__name__t
__module__tNoneRR$R'(((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pyRs		cCs�ddl}ddl}|jdr>|j|jd�}nd}|jdr�|jd}|ddkr{|d}q�d|}nd}t||�}|j�dS(Ni����iiiit@(tsyststringtargvtatoiR*RR'(R,R-R	Rth((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pytmain@s




t__main__((tTkinterRRR1R((((s4/usr/lib64/python2.7/Demo/tkinter/guido/electrons.pyt<module>s

-	PK��Zqf�XXguido/newmenubardemo.pyonu�[����
Afc@sFdZddlTddd��YZd�ZedkrBe�ndS(	s.Play with the new Tk 8.0 toplevel menu option.i����(t*tAppcBseZd�ZRS(cCsu||_t|j�|_t|j�|_|jjdd�|jjdd�|jjdd�|jj�|jjddd|jj�t|j�|_|jjdd�|jjdd�|jjdd	�t|jd
d�|_|jjdd�|jj	dd
d|j�|jj	ddd|j�|jj	ddd|j�t
d|j�|_dS(NtlabeltNewsOpen...tClosetQuittcommandtCuttCopytPastetnamethelpsAbout...tFiletmenutEdittHelp(tmastertMenutmenubartfilemenutadd_commandt
add_separatortquitteditmenuthelpmenutadd_cascadetToplevelttop(tselfR((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pyt__init__	s$	
(t__name__t
__module__R(((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pyRscCs-t�}|j�t|�}|j�dS(N(tTktwithdrawRtmainloop(troottapp((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pytmain(s	
t__main__N((t__doc__tTkinterRR%R(((s9/usr/lib64/python2.7/Demo/tkinter/guido/newmenubardemo.pyt<module>s

!	PK��Z��V���
guido/rmt.pycnu�[����
Afc
@s�ddlTddlZe�ZejZeededd�Zejde	�ee�Z
e
jddde�ee
de
�Zejd	ede�ee
deddd
ejdd�Zejd	ededd�ejdd
d�ejed<ejd�ejd�eedddd�Zejd	e�ee�Zeed<eedd�Zejddddde�ejdddddej �d�Z!ej"de!�d�Z#ej"de#�d�Z$ej"d e$�d!�Z%ej"d"e%�d#�Z&ej"d$e&�d%�Z'ej"d&e'�ej"d'e'�ej"d(e'�d)�Z(d*�Z)d+�Z*d,�Z+e+ed-<ej,e�ej-�a.e)�ej/�ej0�dS(.i����(t*Ntrelieftborderwidthitfilltexpanditsidetyscrollcommandtsetgridtboldtfonts$-Adobe-Courier-Bold-R-Normal-*-120-*tcommandsTk Remote Controllers	Tk RemotettexttFilet	underlineitmenuttearofftlabelsSelect ApplicationtQuitcCs?|j}|j}tjdd�tjdt||��dS(Nstk_priv(selectMode)tchartanchor(txtytttsetvartmark_settAt(teRR((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytsingle15s		s<1>cCs<|j}|j}tjdd�tjt||��dS(Nstk_priv(selectMode)tword(RRRRttk_textSelectToR(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytdouble1=s		s
<Double-1>cCs<|j}|j}tjdd�tjt||��dS(Nstk_priv(selectMode)tline(RRRRRR(RRR((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyttriple1Ds		s
<Triple-1>cCstjt�d�t�dS(Ns
(RtinserttAtInserttinvoke(R((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt	returnkeyKss<Return>cCsStjt�tj��tjt��tjt��ddkrOt�ndS(Ni����s.0(RR!R"t
selection_gettyview_pickplacetindexR#(R((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytcontrolvPss<Control-v>cCsHtjd�tjd�krDtjdt��tjt��ndS(Nt	promptEndsinsert - 1 char(RR'tdeleteR"R&(R((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt	backspaceZss<BackSpace>s<Control-h>s<Delete>cCs�tjdt��}tjtjdd|��r�ttj�krZtjd|�}ntj	t|�}|r�tj
t�|d�nt�ntjt��dS(NspromptEnd + 1 chartinfotcompletetevals
(
RtgetR"t
getbooleanttktcalltapptroott
winfo_nametsendR!tpromptR&(tcmdtmsg((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyR#is
cCs>tjt�td�tjdd�tjddd�dS(Ns: R)sinsert - 1 charRsinsert linestart(RR!R"R3Rttag_add(((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyR7uscCsA|atjdd�tjd|d�tjddd�dS(NspromptEnd linestartR)t:R(R3RR*R!R:(tappName((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytnewApp~scCs�tjd�tjdd�tj�}t|�}|j�xR|D]J}ytj|d�Wntk
rsqFXtj	d|d|d��qFWdS(NR
itlastswinfo name .RcSs
t|�S(N(R=(tname((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt<lambda>�t(
tfile_m_appstaddR*R4t
winfo_interpstlisttsortR6tTclErrortadd_command(tnamesR?((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pytfillAppsMenu�s



	tpostcommand(1tTkintertsystTkR4R1tFrametRAISEDtmBartpacktXtftBOTHt	ScrollbartFLATtstRIGHTtYtTexttsetRtLEFTt
tag_configtyviewttitleticonnamet
MenubuttontfiletMenutfile_mRBtadd_cascadeRHtexitRtbindRR R$R(R+R#R7R=RJt
tk_menuBarR5R3tfocustmainloop(((s./usr/lib64/python2.7/Demo/tkinter/guido/rmt.pyt<module>s^
		'



												


PK��ZKѴ�Q�Qguido/solitaire.pyonu�[����
Afc@sCdZddlZddlZddlTddlmZmZmZmZdefd��YZdZ	dZ
d	Ze	d
eZe
deZ
dZd
ZdZdZdZdZdZdZiZxeefD]Zeee<q�WxeefD]Zeee<q�Wej�Zee�ZdZdZdZdZe dd�Z!ee!�Z"ddge#e$e d
d��dddgZ%dZ&dd0d ��YZ'd!d1d"��YZ(d#e(fd$��YZ)d%�Z*d&e(fd'��YZ+d(e+fd)��YZ,d*e+fd+��YZ-d,d2d-��YZ.d.�Z/e0d/kr?e/�ndS(3s�Solitaire game, much like the one that comes with MS Windows.

Limitations:

- No cute graphical images for the playing cards faces or backs.
- No scoring or timer.
- No undo.
- No option to turn 3 cards at a time.
- No keyboard shortcuts.
- Less fancy animation when you win.
- The determination of which stack you drag to is more relaxed.

Apology:

I'm not much of a card player, so my terminology in these comments may
at times be a little unusual.  If you have suggestions, please let me
know!

i����N(t*(t	Rectanglet
CanvasTexttGrouptWindowRcBseZddd�ZRS(cCs|jj|j||�S(N(tcanvasttag_bindtid(tselftsequencetcommand((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytbind%sN(t__name__t
__module__tNoneR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR$sidi�i
iiis#070tHearttDiamondtClubtSpadetredtblackiiii
ittAtJtQtKitCardcBsMeZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Z	RS(s�A playing card.

    A card doesn't record to which stack it belongs; only the stack
    records this (it turns out that we always know this from the
    context, and this saves a ``double update'' with potential for
    inconsistencies).

    Public methods:

    moveto(x, y) -- move the card to an absolute position
    moveby(dx, dy) -- move the card by a relative offset
    tkraise() -- raise the card to the top of its stack
    showface(), showback() -- turn the card face up or down & raise it

    Public read-only instance variables:

    suit, value, color -- the card's suit, value and color
    face_shown -- true when the card is shown face up, else false

    Semi-public read-only instance variables (XXX should be made
    private):

    group -- the Canvas.Group representing the card
    x, y -- the position of the card's top left corner

    Private instance variables:

    __back, __rect, __text -- the canvas items making up the card

    (To show the card face up, the text item is placed in front of
    rect and the back is placed behind it.  To show it face down, this
    is reversed.  The card is created face down.)

    c
Cs||_||_t||_d|_d|_|_t|�|_dt	||f}t
|tdddtd|jd|�|_
|jj|j
�t|ddttdddd	�|_|jj|j�t|ttttttdddd
�|_|jj|j�dS(sCard constructor.

        Arguments are the card's suit and value, and the canvas widget.

        The card is created at position (0, 0), with its face down
        (adding it to a stack will position it according to that
        stack's rules).

        is%s  %sitanchortfillttexttoutlineRtwhitetblueN(tsuittvaluetCOLORtcolort
face_showntxtyRtgrouptVALNAMESRt	CARDWIDTHtNt_Card__texttaddtag_withtagRt
CARDHEIGHTt_Card__recttMARGINt_Card__back(RR!R"RR((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt__init__�s"
		
	cCsd|j|jfS(s+Return a string for debug print statements.sCard(%r, %r)(R!R"(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt__repr__�scCs"|j||j||j�dS(s*Move the card to absolute position (x, y).N(tmovebyR&R'(RR&R'((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytmoveto�scCs7|j||_|j||_|jj||�dS(sMove the card by (dx, dy).N(R&R'R(tmove(Rtdxtdy((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR4�scCs|jj�dS(s5Raise the card above all other objects in its canvas.N(R(ttkraise(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR9�scCs1|j�|jj�|jj�d|_dS(sTurn the card's face up.iN(R9R/R,R%(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshowface�s


cCs1|j�|jj�|jj�d|_dS(sTurn the card's face down.iN(R9R/R1R%(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshowback�s


(
RR
t__doc__R2R3R5R4R9R:R;(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRss#	 					tStackcBs�eZdZdd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�Zd
�Z
d�Zd�Zd
�Zd�Zd�ZdZd�Zd�Zd�ZRS(s�A generic stack of cards.

    This is used as a base class for all other stacks (e.g. the deck,
    the suit stacks, and the row stacks).

    Public methods:

    add(card) -- add a card to the stack
    delete(card) -- delete a card from the stack
    showtop() -- show the top card (if any) face up
    deal() -- delete and return the top card, or None if empty

    Method that subclasses may override:

    position(card) -- move the card to its proper (x, y) position

        The default position() method places all cards at the stack's
        own (x, y) position.

    userclickhandler(), userdoubleclickhandler() -- called to do
    subclass specific things on single and double clicks

        The default user (single) click handler shows the top card
        face up.  The default user double click handler calls the user
        single click handler.

    usermovehandler(cards) -- called to complete a subpile move

        The default user move handler moves all moved cards back to
        their original position (by calling the position() method).

    Private methods:

    clickhandler(event), doubleclickhandler(event),
    motionhandler(event), releasehandler(event) -- event handlers

        The default event handlers turn the top card of the stack with
        its face up on a (single or double) click, and also support
        moving a subpile around.

    startmoving(event) -- begin a move operation
    finishmoving() -- finish a move operation

    cCs�||_||_||_g|_t|jj�|_|jjd|j�|jjd|j	�|jjd|j
�|jjd|j�|j�dS(sStack constructor.

        Arguments are the stack's nominal x and y position (the top
        left corner of the first card placed in the stack), and the
        game object (which is used to get the canvas; subclasses use
        the game object to find other stacks).

        s<1>s
<Double-1>s<B1-Motion>s<ButtonRelease-1>N(
R&R'tgametcardsRRR(Rtclickhandlertdoubleclickhandlert
motionhandlertreleasehandlert
makebottom(RR&R'R>((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR2s					cCsdS(N((R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRDscCsd|jj|j|jfS(s+Return a string for debug print statements.s
%s(%d, %d)(t	__class__RR&R'(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR3scCs>|jj|�|j�|j|�|jj|j�dS(N(R?tappendR9tpositionR(R-(Rtcard((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytadd%s

cCs'|jj|�|jj|j�dS(N(R?tremoveR(tdtag(RRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytdelete+scCs!|jr|jdj�ndS(Ni����(R?R:(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshowtop/s	cCs+|js
dS|jd}|j|�|S(Ni����(R?RRL(RRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytdeal3s
	

cCs|j|j|j�dS(N(R5R&R'(RRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRG<scCs|j�dS(N(RM(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytuserclickhandler?scCs|j�dS(N(RO(R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytuserdoubleclickhandlerBscCs"x|D]}|j|�qWdS(N(RG(RR?RH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytusermovehandlerEs
cCs%|j�|j�|j|�dS(N(tfinishmovingROtstartmoving(Rtevent((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR@Ks

cCs|j|�dS(N(t
keepmoving(RRT((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRBPscCs|j|�|j�dS(N(RURR(RRT((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRCSs
cCs%|j�|j�|j|�dS(N(RRRPRS(RRT((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRAWs

cCs�d|_|jjjd�}xDtt|j��D])}|j|}|jj	|kr4Pq4q4WdS|j
srdS|j||_|j|_|j
|_x|jD]}|j�q�WdS(Ntcurrent(RtmovingR>RtgettagstrangetlenR?R(ttagR%R&tlastxR'tlastyR9(RRTttagstiRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRS`s	
	cCs||js
dS|j|j}|j|j}|j|_|j|_|sQ|rxx$|jD]}|j||�q[WndS(N(RWR&R\R'R]R4(RRTR7R8RH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRUqs	cCs,|j}d|_|r(|j|�ndS(N(RWRRQ(RR?((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRR|s		N(RR
R<RR2RDR3RIRLRMRNRGRORPRQR@RBRCRARWRSRURR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR=�s(-																	tDeckcBs2eZdZd�Zd�Zd�Zd�ZRS(s7The deck is a stack with support for shuffling.

    New methods:

    fill() -- create the playing cards
    shuffle() -- shuffle the playing cards

    A single click moves the top card to the game's open deck and
    moves it face up; if we're out of cards, it moves the open deck
    back to the deck.

    c
CsRt|jj|j|j|jt|jtdddt�}|jj	|�dS(NRRR(
RR>RR&R'R*R.t
BACKGROUNDR(R-(Rtbottom((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRD�s
cCsEx>tD]6}x-tD]%}|jt|||jj��qWqWdS(N(tALLSUITSt	ALLVALUESRIRR>R(RR!R"((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�s

cCsMt|j�}g}x(t|�D]}|j|j|�q"W||_dS(N(RZR?trandpermRF(RtntnewcardsR_((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytshuffle�s
cCsv|jj}|j�}|sUxQ|j�}|s7Pn|j|�|j�q!Wn|jjj|�|j�dS(N(R>topendeckRNRIR;R:(RRiRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRO�s
(RR
R<RDRRhRO(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR`�s

			cCsLt|�}g}x3|rGtj|�}|j|�|j|�qW|S(s4Function returning a random permutation of range(n).(RYtrandomtchoiceRFRJ(RftrR&R_((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRe�s	
t	OpenStackcBs#eZd�Zd�Zd�ZRS(cCsdS(Ni((RR?((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt
acceptable�scCs�|d}|jj|�}|s?||ks?|j|�rRtj||�n8x(|D] }|j|�|j|�qYW|jj�dS(Ni(R>tcloseststackRnR=RQRLRItwincheck(RR?RHtstack((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRQ�s
#

cCs�|js
dS|jd}|js1|j�dSxQ|jjD]C}|j|g�r>|j|�|j|�|jj�Pq>q>WdS(Ni����(	R?R%ROR>tsuitsRnRLRIRp(RRHts((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRP�s	
	



(RR
RnRQRP(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRm�s		t	SuitStackcBs,eZd�Zd�Zd�Zd�ZRS(c
CsBt|jj|j|j|jt|jtdddd�}dS(NRRRR(RR>RR&R'R*R.(RRb((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRD�scCsdS(N((R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRO�scCsdS(N((R((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRP�scCsit|�dkrdS|d}|js6|jtkS|jd}|j|jkoh|j|jdkS(Niii����(RZR?R"tACER!(RR?RHttopcard((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRn�s
	

(RR
RDRORPRn(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRt�s			tRowStackcBseZd�Zd�ZRS(cCs`|d}|js |jtkS|jd}|js:dS|j|jko_|j|jdkS(Nii����i(R?R"tKINGR%R$(RR?RHRv((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRn�s
	

	cCsh|j}xE|jD]:}||kr)Pn|jrC|dt}q|t}qW|j|j|�dS(Ni(R'R?R%R0tOFFSETR5R&(RRHR'tc((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRGs		(RR
RnRG(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRw�s		t	SolitairecBsGeZd�Zd�Zd�Zd�Zd�Zd�Zd�ZRS(cCs�||_t|jdtdddttddtdt�|_|jjdt	d	t
�t|jd
ddddtdd
d|j�|_
t|jtdtdd|j
dt�t}t}t|||�|_|t}t|||�|_|t}g|_x:tt�D],}|t}|jjt|||��qWt}|t}g|_x:tt�D],}|jjt|||��|t}qoW|jg|j|j|_|jj�|j�dS(Nt
backgroundthighlightthicknessitwidththeightiiRtexpandRtDealtactivebackgroundtgreenR
twindowR(tmastertCanvasRatNROWStXSPACINGtYSPACINGR0RtpacktBOTHtTRUEtButtonRNt
dealbuttonRtSWR`tdeckRmRiRrRYtNSUITSRFRttrowsRwt
openstacksR(RR�R&R'R_((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR2sD	


	
 
	
cCsEx*|jD]}t|j�tkr
dSq
W|j�|j�dS(N(RrRZR?tNVALUEStwinRN(RRs((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRp=s

cCsgg}x|jD]}||j}qWx9|rbtj|�}|j|�|j||j�q*WdS(sStupid animation when you win.N(R�R?RjRkRJtanimatedmovetoR�(RR?RsRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�Ds	
cCsgx`tddd�D]L}|j|j||j|j|}}|j||�|jj�qWdS(Ni
ii����(RYR&R'R4R�tupdate_idletasks(RRHtdestR_R7R8((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�Ns)cCsed}d}xR|jD]G}|j|jd|j|jd}||kr|}|}qqW|S(Ni�ɚ;i(RR�R&R'(RRHtclosesttcdistRqtdist((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRoTs&
cCs�|j�|jj�xHtt�D]:}x1|j|D]"}|jj�}|j|�q8Wq$Wx|jD]}|j�qlWdS(N(	tresetR�RhRYR�R�RNRIRM(RR_RlRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyRN`s

cCsOxH|jD]=}x4|j�}|s)Pn|jj|�|j�qWq
WdS(N(R�RNR�RIR;(RRqRH((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR�js(	RR
R2RpR�R�RoRNR�(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyR{
s	.		
			
cCs6t�}t|�}|jd|j�|j�dS(NtWM_DELETE_WINDOW(tTkR{tprotocoltquittmainloop(trootR>((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pytmainvs	t__main__((((1R<tmathRjtTkinterR�RRRRR*R.R0R�R�RyRatHEARTStDIAMONDStCLUBStSPADEStREDtBLACKR#RstkeysRcRZR�RutJACKtQUEENRxRYRdR�tmaptstrR)R�RR=R`ReRmRtRwR{R�R(((s4/usr/lib64/python2.7/Demo/tkinter/guido/solitaire.pyt<module>sX
"
/f�1	i	PK��Za�A���guido/newmenubardemo.pynuȯ��#! /usr/bin/python2.7

"""Play with the new Tk 8.0 toplevel menu option."""

from Tkinter import *

class App:

    def __init__(self, master):
        self.master = master

        self.menubar = Menu(self.master)

        self.filemenu = Menu(self.menubar)

        self.filemenu.add_command(label="New")
        self.filemenu.add_command(label="Open...")
        self.filemenu.add_command(label="Close")
        self.filemenu.add_separator()
        self.filemenu.add_command(label="Quit", command=self.master.quit)

        self.editmenu = Menu(self.menubar)

        self.editmenu.add_command(label="Cut")
        self.editmenu.add_command(label="Copy")
        self.editmenu.add_command(label="Paste")

        self.helpmenu = Menu(self.menubar, name='help')

        self.helpmenu.add_command(label="About...")

        self.menubar.add_cascade(label="File", menu=self.filemenu)
        self.menubar.add_cascade(label="Edit", menu=self.editmenu)
        self.menubar.add_cascade(label="Help", menu=self.helpmenu)

        self.top = Toplevel(menu=self.menubar)

        # Rest of app goes here...

def main():
    root = Tk()
    root.withdraw()
    app = App(root)
    root.mainloop()

if __name__ == '__main__':
    main()
PK��Z��I��guido/rmt.pynuȯ��#! /usr/bin/python2.7

# A Python program implementing rmt, an application for remotely
# controlling other Tk applications.
# Cf. Ousterhout, Tcl and the Tk Toolkit, Figs. 27.5-8, pp. 273-276.

# Note that because of forward references in the original, we
# sometimes delay bindings until after the corresponding procedure is
# defined.  We also introduce names for some unnamed code blocks in
# the original because of restrictions on lambda forms in Python.

# XXX This should be written in a more Python-like style!!!

from Tkinter import *
import sys

# 1. Create basic application structure: menu bar on top of
# text widget, scrollbar on right.

root = Tk()
tk = root.tk
mBar = Frame(root, relief=RAISED, borderwidth=2)
mBar.pack(fill=X)

f = Frame(root)
f.pack(expand=1, fill=BOTH)
s = Scrollbar(f, relief=FLAT)
s.pack(side=RIGHT, fill=Y)
t = Text(f, relief=RAISED, borderwidth=2, yscrollcommand=s.set, setgrid=1)
t.pack(side=LEFT, fill=BOTH, expand=1)
t.tag_config('bold', font='-Adobe-Courier-Bold-R-Normal-*-120-*')
s['command'] = t.yview

root.title('Tk Remote Controller')
root.iconname('Tk Remote')

# 2. Create menu button and menus.

file = Menubutton(mBar, text='File', underline=0)
file.pack(side=LEFT)
file_m = Menu(file)
file['menu'] = file_m
file_m_apps = Menu(file_m, tearoff=0)
file_m.add_cascade(label='Select Application', underline=0,
                   menu=file_m_apps)
file_m.add_command(label='Quit', underline=0, command=sys.exit)

# 3. Create bindings for text widget to allow commands to be
# entered and information to be selected.  New characters
# can only be added at the end of the text (can't ever move
# insertion point).

def single1(e):
    x = e.x
    y = e.y
    t.setvar('tk_priv(selectMode)', 'char')
    t.mark_set('anchor', At(x, y))
    # Should focus W
t.bind('<1>', single1)

def double1(e):
    x = e.x
    y = e.y
    t.setvar('tk_priv(selectMode)', 'word')
    t.tk_textSelectTo(At(x, y))
t.bind('<Double-1>', double1)

def triple1(e):
    x = e.x
    y = e.y
    t.setvar('tk_priv(selectMode)', 'line')
    t.tk_textSelectTo(At(x, y))
t.bind('<Triple-1>', triple1)

def returnkey(e):
    t.insert(AtInsert(), '\n')
    invoke()
t.bind('<Return>', returnkey)

def controlv(e):
    t.insert(AtInsert(), t.selection_get())
    t.yview_pickplace(AtInsert())
    if t.index(AtInsert())[-2:] == '.0':
        invoke()
t.bind('<Control-v>', controlv)

# 4. Procedure to backspace over one character, as long as
# the character isn't part of the prompt.

def backspace(e):
    if t.index('promptEnd') != t.index('insert - 1 char'):
        t.delete('insert - 1 char', AtInsert())
        t.yview_pickplace(AtInsert())
t.bind('<BackSpace>', backspace)
t.bind('<Control-h>', backspace)
t.bind('<Delete>', backspace)


# 5. Procedure that's invoked when return is typed:  if
# there's not yet a complete command (e.g. braces are open)
# then do nothing.  Otherwise, execute command (locally or
# remotely), output the result or error message, and issue
# a new prompt.

def invoke():
    cmd = t.get('promptEnd + 1 char', AtInsert())
    if t.getboolean(tk.call('info', 'complete', cmd)): # XXX
        if app == root.winfo_name():
            msg = tk.call('eval', cmd) # XXX
        else:
            msg = t.send(app, cmd)
        if msg:
            t.insert(AtInsert(), msg + '\n')
        prompt()
    t.yview_pickplace(AtInsert())

def prompt():
    t.insert(AtInsert(), app + ': ')
    t.mark_set('promptEnd', 'insert - 1 char')
    t.tag_add('bold', 'insert linestart', 'promptEnd')

# 6. Procedure to select a new application.  Also changes
# the prompt on the current command line to reflect the new
# name.

def newApp(appName):
    global app
    app = appName
    t.delete('promptEnd linestart', 'promptEnd')
    t.insert('promptEnd', appName + ':')
    t.tag_add('bold', 'promptEnd linestart', 'promptEnd')

def fillAppsMenu():
    file_m_apps.add('command')
    file_m_apps.delete(0, 'last')
    names = root.winfo_interps()
    names = list(names)
    names.sort()
    for name in names:
        try:
            root.send(name, 'winfo name .')
        except TclError:
            # Inoperative window -- ignore it
            pass
        else:
            file_m_apps.add_command(
                label=name,
                command=lambda name=name: newApp(name))

file_m_apps['postcommand'] = fillAppsMenu
mBar.tk_menuBar(file)

# 7. Miscellaneous initialization.

app = root.winfo_name()
prompt()
t.focus()

root.mainloop()
PK��Z27O�::guido/imageview.pyonu�[����
��^c@s*ddlTddlZd�Ze�dS(i����(t*NcCsOtjd}t�}td|�}t|d|�}|j�|j�dS(Nitfiletimage(tsystargvtTkt
PhotoImagetLabeltpacktmainloop(tfilenametroottimgtlabel((s4/usr/lib64/python2.7/Demo/tkinter/guido/imageview.pytmains
	
(tTkinterRR(((s4/usr/lib64/python2.7/Demo/tkinter/guido/imageview.pyt<module>s
	PK��Z"��@@guido/kill.pyonu�[����
Afc@s�ddlTddlmZddlmZddlZddlZdefd��YZdefd��YZ	e
d	kr�e	dd
d�Zej
�jd�ej
�jd
d
�ej�ndS(i����(t*(tsplitfields(tsplitNt	BarButtoncBseZdd�ZRS(cKsOttj||f|�|jdt�t|dd�|_|j|d<dS(Ntsidetnametmenu(tapplyt
Menubuttont__init__tpacktLEFTtMenuR(tselftmastertcnf((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR	sN(t__name__t
__module__tNoneR	(((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR
stKillc
Bs_eZdddddddd gZd�Zd�Zd�Zd�Zd�Zd!d�Z	RS("tDefaulttitLongs-litUsers-uitJobss-jtSignals-stMemorys-mtVMs-vtHexs-XcCsI|j|jj�d}t|�|}tjd|�|j�dS(Niskill -9 (tformat_listtformattgetRtostsystemt	do_update(R
tselectedtctpid((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pytkillscCs�|j|jj�\}}}tjd|�}t|d�}|jj|d�|d=|jj	j�d}|jj
jdt��x$|D]}|jj
j
d|�q�W|jj
jt|��dS(Nsps -w s
i(RRRtcommandst	getoutputRtheadertsettframetvscrolltlisttdeletetAtEndtinserttyviewtint(R
RtoptiontcolumntsR-tytline((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR" s
cCs6|jjdt�|jj|jj|j��dS(Ni(twidgettselect_cleartENDt
select_settnearestR6(R
te((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyt	do_motion+scCs|jjdt�dS(Ni(R8R9R:(R
R=((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pytdo_leave.scCs,|j|jj|jj|j���dS(N(R&R8RR<R6(R
R=((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pytdo_10sc
Ks
tj|||�|jdddt�t|dddtdd�|_|jjdt�t|jd	d
�|j_|jjj	j
ddd
|j�t|jd	d�|j_t
|�|_|jjd�xYtt|j��D]B}|jjj	jd|j|dd
|jd|jd|�q�W|jj|jj|jj�t|dtdd�|_|jjdddt�t|�|_t|jdtdtddd|j�|j_|jjjdt�t|jdt�|j_t |jdt!ddddd|jjj�|j_"|jj"j#|jjd
<|jjjdt$dt%�|jj"jdddt�t&|d	dd
|j�|_'|j'jdddt�|jj"j(d|j)�|jj"j(d|j*�|jj"j(d|j+�|j�dS(NtexpanditfillRtbartrelieftborderwidthittexttFiletlabeltQuittcommandtViewitvariabletvaluetanchorttextvariabletorienttselectbackgrounds#eed5b7tselectborderwidthtyscrollRtUpdates<Motion>s<Leave>s<1>(,tFrameR	R
tBOTHtRAISEDRCtXRtfileRtadd_commandtquittviewtIntVarRR*trangetlenRtadd_radiobuttonR"t
tk_menuBarR+t	StringVarR)tLabeltFLATtNWRHt	ScrollbartVERTICALR,tListboxtSUNKENR-R1tRIGHTtYtButtontupdatetbindR>R?R@(R
RRtnum((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyR	2sP		(RRi(Rs-li(Rs-ui(Rs-ji(Rs-si(Rs-mi(Rs-vi(Rs-XiN(
RRRR&R"R>R?R@RR	(((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyRs						t__main__REisTkinter Process Killeri(tTkintertstringRRR'R RRRURRRR&twinfo_toplevelttitletminsizetmainloop(((s//usr/lib64/python2.7/Demo/tkinter/guido/kill.pyt<module>s
MPK��Z.��,#,#guido/tkman.pynuȯ��#! /usr/bin/python2.7

# Tk man page browser -- currently only shows the Tcl/Tk man pages

import sys
import os
import string
import re
from Tkinter import *
from ManPage import ManPage

MANNDIRLIST = ['/depot/sundry/man/mann','/usr/local/man/mann']
MAN3DIRLIST = ['/depot/sundry/man/man3','/usr/local/man/man3']

foundmanndir = 0
for dir in MANNDIRLIST:
    if os.path.exists(dir):
        MANNDIR = dir
        foundmanndir = 1

foundman3dir = 0
for dir in MAN3DIRLIST:
    if os.path.exists(dir):
        MAN3DIR = dir
        foundman3dir =  1

if not foundmanndir or not foundman3dir:
    sys.stderr.write('\n')
    if not foundmanndir:
        msg = """\
Failed to find mann directory.
Please add the correct entry to the MANNDIRLIST
at the top of %s script.""" % \
sys.argv[0]
        sys.stderr.write("%s\n\n" % msg)
    if not foundman3dir:
        msg = """\
Failed to find man3 directory.
Please add the correct entry to the MAN3DIRLIST
at the top of %s script.""" % \
sys.argv[0]
        sys.stderr.write("%s\n\n" % msg)
    sys.exit(1)

del foundmanndir
del foundman3dir

def listmanpages(mandir):
    files = os.listdir(mandir)
    names = []
    for file in files:
        if file[-2:-1] == '.' and  (file[-1] in 'ln123456789'):
            names.append(file[:-2])
    names.sort()
    return names

class SelectionBox:

    def __init__(self, master=None):
        self.choices = []

        self.frame = Frame(master, name="frame")
        self.frame.pack(expand=1, fill=BOTH)
        self.master = self.frame.master
        self.subframe = Frame(self.frame, name="subframe")
        self.subframe.pack(expand=0, fill=BOTH)
        self.leftsubframe = Frame(self.subframe, name='leftsubframe')
        self.leftsubframe.pack(side=LEFT, expand=1, fill=BOTH)
        self.rightsubframe = Frame(self.subframe, name='rightsubframe')
        self.rightsubframe.pack(side=RIGHT, expand=1, fill=BOTH)
        self.chaptervar = StringVar(master)
        self.chapter = Menubutton(self.rightsubframe, name='chapter',
                                  text='Directory', relief=RAISED,
                                  borderwidth=2)
        self.chapter.pack(side=TOP)
        self.chaptermenu = Menu(self.chapter, name='chaptermenu')
        self.chaptermenu.add_radiobutton(label='C functions',
                                         value=MAN3DIR,
                                         variable=self.chaptervar,
                                         command=self.newchapter)
        self.chaptermenu.add_radiobutton(label='Tcl/Tk functions',
                                         value=MANNDIR,
                                         variable=self.chaptervar,
                                         command=self.newchapter)
        self.chapter['menu'] = self.chaptermenu
        self.listbox = Listbox(self.rightsubframe, name='listbox',
                               relief=SUNKEN, borderwidth=2,
                               width=20, height=5)
        self.listbox.pack(expand=1, fill=BOTH)
        self.l1 = Button(self.leftsubframe, name='l1',
                         text='Display manual page named:',
                         command=self.entry_cb)
        self.l1.pack(side=TOP)
        self.entry = Entry(self.leftsubframe, name='entry',
                            relief=SUNKEN, borderwidth=2,
                            width=20)
        self.entry.pack(expand=0, fill=X)
        self.l2frame = Frame(self.leftsubframe, name='l2frame')
        self.l2frame.pack(expand=0, fill=NONE)
        self.l2 = Button(self.l2frame, name='l2',
                         text='Search regexp:',
                         command=self.search_cb)
        self.l2.pack(side=LEFT)
        self.casevar = BooleanVar()
        self.casesense = Checkbutton(self.l2frame, name='casesense',
                                     text='Case sensitive',
                                     variable=self.casevar,
                                     relief=FLAT)
        self.casesense.pack(side=LEFT)
        self.search = Entry(self.leftsubframe, name='search',
                            relief=SUNKEN, borderwidth=2,
                            width=20)
        self.search.pack(expand=0, fill=X)
        self.title = Label(self.leftsubframe, name='title',
                           text='(none)')
        self.title.pack(side=BOTTOM)
        self.text = ManPage(self.frame, name='text',
                            relief=SUNKEN, borderwidth=2,
                            wrap=NONE, width=72,
                            selectbackground='pink')
        self.text.pack(expand=1, fill=BOTH)

        self.entry.bind('<Return>', self.entry_cb)
        self.search.bind('<Return>', self.search_cb)
        self.listbox.bind('<Double-1>', self.listbox_cb)

        self.entry.bind('<Tab>', self.entry_tab)
        self.search.bind('<Tab>', self.search_tab)
        self.text.bind('<Tab>', self.text_tab)

        self.entry.focus_set()

        self.chaptervar.set(MANNDIR)
        self.newchapter()

    def newchapter(self):
        mandir = self.chaptervar.get()
        self.choices = []
        self.addlist(listmanpages(mandir))

    def addchoice(self, choice):
        if choice not in self.choices:
            self.choices.append(choice)
            self.choices.sort()
        self.update()

    def addlist(self, list):
        self.choices[len(self.choices):] = list
        self.choices.sort()
        self.update()

    def entry_cb(self, *e):
        self.update()

    def listbox_cb(self, e):
        selection = self.listbox.curselection()
        if selection and len(selection) == 1:
            name = self.listbox.get(selection[0])
            self.show_page(name)

    def search_cb(self, *e):
        self.search_string(self.search.get())

    def entry_tab(self, e):
        self.search.focus_set()

    def search_tab(self, e):
        self.entry.focus_set()

    def text_tab(self, e):
        self.entry.focus_set()

    def updatelist(self):
        key = self.entry.get()
        ok = filter(lambda name, key=key, n=len(key): name[:n]==key,
                 self.choices)
        if not ok:
            self.frame.bell()
        self.listbox.delete(0, AtEnd())
        exactmatch = 0
        for item in ok:
            if item == key: exactmatch = 1
            self.listbox.insert(AtEnd(), item)
        if exactmatch:
            return key
        n = self.listbox.size()
        if n == 1:
            return self.listbox.get(0)
        # Else return None, meaning not a unique selection

    def update(self):
        name = self.updatelist()
        if name:
            self.show_page(name)
            self.entry.delete(0, AtEnd())
            self.updatelist()

    def show_page(self, name):
        file = '%s/%s.?' % (self.chaptervar.get(), name)
        fp = os.popen('nroff -man %s | ul -i' % file, 'r')
        self.text.kill()
        self.title['text'] = name
        self.text.parsefile(fp)

    def search_string(self, search):
        if not search:
            self.frame.bell()
            print 'Empty search string'
            return
        if not self.casevar.get():
            map = re.IGNORECASE
        else:
            map = None
        try:
            if map:
                prog = re.compile(search, map)
            else:
                prog = re.compile(search)
        except re.error, msg:
            self.frame.bell()
            print 'Regex error:', msg
            return
        here = self.text.index(AtInsert())
        lineno = string.atoi(here[:string.find(here, '.')])
        end = self.text.index(AtEnd())
        endlineno = string.atoi(end[:string.find(end, '.')])
        wraplineno = lineno
        found = 0
        while 1:
            lineno = lineno + 1
            if lineno > endlineno:
                if wraplineno <= 0:
                    break
                endlineno = wraplineno
                lineno = 0
                wraplineno = 0
            line = self.text.get('%d.0 linestart' % lineno,
                                 '%d.0 lineend' % lineno)
            i = prog.search(line)
            if i >= 0:
                found = 1
                n = max(1, len(prog.group(0)))
                try:
                    self.text.tag_remove('sel',
                                         AtSelFirst(),
                                         AtSelLast())
                except TclError:
                    pass
                self.text.tag_add('sel',
                                  '%d.%d' % (lineno, i),
                                  '%d.%d' % (lineno, i+n))
                self.text.mark_set(AtInsert(),
                                   '%d.%d' % (lineno, i))
                self.text.yview_pickplace(AtInsert())
                break
        if not found:
            self.frame.bell()

def main():
    root = Tk()
    sb = SelectionBox(root)
    if sys.argv[1:]:
        sb.show_page(sys.argv[1])
    root.minsize(1, 1)
    root.mainloop()

main()
PK��Z~H�+��guido/ShellWindow.pycnu�[����
��^c@s�ddlZddlZddlZddlTddlmZddlmZddlZdZdefd��YZdZ	d	�Z
d
�Zedkr�e�ndS(i����N(t*(tScrolledText(tDialogitShellWindowcBsheZd
d
d�Zd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d�Zd	�ZRS(cKs|s>ytjd}Wntk
r0d}nX|d}ntj|�}|d}ttj||f|�d|_|j	d|j
�|j	d|j�|j	d|j�|j	d	|j
�|j	d
|j�t||�\|_|_|_|jj|jt|j�dS(NtSHELLs/bin/shs -iis1.0s<Return>s<Control-c>s<Control-t>s<Control-k>s<Control-d>(tostenvirontKeyErrortstringtsplittapplyRt__init__tpostbindtinputhandlertsiginttsigtermtsigkilltsendeoftspawntpidt	fromchildttochildttktcreatefilehandlertREADABLEt
outputhandler(tselftmastertshelltcnftargs((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR
s$



	!c	Cstj|t�}|s�|jj|�tj|jd�\}}dG|GdG|GHd|_|d?}|d@}|dkr�d|}n%d|d@}|d	@r�|d
}nt|j	d|dd
dddddd�dS|j
t|�|jd�|_
|jt�dS(NiRtstatusii�sexit status %dskilled by signal %dii�s -- core dumpedttextttitlesExit statustbitmaptwarningtdefaulttstringstOKsend - 1 char(R'(RtreadtBUFSIZERtdeletefilehandlertwaitpidRtNoneRRtinserttENDtindexRtyview_pickplace(	RtfiletmasktdataRtststdetailtcausetmsg((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR#s.	




cGse|js|j�dS|jtd�|j|jd�}|jt�|_tj|j	|�dS(Ntbreaks
send - 1 char(
Rt
no_processR-R.tgetRR/RtwriteR(RRtline((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR=s	
cGs+|js|j�dStj|j�dS(NR8(RR9RtcloseR(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRGs
	
cCs.|js|j�dStj|j|�dS(NR8(RR9Rtkill(Rtsig((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pytsendsigNs
	
cGs|jtj�S(N(R@tsignaltSIGINT(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRUscGs|jtj�S(N(R@RAtSIGQUIT(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pytsigquitXscGs|jtj�S(N(R@RAtSIGTERM(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR[scGs|jtj�S(N(R@RAtSIGKILL(RR((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR^scCs/t|jddddddddd	d�dS(NR!sNo active processR"s
No processR#terrorR%iR&R'(R'(RR(R((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyR9asN(
t__name__t
__module__R,RRRRR@RRDRRR9(((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRs		
						idcCs\tj�\}}tj�\}}tj�}|dkr5x6dD].}ytj|�WqCtjk
rpqCXqCWtj|�dkr�tjjd�ntj|�dkr�tjjd�ntj|�dkr�tjjd�ntj	dt
�ztj||�Wdtjjd�tjd�Xntj|�tj|�|||fS(	Niiispopen2: bad read dup
spopen2: bad write dup
isexecvp failed
(iii(
RtpipetforkR=RGtduptsyststderrR;t
closerangetMAXFDtexecvpt_exit(tprogRtp2creadtp2cwritetc2preadtc2pwriteRti((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyRks.


cCs�tjtjd�}t�}|jdd�|rJt|d|�}nt|�}|jdddt�|j	�|j
j�dS(NiRtexpandtfill(RtjoinRMtargvtTktminsizeRtpacktBOTHt	focus_setRtmainloop(Rtroottw((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyttest�s	
t__main__(
RRMRtTkinterRRRAR)RRPRReRH(((s6/usr/lib64/python2.7/Demo/tkinter/guido/ShellWindow.pyt<module>s
^		PK�(�Z�$�͕͕__init__.pynu�[���PK�(�Za� `A
A
�colorchooser.pynu�[���PK�(�Z_	Y�-,-,��tix.pynu�[���PK�(�Z	�j������ttk.pynu�[���PK�(�Zq�
���__main__.pynu�[���PK�(�Z����@@Ӭfont.pynu�[���PK�(�ZU���}}
J�messagebox.pynu�[���PK�(�Zs��8�8
�filedialog.pynu�[���PK�(�Z&���-�-:simpledialog.pynu�[���PK�(�Zj�xx*f=__pycache__/constants.cpython-38.opt-1.pycnu�[���PK�(�Z��00%8D__pycache__/filedialog.cpython-38.pycnu�[���PK�(�Z��z`,,$�t__pycache__/dnd.cpython-38.opt-1.pycnu�[���PK�(�Zs����-�__pycache__/scrolledtext.cpython-38.opt-1.pycnu�[���PK�(�Zҧ����'ҩ__pycache__/dialog.cpython-38.opt-2.pycnu�[���PK�(�ZD��@�*�*'�__pycache__/simpledialog.cpython-38.pycnu�[���PK�(�Z�(1616:�__pycache__/tix.cpython-38.pycnu�[���PK�(�Z ���I�I�$�__pycache__/tix.cpython-38.opt-2.pycnu�[���PK�(�Z寉�CC-V�__pycache__/colorchooser.cpython-38.opt-2.pycnu�[���PK�(�Z��xx$��__pycache__/constants.cpython-38.pycnu�[���PK�(�ZV�Fi%�__pycache__/font.cpython-38.opt-2.pycnu�[���PK�(�Zҧ����!__pycache__/dialog.cpython-38.pycnu�[���PK�(�Zb
p�nn$/__pycache__/ttk.cpython-38.opt-2.pycnu�[���PK�(�Z�x��2$2$-��__pycache__/simpledialog.cpython-38.opt-2.pycnu�[���PK�(�Z<,��22#/�__pycache__/__main__.cpython-38.pycnu�[���PK�(�Z�(1616$��__pycache__/tix.cpython-38.opt-1.pycnu�[���PK�(�Z��z`,,9�	__pycache__/dnd.cpython-38.pycnu�[���PK�(�ZD��@�*�*-�
__pycache__/simpledialog.cpython-38.opt-1.pycnu�[���PK�(�Zz��YVV-�=
__pycache__/scrolledtext.cpython-38.opt-2.pycnu�[���PK�(�Z\�yd3�3�)�D
__pycache__/__init__.cpython-38.opt-1.pycnu�[���PK�(�Z��00+�__pycache__/filedialog.cpython-38.opt-1.pycnu�[���PK�(�Z`��Nx�x�)�%
__pycache__/__init__.cpython-38.opt-2.pycnu�[���PK�(�Zwbh^��$X�__pycache__/dnd.cpython-38.opt-2.pycnu�[���PK�(�Z�#�N��-R�__pycache__/colorchooser.cpython-38.opt-1.pycnu�[���PK�(�Zj�xx*}�__pycache__/constants.cpython-38.opt-2.pycnu�[���PK�(�Z[_��S
S
+O�__pycache__/messagebox.cpython-38.opt-2.pycnu�[���PK�(�Z�1&���+��__pycache__/messagebox.cpython-38.opt-1.pycnu�[���PK�(�ZM�С�%	�__pycache__/font.cpython-38.opt-1.pycnu�[���PK�(�Zҧ����'�__pycache__/dialog.cpython-38.opt-1.pycnu�[���PK�(�Zv��ZZ-__pycache__/commondialog.cpython-38.opt-2.pycnu�[���PK�(�Zv��ZZ'�__pycache__/commondialog.cpython-38.pycnu�[���PK�(�Z�1&���%�$__pycache__/messagebox.cpython-38.pycnu�[���PK�(�Z�T—|�|�$�0__pycache__/ttk.cpython-38.opt-1.pycnu�[���PK�(�Z���i�(�(+V__pycache__/filedialog.cpython-38.opt-2.pycnu�[���PK�(�Zv��ZZ-�7__pycache__/commondialog.cpython-38.opt-1.pycnu�[���PK�(�Z�T—|�|�Z<__pycache__/ttk.cpython-38.pycnu�[���PK�(�ZM�С�$__pycache__/font.cpython-38.pycnu�[���PK�(�Zs����'3__pycache__/scrolledtext.cpython-38.pycnu�[���PK�(�Z�#�N��'�;__pycache__/colorchooser.cpython-38.pycnu�[���PK�(�Z<,��22)E__pycache__/__main__.cpython-38.opt-1.pycnu�[���PK�(�ZF�9Q�Q�#�F__pycache__/__init__.cpython-38.pycnu�[���PK�(�ZOU��)B�__pycache__/__main__.cpython-38.opt-2.pycnu�[���PK�(�Z�p������commondialog.pynu�[���PK�(�ZSs�-�,�,��dnd.pynu�[���PK�(�Zc�����*constants.pynu�[���PK�(�Z����0scrolledtext.pynu�[���PK�(�Z�6;��	/8dialog.pynu�[���PK��Z�}N�

O>matt/pong-demo-1.pynu�[���PK��Z��>;���Dmatt/packer-simple.pycnu�[���PK��ZMh�Ω	�	uJmatt/canvas-moving-w-mouse.pycnu�[���PK��Z~����lTmatt/00-HELLO-WORLD.pynu�[���PK��Z��)���Wmatt/canvas-reading-tag-info.pynu�[���PK��Z�f� 44#c^matt/window-creation-w-location.pyonu�[���PK��Z�		�fmatt/canvas-gridding.pycnu�[���PK��Zk�����Epmatt/dialog-box.pyonu�[���PK��Za>oQ��"Bxmatt/animation-w-velocity-ctrl.pyonu�[���PK��Z�]���!�matt/animation-w-velocity-ctrl.pynu�[���PK��Z��Vkk"��matt/menu-all-types-of-entries.pycnu�[���PK��Zb*�//>�matt/window-creation-simple.pynu�[���PK��Z;U<��"��matt/subclass-existing-widgets.pyonu�[���PK��Zb�r;	;	ߡmatt/canvas-with-scrollbars.pycnu�[���PK��Z;mDD i�matt/canvas-reading-tag-info.pycnu�[���PK��Z�j�HH��matt/radiobutton-simple.pyonu�[���PK��Z��g��matt/00-HELLO-WORLD.pycnu�[���PK��Z���ll#�matt/packer-and-placer-together.pyonu�[���PK��Z�D66��matt/placer-simple.pynu�[���PK��Z3��(jj$�matt/window-creation-simple.pycnu�[���PK��Z���*hh#��matt/entry-with-shared-variable.pycnu�[���PK��Z�X
���"��matt/packer-and-placer-together.pynu�[���PK��Z���*hh#��matt/entry-with-shared-variable.pyonu�[���PK��Z��t44^�matt/entry-simple.pyonu�[���PK��Z��ZZ����matt/window-creation-more.pycnu�[���PK��Z��g��matt/00-HELLO-WORLD.pyonu�[���PK��Z�3�--"5�matt/window-creation-w-location.pynu�[���PK��Z�P6����matt/slider-demo-1.pynu�[���PK��Z��Vkk"�matt/menu-all-types-of-entries.pyonu�[���PK��Z�w�� �matt/bind-w-mult-calls-p-type.pynu�[���PK��Z�Fֳ��matt/menu-simple.pynu�[���PK��Z�F�77#�$matt/not-what-you-might-think-2.pycnu�[���PK��Z���ll#|*matt/packer-and-placer-together.pycnu�[���PK��Z��>;��;0matt/packer-simple.pyonu�[���PK��Z�� �yy!6matt/bind-w-mult-calls-p-type.pyonu�[���PK��Zʥ�E��"�;matt/not-what-you-might-think-1.pynu�[���PK��Zv��	
	
�>matt/rubber-band-box-demo-1.pycnu�[���PK��Z�!��(Imatt/READMEnu�[���PK��Ze��̍�dKmatt/canvas-demo-simple.pyonu�[���PK��Za>oQ��"<Qmatt/animation-w-velocity-ctrl.pycnu�[���PK��Z	����yYmatt/slider-demo-1.pyonu�[���PK��ZCa�33o`matt/packer-simple.pynu�[���PK��Z`MY��!�cmatt/subclass-existing-widgets.pynu�[���PK��Z|=4�>>�fmatt/canvas-with-scrollbars.pynu�[���PK��Z���'��iomatt/canvas-gridding.pynu�[���PK��Zv��	
	
�xmatt/rubber-band-box-demo-1.pyonu�[���PK��Z�;����matt/window-creation-more.pynu�[���PK��Z�Q.�/�matt/killing-window-w-wm.pynu�[���PK��Z��������matt/animation-simple.pycnu�[���PK��Z;mDD ��matt/canvas-reading-tag-info.pyonu�[���PK��Z�����matt/rubber-line-demo-1.pyonu�[���PK��ZS�"

J�matt/placer-simple.pyonu�[���PK��Zk�������matt/dialog-box.pycnu�[���PK��Z�		��matt/canvas-gridding.pyonu�[���PK��Z��aI

"��matt/canvas-moving-or-creating.pyonu�[���PK��Z0L���^�matt/killing-window-w-wm.pycnu�[���PK��Z	�����matt/slider-demo-1.pycnu�[���PK��Z0L���u�matt/killing-window-w-wm.pyonu�[���PK��ZS�"

��matt/placer-simple.pycnu�[���PK��Z;U<��"��matt/subclass-existing-widgets.pycnu�[���PK��Z�̆^#
�matt/not-what-you-might-think-1.pyonu�[���PK��Z3��(jjt�matt/window-creation-simple.pyonu�[���PK��Z������-�matt/animation-simple.pyonu�[���PK��ZMh�Ω	�	.�matt/canvas-moving-w-mouse.pyonu�[���PK��Z�nЈ	�	%matt/dialog-box.pynu�[���PK��Z�	��NN�	matt/canvas-moving-w-mouse.pynu�[���PK��Z�����matt/rubber-line-demo-1.pycnu�[���PK��Ze��̍��matt/canvas-demo-simple.pycnu�[���PK��ZL�

!�!matt/printing-coords-of-items.pyonu�[���PK��Zb�r;	;	�+matt/canvas-with-scrollbars.pyonu�[���PK��Z��>kv	v	!5matt/canvas-moving-or-creating.pynu�[���PK��Z�x�#�#!F?matt/menu-all-types-of-entries.pynu�[���PK��Z:���
�
-cmatt/canvas-mult-item-sel.pyonu�[���PK��Z�F�77#pnmatt/not-what-you-might-think-2.pyonu�[���PK��ZL�

!�smatt/printing-coords-of-items.pycnu�[���PK��Z��aI

"a~matt/canvas-moving-or-creating.pycnu�[���PK��Z���d�� ʈmatt/canvas-w-widget-draw-el.pyonu�[���PK��Z�uk/����matt/animation-simple.pynu�[���PK��Z��t44�matt/entry-simple.pycnu�[���PK��Z�� �yy!g�matt/bind-w-mult-calls-p-type.pycnu�[���PK��Z~ǁ���"1�matt/not-what-you-might-think-2.pynu�[���PK��Z4+���n�matt/two-radio-groups.pycnu�[���PK��Z����PPG�matt/pong-demo-1.pycnu�[���PK��Z:���
�
۱matt/canvas-mult-item-sel.pycnu�[���PK��Z����PP�matt/pong-demo-1.pyonu�[���PK��ZR��۩���matt/menu-simple.pycnu�[���PK��Z�}�`	`	 ��matt/printing-coords-of-items.pynu�[���PK��Z�_ ��O�matt/canvas-demo-simple.pynu�[���PK��Z�>�����matt/two-radio-groups.pynu�[���PK��Z�̆^#{�matt/not-what-you-might-think-1.pycnu�[���PK��Z���d�� ��matt/canvas-w-widget-draw-el.pycnu�[���PK��Z#~���"�matt/entry-with-shared-variable.pynu�[���PK��Z�J����8�matt/radiobutton-simple.pynu�[���PK��Z����]matt/canvas-w-widget-draw-el.pynu�[���PK��Zo���VVF	matt/rubber-band-box-demo-1.pynu�[���PK��Z��ZZ���matt/window-creation-more.pyonu�[���PK��Z�j�HH�matt/radiobutton-simple.pycnu�[���PK��Z�f� 44#� matt/window-creation-w-location.pycnu�[���PK��Z�(�)matt/canvas-mult-item-sel.pynu�[���PK��ZQm4matt/rubber-line-demo-1.pynu�[���PK��ZR��۩�6<matt/menu-simple.pyonu�[���PK��Z4+���#Dmatt/two-radio-groups.pyonu�[���PK��Z#U�����Lmatt/entry-simple.pynu�[���PK��Z��$&$&Pttk/ttkcalendar.pycnu�[���PK��Z��[����vttk/mac_searchentry.pynu�[���PK��Z|&C]��L�ttk/combo_themes.pycnu�[���PK��Z|&C]���ttk/combo_themes.pyonu�[���PK��ZRh�|@@�ttk/listbox_scrollcmd.pyonu�[���PK��Zxa��##k�ttk/roundframe.pyonu�[���PK��Z�/
QQдttk/combo_themes.pynu�[���PK��ZRh�|@@d�ttk/listbox_scrollcmd.pycnu�[���PK��Z�8�~ ~ �ttk/ttkcalendar.pynu�[���PK��Z�O�����ttk/dirbrowser.pyonu�[���PK��Z#��ggw�ttk/treeview_multicolumn.pyonu�[���PK��Z�-���*ttk/listbox_scrollcmd.pynu�[���PK��Z>����ttk/mac_searchentry.pyonu�[���PK��Zy5�L���ttk/roundframe.pynu�[���PK��Z#��gg�2ttk/treeview_multicolumn.pycnu�[���PK��Zn�nF�	�	�Httk/notebook_closebtn.pynu�[���PK��Z��yTt%t%�Rttk/plastik_theme.pynu�[���PK��Z�|!ee{xttk/img/close_pressed.gifnu�[���PK��Z�xU�ee)yttk/img/close.gifnu�[���PK��Z�.�PP�yttk/img/close_active.gifnu�[���PK��Z��$&$&gzttk/ttkcalendar.pyonu�[���PK��Z��"�P
P
Πttk/widget_state.pyonu�[���PK��Zw�%>>b�ttk/theme_selector.pycnu�[���PK��Za�O����ttk/theme_selector.pynu�[���PK��Zxa��##�ttk/roundframe.pycnu�[���PK��Z�^��C�ttk/treeview_multicolumn.pynu�[���PK��Z�J"_��$�ttk/notebook_closebtn.pyonu�[���PK��Z�J"_��
�ttk/notebook_closebtn.pycnu�[���PK��Z��"�P
P
�ttk/widget_state.pycnu�[���PK��Z�j:�^^�ttk/plastik_theme.pyonu�[���PK��Zw�%>>-/ttk/theme_selector.pyonu�[���PK��Z>����:ttk/mac_searchentry.pycnu�[���PK��Z�O����Jttk/dirbrowser.pycnu�[���PK��Za�kJ�
�
KZttk/widget_state.pynu�[���PK��Z��qP�
�
/ettk/dirbrowser.pynu�[���PK��Z�j:�^^
pttk/plastik_theme.pycnu�[���PK��Z�Ծ����READMEnu�[���PK��Z�#����guido/imageview.pynu�[���PK��Z^�������guido/wish.pycnu�[���PK��ZM�dUU��guido/MimeViewer.pycnu�[���PK��Z�X�\J�guido/ManPage.pycnu�[���PK��Z��kK�\�\��guido/sortvisu.pyonu�[���PK��Z%L���guido/brownian2.pycnu�[���PK��Z�+�$RR�$guido/optionmenu.pycnu�[���PK��Z�^u�iiq'guido/switch.pyonu�[���PK��Z-���883guido/AttrDialog.pynu�[���PK��Z��V���
akguido/rmt.pyonu�[���PK��Z���,�)�)Sguido/canvasevents.pycnu�[���PK��Z)t�MIMIu�guido/AttrDialog.pycnu�[���PK��Z^������guido/wish.pyonu�[���PK��Z
Cx�jj%�guido/paint.pynu�[���PK��Z�X�\�guido/ManPage.pyonu�[���PK��Z���X�#�#%guido/tkman.pyonu�[���PK��Z27O�::�:guido/imageview.pycnu�[���PK��Z����YYb=guido/brownian.pyonu�[���PK��ZM�dUU�Cguido/MimeViewer.pyonu�[���PK��Z.��55�Wguido/svkill.pycnu�[���PK��Zv����oguido/canvasevents.pynuȯ��PK��Z`�xII�guido/hanoi.pyonu�[���PK��Zn�`�		��guido/electrons.pynuȯ��PK��Z-�ɖ55
��guido/mbox.pynuȯ��PK��Z��LLk�guido/ShellWindow.pynu�[���PK��Zj'����guido/imagedraw.pynu�[���PK��Z&�S�}E}E:�guido/solitaire.pynuȯ��PK��Z"��@@�guido/kill.pycnu�[���PK��Z�^u�iiw+guido/switch.pycnu�[���PK��Z��1 7guido/switch.pynu�[���PK��Z~H�+��v=guido/ShellWindow.pyonu�[���PK��ZD�����Sguido/optionmenu.pynu�[���PK��Z��kK�\�\�Uguido/sortvisu.pycnu�[���PK��Z�˗*KK��guido/hello.pynu�[���PK��Z)�Yz�K�K�guido/sortvisu.pynuȯ��PK��Z�h���guido/imagedraw.pycnu�[���PK��ZXj|0J|J|
�guido/ss1.pyonu�[���PK��Z&Y���>�guido/listtree.pycnu�[���PK��ZKѴ�Q�Q}�guido/solitaire.pycnu�[���PK��Z��sl�~�~
a�guido/ss1.pycnu�[���PK��Z�m.,,
IXguido/kill.pynuȯ��PK��Z�+�$RR�gguido/optionmenu.pyonu�[���PK��Z���X�#�#Hjguido/tkman.pycnu�[���PK��Z	�7E� � �guido/mbox.pycnu�[���PK��ZE`}eR	R	��guido/electrons.pycnu�[���PK��ZE�7����guido/listtree.pynu�[���PK��Z.��55��guido/svkill.pyonu�[���PK��Z��GfGf!�guido/ss1.pynu�[���PK��Zk>'���:guido/hello.pyonu�[���PK��Z���oo�=guido/dialog.pycnu�[���PK��Z���,�)�)OJguido/canvasevents.pyonu�[���PK��Zqf�XXqtguido/newmenubardemo.pycnu�[���PK��Z	�7E� � {guido/mbox.pyonu�[���PK��Z�|�D���guido/paint.pycnu�[���PK��Z�<J=�guido/svkill.pynuȯ��PK��Z����YYA�guido/brownian.pycnu�[���PK��Z&Y���ܾguido/listtree.pyonu�[���PK��Z/	Ŕcc�guido/brownian2.pynu�[���PK��Z%L����guido/brownian2.pyonu�[���PK��Zե�))��guido/hanoi.pynu�[���PK��Z���ooc�guido/dialog.pyonu�[���PK��Z��|
���guido/MimeViewer.pynuȯ��PK��Z�|�D��� guido/paint.pyonu�[���PK��Z�(�V��� guido/ManPage.pynu�[���PK��Z`�xII�& guido/hanoi.pycnu�[���PK��Zk>'��x6 guido/hello.pycnu�[���PK��Z�`&�CCt9 guido/brownian.pynu�[���PK��Z�Ṁ���= guido/dialog.pynuȯ��PK��Z�h���J guido/imagedraw.pyonu�[���PK��Z)t�MIMI~O guido/AttrDialog.pyonu�[���PK��Z.�V�oo
� guido/wish.pynu�[���PK��ZE`}eR	R	�� guido/electrons.pyonu�[���PK��Zqf�XXP� guido/newmenubardemo.pyonu�[���PK��Z��V���
� guido/rmt.pycnu�[���PK��ZKѴ�Q�Q� guido/solitaire.pyonu�[���PK��Za�A����!guido/newmenubardemo.pynuȯ��PK��Z��I���!guido/rmt.pynuȯ��PK��Z27O�::�(!guido/imageview.pyonu�[���PK��Z"��@@!+!guido/kill.pyonu�[���PK��Z.��,#,#�>!guido/tkman.pynuȯ��PK��Z~H�+��	b!guido/ShellWindow.pycnu�[���PK`/x!