If you've ever wanted a simple GUI tool to check if a number is prime, this project is perfect for you. We'll build a Prime Number Checker using Python's tkinter library and enhance the UI with sv_ttk for theming.
The app will allow users to:
Input a number and check if it's prime.
Keep track of all numbers checked.
Toggle between light and dark mode.
Copy results to the clipboard.
Clear the history of checked numbers.
Let's dive in!
Features Overview
Interactive GUI built with Tkinter.
Dark Mode support for comfortable viewing.
Real-time results with color-coded messages:
✅ Green for prime numbers
❌ Red for non-prime numbers
History management and clipboard support.
Full Source Code
import tkinter as tk
from tkinter import ttk, messagebox, scrolledtext
import sv_ttk
# =========================
# App Setup
# =========================
root = tk.Tk()
root.title("Prime Number Checker")
root.geometry("900x600")
root.iconbitmap("") # Add path to your icon if needed
sv_ttk.set_theme("light") # Default theme
# =========================
# Globals
# =========================
checked_numbers = {} # number: True/False
dark_mode_var = tk.BooleanVar(value=False)
# =========================
# Helpers
# =========================
def toggle_theme():
if dark_mode_var.get():
root.configure(bg="#2E2E2E")
style.configure("TLabel", background="#2E2E2E", foreground="white")
style.configure("TFrame", background="#2E2E2E")
style.configure("TButton", background="#4CAF50", foreground="white")
style.configure("TNotebook", background="#2E2E2E")
else:
root.configure(bg="#FFFFFF")
style.configure("TLabel", background="#FFFFFF", foreground="black")
style.configure("TFrame", background="#FFFFFF")
style.configure("TButton", background="#4CAF50", foreground="white")
style.configure("TNotebook", background="#FFFFFF")
def is_prime(n):
if n <= 1:
return False
if n <= 3:
return True
if n % 2 == 0 or n % 3 == 0:
return False
i = 5
while i * i <= n:
if n % i == 0 or n % (i + 2) == 0:
return False
i += 6
return True
def check_number():
num_str = number_entry.get().strip()
if not num_str.isdigit():
messagebox.showerror("Invalid Input", "Enter a valid positive integer.")
return
num = int(num_str)
prime = is_prime(num)
checked_numbers[num] = prime
update_results()
number_entry.delete(0, tk.END)
def update_results():
result_text.configure(state="normal")
result_text.delete("1.0", tk.END)
for num, prime in sorted(checked_numbers.items()):
if prime:
result_text.insert(tk.END, f"✅ {num} is a prime number.\n", "prime")
else:
result_text.insert(tk.END, f"❌ {num} is NOT a prime number.\n", "not_prime")
result_text.configure(state="disabled")
result_text.tag_configure("prime", foreground="#4CAF50")
result_text.tag_configure("not_prime", foreground="#F44336")
def clear_history():
checked_numbers.clear()
update_results()
def copy_results():
root.clipboard_clear()
root.clipboard_append(result_text.get("1.0", tk.END))
messagebox.showinfo("Copied", "Results copied to clipboard.")
# =========================
# Styles
# =========================
style = ttk.Style()
style.theme_use("clam")
style.configure("Action.TButton", font=("Segoe UI", 11, "bold"),
foreground="white", background="#4CAF50", padding=8)
style.map("Action.TButton", background=[("active", "#45a049"), ("disabled", "#a5d6a7")])
style.configure("Secondary.TButton", font=("Segoe UI", 11, "bold"),
foreground="white", background="#2196F3", padding=8)
style.map("Secondary.TButton", background=[("active", "#1976D2"), ("disabled", "#90caf9")])
# =========================
# Layout
# =========================
top_frame = ttk.Frame(root, padding=20)
top_frame.pack(fill="x")
ttk.Label(top_frame, text="Prime Number Checker", font=("Segoe UI", 20, "bold")).pack(anchor="w")
ttk.Label(top_frame, text="Enter a number and check if it is prime.", font=("Segoe UI", 11)).pack(anchor="w", pady=(0,10))
input_frame = ttk.Frame(root, padding=10)
input_frame.pack(fill="x")
ttk.Label(input_frame, text="Number:", font=("Segoe UI", 12)).pack(side="left", padx=(0,5))
number_entry = ttk.Entry(input_frame, width=20, font=("Segoe UI", 12))
number_entry.pack(side="left", padx=(0,10), ipady=4)
ttk.Button(input_frame, text="Check", command=check_number, style="Action.TButton").pack(side="left", padx=5)
ttk.Button(input_frame, text="Clear History", command=clear_history, style="Secondary.TButton").pack(side="left", padx=5)
ttk.Button(input_frame, text="Copy Results", command=copy_results, style="Secondary.TButton").pack(side="left", padx=5)
dark_frame = ttk.Frame(root, padding=10)
dark_frame.pack(fill="x")
ttk.Checkbutton(dark_frame, text="Dark Mode", variable=dark_mode_var, command=toggle_theme, style="Action.TButton").pack(anchor="w")
result_frame = ttk.LabelFrame(root, text="Results", padding=15)
result_frame.pack(fill="both", expand=True, padx=20, pady=20)
result_text = scrolledtext.ScrolledText(result_frame, state="disabled", font=("Consolas", 12))
result_text.pack(fill="both", expand=True)
# =========================
# Run App
# =========================
root.mainloop()
How It Works
Prime Check Logic: Uses a simple but efficient algorithm to determine if a number is prime.
Dynamic UI: Results are shown in a ScrolledText widget, with color-coded messages.
Dark Mode: Toggleable with a checkbox, updating all widget styles.
History Management: Keeps track of previously checked numbers and allows clearing them.
Clipboard Support: Users can copy the results for use elsewhere.
Screenshot
Conclusion
This project is a fun way to combine Python programming with GUI development. You can expand it further by:
Adding a range checker for multiple numbers at once.
Including advanced prime algorithms for very large numbers.
Packaging it as an executable with pyinstaller.

Top comments (0)