Building a desktop application in Python is an exciting journey, but the first hurdle is always choosing the right library.
I have spent years building custom tools and internal dashboards using Python, and I have spent most of that time working with Tkinter.
However, I’ve also had my fair share of projects where PyQt was the better fit for the job.
In this guide, I will share my firsthand experience with both frameworks to help you decide which one suits your next project.
Why Choosing the Right GUI Framework Matters
When I first started developing desktop apps, I thought any library would do as long as it showed a window.
I quickly learned that the framework you choose affects your development speed, the app’s look, and even how you distribute it.
If you are building a simple calculator for a local US tax office, you might not need a heavy framework.
But if you are designing a high-end data visualization tool for a tech firm in San Francisco, aesthetics and performance become critical.
An Overview of Tkinter
Tkinter is Python’s built-in library for creating interfaces. It is the “Standard GUI” for Python.
I love Tkinter because I don’t have to install anything extra; it comes bundled with my Python installation.
It uses a “wrapper” around the Tcl/Tk engine, which has been around for decades.
The Pros of Tkinter
- Zero Installation: Since it’s built-in, your users won’t need to run pip install for the GUI to work.
- Lightweight: It starts up almost instantly and consumes very little RAM.
- Simplicity: The syntax is easy, making it perfect for beginners or quick internal tools.
The Cons of Tkinter
- Dated Look: By default, Tkinter apps look like software from the Windows 95 era.
- Limited Widgets: You won’t find advanced widgets like built-in web browsers or complex charts.
An Overview of PyQt
PyQt is a Python binding for the Qt framework, which is written in C++. It is a powerhouse.
When I need to build a professional-grade application that looks like a modern Mac or Windows app, I reach for PyQt.
It offers a massive library of widgets and tools that go far beyond simple buttons and text boxes.
The Pros of PyQt
- Modern Aesthetics: It follows the native look and feel of the operating system perfectly.
- Feature Rich: It includes tools for networking, database management, and multimedia.
- Qt Designer: You can drag and drop elements to design your UI visually rather than writing every line of layout code.
The Cons of PyQt
- Steep Learning Curve: There are many more classes and methods to learn compared to Tkinter.
- Large Footprint: It adds a significant size to your final executable file.
- Licensing: If you are building a commercial closed-source app, you might need to buy a license.
Method 1: Build a Simple US Sales Tax Calculator in Tkinter
I often use Tkinter for small utility apps. Let’s look at how I would build a Sales Tax Calculator tailored for a business in Florida (7% tax).
Tkinter uses a “Grid” system for layouts, which I find very intuitive for forms.
import tkinter as tk
from tkinter import messagebox
def calculate_tax():
try:
# Get input amount
amount = float(entry_amount.get())
# Florida Sales Tax (6% State + 1% typical local)
tax_rate = 0.07
total_tax = amount * tax_rate
final_total = amount + total_tax
# Display results
label_result.config(text=f"Total with Tax: ${final_total:,.2f}")
except ValueError:
messagebox.showerror("Input Error", "Please enter a valid numeric amount.")
# Initialize the main window
root = tk.Tk()
root.title("Florida Sales Tax Tool")
root.geometry("400x250")
# Adding widgets
tk.Label(root, text="Enter Sale Amount ($):", font=("Arial", 12)).pack(pady=10)
entry_amount = tk.Entry(root, font=("Arial", 12))
entry_amount.pack(pady=5)
btn_calculate = tk.Button(root, text="Calculate Tax", command=calculate_tax, bg="#0078d4", fg="white")
btn_calculate.pack(pady=20)
label_result = tk.Label(root, text="Total with Tax: $0.00", font=("Arial", 12, "bold"))
label_result.pack(pady=10)
# Start the application
root.mainloop()You can see the output in the screenshot below.

