Theme Loading¶
Tkinter for Python runs a Tcl
-interpreter with the Tk
package.
The actual UI is drawn and controlled by this Tcl
-interpreter. In
order to load themes into Tkinter
, it must be done through this
Tcl
-interpreter. This page describes how this is done, and what the
limitations per Python version are.
Loading¶
Each theme is a Tcl
-package in itself. In order to load the theme,
the package has to be loaded. Usually, stand-alone packages come with
a pkgIndex.tcl
file, which checks the dependencies of the package
and then provides a package ifneeded {name} {version}
line.
Then, in order to execute the code that creates the package, a
package require {name} {version}
is executed. Subsequently, the
code provided after the package ifneeded
is executed, and thus the
files for the package are executed.
The code files that are executed to create the package then provide a
package provide {name} {version}
line, which creates the package.
Then loading the package is complete, and the theme is available.
In the case of ttkthemes
, there is a big difference. The themes
are split into PNG-themes (which also have a GIF-version) and GIF-only
themes. The appropriate pkgIndex.tcl
files in the right folders
are evaluated depending on whether the PNG-dependencies have been met.
Instead of using package ifneeded
with a pkgIndex.tcl
file for
each theme, ttkthemes
loads all the themes instantly upon evaluation
of the pkgIndex.tcl
file of the whole folder of themes.
This is done so as to limit the amount of Tcl-code in the ttkthemes
package. While the ttkthemes
package could still be used with
Tcl
directly, it is intended for use within Python, and Tkinter’s
error reporting facilities are extremely limited (no full tracebacks
are available), and thus the amount of Tcl
-code is best minimized.
All work that can be performed in Python is performed in Python.
For more information on packages and loading them, check the tcl-lang wiki website.
Limitations¶
All themes are available on all platforms that support Tk 8.4
or
higher. Tk 8.4
is available with all Python distributions of 2.7
or higher. Python-distributions may be created with higher versions of
Tk
as well.
In order to load the higher quality PNG version of themes for which it
is available, either Tk 8.6
is required, or TkImg
. Tk 8.6
is
available with Python 3.6 in most Python binary distributions, including
the Windows binaries and the Ubuntu PPA-version. However, it may be
possible that there are binary distributions compiled with a different
version of Tk
out in the wild.
In order to use the PNG version of themes on older Python versions,
including Python 2.7, TkImg
is required. While formerly provided
with ttkthemes
, the Tk
-extension TkImg
is now available for
Python in a separate package: tkimg.
Tcl-loading¶
The ttkthemes
themes can be loaded from a Tcl
-interpreter
directly. In fact, this is what the _Widget
-class does for the
ttkthemes
Python-package. In this section, from this point onwards,
ttkthemes
will refer to the Tcl
-package instead.
The themes provided are divided into two categories: themes with a
PNG and GIF version and themes with only a GIF version. The GIF-only
themes are provided in the folder /ttkthemes/themes
. The
pkgIndex.tcl
file in this folder loads all themes in the folder when
executed and provides the ttkthemes
package.
For the other category of themes, only the GIF or PNG version can be loaded, as loading a second package with a name which is already used by another package is not possible.
Depending on whether the PNG or GIF version of themes should be loaded,
the pkgIndex.tcl
in the ttkthemes/gif
or ttkthemes/png
can
be evaluated. The PNG themes can only be loaded if Tk is version 8.6 or
TkImg is available.
package require Tk 8.6
source ttkthemes/themes/pkgIndex.tcl
source ttkthemes/png/pkgIndex.tcl
package require ttkthemes 1.0
ttk::setTheme plastik