Lesson 25 of 34
Tkinter Desktop Apps
Tkinter ships with most Python installations and turns a script into a real window. It is a good fit for small utilities, internal tools, and learning event-driven programming.
A GUI is event-driven: create widgets, connect , then enter mainloop(). Use ttk widgets for native-looking controls and grid() for layouts that resize cleanly. Keep one geometry manager per parent widget.
import tkinter as tk
from tkinter import ttk, messagebox
def convert() -> None:
try:
celsius = float(temperature.get())
except ValueError:
messagebox.showerror("Invalid temperature", "Enter a number.")
return
fahrenheit.set(f"{celsius * 9 / 5 + 32:.1f} °F")
root = tk.Tk()
root.title("Temperature Converter")
root.minsize(360, 160)
frame = ttk.Frame(root, padding=20)
frame.grid(sticky="nsew")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
frame.columnconfigure(1, weight=1)
temperature = tk.StringVar()
fahrenheit = tk.StringVar(value="—")
ttk.Label(frame, text="Celsius").grid(row=0, column=0, padx=6, pady=6)
entry = ttk.Entry(frame, textvariable=temperature)
entry.grid(row=0, column=1, sticky="ew", padx=6, pady=6)
ttk.Button(frame, text="Convert", command=convert).grid(row=1, column=0, columnspan=2, pady=8)
ttk.Label(frame, textvariable=fahrenheit, font=("TkDefaultFont", 16)).grid(row=2, column=0, columnspan=2)
entry.focus()
root.bind("<Return>", lambda event: convert())
root.mainloop()# Useful dialogs and a scrollable list
from tkinter import filedialog
path = filedialog.askopenfilename(
title="Open a text file",
filetypes=[("Text files", "*.txt"), ("All files", "*.*")],
)
tree = ttk.Treeview(root, columns=("size",), show="tree headings")
tree.heading("#0", text="Name")
tree.heading("size", text="Bytes")
tree.insert("", "end", text="notes.txt", values=(2048,))
# Schedule work without freezing the window
def update_clock():
clock.configure(text=time.strftime("%H:%M:%S"))
root.after(1000, update_clock)
# For slow network/file work, use a worker thread and send the
# result back with root.after(...). Never update widgets from that thread.Finished reading?Mark it done to track your progress.
Tip: use the ← and → keys to move between lessons.