When I run this, the window is simple. It gets the job done without any fuss. If you are working on a tight deadline for a “one-off” internal script, this is the way to go.
Method 2: Build a Real Estate Commission Tracker in PyQt6
Now, let’s look at how PyQt handles a slightly more complex UI. Imagine you are a real estate agent in New York, and you want a sleek app to track commissions.
PyQt uses a “Signals and Slots” mechanism for handling button clicks, which is more robust for large apps.
import sys
from PyQt6.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox
class CommissionApp(QWidget):
def __init__(self):
super().__init__()
self.init_ui()
def init_ui(self):
# Set Window Properties
self.setWindowTitle('NY Real Estate Commission Tracker')
self.setGeometry(100, 100, 400, 300)
# Create Layout
layout = QVBoxLayout()
# Create Widgets
self.label_instr = QLabel('Enter Property Sale Price ($):')
self.input_price = QLineEdit()
self.input_price.setPlaceholderText("e.g. 750000")
self.btn_calc = QPushButton('Calculate 6% Commission')
self.btn_calc.clicked.connect(self.calculate_commission)
# Styling the button
self.btn_calc.setStyleSheet("background-color: #2c3e50; color: white; padding: 10px;")
self.result_label = QLabel('Commission Amount: $0.00')
self.result_label.setStyleSheet("font-size: 18px; color: green;")
# Add Widgets to Layout
layout.addWidget(self.label_instr)
layout.addWidget(self.input_price)
layout.addWidget(self.btn_calc)
layout.addWidget(self.result_label)
self.setLayout(layout)
def calculate_commission(self):
try:
price = float(self.input_price.text())
commission = price * 0.06
self.result_label.setText(f'Commission Amount: ${commission:,.2f}')
except ValueError:
QMessageBox.critical(self, "Error", "Please enter a valid property price.")
if __name__ == '__main__':
app = QApplication(sys.argv)
window = CommissionApp()
window.show()
sys.exit(app.exec())You can see the output in the screenshot below.

In this PyQt example, you can see the object-oriented approach I usually take. It feels more organized, especially as the application grows to include multiple windows.
Performance and Resource Consumption
In my experience, Tkinter is the king of low-resource environments.
If you are running an app on an old laptop or a Raspberry Pi, Tkinter will be much smoother.
PyQt, being based on C++, is very fast once it’s loaded, but it has a heavier memory footprint.
For most modern US desktops with 16GB of RAM, this difference is negligible.
Ease of Learning: Firsthand Observations
When I teach junior developers, I always start them with Tkinter.
The concepts of “root”, “main loop”, and “pack” can be learned in a single afternoon.
PyQt requires an understanding of Classes and Inheritance, which can be a bit daunting for beginners.
However, once you master PyQt, you feel like you have a “superpower” for building any software imaginable.
Deployment: Share Your App
Sharing your Python app with a client in Chicago or LA requires turning your script into an .exe file.
I use PyInstaller for both frameworks.
Tkinter apps result in very small executable files (around 10-15 MB).
PyQt apps often result in larger files (over 50 MB) because they have to include the Qt libraries.
Customization and Styling
If your brand has a specific color palette (like the red and white of a Coca-Cola themed app), styling is key.
In Tkinter, I find styling to be a bit tedious; you have to change colors widget by widget.
In PyQt, I can use “Qt Style Sheets” (QSS), which are very similar to CSS used in web design.
This allows me to style the entire app with just a few lines of code.
Summary of Key Differences
| Feature | Tkinter | PyQt |
| Ease of Use | Very Easy | Moderate to Hard |
| Aesthetics | Basic/Old | Modern/Native |
| Installation | Built-in | Needs pip install |
| Learning Curve | Low | High |
| Visual Design | Manual code | Qt Designer (Drag & Drop) |
In this article, I have shared my personal journey using both Tkinter and PyQt.
While I often use Tkinter for quick internal tools that stay on my machine, I prefer PyQt for anything that a client will see.
Choosing between them really depends on your specific needs and how much time you have to learn the framework.
If you want something built-in and simple, go with Tkinter. If you want a professional look and more features, PyQt is worth the effort.
You may also like to read:
- How to Set a Default Value in Tkinter Entry Widget
- How to Fix Exception in Tkinter Callback
- How to Set a Default Value in a Tkinter Combobox
- How to Change the Tkinter Title Bar Color

Bijay Kumar is an experienced Python and AI professional who enjoys helping developers learn modern technologies through practical tutorials and examples. His expertise includes Python development, Machine Learning, Artificial Intelligence, automation, and data analysis using libraries like Pandas, NumPy, TensorFlow, Matplotlib, SciPy, and Scikit-Learn. At PythonGuides.com, he shares in-depth guides designed for both beginners and experienced developers. More about us.