ttkbootstrap: a styling layer for tkinter rather than a replacement for it
Modern themes for Tkinter. Sleek, responsive styles inspired by Bootstrap. Includes ready-to-use widgets, 30+ themes, and tools for building beautiful, cross-platform desktop apps with ease.
At a glance
- What is it?
- Thirty Bootstrap-inspired themes for tkinter, generated on demand, with a closed bootstyle vocabulary that keeps the widgets themselves exactly where they were.
- Who is it for?
- ttkbootstrap succeeds because it refuses to be a framework. The widgets are still tkinter's, the geometry managers are unchanged, and everything you already know about tkinter keeps working while a single keyword carries intent from a button to a progress bar.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 24 days ago.
- What is it written in?
- Mainly Python, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 24, 2026, and from our analysis. They are not legal advice.
Editorial analysis
One keyword that means the same thing on every widget
The pitch in a single line is that you can style any ttk widget with one keyword. The library generates flat, Bootstrap-inspired light and dark themes on demand and adds a `bootstyle` keyword to every widget, so you describe intent such as `primary`, `success`, or `outline` instead of tuning colors or writing out long ttk style names.
What makes the idea hold up is that the keyword is consistent across widget types.
ttk.Button(app, bootstyle="success")
ttk.Progressbar(app, bootstyle="success")
ttk.Entry(app, bootstyle="success")Same word, same visual meaning, three completely different widgets. A styling layer that needed a different vocabulary per widget would push the work back onto you.
The value is a small grammar: a color, plus an optional modifier, plus an optional widget type. So `info outline`, `success round toggle`, and `warning striped` are all valid, and they compose. The README makes a point of the vocabulary being closed, which means a typo raises rather than silently doing nothing. That is a deliberate design choice in a GUI library where silent no-op styling is the usual failure mode.
The positioning statement underneath all of this is worth reading carefully: ttkbootstrap is a styling layer for vanilla tkinter, not a new framework, and the widgets stay tkinter's. Everything you know about pack, grid, place, and widget options still applies.
Install, then run the demo before you write anything
Installation is a single pip command, and the dependency situation is unusually clean for a GUI library.
python -m pip install ttkbootstrapThe README describes the project as pure Python with one dependency, Pillow, requiring Python 3.10 or newer, and with no native extensions. The manifest confirms the dependency as `pillow>=10,<13` and the requirement as `>=3.10`. The manifest license field is more specific than a single identifier, reading `MIT AND (Apache-2.0 OR BSD-2-Clause)`, which is the usual way to say the package code is MIT while bundled or derived material carries a choice of two permissive licenses.
Then there is the part that saves the most time, which is not in most GUI library READMEs:
ttkb demoThat opens a window with every widget and a theme picker. Since the whole value proposition is visual consistency across widgets and themes, seeing all of them in one window is worth more than any amount of documentation.
The ttkb command is a real part of the distribution rather than a separate tool, since the project declares it as a console script. It has four subcommands according to the README table: `version` to print the installed version, `demo` to open the widget demo, `convert-theme` to turn a 1.x theme file into the 2.x Theme form, and `creator` to open the theme designer.
Thirty themes, and a designer instead of hand-built palettes
The theme catalog is thirty curated themes, which the README breaks down as fifteen families, each in a coordinated light and dark variant, and all of them switch at runtime.
app.theme_use("bootstrap-dark") # any theme by name
app.toggle_theme() # flip light <-> darkTwo levels of control there. Naming a theme sets one explicitly, and `toggle_theme` flips between light and dark, which is the operation you want behind a settings checkbox. A themes gallery on the documentation site is linked for browsing what exists.
For anything beyond the built-ins there is a bundled editor rather than a documented palette format.
ttkb creatorThe README describes this as picking colors, previewing them on live widgets, and exporting a `Theme(...)` snippet for your app. That export step is the important detail, because it means the artifact you commit is ordinary Python in your own codebase rather than a file inside an installed package.
That change is the main structural break in 2.0. The upgrading section says custom themes moved out of the package and into your own code, and that most code keeps working, with legacy theme names and older spellings accepted but producing a deprecation warning. There is a conversion command for themes you already have:
ttkb convert-theme user.py -o brand.pyThe migration guide is documented as sorting every change into breaking, deprecated, notable, and new, which is the right way to write an upgrade note for a library with a large installed base.
Widgets beyond the ttk set, and the icon story
The README describes the extras as styled ttk widgets plus a handful of additions: `Meter`, `DateEntry`, `Floodgauge`, and `Tableview`, plus fully themed dialogs. These are the pieces a tkinter application tends to hand-roll badly, which is exactly where a styling layer earns its keep.
Icons are handled by bundling the entire Bootstrap Icons set, described as more than 2,000 glyphs rendered from a bundled font. The argument for a font rather than image files is crispness at any size and the fact that the icon follows the theme, and the README states both along with no extra dependency, which is consistent with the Pillow-only dependency list.
ttk.Button(app, text="Settings", icon="gear-fill", bootstyle="primary")For other families the answer is a sibling project, tkinter-icons, described as adding sixteen icon sets and 61,000 or more icons alongside the built-in one. Worth noting that the names Font Awesome, Material, and Lucide appear there as part of that extension's scope, not as bundled content of ttkbootstrap itself.
The quickstart in the README is short enough to be the whole onboarding path for a simple app: create an App with a title, pack a label and three buttons with primary, success, and danger outline styles, then call `mainloop`. There is a longer build-your-first-app walkthrough on the documentation site for anything beyond that.
Packaging fixes, issue counts, and what the tree says
The release history shows a project in maintenance mode with a very low issue count. v2.2.3 was published on 2026-09-12 and the repository has one open issue against 2,655 stars and 457 forks. That ratio is unusual for a library of this age and size, and it says more about triage than about popularity.
The v2.2.3 release is worth reading because it documents a packaging bug that affected every 2.x release. Apps frozen with PyInstaller crashed at startup with a `FileNotFoundError` for `ttkbootstrap/assets/icons/bootstrap.ttf`, because PyInstaller does not bundle package data on its own. The fix is a PyInstaller hook that is picked up automatically, so a frozen build needs no extra configuration.
The same release added a how-to page on packaging, including how to point at the hook by hand when it cannot find it. That is the kind of fix that only surfaces once a library has real desktop applications built on top of it, and it is a useful signal about which platform the project actually serves.
The tree is well organised for a package: `src/` for the code, `tests/`, `examples/`, `gallery/`, `docs/` with its own requirements file, `tools/`, `development/`, and `assets/`. There is a `CLAUDE.md` at the root, which tells you the project keeps contributor-facing instructions in version control. The development requirements file explains its own shape, noting that installing it alongside an editable install gives you the full local gate set, that runtime dependencies are declared in pyproject.toml, and that documentation build deps live in docs/requirements.txt.
One dependency comment there is worth repeating for anyone running the suite: `screeninfo` is optional at runtime and enables real multi-monitor placement, and without it the positioning code falls back to X11's Xinerama query and then to Tk's screen metrics. So the tests are worth running both with and without it installed. Support for the project is provided by JetBrains through PyCharm.
Editorial conclusion
ttkbootstrap succeeds because it refuses to be a framework. The widgets are still tkinter's, the geometry managers are unchanged, and everything you already know about tkinter keeps working while a single keyword carries intent from a button to a progress bar. The parts worth knowing before you commit are the ones the README states plainly: bootstyle is a closed vocabulary so typos fail loudly, 2.0 moved custom themes out of the package and into your code, and custom themes now ship as a Theme(...) literal that the bundled creator exports for you. Start with `ttkb demo` to see every widget before writing a line, and use `ttkb creator` rather than hand-building a palette.
Frequently asked questions
Should I use Tk or TTK?
For a themed application, ttk is what ttkbootstrap styles, since it adds its bootstyle keyword to every ttk widget and the widgets themselves stay tkinter's. The library is a styling layer rather than a replacement, so ordinary tkinter knowledge, geometry managers, and widget options all keep applying. Plain Tk widgets are not what the themes target.
What does the bootstyle keyword accept?
A small grammar made of a color, an optional modifier, and an optional widget type, so success, info outline, success round toggle, and warning striped are all valid. The vocabulary is closed, which means a misspelling fails loudly instead of quietly styling nothing.
Does ttkbootstrap work with custom themes from version 1.x?
They need converting. Version 2.0 moved custom themes out of the package and into your own code, and the ttkb convert-theme command turns a 1.x theme file into the 2.x Theme(...) form. Legacy theme names and older spellings still work but raise a deprecation warning.
Which widgets come with ttkbootstrap?
The styled ttk widgets, plus four extras named Meter, DateEntry, Floodgauge, and Tableview, and themed dialogs. Icons are included as a bundled Bootstrap Icons font of more than 2,000 glyphs, and a separate tkinter-icons extension adds sixteen more sets.
Does ttkbootstrap need a native compiler or extra packages?
No. It is pure Python with one runtime dependency, Pillow, requires Python 3.10 or newer, and ships no native extensions. The only packaging caveat worth knowing is that PyInstaller needs the bundled hook so the icon font travels with a frozen build.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/israel-dryer-ttkbootstrap)