:mod:`!tkinter.ttk` --- Tk themed widgets
=========================================

.. module:: tkinter.ttk
   :synopsis: Tk themed widget set

.. sectionauthor:: Guilherme Polo <ggpolo@gmail.com>

**Source code:** :source:`Lib/tkinter/ttk.py`

.. index:: single: ttk

--------------

The :mod:`tkinter.ttk` module provides access to the Tk themed widget set,
introduced in Tk 8.5. It provides additional benefits including anti-aliased font
rendering under X11 and window transparency (requiring a composition
window manager on X11).

The basic idea for :mod:`tkinter.ttk` is to separate, to the extent possible,
the code implementing a widget's behavior from the code implementing its
appearance.


.. seealso::

   `Tk Widget Styling Support <https://core.tcl.tk/tips/doc/trunk/tip/48.md>`_
      A document introducing theming support for Tk


Using Ttk
---------

To start using Ttk, import its module::

   from tkinter import ttk

To override the basic Tk widgets, the import should follow the Tk import::

   from tkinter import *
   from tkinter.ttk import *

That code causes several :mod:`tkinter.ttk` widgets (:class:`Button`,
:class:`Checkbutton`, :class:`Entry`, :class:`Frame`, :class:`Label`,
:class:`LabelFrame`, :class:`Menubutton`, :class:`PanedWindow`,
:class:`Radiobutton`, :class:`Scale` and :class:`Scrollbar`) to
automatically replace the Tk widgets.

This has the direct benefit of using the new widgets which gives a better
look and feel across platforms; however, the replacement widgets are not
completely compatible. The main difference is that widget options such as
"fg", "bg" and others related to widget styling are no
longer present in Ttk widgets.  Instead, use  the :class:`ttk.Style` class
for improved styling effects.


.. seealso::

   `Converting existing applications to use Tile widgets <https://tktable.sourceforge.net/tile/doc/converting.txt>`_
     A monograph (using Tcl terminology) about differences typically
     encountered when moving applications to use the new widgets.


Ttk Widgets
-----------

Ttk comes with 18 widgets, twelve of which already existed in tkinter:
:class:`Button`, :class:`Checkbutton`, :class:`Entry`, :class:`Frame`,
:class:`Label`, :class:`LabelFrame`, :class:`Menubutton`, :class:`PanedWindow`,
:class:`Radiobutton`, :class:`Scale`, :class:`Scrollbar`, and :class:`Spinbox`.
The other six are new: :class:`Combobox`, :class:`Notebook`,
:class:`Progressbar`, :class:`Separator`, :class:`Sizegrip` and
:class:`Treeview`. And all them are subclasses of :class:`Widget`.

Using the Ttk widgets gives the application an improved look and feel.
As discussed above, there are differences in how the styling is coded.

Tk code::

   l1 = tkinter.Label(text="Test", fg="black", bg="white")
   l2 = tkinter.Label(text="Test", fg="black", bg="white")


Ttk code::

   style = ttk.Style()
   style.configure("BW.TLabel", foreground="black", background="white")

   l1 = ttk.Label(text="Test", style="BW.TLabel")
   l2 = ttk.Label(text="Test", style="BW.TLabel")

For more information about TtkStyling_, see the :class:`Style` class
documentation.

Widget
------

:class:`ttk.Widget` defines standard options and methods supported by Tk
themed widgets and is not supposed to be directly instantiated.


Standard Options
^^^^^^^^^^^^^^^^

All the :mod:`ttk` Widgets accept the following options:

.. tabularcolumns:: |l|L|

+-----------+--------------------------------------------------------------+
| Option    | Description                                                  |
+===========+==============================================================+
| class     | Specifies the window class. The class is used when querying  |
|           | the option database for the window's other options, to       |
|           | determine the default bindtags for the window, and to select |
|           | the widget's default layout and style. This option is        |
|           | read-only, and may only be specified when the window is      |
|           | created.                                                     |
+-----------+--------------------------------------------------------------+
| cursor    | Specifies the mouse cursor to be used for the widget. If set |
|           | to the empty string (the default), the cursor is inherited   |
|           | for the parent widget.                                       |
+-----------+--------------------------------------------------------------+
| takefocus | Determines whether the window accepts the focus during       |
|           | keyboard traversal. 0, 1 or an empty string is returned.     |
|           | If 0 is returned, it means that the window should be skipped |
|           | entirely during keyboard traversal. If 1, it means that the  |
|           | window should receive the input focus as long as it is       |
|           | viewable. And an empty string means that the traversal       |
|           | scripts make the decision about whether or not to focus      |
|           | on the window.                                               |
+-----------+--------------------------------------------------------------+
| style     | May be used to specify a custom widget style.                |
+-----------+--------------------------------------------------------------+


Scrollable Widget Options
^^^^^^^^^^^^^^^^^^^^^^^^^

The following options are supported by widgets that are controlled by a
scrollbar.

.. tabularcolumns:: |l|L|

+----------------+---------------------------------------------------------+
| Option         | Description                                             |
+================+=========================================================+
| xscrollcommand | Used to communicate with horizontal scrollbars.         |
|                |                                                         |
|                | When the view in the widget's window change, the widget |
|                | will generate a Tcl command based on the scrollcommand. |
|                |                                                         |
|                | Usually this option consists of the method              |
|                | :meth:`Scrollbar.set` of some scrollbar. This will cause|
|                | the scrollbar to be updated whenever the view in the    |
|                | window changes.                                         |
+----------------+---------------------------------------------------------+
| yscrollcommand | Used to communicate with vertical scrollbars.           |
|                | For some more information, see above.                   |
+----------------+---------------------------------------------------------+


