If you've ever tried building a GUI in Python, you already know the cycle:
- You open a tutorial.
- You copy the example window code.
- The window looks like it was designed in 1998.
- You quietly close the tab and go back to building CLIs.
For years, I stuck to the command line because every GUI library I tried felt like punishment. Either too old, too complex, too rigid, or too "do everything yourself."
But two months ago, I hit a wall.
I needed a real interface for one of my automation tools — something I could send to non-technical people without explaining how to run a Python script. So I decided to test every GUI toolkit I could find. And somewhere between broken layout managers, callback hell, and endless widget configs…
…I found the one that finally made everything click.
Before we get there, here's how the journey went.
1. The Problem That Forced Me Into GUI Land
I built a small automation script that organizes project folders, renames files, and generates a daily report. For developers, a CLI is perfect. For regular users?
Not so much.
My friends stared at the terminal like it was malware.
I needed:
- Buttons
- File pickers
- Status indicators
- Progress bars
- A layout system that wouldn't fight me
- And something that didn't require rewriting my entire Python script
Basically, a GUI that felt modern without demanding a computer science diploma.
So I spent weeks testing different frameworks with the same simple prototype:
- A main screen
- A "Select Folder" button
- A process button
- A live progress bar
- A log area
If a toolkit made even this irritating — instant rejection.
2. Tkinter: The Tutorial Darling That Ages Like Milk
Tkinter is like a childhood toy you can't bring yourself to throw away…but deep down you know you should.
To be fair, it works. You can create a window in four lines:
import tkinter as tk
root = tk.Tk()
root.title("Areej's App")
root.mainloop()But the second you try making it modern, you enter layout chaos.
Center this? Stretch that? Make the button not look like it's from Windows XP?
Suddenly you're debugging pixel values at 2 a.m.
Even basic styling requires adding ttk widgets, themes, and platform-specific tweaks. As one developer put it:
"Tkinter teaches you patience. Mostly because it tests all of it."
I dropped it after 3 days.
3. PyQt: Beautiful, Powerful… and Overwhelming
PyQt is undeniably gorgeous. The widgets feel professional, and Qt Designer is a lifesaver. But the licensing, API size, and learning curve?
Brutal.
Here's the "simple" version of a PyQt window:
from PyQt6.QtWidgets import QApplication, QWidget
app = QApplication([])
window = QWidget()
window.setWindowTitle("Areej's App")
window.show()
app.exec()Not bad… until you start connecting signals, managing threads, adjusting layouts, installing Qt dependencies, and bundling an app that suddenly weighs 300MB.
PyQt is powerful. But it felt like driving a race car when I just needed a bicycle.
4. Kivy: The Cool One That Doesn't Fit Every Project
Kivy is amazing if you want:
- Mobile apps
- Touch support
- Animations
- A UI that looks like it came straight from a modern game menu
But I didn't need animated buttons or gesture support. I needed standard desktop widgets — the stuff people already know.
Kivy's KV language is fun, though:
<Button>:
font_size: 20
text: "Process Files"Still, it wasn't the right tool for a simple automation dashboard.
5. Dear PyGUI: The Fast, GPU-Accelerated Beast
Dear PyGUI is wild — everything is GPU-rendered. It feels like building a game UI more than an app.
import dearpygui.dearpygui as dpg
dpg.create_context()
with dpg.window(label="Areej's App"):
dpg.add_button(label="Run")
dpg.create_viewport()
dpg.setup_dearpygui()
dpg.show_viewport()
dpg.start_dearpygui()Pros:
- Fast
- Modern
- Great for tools, dashboards, dev utilities
Cons:
- Looks like dev software, not user software
- Not the "simple desktop app" vibe I needed
Still… easily in my top 3.
6. CustomTkinter: The Glow-Up Tkinter Didn't Know It Needed
CustomTkinter is Tkinter — but actually good-looking.
Dark mode? Built in. Rounded buttons? Built in. Modern widgets? Built in.
import customtkinter as ctk
ctk.set_appearance_mode("dark")
app = ctk.CTk()
button = ctk.CTkButton(app, text="Process")
button.pack(padx=20, pady=20)
app.mainloop()Honestly, CustomTkinter fixed 70% of what annoyed me in Tkinter.
But layouts still feel… Tkinter-y. And for larger apps, it starts to show its limitations.
That's when I finally reached the toolkit that changed everything.
7. The One I Wish I Found Earlier: Flet
Flet is what you get if Python, Flutter, and sanity had a baby.
- Modern UI
- Cross-platform
- Web + desktop + mobile
- Hot reload
- Straightforward layout system
- And… you write everything in Python.
Here's the same window prototype rewritten in Flet:
import flet as ft
def main(page: ft.Page):
page.title = "Areej's App"
page.vertical_alignment = ft.MainAxisAlignment.START
log = ft.Text(value="Waiting...", expand=True)
def process_files(e):
log.value = "Processing..."
page.update()
page.add(
ft.Row([
ft.FilledButton("Select Folder"),
ft.FilledButton("Process", on_click=process_files)
]),
ft.ProgressBar(width=400),
log
)
ft.app(target=main)It's clean. It looks modern. It behaves predictably. And the layout system feels like designing in Flutter — intuitive but powerful.
A senior engineer once said:
"Good tools make you productive. Great tools make you creative."
Flet did that for me.
Instead of fighting the framework, I started experimenting. Adding widgets. Adding pages. Trying animations. Building forms. Creating cards. Adding charts.
For the first time ever, building a GUI felt like building a web app — structured, logical, enjoyable.
8. Why Flet Won (By a Landslide)
Modern UI without hacks
No theming nightmares. No ugly defaults.
Easy state management
Your app feels almost like React, but in Python.
Layout system that makes sense
Rows, Columns, Containers — it all fits together.
Web or desktop with the same code
You can ship it to anyone.
Perfect for automation dashboards
This is where most Python GUIs fail. Flet shines here.
9. What I Built After Switching to Flet
Once it clicked, I rebuilt my entire automation tool:
- Multiple tabs
- Logs
- File previews
- A live progress bar
- A settings page
- Drag-and-drop
And it still looked cleaner than anything I built in Tkinter, CustomTkinter, or PyQt.
Final Thoughts: The GUI That Finally Made Me Want to Keep Coding
Two years ago, I kept stopping GUI projects halfway because everything felt like work.
Now? I open Flet when I'm bored — not because I have to, but because building interfaces is actually fun.
If you've struggled with Python GUIs, trust me: test everything, but try Flet last.
Because once you do, you might not go back.