CodingNic

Final Capstone Project

Final Polish and Improvements

Final Capstone Project 60 min read

Final Polish and Improvements

Final Polish and Improvements

Your application is now complete and tested.

This final step focuses on the small touches that turn a working app into a presentable one:

  • edge cases you may not have considered
  • additional polish ideas
  • preparing your project for presentation
  • deciding what to build next

You have already added a lot of polish along the way (theme, keyboard shortcuts, feedback messages, automatic refresh). This lesson is about finishing the last 5%.


Goal of This Lesson

By the end of this lesson, you will:

  • handle remaining edge cases
  • know what optional improvements make sense
  • have a clear, presentable final version
  • be ready to demo your project

Step 1: Edge Case Audit

Run your application and try these scenarios. Each should fail gracefully — never crash.

☐ Login with empty fields

Click Login with both fields blank.

Expected: “Enter username and password” message in red.

☐ Login with wrong password

Try logging in with a username that exists but a wrong password.

Expected: “Invalid login” message in red.

☐ Register a duplicate username

Register the same username twice.

Expected: “Username already taken” message in red.

☐ Add an empty task

Click Add with the task field blank.

Expected: “Enter a task title” message in red.

☐ Add an expense with letters in the amount

Type “abc” in the amount field and click Add Expense.

Expected: “Amount must be a number” message in red.

☐ Click Complete or Delete without selecting a task

Expected: “Select a task first” message in red.

☐ Logout and log back in

Confirm your data persists.

If any of these crashes the app, fix the missing validation now.


Step 2: Visual Consistency Pass

Open your app and look at every screen with fresh eyes. Check:

  • ☐ Are all paddings consistent? (look for cramped or oddly-spaced elements)
  • ☐ Do all buttons have the same style?
  • ☐ Is text alignment consistent?
  • ☐ Do colors match the theme everywhere?

If something looks off, find the value in THEME or your padding constants and fix it once.


Step 3: Small Quality-of-Life Additions (Optional)

Each of these is small and adds real value:

Auto-clear feedback messages

Currently, feedback messages stay on screen forever. You can make them clear themselves after a delay:

python
def show_message(label, text, color):
    label.config(text=text, fg=color)
    label.after(3000, lambda: label.config(text=""))

Then call show_message(message_label, "Task added", THEME["success"]) instead of message_label.config(...).

Confirm before deleting

python
from tkinter import messagebox

def delete_selected():
    selection = task_list.curselection()
    if not selection:
        return
    if messagebox.askyesno("Delete task", "Are you sure?"):
        delete_task(task_id_by_row[selection[0]])
        load_tasks()
        if on_change:
            on_change()

Show empty state messages

When a user has no tasks yet, the listbox is empty and confusing. Show a hint:

python
def load_tasks():
    task_list.delete(0, tk.END)
    task_id_by_row.clear()
    tasks = get_tasks(user_id)
    if not tasks:
        task_list.insert(tk.END, "  No tasks yet — add one above")
        task_list.itemconfig(tk.END, fg=THEME["muted"])
        return
    for task in tasks:
        # ... existing code ...

Step 4: Clean main.py

Your final main.py should be simple:

python
from app.services.database import create_tables
from app.ui.app_ui import create_app, show_login

def main():
    create_tables()

    window = create_app()
    show_login(window)

    window.mainloop()

if __name__ == "__main__":
    main()

If main.py has anything more than this, move it.


Step 5: Review Project Structure

text
productivity_app/
    app/
        services/
            database.py
            user_service.py
            task_service.py
            expense_service.py
            dashboard_service.py
        ui/
            app_ui.py
    tests/
        test_app.py
    main.py
    README.md

Step 6: Write a README

Create README.md in the project root. Include:

  • what the app does
  • how to run it (python main.py)
  • how to run tests (pytest)
  • the project structure
  • a note that passwords are stored as plain text (so anyone reading your code knows you know)

A README is what people see first when they open your project on GitHub. It is part of the project.


Step 7: Prepare for Presentation

Make sure your project:

  • runs without errors from a fresh clone
  • deletes app.db and runs again — should still work
  • has a clear structure
  • is easy to explain in 2 minutes

If you need to demo, prepare a short script:

  1. “Here’s the login screen — I can register or log in.”
  2. “After login, the dashboard shows summary stats at the top…”
  3. “…and tasks and expenses side by side. I can add, complete, and delete.”
  4. “The summary updates automatically when I change anything.”
  5. “All data is stored in SQLite, and the backend logic is fully tested with pytest.”

What You Built

You created a complete application with:

  • user authentication (register + login)
  • task management (add, complete, delete)
  • expense tracking with running total
  • dashboard summaries with auto-refresh
  • themed Tkinter GUI with header, stat cards, and side-by-side panels
  • SQLite database storage
  • automated tests

What This Represents

This is no longer a practice script.

This is a real application.


Going Further

If you want to keep improving:

Realistic next steps

  • hash passwords with bcrypt instead of plain text
  • add a date column to tasks and expenses
  • show expenses grouped by category
  • add a search/filter box to the task list
  • add a chart showing expense totals per category (Tkinter has no native charts — this means learning matplotlib or moving the UI to a web framework)

Bigger leaps

  • rewrite the UI in PyQt or a web framework (Flask + HTMX is approachable)
  • replace raw SQL with SQLAlchemy
  • package the app with PyInstaller so others can run it without Python installed

Pick one and start a new project. Do not try to do all of them at once.


Final Result

You now have a portfolio-ready Python project.


Summary

You polished your application’s edge cases, audited it for visual consistency, prepared it for presentation, and identified a clear path for what to build next. Your project is complete.