Tkinter Designer

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 designerExports asNotes
LabelCTkLabelNative
ButtonCTkButtonNative, with hover colour and corner radius
EntryCTkEntryNative, supports show="*"
TextCTkTextboxNative
CheckbuttonCTkCheckBoxNative
RadiobuttonCTkRadioButtonNative
FrameCTkFrameNative
ComboboxCTkComboBoxNative
OptionMenuCTkOptionMenuNative
ScaleCTkSliderNative
ProgressbarCTkProgressBarNative, though CTk uses a 0.0–1.0 range
ScrollbarCTkScrollbarNative, no arrow buttons
CanvasCTkCanvasNative
Notebook (tabs)CTkTabviewNative; tabs are added by name
LabelFramecomposedA bordered CTkFrame with a caption label
SeparatorcomposedA thin flat CTkFrame
Listboxtk.ListboxNo CTk equivalent; keeps .insert() and .curselection()
Spinboxtk.SpinboxNo CTk equivalent
ImageCTkLabel + CTkImageNative; CTkImage scales properly on HiDPI screens
Treeviewttk.TreeviewNo CTk table widget
Date pickertkcalendar.DateEntryNo CTk date widget; needs pip install tkcalendar
SwitchCTkSwitchNative, and the only toolkit here with a real one
Meter (gauge)CTkProgressBarNo CTk gauge; a progress bar carries the value
Scrollable framegenerated ScrollableFrameNot CTkScrollableFrame: it cannot scroll place()d children
Chart (matplotlib)FigureCanvasTkAggA 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 →