tkinter — Python interface to Tcl/Tk¶
Source code: Lib/tkinter/__init__.py
The tkinter package (“Tk interface”) is the standard Python interface to
the Tcl/Tk GUI toolkit. Both Tk and tkinter are available on most Unix
platforms, including macOS, as well as on Windows systems.
Running python -m tkinter from the command line should open a window
demonstrating a simple Tk interface, letting you know that tkinter is
properly installed on your system, and also showing what version of Tcl/Tk is
installed, so you can read the Tcl/Tk documentation specific to that version.
Tkinter supports a range of Tcl/Tk versions, built either with or
without thread support. The official Python binary release bundles Tcl/Tk 8.6
threaded. See the source code for the _tkinter module
for more information about supported versions.
Tkinter is not a thin wrapper, but adds a fair amount of its own logic to make the experience more pythonic. This documentation will concentrate on these additions and changes, and refer to the official Tcl/Tk documentation for details that are unchanged.
Note
Tcl/Tk 8.5 (2007) introduced a modern set of themed user interface components along with a new API to use them. Both old and new APIs are still available. Most documentation you will find online still uses the old API and can be woefully outdated.
This is an optional module. If it is missing from your copy of CPython, look for documentation from your distributor (that is, whoever provided Python to you). If you are the distributor, see Requirements for optional modules.
See also
- TkDocs
Extensive tutorial on creating user interfaces with Tkinter. Explains key concepts, and illustrates recommended approaches using the modern API.
- Tkinter 8.5 reference: a GUI for Python
Reference documentation for Tkinter 8.5 detailing available classes, methods, and options.
Tcl/Tk Resources:
- Tk commands
Comprehensive reference to each of the underlying Tcl/Tk commands used by Tkinter.
- Tcl/Tk Home Page
Additional documentation, and links to Tcl/Tk core development.
Books:
- Modern Tkinter for Busy Python Developers
By Mark Roseman. (ISBN 978-1999149567)
- Python GUI programming with Tkinter
By Alan D. Moore. (ISBN 978-1788835886)
- Programming Python
By Mark Lutz; has excellent coverage of Tkinter. (ISBN 978-0596158101)
- Tcl and the Tk Toolkit (2nd edition)
By John Ousterhout, inventor of Tcl/Tk, and Ken Jones; does not cover Tkinter. (ISBN 978-0321336330)
Architecture¶
Tcl/Tk is not a single library but rather consists of a few distinct modules, each with separate functionality and its own official documentation. Python’s binary releases also ship an add-on module together with it.
- Tcl
Tcl is a dynamic interpreted programming language, just like Python. Though it can be used on its own as a general-purpose programming language, it is most commonly embedded into C applications as a scripting engine or an interface to the Tk toolkit. The Tcl library has a C interface to create and manage one or more instances of a Tcl interpreter, run Tcl commands and scripts in those instances, and add custom commands implemented in either Tcl or C. Each interpreter has an event queue, and there are facilities to send events to it and process them. Unlike Python, Tcl’s execution model is designed around cooperative multitasking, and Tkinter bridges this difference (see Threading model for details).
- Tk
Tk is a Tcl package implemented in C that adds custom commands to create and manipulate GUI widgets. Each
Tkobject embeds its own Tcl interpreter instance with Tk loaded into it. Tk’s widgets are very customizable, though at the cost of a dated appearance. Tk uses Tcl’s event queue to generate and process GUI events.- Ttk
Themed Tk (Ttk) is a newer family of Tk widgets that provide a much better appearance on different platforms than many of the classic Tk widgets. Ttk is distributed as part of Tk, starting with Tk version 8.5. Python bindings are provided in a separate module,
tkinter.ttk.
Internally, Tk and Ttk use facilities of the underlying operating system, i.e., Xlib on Unix/X11, Cocoa on macOS, GDI on Windows.
When your Python application uses a class in Tkinter, e.g., to create a widget,
the tkinter module first assembles a Tcl/Tk command string. It passes that
Tcl command string to an internal _tkinter binary module, which then
calls the Tcl interpreter to evaluate it. The Tcl interpreter will then call into the
Tk and/or Ttk packages, which will in turn make calls to Xlib, Cocoa, or GDI.
Tkinter Modules¶
Support for Tkinter is spread across several modules. Most applications will need the
main tkinter module, as well as the tkinter.ttk module, which provides
the modern themed widget set and API:
from tkinter import *
from tkinter import ttk
- class tkinter.Tk(screenName=None, baseName=None, className='Tk', useTk=True, sync=False, use=None)¶
Construct a toplevel Tk widget, which is usually the main window of an application, and initialize a Tcl interpreter for this widget. Each instance has its own associated Tcl interpreter.
The
Tkclass is typically instantiated using all default values. However, the following keyword arguments are currently recognized:- screenName
When given (as a string), sets the
DISPLAYenvironment variable. (X11 only)- baseName
Name of the profile file. By default, baseName is derived from the program name (
sys.argv[0]).- className
Name of the widget class. Used as a profile file and also as the name with which Tcl is invoked (argv0 in interp).
- useTk
If
True, initialize the Tk subsystem. Thetkinter.Tcl()function sets this toFalse.- sync
If
True, execute all X server commands synchronously, so that errors are reported immediately. Can be used for debugging. (X11 only)- use
Specifies the id of the window in which to embed the application, instead of it being created as an independent toplevel window. id must be specified in the same way as the value for the -use option for toplevel widgets (that is, it has a form like that returned by
winfo_id()).Note that on some platforms this will only work correctly if id refers to a Tk frame or toplevel that has its -container option enabled.
Tkreads and interprets profile files, named.className.tcland.baseName.tcl, into the Tcl interpreter and callsexec()on the contents of.className.pyand.baseName.py. The path for the profile files is theHOMEenvironment variable or, if that isn’t defined, thenos.curdir.- tk¶
The Tk application object created by instantiating
Tk. This provides access to the Tcl interpreter. Each widget that is attached the same instance ofTkhas the same value for itstkattribute.
- master¶
The widget object that contains this widget. For
Tk, the master isNonebecause it is the main window. The terms master and parent are similar and sometimes used interchangeably as argument names; however, callingwinfo_parent()returns a string of the widget name whereasmasterreturns the object. parent/child reflects the tree-like relationship while master/slave reflects the container structure.
- tkinter.Tcl(screenName=None, baseName=None, className='Tk', useTk=False)¶
The
Tcl()function is a factory function which creates an object much like that created by theTkclass, except that it does not initialize the Tk subsystem. This is most often useful when driving the Tcl interpreter in an environment where one doesn’t want to create extraneous toplevel windows, or where one cannot (such as Unix/Linux systems without an X server). An object created by theTcl()object can have a Toplevel window created (and the Tk subsystem initialized) by calling itsloadtk()method.
The modules that provide Tk support include:
tkinterMain Tkinter module.
tkinter.colorchooserDialog to let the user choose a color.
tkinter.commondialogBase class for the dialogs defined in the other modules listed here.
tkinter.filedialogCommon dialogs to allow the user to specify a file to open or save.
tkinter.fontUtilities to help work with fonts.
tkinter.messageboxAccess to standard Tk dialog boxes.
tkinter.scrolledtextText widget with a vertical scroll bar built in.