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

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.