CustomTkinter GUI builder
CustomTkinter gives
tkinter a modern look (rounded corners, a flat accent-driven palette, and proper light and
dark modes) while staying ordinary Python you run with python main.py. What it
doesn't come with is a visual designer, so laying out a window still means guessing
coordinates and re-running your script.
This is a free online builder for exactly that. Drag CTk widgets onto a canvas that draws them
the way CustomTkinter actually renders them, set their properties, and download a clean,
class-based main.py that imports customtkinter and nothing else of
ours. There's no runtime to bundle and no lock-in, and the code is yours.
Open the designer, then turn on CustomTkinter from the Toolkit button in the toolbar.
Start building, no sign-up →What the exported code looks like
This is real generated output: standard CustomTkinter, readable, and yours to edit by hand afterwards:
# Requires CustomTkinter: pip install customtkinter
import customtkinter as ctk
import tkinter as tk
class Application:
def __init__(self, root):
self.root = root
root.title("Login")
root.geometry("360x240")
self.label1 = ctk.CTkLabel(root, text="Username", width=80, height=26)
self.label1.place(x=40, y=42)
self.entry1 = ctk.CTkEntry(root, width=170, height=28)
self.entry1.place(x=140, y=40)
self.entry2 = ctk.CTkEntry(root, show="*", width=170, height=28)
self.entry2.place(x=140, y=90)
self.button1 = ctk.CTkButton(root, text="Log in", command=self.on_button1,
width=100, height=34)
self.button1.place(x=140, y=140)
def on_button1(self):
username = self.entry1.get()
self.label1.configure(text="Welcome, " + username + "!")
if __name__ == "__main__":
ctk.set_appearance_mode("light")
root = ctk.CTk()
app = Application(root)
root.mainloop() Which widgets are supported
Sixteen of the twenty-five widgets in the palette map straight onto a native CustomTkinter class. Four have no CTk equivalent at all, so they fall back to their classic tkinter versions. They work, but they keep the older look, and the canvas shows them that way rather than pretending otherwise. The Chart is a case of its own: matplotlib draws into its own canvas, so it exports the same way whichever toolkit you pick.
| In the designer | Exports as | Notes |
|---|---|---|
| Label | CTkLabel | Native |
| Button | CTkButton | Native, with hover colour and corner radius |
| Entry | CTkEntry | Native, supports show="*" |
| Text | CTkTextbox | Native |
| Checkbutton | CTkCheckBox | Native |
| Radiobutton | CTkRadioButton | Native |
| Frame | CTkFrame | Native |
| Combobox | CTkComboBox | Native |
| OptionMenu | CTkOptionMenu | Native |
| Scale | CTkSlider | Native |
| Progressbar | CTkProgressBar | Native, though CTk uses a 0.0–1.0 range |
| Scrollbar | CTkScrollbar | Native, no arrow buttons |
| Canvas | CTkCanvas | Native |
| Notebook (tabs) | CTkTabview | Native; tabs are added by name |
| LabelFrame | composed | A bordered CTkFrame with a caption label |
| Separator | composed | A thin flat CTkFrame |
| Listbox | tk.Listbox | No CTk equivalent; keeps .insert() and .curselection() |
| Spinbox | tk.Spinbox | No CTk equivalent |
| Image | CTkLabel + CTkImage | Native; CTkImage scales properly on HiDPI screens |
| Treeview | ttk.Treeview | No CTk table widget |
| Date picker | tkcalendar.DateEntry | No CTk date widget; needs pip install tkcalendar |
| Switch | CTkSwitch | Native, and the only toolkit here with a real one |
| Meter (gauge) | CTkProgressBar | No CTk gauge; a progress bar carries the value |
| Scrollable frame | generated ScrollableFrame | Not CTkScrollableFrame: it cannot scroll place()d children |
| Chart (matplotlib) | FigureCanvasTkAgg | A matplotlib figure, identical on every toolkit; needs pip install matplotlib |
Light and dark, decided by you
Pick a project theme and both the canvas and the exported app follow it. CustomTkinter styles each widget rather than using a global option database, so the generated code carries the colours and font onto the widgets themselves, and anything you set on an individual widget still wins.
One deliberate difference from CustomTkinter's own default: it normally uses "system" appearance mode, which follows whatever machine the app runs on. That
would make your app look different from the design you drew, so the export always sets the
mode explicitly.
Switching an existing tkinter project across
The toolkit is a project setting, not a separate editor, so you can flip between standard tkinter and CustomTkinter whenever you like. Your widgets, layout and handler code are preserved; only the generated code and the canvas appearance change.
One thing to watch, because it fails at runtime rather than when the code is generated:
CustomTkinter rejects .config() and insists on .configure(). If your
own handler code uses .config(, the designer flags it while the CustomTkinter
target is on. .configure() is valid in both toolkits, so it's a safe change to
make either way.
Running what you export
CustomTkinter is a third-party package, so install it once:
pip install customtkinter Then run your app the way you'd run any Python script:
python main.py Frequently asked questions
Is this an official CustomTkinter tool?
No. CustomTkinter is an open-source library by Tom Schimansky; this is an independent visual builder that generates code for it. You still install CustomTkinter yourself with pip.
Do I need to install anything to design?
No. The designer runs in your browser and needs no account to start. You only need Python and "pip install customtkinter" to run the code you export.
Which CustomTkinter widgets are supported?
Thirteen map to native CTk widgets, including CTkButton, CTkEntry, CTkTextbox, CTkSlider, CTkProgressBar, CTkComboBox, CTkOptionMenu, CTkCheckBox, CTkRadioButton, CTkFrame, CTkScrollbar, CTkTabview and CTkCanvas. Listbox, Spinbox and Treeview fall back to classic tkinter widgets, because CustomTkinter has no equivalent.
Can I switch an existing tkinter design to CustomTkinter?
Yes. The toolkit is a project setting, so you can flip between standard tkinter and CustomTkinter at any time. Your widgets, layout and handler code are kept. Only the generated code and the canvas appearance change.
Does it support dark mode?
Yes. Pick a dark project theme and the canvas and the exported app both switch to CustomTkinter dark appearance mode. The mode is written into the code explicitly so the app looks the same on any machine.
Prefer standard tkinter?
The same designer also exports ttkbootstrap, which themes Python's built-in ttk widgets rather than replacing them. CustomTkinter vs ttkbootstrap compares the two side by side with real generated code. Or stay on plain tkinter, with no third-party dependency at all, useful on locked-down machines where you can't install packages. See the step-by-step guide, browse the ready-made templates, or read what to look for when choosing a tkinter GUI builder.
Your first CustomTkinter window takes about a minute.
Open the designer →