Drag-and-drop visual designer for CustomTkinter — design Python GUIs without writing layout code by hand.
Community Hub: kandelucky.github.io/ctkmaker-hub — browse and share reusable components built in CTkMaker.
What changed since v1.36.0:
- v1.41.0 — Window properties surface — Attached Scripts group + Object References flat list with Win/Dlg/Btn/Lbl chips + Local Variables 3-letter type chip + color swatch + Edit tool click on focused window opens Properties.
- v1.40.0 — Scripts panel folder UI — folder creation, Attached column with per-window cascade + drag-and-drop between folders.
- v1.39.0 — Library scripts as event handler targets — picker shows attached scripts, bindings export as
from assets.scripts.<page>... import <module>plus the call site.- v1.38.0 — Event binding Unity-style row layout — parent row is the target, Function child appears once target is picked, param children appear with function args.
- v1.36.0 — Scripts panel — per-page library
.pyfiles underassets/scripts/<page>/, opens via F6 / View → Scripts.
⚠️ Tested on Windows only. macOS and Linux are not verified — see issue #5 for the running list of known incompatibilities + how to help.
A CTkMaker project is organised in four levels:
- Project — a folder containing one or more page files plus a shared asset pool
- Page — a single
.ctkprojdesign (Login, Dashboard, Settings, ...) — pages share the project's fonts / images / icons - Window — a Tk window inside a page; either the Main Window (one per page) or a Dialog Window (zero or more)
- Widget — buttons, labels, frames, etc. nested inside a window
- Visual canvas — real CTk widgets on a zoomable workspace. What you see is what you get. Multiple windows (main + dialogs) live on the same canvas in one page.
- Widgets — 22 in the palette: Button, Segmented Button, Label, Rich Label, Image, Card, Progress Bar, Circular Progress, Check Box, Radio Button, Switch, Entry, Textbox, Combo Box, Option Menu, Slider, Frame, Scrollable Frame, Tab View, Vertical Layout, Horizontal Layout, Grid Layout. Richer property editing than raw CTk: drag-scrub numbers, paired font family + size, multiline overlays, segmented value editor, scrollable dropdown for ComboBox / OptionMenu, color swatches with eyedropper. Open Tools → Inspect CTk Widget to see every property side-by-side — native CTk parameters vs builder-added helpers.
- Layout managers —
place,vbox,hbox,gridrendered with the actual Tk pack/grid managers. Drop into cells, drag to reparent, even across windows. Horizontal / Vertical containers flex-shrink their children to a content-min floor (CSS-flex semantics):fixedsiblings keep their nominal size,fillsiblings let the user pin the main axis while the cross axis auto-fills,growsiblings auto-distribute the remaining space and shrink down to text + icon + chrome padding before clipping. - Alignment & distribution — toolbar buttons to align widgets (Left / Center / Right + Top / Middle / Bottom) and distribute them evenly. Auto-detects intent: a single widget aligns to its container, multiple widgets align to each other.
- Marquee selection + smart snap guides — drag a rectangle on empty canvas to multi-select; while dragging a widget, cyan guide lines snap its edges / centre to siblings and to the container. Hold Alt to bypass.
- Groups — Ctrl+G binds a same-parent selection together; clicking any member targets the whole group, fast follow-up drills to a single member, drag always carries the group as one. Object Tree shows them as a virtual
◆ Group (n)parent with members nested in soft orange. Ctrl+Shift+G dissolves the group. - Variables + property bindings (two-level) — declare shared values once and bind them to widget properties from the Properties panel with one click. Global variables (blue) live on the page — visible to every window inside it (main + dialogs); Local variables (orange) live on a single window and stay invisible to widgets in other windows. Updates propagate live across every bound widget. Reparenting or pasting a widget across windows triggers a migration dialog so local bindings are preserved cleanly. Exported code keeps globals on the main window and locals on each class — no glue code to wire up.
- Visual scripting (event handlers + object references + library scripts) — clickable widgets gain an Events group in the Properties panel: bind one or more methods to a widget event and the exporter generates the stubs in a per-window behavior file inside the project folder. Each widget also gets a one-click Object Reference toggle (+/×) that creates a typed slot in the behavior class — so handler code can reach any canvas widget by name without manual lookup. Window and Dialog panels get a matching global reference toggle for cross-window access. All references are managed in F11 → Object References alongside variables. Drop shared helpers (
helpers.py,services/auth.py, sub-packages) intoassets/scripts/<page>/and import them from any behavior file in the same page; events can also call a library function directly via the target picker, with the matchingfrom . import …auto-emitted on export. Editor preference (Settings → Editor) routesOpen in editor/ F7 / double-click into VS Code, Notepad++, or IDLE. - Widget descriptions (AI bridge) — every widget has a free-form description field for plain-language intent ("when clicked, add the digit 1 to the display"). Export optionally emits descriptions as Python comments above each widget — paste the file into your favourite AI to have it fill in the missing logic.
- Asset system — fonts, images, and 1700+ Lucide icons managed inside the project folder. Tinted PNGs, system-font auto-import, portable references.
- Component library — save any selection on the canvas as a reusable component (
.ctkcompzip), browse them in the Palette's Components tab, then drag back onto any canvas to instantiate with fresh UUIDs. Real-time search filter, single-widget components show their type icon, multi-widget fragments fall back to a generic icon. Lives under<project>/components/so the library travels with the project. Variable bindings inside a component get bundled with the file — on insert, name conflicts surface a Rename / Skip dialog. Whole windows can be saved too (drop spawns a fresh Toplevel). Sharing goes through the Community Hub via a Publish flow gated by MIT license + form (Author / Category / Description). - Live preview — run any window as a real CTk app in one click; floating Screenshot · F12 button saves the client area as PNG to share.
- Clean code export — one runnable Python file per window. Optional
.zipbundle (Python code + assets) for sharing. Per-page export ships only the assets that page actually references.
Startup — recent projects on the left, new-project form on the right with device + screen-size presets.
git clone https://github.com/kandelucky/ctk_maker.git
cd ctk_maker
pip install -r requirements.txt
python main.pyFull docs live in the Wiki:
- User Guide — workflow walkthrough
- Widgets — every supported widget + properties
- Keyboard Shortcuts — full reference
- Version history — screenshots and notes from each release
kandelucky.github.io/ctkmaker-hub is the
community library where reusable components built in CTkMaker get shared. Browse cards
by category (forms, buttons, mini-apps, …), click to preview, download the .ctkcomp.zip,
drop it into your own project.
To share one of your own — click Publish to Community in the builder, sign the MIT agreement, post the file in the Components Discussion. A sync workflow picks it up within ~30 minutes and your card appears on the site.
Found a bug or have an idea? Use Help → Report a Bug (or the toolbar button on the right) — a guided form opens that submits straight to the GitHub issue tracker, or saves a markdown file you can email instead. You can also open an issue directly.
- Python 3.12+ (tested on 3.14)
- ctkmaker-core 5.4.20+ — maintained CustomTkinter fork
- Pillow, tkextrafont, Send2Trash
- Custom user widgets + plugin system
- Distribution: PyInstaller bundles, installers, auto-updater
- macOS / Linux verification + cross-platform polish
- Component Hub growth — categories, search, version history
If CTkMaker helps you, buy me a coffee ☕.
MIT