Label Options
^^^^^^^^^^^^^

The following options are supported by labels, buttons and other button-like
widgets.

.. tabularcolumns:: |l|p{0.7\linewidth}|

+--------------+-----------------------------------------------------------+
| Option       | Description                                               |
+==============+===========================================================+
| text         | Specifies a text string to be displayed inside the widget.|
+--------------+-----------------------------------------------------------+
| textvariable | Specifies a name whose value will be used in place of the |
|              | text option resource.                                     |
+--------------+-----------------------------------------------------------+
| underline    | If set, specifies the index (0-based) of a character to   |
|              | underline in the text string. The underline character is  |
|              | used for mnemonic activation.                             |
+--------------+-----------------------------------------------------------+
| image        | Specifies an image to display. This is a list of 1 or more|
|              | elements. The first element is the default image name. The|
|              | rest of the list if a sequence of statespec/value pairs as|
|              | defined by :meth:`Style.map`, specifying different images |
|              | to use when the widget is in a particular state or a      |
|              | combination of states. All images in the list should have |
|              | the same size.                                            |
+--------------+-----------------------------------------------------------+
| compound     | Specifies how to display the image relative to the text,  |
|              | in the case both text and images options are present.     |
|              | Valid values are:                                         |
|              |                                                           |
|              | * text: display text only                                 |
|              | * image: display image only                               |
|              | * top, bottom, left, right: display image above, below,   |
|              |   left of, or right of the text, respectively.            |
|              | * none: the default. display the image if present,        |
|              |   otherwise the text.                                     |
+--------------+-----------------------------------------------------------+
| width        | If greater than zero, specifies how much space, in        |
|              | character widths, to allocate for the text label, if less |
|              | than zero, specifies a minimum width. If zero or          |
|              | unspecified, the natural width of the text label is used. |
+--------------+-----------------------------------------------------------+


Compatibility Options
^^^^^^^^^^^^^^^^^^^^^

.. tabularcolumns:: |l|L|

+--------+----------------------------------------------------------------+
| Option | Description                                                    |
+========+================================================================+
| state  | May be set to "normal" or "disabled" to control the "disabled" |
|        | state bit. This is a write-only option: setting it changes the |
|        | widget state, but the :meth:`Widget.state` method does not     |
|        | affect this option.                                            |
+--------+----------------------------------------------------------------+

Widget States
^^^^^^^^^^^^^

The widget state is a bitmap of independent state flags.

.. tabularcolumns:: |l|L|

+------------+-------------------------------------------------------------+
| Flag       | Description                                                 |
+============+=============================================================+
| active     | The mouse cursor is over the widget and pressing a mouse    |
|            | button will cause some action to occur                      |
+------------+-------------------------------------------------------------+
| disabled   | Widget is disabled under program control                    |
+------------+-------------------------------------------------------------+
| focus      | Widget has keyboard focus                                   |
+------------+-------------------------------------------------------------+
| pressed    | Widget is being pressed                                     |
+------------+-------------------------------------------------------------+
| selected   | "On", "true", or "current" for things like Checkbuttons and |
|            | radiobuttons                                                |
+------------+-------------------------------------------------------------+
| background | Windows and Mac have a notion of an "active" or foreground  |
|            | window. The *background* state is set for widgets in a      |
|            | background window, and cleared for those in the foreground  |
|            | window                                                      |
+------------+-------------------------------------------------------------+
| readonly   | Widget should not allow user modification                   |
+------------+-------------------------------------------------------------+
| alternate  | A widget-specific alternate display format                  |
+------------+-------------------------------------------------------------+
| invalid    | The widget's value is invalid                               |
+------------+-------------------------------------------------------------+

A state specification is a sequence of state names, optionally prefixed with
an exclamation point indicating that the bit is off.


ttk.Widget
^^^^^^^^^^

Besides the methods described below, the :class:`ttk.Widget` supports the
methods :meth:`tkinter.Widget.cget` and :meth:`tkinter.Widget.configure`.

.. class:: Widget

   .. method:: identify(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.


   .. method:: instate(statespec, callback=None, *args, **kw)

      Test the widget's state. If a callback is not specified, returns ``True``
      if the widget state matches *statespec* and ``False`` otherwise. If callback
      is specified then it is called with args if widget state matches
      *statespec*.


   .. method:: state(statespec=None)

      Modify or inquire widget state. If *statespec* is specified, sets the
      widget state according to it and return a new *statespec* indicating
      which flags were changed. If *statespec* is not specified, returns
      the currently enabled state flags.

   *statespec* will usually be a list or a tuple.


Combobox
--------

The :class:`ttk.Combobox` widget combines a text field with a pop-down list of
values. This widget is a subclass of :class:`Entry`.

Besides the methods inherited from :class:`Widget`: :meth:`Widget.cget`,
:meth:`Widget.configure`, :meth:`Widget.identify`, :meth:`Widget.instate`
and :meth:`Widget.state`, and the following inherited from :class:`Entry`:
:meth:`Entry.bbox`, :meth:`Entry.delete`, :meth:`Entry.icursor`,
:meth:`Entry.index`, :meth:`Entry.insert`, :meth:`Entry.selection`,
:meth:`Entry.xview`, it has some other methods, described at
:class:`ttk.Combobox`.


Options
^^^^^^^

This widget accepts the following specific options:

.. tabularcolumns:: |l|L|

+-----------------+--------------------------------------------------------+
| Option          | Description                                            |
+=================+========================================================+
| exportselection | Boolean value. If set, the widget selection is linked  |
|                 | to the Window Manager selection (which can be returned |
|                 | by invoking Misc.selection_get, for example).          |
+-----------------+--------------------------------------------------------+
| justify         | Specifies how the text is aligned within the widget.   |
|                 | One of "left", "center", or "right".                   |
+-----------------+--------------------------------------------------------+
| height          | Specifies the height of the pop-down listbox, in rows. |
+-----------------+--------------------------------------------------------+
| postcommand     | A script (possibly registered with Misc.register) that |
|                 | is called immediately before displaying the values. It |
|                 | may specify which values to display.                   |
+-----------------+--------------------------------------------------------+
| state           | One of "normal", "readonly", or "disabled". In the     |
|                 | "readonly" state, the value may not be edited directly,|
|                 | and the user can only selection of the values from the |
|                 | dropdown list. In the "normal" state, the text field is|
|                 | directly editable. In the "disabled" state, no         |
|                 | interaction is possible.                               |
+-----------------+--------------------------------------------------------+
| textvariable    | Specifies a name whose value is linked to the widget   |
|                 | value. Whenever the value associated with that name    |
|                 | changes, the widget value is updated, and vice versa.  |
|                 | See :class:`tkinter.StringVar`.                        |
+-----------------+--------------------------------------------------------+
| values          | Specifies the list of values to display in the         |
|                 | drop-down listbox.                                     |
+-----------------+--------------------------------------------------------+
| width           | Specifies an integer value indicating the desired width|
|                 | of the entry window, in average-size characters of the |
|                 | widget's font.                                         |
+-----------------+--------------------------------------------------------+


Virtual events
^^^^^^^^^^^^^^

The combobox widgets generates a **<<ComboboxSelected>>** virtual event
when the user selects an element from the list of values.


ttk.Combobox
^^^^^^^^^^^^

.. class:: Combobox

   .. method:: current(newindex=None)

      If *newindex* is specified, sets the combobox value to the element
      position *newindex*. Otherwise, returns the index of the current value or
      -1 if the current value is not in the values list.


   .. method:: get()

      Returns the current value of the combobox.


   .. method:: set(value)

      Sets the value of the combobox to *value*.


Spinbox
-------
The :class:`ttk.Spinbox` widget is a :class:`ttk.Entry` enhanced with increment
and decrement arrows.  It can be used for numbers or lists of string values.
This widget is a subclass of :class:`Entry`.

Besides the methods inherited from :class:`Widget`: :meth:`Widget.cget`,
:meth:`Widget.configure`, :meth:`Widget.identify`, :meth:`Widget.instate`
and :meth:`Widget.state`, and the following inherited from :class:`Entry`:
:meth:`Entry.bbox`, :meth:`Entry.delete`, :meth:`Entry.icursor`,
:meth:`Entry.index`, :meth:`Entry.insert`, :meth:`Entry.xview`,
it has some other methods, described at :class:`ttk.Spinbox`.

Options
^^^^^^^

This widget accepts the following specific options:

.. tabularcolumns:: |l|L|

+----------------------+------------------------------------------------------+
| Option               | Description                                          |
+======================+======================================================+
| from                 | Float value.  If set, this is the minimum value to   |
|                      | which the decrement button will decrement.  Must be  |
|                      | spelled as ``from_`` when used as an argument, since |
|                      | ``from`` is a Python keyword.                        |
+----------------------+------------------------------------------------------+
| to                   | Float value.  If set, this is the maximum value to   |
|                      | which the increment button will increment.           |
+----------------------+------------------------------------------------------+
| increment            | Float value.  Specifies the amount which the         |
|                      | increment/decrement buttons change the               |
|                      | value. Defaults to 1.0.                              |
+----------------------+------------------------------------------------------+
| values               | Sequence of string or float values.  If specified,   |
|                      | the increment/decrement buttons will cycle through   |
|                      | the items in this sequence rather than incrementing  |
|                      | or decrementing numbers.                             |
|                      |                                                      |
+----------------------+------------------------------------------------------+
| wrap                 | Boolean value.  If ``True``, increment and decrement |
|                      | buttons will cycle from the ``to`` value to the      |
|                      | ``from`` value or the ``from`` value to the ``to``   |
|                      | value, respectively.                                 |
+----------------------+------------------------------------------------------+
| format               | String value.  This specifies the format of numbers  |
|                      | set by the increment/decrement buttons.  It must be  |
|                      | in the form "%W.Pf", where W is the padded width of  |
|                      | the value, P is the precision, and '%' and 'f' are   |
|                      | literal.                                             |
+----------------------+------------------------------------------------------+
| command              | Python callable.  Will be called with no arguments   |
|                      | whenever either of the increment or decrement buttons|
|                      | are pressed.                                         |
|                      |                                                      |
+----------------------+------------------------------------------------------+


Virtual events
^^^^^^^^^^^^^^

The spinbox widget generates an **<<Increment>>** virtual event when the
user presses <Up>, and a **<<Decrement>>** virtual event when the user
presses <Down>.

ttk.Spinbox
^^^^^^^^^^^^

.. class:: Spinbox

   .. method:: get()

      Returns the current value of the spinbox.


   .. method:: set(value)

      Sets the value of the spinbox to *value*.


Notebook
--------

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.


Options
^^^^^^^

This widget accepts the following specific options:

.. tabularcolumns:: |l|L|

+---------+----------------------------------------------------------------+
| Option  | Description                                                    |
+=========+================================================================+
| height  | If present and greater than zero, specifies the desired height |
|         | of the pane area (not including internal padding or tabs).     |
|         | Otherwise, the maximum height of all panes is used.            |
+---------+----------------------------------------------------------------+
| padding | Specifies the amount of extra space to add around the outside  |
|         | of the notebook. The padding is a list up to four length       |
|         | specifications left top right bottom. If fewer than four       |
|         | elements are specified, bottom defaults to top, right defaults |
|         | to left, and top defaults to left.                             |
+---------+----------------------------------------------------------------+
| width   | If present and greater than zero, specified the desired width  |
|         | of the pane area (not including internal padding). Otherwise,  |
|         | the maximum width of all panes is used.                        |
+---------+----------------------------------------------------------------+


Tab Options
^^^^^^^^^^^

There are also specific options for tabs:

.. tabularcolumns:: |l|L|

+-----------+--------------------------------------------------------------+
| Option    | Description                                                  |
+===========+==============================================================+
| state     | Either "normal", "disabled" or "hidden". If "disabled", then |
|           | the tab is not selectable. If "hidden", then the tab is not  |
|           | shown.                                                       |
+-----------+--------------------------------------------------------------+
| sticky    | Specifies how the child window is positioned within the pane |
|           | area. Value is a string containing zero or more of the       |
|           | characters "n", "s", "e" or "w". Each letter refers to a     |
|           | side (north, south, east or west) that the child window will |
|           | stick to, as per the :meth:`grid` geometry manager.          |
+-----------+--------------------------------------------------------------+
| padding   | Specifies the amount of extra space to add between the       |
|           | notebook and this pane. Syntax is the same as for the option |
|           | padding used by this widget.                                 |
+-----------+--------------------------------------------------------------+
| text      | Specifies a text to be displayed in the tab.                 |
+-----------+--------------------------------------------------------------+
| image     | Specifies an image to display in the tab. See the option     |
|           | image described in :class:`Widget`.                          |
+-----------+--------------------------------------------------------------+
| compound  | Specifies how to display the image relative to the text, in  |
|           | the case both options text and image are present. See        |
|           | `Label Options`_ for legal values.                           |
+-----------+--------------------------------------------------------------+
| underline | Specifies the index (0-based) of a character to underline in |
|           | the text string. The underlined character is used for        |
|           | mnemonic activation if :meth:`Notebook.enable_traversal` is  |
|           | called.                                                      |
+-----------+--------------------------------------------------------------+


Tab Identifiers
^^^^^^^^^^^^^^^

The tab_id present in several methods of :class:`ttk.Notebook` 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 identifies the tab
* The literal string "current", which identifies the currently selected tab
* The literal string "end", which returns the number of tabs (only valid for
  :meth:`Notebook.index`)


Virtual Events
^^^^^^^^^^^^^^

This widget generates a **<<NotebookTabChanged>>** virtual event after a new
tab is selected.


ttk.Notebook
^^^^^^^^^^^^

.. class:: Notebook

   .. method:: add(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.

      See `Tab Options`_ for the list of available options.


   .. method:: forget(tab_id)

      Removes the tab specified by *tab_id*, unmaps and unmanages the
      associated window.


   .. method:: hide(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 :meth:`add` command.


   .. method:: identify(x, y)

      Returns the name of the tab element at position *x*, *y*, or the empty
      string if none.


   .. method:: index(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".


   .. method:: insert(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.

      See `Tab Options`_ for the list of available options.


   .. method:: select(tab_id=None)

      Selects the specified *tab_id*.

      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.


   .. method:: tab(tab_id, option=None, **kw)

      Query or modify the options of the specific *tab_id*.

      If *kw* is not given, returns a dictionary of the tab option values. If
      *option* is specified, returns the value of that *option*. Otherwise,
      sets the options to the corresponding values.


   .. method:: tabs()

      Returns a list of windows managed by the notebook.


   .. method:: enable_traversal()

      Enable keyboard traversal for a toplevel window containing this notebook.

      This will extend the bindings for the toplevel window containing the
      notebook as follows:

      * :kbd:`Control-Tab`: selects the tab following the currently selected one.
      * :kbd:`Shift-Control-Tab`: selects the tab preceding the currently selected one.
      * :kbd:`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 have the notebook they are in as master.


Progressbar
-----------

The :class:`ttk.Progressbar` widget shows the status of a long-running
operation. It can operate in two modes:  1) the determinate mode which shows the
amount completed relative to the total amount of work to be done and 2) the
indeterminate mode which provides an animated display to let the user know that
work is progressing.


Options
^^^^^^^

This widget accepts the following specific options:

.. tabularcolumns:: |l|L|

+----------+---------------------------------------------------------------+
| Option   | Description                                                   |
+==========+===============================================================+
| orient   | One of "horizontal" or "vertical". Specifies the orientation  |
|          | of the progress bar.                                          |
+----------+---------------------------------------------------------------+
| length   | Specifies the length of the long axis of the progress bar     |
|          | (width if horizontal, height if vertical).                    |
+----------+---------------------------------------------------------------+
| mode     | One of "determinate" or "indeterminate".                      |
+----------+---------------------------------------------------------------+
| maximum  | A number specifying the maximum value. Defaults to 100.       |
+----------+---------------------------------------------------------------+
| value    | The current value of the progress bar. In "determinate" mode, |
|          | this represents the amount of work completed. In              |
|          | "indeterminate" mode, it is interpreted as modulo *maximum*;  |
|          | that is, the progress bar completes one "cycle" when its value|
|          | increases by *maximum*.                                       |
+----------+---------------------------------------------------------------+
| variable | A name which is linked to the option value. If specified, the |
|          | value of the progress bar is automatically set to the value of|
|          | this name whenever the latter is modified.                    |
+----------+---------------------------------------------------------------+
| phase    | Read-only option. The widget periodically increments the value|
|          | of this option whenever its value is greater than 0 and, in   |
|          | determinate mode, less than maximum. This option may be used  |
|          | by the current theme to provide additional animation effects. |
+----------+---------------------------------------------------------------+


ttk.Progressbar
^^^^^^^^^^^^^^^

.. class:: Progressbar

   .. method:: start(interval=None)

      Begin autoincrement mode: schedules a recurring timer event that calls
      :meth:`Progressbar.step` every *interval* milliseconds. If omitted,
      *interval* defaults to 50 milliseconds.


   .. method:: step(amount=None)

      Increments the progress bar's value by *amount*.

      *amount* defaults to 1.0 if omitted.


   .. method:: stop()

      Stop autoincrement mode: cancels any recurring timer event initiated by
      :meth:`Progressbar.start` for this progress bar.


Separator
---------

The :class:`ttk.Separator` widget displays a horizontal or vertical separator
bar.

It has no other methods besides the ones inherited from :class:`ttk.Widget`.


Options
^^^^^^^

This widget accepts the following specific option:

.. tabularcolumns:: |l|L|

+--------+----------------------------------------------------------------+
| Option | Description                                                    |
+========+================================================================+
| orient | One of "horizontal" or "vertical". Specifies the orientation of|
|        | the separator.                                                 |
+--------+----------------------------------------------------------------+


Sizegrip
--------

The :class:`ttk.Sizegrip` widget (also known as a grow box) allows the user to
resize the containing toplevel window by pressing and dragging the grip.

This widget has neither specific options nor specific methods, besides the
ones inherited from :class:`ttk.Widget`.


Platform-specific notes
^^^^^^^^^^^^^^^^^^^^^^^

* On macOS, toplevel windows automatically include a built-in size grip
  by default. Adding a :class:`Sizegrip` is harmless, since the built-in
  grip will just mask the widget.


Bugs
^^^^

* If the containing toplevel's position was specified relative to the right
  or bottom of the screen (e.g. ....), the :class:`Sizegrip` widget will
  not resize the window.
* This widget supports only "southeast" resizing.


Treeview
--------

The :class:`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.

The order in which data values are displayed may be controlled by setting
the widget option ``displaycolumns``. The tree widget can also display column
headings. Columns may be accessed by number or symbolic names listed in the
widget option columns. See `Column Identifiers`_.

Each item is identified by a unique name. The widget will generate item IDs
if they are not supplied by the caller. There is a distinguished root item,
named ``{}``. The root item itself is not displayed; its children appear at the
top level of the hierarchy.

Each item also has a list of tags, which can be used to associate event bindings
with individual items and control the appearance of the item.

The Treeview widget supports horizontal and vertical scrolling, according to
the options described in `Scrollable Widget Options`_ and the methods
:meth:`Treeview.xview` and :meth:`Treeview.yview`.


Options
^^^^^^^

This widget accepts the following specific options:

.. tabularcolumns:: |l|p{0.7\linewidth}|

+----------------+--------------------------------------------------------+
| Option         | Description                                            |
+================+========================================================+
| columns        | A list of column identifiers, specifying the number of |
|                | columns and their names.                               |
+----------------+--------------------------------------------------------+
| displaycolumns | A list of column identifiers (either symbolic or       |
|                | integer indices) specifying which data columns are     |
|                | displayed and the order in which they appear, or the   |
|                | string "#all".                                         |
+----------------+--------------------------------------------------------+
| height         | Specifies the number of rows which should be visible.  |
|                | Note: the requested width is determined from the sum   |
|                | of the column widths.                                  |
+----------------+--------------------------------------------------------+
| padding        | Specifies the internal padding for the widget. The     |
|                | padding is a list of up to four length specifications. |
+----------------+--------------------------------------------------------+
| selectmode     | Controls how the built-in class bindings manage the    |
|                | selection. One of "extended", "browse" or "none".      |
|                | If set to "extended" (the default), multiple items may |
|                | be selected. If "browse", only a single item will be   |
|                | selected at a time. If "none", the selection will not  |
|                | be changed.                                            |
|                |                                                        |
|                | Note that the application code and tag bindings can set|
|                | the selection however they wish, regardless of the     |
|                | value  of this option.                                 |
+----------------+--------------------------------------------------------+
| show           | A list containing zero or more of the following values,|
|                | specifying which elements of the tree to display.      |
|                |                                                        |
|                | * tree: display tree labels in column #0.              |
|                | * headings: display the heading row.                   |
|                |                                                        |
|                | The default is "tree headings", i.e., show all         |
|                | elements.                                              |
|                |                                                        |
|                | **Note**: Column #0 always refers to the tree column,  |
|                | even if show="tree" is not specified.                  |
+----------------+--------------------------------------------------------+


Item Options
^^^^^^^^^^^^

The following item options may be specified for items in the insert and item
widget commands.

.. tabularcolumns:: |l|L|

+--------+---------------------------------------------------------------+
| Option | Description                                                   |
+========+===============================================================+
| text   | The textual label to display for the item.                    |
+--------+---------------------------------------------------------------+
| image  | A Tk Image, displayed to the left of the label.               |
+--------+---------------------------------------------------------------+
| values | The list of values associated with the item.                  |
|        |                                                               |
|        | Each item should have the same number of values as the widget |
|        | option columns. If there are fewer values than columns, the   |
|        | remaining values are assumed empty. If there are more values  |
|        | than columns, the extra values are ignored.                   |
+--------+---------------------------------------------------------------+
| open   | ``True``/``False`` value indicating whether the item's        |
|        | children should be displayed or hidden.                       |
+--------+---------------------------------------------------------------+
| tags   | A list of tags associated with this item.                     |
+--------+---------------------------------------------------------------+


Tag Options
^^^^^^^^^^^

The following options may be specified on tags:

.. tabularcolumns:: |l|L|

+------------+-----------------------------------------------------------+
| Option     | Description                                               |
+============+===========================================================+
| foreground | Specifies the text foreground color.                      |
+------------+-----------------------------------------------------------+
| background | Specifies the cell or item background color.              |
+------------+-----------------------------------------------------------+
| font       | Specifies the font to use when drawing text.              |
+------------+-----------------------------------------------------------+
| image      | Specifies the item image, in case the item's image option |
|            | is empty.                                                 |
+------------+-----------------------------------------------------------+


Column Identifiers
^^^^^^^^^^^^^^^^^^

Column identifiers take any of the following forms:

* A symbolic name from the list of columns option.
* An integer n, specifying the nth data column.
* A string of the form #n, where n is an integer, specifying the nth display
  column.

Notes:

* Item's option values may be displayed in a different order than the order
  in which they are stored.
* Column #0 always refers to the tree column, even if show="tree" is not
  specified.

A data column number is an index into an item's option values list; a display
column number is the column number in the tree where the values are displayed.
Tree labels are displayed in column #0. If option displaycolumns is not set,
then data column n is displayed in column #n+1. Again, **column #0 always
refers to the tree column**.


Virtual Events
^^^^^^^^^^^^^^

The Treeview widget generates the following virtual events.

.. tabularcolumns:: |l|L|

+--------------------+--------------------------------------------------+
| Event              | Description                                      |
+====================+==================================================+
| <<TreeviewSelect>> | Generated whenever the selection changes.        |
+--------------------+--------------------------------------------------+
| <<TreeviewOpen>>   | Generated just before settings the focus item to |
|                    | open=True.                                       |
+--------------------+--------------------------------------------------+
| <<TreeviewClose>>  | Generated just after setting the focus item to   |
|                    | open=False.                                      |
+--------------------+--------------------------------------------------+

The :meth:`Treeview.focus` and :meth:`Treeview.selection` methods can be used
to determine the affected item or items.


ttk.Treeview
^^^^^^^^^^^^

.. class:: Treeview

   .. method:: bbox(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.


   .. method:: get_children(item=None)

      Returns the list of children belonging to *item*.

      If *item* is not specified, returns root children.


   .. method:: set_children(item, *newchildren)

      Replaces *item*'s child with *newchildren*.

      Children present in *item* that are not present in *newchildren* are
      detached from the tree. No items in *newchildren* may be an ancestor of
      *item*. Note that not specifying *newchildren* results in detaching
      *item*'s children.


   .. method:: column(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.

      The valid options/values are:

      *id*
         Returns the column name. This is a read-only option.
      *anchor*: One of the standard Tk anchor values.
         Specifies how the text in this column should be aligned with respect
         to the cell.
      *minwidth*: width
         The minimum width of the column in pixels. The treeview widget will
         not make the column any smaller than specified by this option when
         the widget is resized or the user drags a column.
      *stretch*: ``True``/``False``
         Specifies whether the column's width should be adjusted when
         the widget is resized.
      *width*: width
         The width of the column in pixels.

      To configure the tree column, call this with column = "#0"

   .. method:: delete(*items)

      Delete all specified *items* and all their descendants.

      The root item may not be deleted.


   .. method:: detach(*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.


   .. method:: exists(item)

      Returns ``True`` if the specified *item* is present in the tree.


   .. method:: focus(item=None)

      If *item* is specified, sets the focus item to *item*. Otherwise, returns
      the current focus item, or '' if there is none.


   .. method:: heading(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.

      The valid options/values are:

      *text*: text
         The text to display in the column heading.
      *image*: imageName
         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".


   .. method:: identify(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.


   .. method:: identify_row(y)

      Returns the item ID of the item at position *y*.


   .. method:: identify_column(x)

      Returns the data column identifier of the cell at position *x*.

      The tree column has ID #0.


   .. method:: identify_region(x, y)

      Returns one of:

      +-----------+--------------------------------------+
      | region    | meaning                              |
      +===========+======================================+
      | heading   | Tree heading area.                   |
      +-----------+--------------------------------------+
      | separator | Space between two columns headings.  |
      +-----------+--------------------------------------+
      | tree      | The tree area.                       |
      +-----------+--------------------------------------+
      | cell      | A data cell.                         |
      +-----------+--------------------------------------+

      Availability: Tk 8.6.


   .. method:: identify_element(x, y)

      Returns the element at position *x*, *y*.

      Availability: Tk 8.6.


   .. method:: index(item)

      Returns the integer index of *item* within its parent's list of children.


   .. method:: insert(parent, index, iid=None, **kw)

      Creates a new item and returns 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.

      See `Item Options`_ for the list of available options.


   .. method:: item(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*.


   .. method:: move(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.


   .. method:: next(item)

      Returns the identifier of *item*'s next sibling, or '' if *item* is the
      last child of its parent.


   .. method:: parent(item)

      Returns the ID of the parent of *item*, or '' if *item* is at the top
      level of the hierarchy.


   .. method:: prev(item)

      Returns the identifier of *item*'s previous sibling, or '' if *item* is
      the first child of its parent.


   .. method:: reattach(item, parent, index)

      An alias for :meth:`Treeview.move`.


   .. method:: see(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.


   .. method:: selection()

      Returns a tuple of selected items.

      .. versionchanged:: 3.8
         ``selection()`` no longer takes arguments.  For changing the selection
         state use the following selection methods.


   .. method:: selection_set(*items)

      *items* becomes the new selection.

      .. versionchanged:: 3.6
         *items* can be passed as separate arguments, not just as a single tuple.


   .. method:: selection_add(*items)

      Add *items* to the selection.

      .. versionchanged:: 3.6
         *items* can be passed as separate arguments, not just as a single tuple.


   .. method:: selection_remove(*items)

      Remove *items* from the selection.

      .. versionchanged:: 3.6
         *items* can be passed as separate arguments, not just as a single tuple.


   .. method:: selection_toggle(*items)

      Toggle the selection state of each item in *items*.

      .. versionchanged:: 3.6
         *items* can be passed as separate arguments, not just as a single tuple.


   .. method:: set(item, column=None, value=None)

      With one argument, returns a dictionary of column/value pairs for the
      specified *item*. With two arguments, returns the current value of the
      specified *column*. With three arguments, sets the value of given
      *column* in given *item* to the specified *value*.


   .. method:: tag_bind(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.


   .. method:: tag_configure(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*.


   .. method:: tag_has(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
      that have the specified tag.

      Availability: Tk 8.6


   .. method:: xview(*args)

      Query or modify horizontal position of the treeview.


   .. method:: yview(*args)

      Query or modify vertical position of the treeview.


.. _TtkStyling:

Ttk Styling
-----------

Each widget in :mod:`ttk` is assigned a style, which specifies the set of
elements making up the widget and how they are arranged, along with dynamic
and default settings for element options. By default the style name is the
same as the widget's class name, but it may be overridden by the widget's style
option. If you don't know the class name of a widget, use the method
:meth:`Misc.winfo_class` (somewidget.winfo_class()).

.. seealso::

   `Tcl'2004 conference presentation <https://tktable.sourceforge.net/tile/tile-tcl2004.pdf>`_
      This document explains how the theme engine works


.. class:: Style

   This class is used to manipulate the style database.


   .. method:: configure(style, query_opt=None, **kw)

      Query or set the default value of the specified option(s) in *style*.

      Each key in *kw* is an option and each value is a string identifying
      the value for that option.

      For example, to change every default button to be a flat button with
      some padding and a different background color::

         from tkinter import ttk
         import tkinter

         root = tkinter.Tk()

         ttk.Style().configure("TButton", padding=6, relief="flat",
            background="#ccc")

         btn = ttk.Button(text="Sample")
         btn.pack()

         root.mainloop()


   .. method:: map(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, lists, or
      some other preference. A statespec is a compound of one
      or more states and then a value.

      An example may make it more understandable::

         import tkinter
         from tkinter import ttk

         root = tkinter.Tk()

         style = ttk.Style()
         style.map("C.TButton",
             foreground=[('pressed', 'red'), ('active', 'blue')],
             background=[('pressed', '!disabled', 'black'), ('active', 'white')]
             )

         colored_btn = ttk.Button(text="Test", style="C.TButton").pack()

         root.mainloop()


      Note that the order of the (states, value) sequences for an option does
      matter, if the order is changed to ``[('active', 'blue'), ('pressed',
      'red')]`` in the foreground option, for example, the result would be a
      blue foreground when the widget were in active or pressed states.


   .. method:: lookup(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.

      To check what font a Button uses by default::

         from tkinter import ttk

         print(ttk.Style().lookup("TButton", "font"))


   .. method:: layout(style, layoutspec=None)

      Define the widget layout for given *style*. If *layoutspec* is omitted,
      return the layout specification for given style.

      *layoutspec*, if specified, is expected to be a list or some other
      sequence type (excluding strings), where each item should be a tuple and
      the first item is the layout name and the second item should have the
      format described in `Layouts`_.

      To understand the format, see the following example (it is not
      intended to do anything useful)::

         from tkinter import ttk
         import tkinter

         root = tkinter.Tk()

         style = ttk.Style()
         style.layout("TMenubutton", [
            ("Menubutton.background", None),
            ("Menubutton.button", {"children":
                [("Menubutton.focus", {"children":
                    [("Menubutton.padding", {"children":
                        [("Menubutton.label", {"side": "left", "expand": 1})]
                    })]
                })]
            }),
         ])

         mbtn = ttk.Menubutton(text='Text')
         mbtn.pack()
         root.mainloop()


   .. method:: element_create(elementname, etype, *args, **kw)

      Create a new element in the current theme, of the given *etype* which is
      expected to be either "image", "from" or "vsapi".
      The latter is only available in Tk 8.6 on Windows.

      If "image" is used, *args* should contain the default image name followed
      by statespec/value pairs (this is the imagespec), and *kw* may have the
      following options:

      border=padding
         padding is a list of up to four integers, specifying the left, top,
         right, and bottom borders, respectively.

      height=height
         Specifies a minimum height for the element. If less than zero, the
         base image's height is used as a default.

      padding=padding
         Specifies the element's interior padding. Defaults to border's value
         if not specified.

      sticky=spec
         Specifies how the image is placed within the final parcel. spec
         contains zero or more characters "n", "s", "w", or "e".

      width=width
         Specifies a minimum width for the element. If less than zero, the
         base image's width is used as a default.

      Example::

         img1 = tkinter.PhotoImage(master=root, file='button.png')
         img1 = tkinter.PhotoImage(master=root, file='button-pressed.png')
         img1 = tkinter.PhotoImage(master=root, file='button-active.png')
         style = ttk.Style(root)
         style.element_create('Button.button', 'image',
                              img1, ('pressed', img2), ('active', img3),
                              border=(2, 4), sticky='we')

      If "from" is used as the value of *etype*,
      :meth:`element_create` will clone an existing
      element. *args* is expected to contain a themename, from which
      the element will be cloned, and optionally an element to clone from.
      If this element to clone from is not specified, an empty element will
      be used. *kw* is discarded.

      Example::

         style = ttk.Style(root)
         style.element_create('plain.background', 'from', 'default')

      If "vsapi" is used as the value of *etype*, :meth:`element_create`
      will create a new element in the current theme whose visual appearance
      is drawn using the Microsoft Visual Styles API which is responsible
      for the themed styles on Windows XP and Vista.
      *args* is expected to contain the Visual Styles class and part as
      given in the Microsoft documentation followed by an optional sequence
      of tuples of ttk states and the corresponding Visual Styles API state
      value.
      *kw* may have the following options:

      padding=padding
         Specify the element's interior padding.
         *padding* is a list of up to four integers specifying the left,
         top, right and bottom padding quantities respectively.
         If fewer than four elements are specified, bottom defaults to top,
         right defaults to left, and top defaults to left.
         In other words, a list of three numbers specify the left, vertical,
         and right padding; a list of two numbers specify the horizontal
         and the vertical padding; a single number specifies the same
         padding all the way around the widget.
         This option may not be mixed with any other options.

      margins=padding
         Specifies the elements exterior padding.
         *padding* is a list of up to four integers specifying the left, top,
         right and bottom padding quantities respectively.
         This option may not be mixed with any other options.

      width=width
         Specifies the width for the element.
         If this option is set then the Visual Styles API will not be queried
         for the recommended size or the part.
         If this option is set then *height* should also be set.
         The *width* and *height* options cannot be mixed with the *padding*
         or *margins* options.

      height=height
         Specifies the height of the element.
         See the comments for *width*.

      Example::

         style = ttk.Style(root)
         style.element_create('pin', 'vsapi', 'EXPLORERBAR', 3, [
                              ('pressed', '!selected', 3),
                              ('active', '!selected', 2),
                              ('pressed', 'selected', 6),
                              ('active', 'selected', 5),
                              ('selected', 4),
                              ('', 1)])
         style.layout('Explorer.Pin',
                      [('Explorer.Pin.pin', {'sticky': 'news'})])
         pin = ttk.Checkbutton(style='Explorer.Pin')
         pin.pack(expand=True, fill='both')

      .. versionchanged:: 3.13
         Added support of the "vsapi" element factory.

   .. method:: element_names()

      Returns the list of elements defined in the current theme.


   .. method:: element_options(elementname)

      Returns the list of *elementname*'s options.


   .. method:: theme_create(themename, parent=None, settings=None)

      Create 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 parent
      theme. If *settings* are present they are expected to have the same
      syntax used for :meth:`theme_settings`.


   .. method:: theme_settings(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
      :meth:`Style.configure`, :meth:`Style.map`, :meth:`Style.layout` and
      :meth:`Style.element_create` respectively.

      As an example, let's change the Combobox for the default theme a bit::

         from tkinter import ttk
         import tkinter

         root = tkinter.Tk()

         style = ttk.Style()
         style.theme_settings("default", {
            "TCombobox": {
                "configure": {"padding": 5},
                "map": {
                    "background": [("active", "green2"),
                                   ("!disabled", "green4")],
                    "fieldbackground": [("!disabled", "green3")],
                    "foreground": [("focus", "OliveDrab1"),
                                   ("!disabled", "OliveDrab2")]
                }
            }
         })

         combo = ttk.Combobox().pack()

         root.mainloop()


   .. method:: theme_names()

      Returns a list of all known themes.


   .. method:: theme_use(themename=None)

      If *themename* is not given, returns the theme in use.  Otherwise, sets
      the current theme to *themename*, refreshes all widgets and emits a
      <<ThemeChanged>> event.


Layouts
^^^^^^^

A layout can be just ``None``, if it 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.

The 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.

*unit*: 0 or 1
   If set to 1, causes the element and all of its descendants to be treated as
   a single element for the purposes of :meth:`Widget.identify` et al. It's
   used for things like scrollbar thumbs with grips.

*children*: [sublayout... ]
   Specifies a list of elements to place inside the element. Each
   element is a tuple (or other sequence type) where the first item is
   the layout name, and the other is a `Layout`_.

.. _Layout: `Layouts`_
