A full UI framework for Python desktop apps built on tkinter — rich widgets, theming, and application structure out of the box.
Project description
bootstack is a batteries-included desktop application framework for Python, built on Tk. It grew out of ttkbootstrap — which brought Bootstrap-style theming to ttk widgets — and bundles the layers you'd expect from a modern framework around it: app scaffolding, layout containers, semantic styling, reactive signals, forms and validation, i18n, a data layer, and a CLI for scaffolding and packaging.
The aim is to take you from pip install to a working, themed application without wiring those pieces together yourself or dropping down to raw Tk geometry calls.
Active alpha. APIs may change before the first stable release. See the documentation for guides and the API reference.
Installation
Requires Python 3.12+.
bootstack is currently in active alpha, so the --pre flag is required to opt in to pre-release versions:
pip install --pre bootstack
Quick Start
import bootstack as bs
app = bs.App(title="Hello bootstack", theme="bootstrap-light")
bs.Label(app, text="Hello from bootstack!").pack(pady=10)
bs.Button(app, text="Primary", accent="primary").pack(pady=5)
bs.Button(app, text="Success", accent="success").pack(pady=5)
bs.Button(app, text="Danger Outline", accent="danger", variant="outline").pack(pady=5)
app.mainloop()
For navigation-based apps, use AppShell — it gives you a toolbar, sidebar, and page stack in one call:
import bootstack as bs
shell = bs.AppShell(title="My App", size=(1000, 650))
home = shell.add_page("home", text="Home", icon="house")
bs.Label(home, text="Welcome!").pack(padx=20, pady=20)
docs = shell.add_page("docs", text="Documents", icon="file-earmark-text")
bs.Label(docs, text="Your documents.").pack(padx=20, pady=20)
shell.mainloop()
How it works
Layout containers
PackFrame and GridFrame let you describe a layout once instead of repeating geometry calls on each child:
form = bs.GridFrame(app, columns=["auto", 1], gap=(12, 6), padding=12)
form.pack(fill="both", expand=True)
form.add(bs.Label(form, text="Name"))
form.add(bs.Entry(form))
form.add(bs.Label(form, text="Email"))
form.add(bs.Entry(form))
form.add(bs.Button(form, text="Submit", accent="primary"), columnspan=2)
Semantic styling
Widgets take an accent (color intent) and variant (visual weight) instead of hard-coded colors, so the same code looks right across themes and light/dark modes:
bs.Button(app, text="Save", accent="primary") # solid (default)
bs.Button(app, text="Cancel", accent="secondary", variant="outline")
bs.Button(app, text="Learn more", accent="info", variant="link")
bs.Label(app, text="Heading", font="heading-lg")
Signals (optional)
Plain callbacks work fine for most things. When state needs to flow between widgets, signals give you a small subscribe/get/set primitive:
counter = bs.Signal(0)
label = bs.Label(app)
counter.subscribe(lambda v: label.configure(text=f"Count: {v}"))
bs.Button(app, text="+1", command=lambda: counter.set(counter.get() + 1))
Features
- Application scaffolding —
Appfor blank windows,AppShellfor toolbar + sidebar + page-stack apps, frameless windows with custom chrome - 60+ widgets — ttk-derived primitives plus higher-level composites (TableView, Calendar, DateEntry, Form, FloodGauge, Meter, ToggleGroup, PageStack, Toast, Tooltip, and more)
- 9 dialogs — Message, Query, ColorChooser, ColorDropper, DateDialog, FontDialog, FilterDialog, FormDialog, plus a
Dialogbase - Layout containers —
PackFrameandGridFramefor declarative layouts;ScrollView,PanedWindow,Accordion,Card,Expander - Design system — semantic
accentcolors (primary, secondary, success, danger, warning, info) andvarianttokens (solid, outline, ghost, link, text), consistent across widgets - Built-in themes — paired light/dark variants (amber, aurora, bootstrap, classic, docs, forest, ocean, rose) with runtime theme switching and a custom-theme API
- Reactive signals — observable state with subscribe/get/set, integrates with widgets via
signal=/textvariable= - Forms & validation —
FormandFieldwith built-in validators - DataSource — common interface over in-memory, SQLite, and file backends, with pagination, filtering, sorting, CRUD, and CSV export
- Localization (i18n) — 23 bundled message catalogs, locale-aware number/date/time formatting via Babel, runtime language switching
- Icons & images — icon handling with theme-aware recoloring, DPI scaling, and caching
- Platform support — DPI awareness, multi-monitor centering, mica/acrylic effects on Windows
- CLI (
bootstack) — project scaffolding, run, add components, theme/i18n setup, doctor, build/package
Widget Categories
| Category | Widgets |
|---|---|
| Actions | Button, ButtonGroup, MenuButton, DropdownButton, ContextMenu |
| Inputs | TextEntry, PasswordEntry, PathEntry, NumericEntry, SpinnerEntry, Scale, ScrolledText, DateEntry, TimeEntry |
| Selection | CheckButton, CheckToggle, RadioButton, RadioToggle, RadioGroup, ToggleGroup, OptionMenu, SelectBox, Calendar, Switch |
| Data Display | Label, Badge, ListView, TreeView, TableView, Progressbar, Meter, FloodGauge |
| Layout | Frame, PackFrame, GridFrame, LabelFrame, PanedWindow, ScrollView, Accordion, Card, Expander, Separator, SizeGrip |
| Navigation | AppShell, Toolbar, SideNav, Tabs, PageStack |
| Dialogs | MessageDialog, QueryDialog, ColorChooser, ColorDropper, DateDialog, FontDialog, FilterDialog, FormDialog |
| Overlays | Toast, Tooltip |
| Forms | Form, Field (with validation) |
CLI
bootstack ships with an optional CLI for scaffolding, running, and packaging applications:
bootstack start MyApp # Create a new project (basic template)
bootstack start MyApp --template appshell # ...or with sidebar navigation
bootstack run # Run the app defined in the project config
bootstack add page Dashboard # Add a new page (appshell)
bootstack add view Settings # Add a new view (basic)
bootstack add dialog Preferences # Add a new dialog
bootstack add theme my-brand # Scaffold a custom theme
bootstack add i18n --languages en es fr # Add i18n support
bootstack list themes # List available themes
bootstack doctor # Diagnose project & environment
bootstack build # Package for distribution
Documentation
- Documentation: https://bootstack.org
- Getting Started: https://bootstack.org/getting-started/
- Guides: https://bootstack.org/guides/
- Widgets: https://bootstack.org/widgets/
Links
- GitHub: https://github.com/israel-dryer/bootstack
- Icons: https://github.com/israel-dryer/ttkbootstrap-icons
Acknowledgements
bootstack is derived from ttkbootstrap and continues that project's mission. See NOTICE for license attribution.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bootstack-0.1.0a4.tar.gz.
File metadata
- Download URL: bootstack-0.1.0a4.tar.gz
- Upload date:
- Size: 687.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8177b40f167b9ce769122f5ae76290c498f0214f90c7f454c94fd4841c9cb616
|
|
| MD5 |
32fda905effadf9afc5e494eb4224ab1
|
|
| BLAKE2b-256 |
3d11a6e0a026ce84a54ffb29e92a9bf9836161ebc0c26751b382b81602b932c9
|
Provenance
The following attestation bundles were made for bootstack-0.1.0a4.tar.gz:
Publisher:
release.yml on israel-dryer/bootstack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bootstack-0.1.0a4.tar.gz -
Subject digest:
8177b40f167b9ce769122f5ae76290c498f0214f90c7f454c94fd4841c9cb616 - Sigstore transparency entry: 1437986179
- Sigstore integration time:
-
Permalink:
israel-dryer/bootstack@29e298d02db30114c2b389942e2d034cc2bc55a8 -
Branch / Tag:
refs/tags/v0.1.0a4 - Owner: https://github.com/israel-dryer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@29e298d02db30114c2b389942e2d034cc2bc55a8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file bootstack-0.1.0a4-py3-none-any.whl.
File metadata
- Download URL: bootstack-0.1.0a4-py3-none-any.whl
- Upload date:
- Size: 938.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
23b711f42c03b565dccaeb338f5a309fe6e35d186c1dca40a1bcd9ff61f6a558
|
|
| MD5 |
f403cdcd39cc2c4b94e0eb0164318d46
|
|
| BLAKE2b-256 |
706fd566f88c3f64fc9349564f8eac6277ab6deb70cb8942819a122c62f0c96c
|
Provenance
The following attestation bundles were made for bootstack-0.1.0a4-py3-none-any.whl:
Publisher:
release.yml on israel-dryer/bootstack
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bootstack-0.1.0a4-py3-none-any.whl -
Subject digest:
23b711f42c03b565dccaeb338f5a309fe6e35d186c1dca40a1bcd9ff61f6a558 - Sigstore transparency entry: 1437986261
- Sigstore integration time:
-
Permalink:
israel-dryer/bootstack@29e298d02db30114c2b389942e2d034cc2bc55a8 -
Branch / Tag:
refs/tags/v0.1.0a4 - Owner: https://github.com/israel-dryer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@29e298d02db30114c2b389942e2d034cc2bc55a8 -
Trigger Event:
push
-
Statement type: