import tkinter as tk
from tkinter import ttk, messagebox
import webbrowser
from datetime import datetime
import json
import os
class PhotoshopLearningApp:
def __init__(self, root):
self.root = root
self.root.title("🎨 Photoshop Learning Adventure for Kids!")
self.root.geometry("1000x700")
self.root.configure(bg='#2E3192')
# Student progress data
self.progress_file = "student_progress.json"
self.load_progress()
# Course data structure
self.curriculum = {
"Phase 1: Digital Art Explorer": {
"weeks": [
{
"title": "Week 1-2: Welcome to Digital Art",
"lessons": [
{"name": "What is Photoshop?", "video": "https://youtu.be/IyR_uYsRdPs", "completed": False},
{"name": "Mouse Skills & Brush Tools", "video": "https://youtu.be/x8gmDiRwM9k", "completed": False}
],
"project": "Rainbow Paintings"
},
{
"title": "Week 3-4: Shapes & Colors",
"lessons": [
{"name": "Shape Tools Magic", "video": "https://youtu.be/y7gJ5ELp6-A", "completed": False},
{"name": "Color Theory Fun", "video": "https://youtu.be/Qj1FK8n7WgY", "completed": False}
],
"project": "Geometric Animals"
},
{
"title": "Week 5-6: Photo Magic",
"lessons": [
{"name": "Importing & Cropping Photos", "video": "https://youtu.be/2qC4x5iI3HQ", "completed": False},
{"name": "Simple Filters & Effects", "video": "https://youtu.be/HKHEHLsOJ7o", "completed": False}
],
"project": "Pet Photo Makeovers"
}
],
"color": "#FF6B6B"
},
"Phase 2: Design Detective": {
"weeks": [
{
"title": "Week 7-8: Layers Like a Pro",
"lessons": [
{"name": "Understanding Layers", "video": "https://youtu.be/Tx2GC_qtLZ4", "completed": False},
{"name": "Layer Organization", "video": "https://youtu.be/NN7eWAY5mOE", "completed": False}
],
"project": "Digital Collages"
},
{
"title": "Week 9-10: Typography Adventures",
"lessons": [
{"name": "Text Tools & Fonts", "video": "https://youtu.be/YlUhPrAny3M", "completed": False},
{"name": "Cool Text Effects", "video": "https://youtu.be/oQM4nNAOPTw", "completed": False}
],
"project": "Movie Posters"
},
{
"title": "Week 11-12: Selection Superpowers",
"lessons": [
{"name": "Magic Wand & Lasso", "video": "https://youtu.be/O8RiBum8M8Y", "completed": False},
{"name": "Advanced Selections", "video": "https://youtu.be/gDq7OvO1qkE", "completed": False}
],
"project": "Background Swaps"
}
],
"color": "#4ECDC4"
},
"Phase 3: Creative Professional": {
"weeks": [
{
"title": "Week 13-14: Advanced Photo Editing",
"lessons": [
{"name": "Healing & Clone Tools", "video": "https://youtu.be/gAhYkY6VPag", "completed": False},
{"name": "Color Correction", "video": "https://youtu.be/W7Y3xw8WqP4", "completed": False}
],
"project": "Photo Restoration"
},
{
"title": "Week 15-16: Digital Illustration",
"lessons": [
{"name": "Pen Tool Mastery", "video": "https://youtu.be/tPCVTOaWJQo", "completed": False},
{"name": "Vector Shapes", "video": "https://youtu.be/O2TqvI5bYLw", "completed": False}
],
"project": "Logo Design"
},
{
"title": "Week 17-18: Composition & Layout",
"lessons": [
{"name": "Design Principles", "video": "https://youtu.be/ZK86XQ1iFVs", "completed": False},
{"name": "Grid Systems", "video": "https://youtu.be/a2DABzm_nCM", "completed": False}
],
"project": "Magazine Layouts"
}
],
"color": "#45B7D1"
},
"Phase 4: Design Professional": {
"weeks": [
{
"title": "Week 19-20: Advanced Masking",
"lessons": [
{"name": "Complex Masks", "video": "https://youtu.be/cyE2bxj6UBE", "completed": False},
{"name": "Photo Compositing", "video": "https://youtu.be/RlOxWBACCz8", "completed": False}
],
"project": "Fantasy Scenes"
},
{
"title": "Week 21-22: Brand Identity",
"lessons": [
{"name": "Logo Design Principles", "video": "https://youtu.be/RBTiTcHlVTU", "completed": False},
{"name": "Brand Guidelines", "video": "https://youtu.be/KKfuJQX7-e0", "completed": False}
],
"project": "Complete Brand Identity"
},
{
"title": "Week 23-24: Portfolio Creation",
"lessons": [
{"name": "Professional Portfolios", "video": "https://youtu.be/6h3RJd4rPa0", "completed": False},
{"name": "File Export & Presentation", "video": "https://youtu.be/HDHgOOhCLAo", "completed": False}
],
"project": "Final Portfolio Showcase"
}
],
"color": "#96CEB4"
}
}
self.setup_ui()
def load_progress(self):
"""Load student progress from file"""
try:
if os.path.exists(self.progress_file):
with open(self.progress_file, 'r') as f:
self.student_progress = json.load(f)
else:
self.student_progress = {"completed_lessons": [], "current_phase": 0}
except:
self.student_progress = {"completed_lessons": [], "current_phase": 0}
def save_progress(self):
"""Save student progress to file"""
try:
with open(self.progress_file, 'w') as f:
json.dump(self.student_progress, f)
except:
pass
def setup_ui(self):
"""Setup the main user interface"""
# Header
header_frame = tk.Frame(self.root, bg='#2E3192', height=80)
header_frame.pack(fill='x', pady=(0, 20))
header_frame.pack_propagate(False)
title_label = tk.Label(header_frame, text="🎨 Photoshop Learning Adventure",
font=('Comic Sans MS', 24, 'bold'),
fg='white', bg='#2E3192')
title_label.pack(pady=20)
# Progress bar
progress_frame = tk.Frame(self.root, bg='#2E3192')
progress_frame.pack(fill='x', padx=20, pady=(0, 20))
tk.Label(progress_frame, text="Your Learning Progress:",
font=('Arial', 12, 'bold'), fg='white', bg='#2E3192').pack(anchor='w')
self.progress_var = tk.DoubleVar()
self.progress_bar = ttk.Progressbar(progress_frame, variable=self.progress_var,
maximum=100, length=400)
self.progress_bar.pack(pady=5, anchor='w')
self.progress_label = tk.Label(progress_frame, text="0% Complete",
font=('Arial', 10), fg='white', bg='#2E3192')
self.progress_label.pack(anchor='w')
# Main content area
main_frame = tk.Frame(self.root, bg='white')
main_frame.pack(fill='both', expand=True, padx=20, pady=(0, 20))
# Create notebook for phases
self.notebook = ttk.Notebook(main_frame)
self.notebook.pack(fill='both', expand=True, padx=10, pady=10)
self.setup_phases()
self.update_progress()
def setup_phases(self):
"""Setup phase tabs and content"""
for phase_name, phase_data in self.curriculum.items():
# Create frame for this phase
phase_frame = tk.Frame(self.notebook, bg='white')
self.notebook.add(phase_frame, text=phase_name)
# Create scrollable canvas
canvas = tk.Canvas(phase_frame, bg='white')
scrollbar = ttk.Scrollbar(phase_frame, orient="vertical", command=canvas.yview)
scrollable_frame = tk.Frame(canvas, bg='white')
scrollable_frame.bind(
"<Configure>",
lambda e: canvas.configure(scrollregion=canvas.bbox("all"))
)
canvas.create_window((0, 0), window=scrollable_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)
# Add weeks to this phase
for week_idx, week_data in enumerate(phase_data["weeks"]):
self.create_week_section(scrollable_frame, week_data, phase_data["color"],
f"{phase_name}_{week_idx}")
canvas.pack(side="left", fill="both", expand=True)
scrollbar.pack(side="right", fill="y")
def create_week_section(self, parent, week_data, color, week_id):
"""Create a week section with lessons and videos"""
# Week container
week_frame = tk.Frame(parent, bg=color, relief='raised', bd=2)
week_frame.pack(fill='x', padx=10, pady=10)
# Week title
title_frame = tk.Frame(week_frame, bg=color)
title_frame.pack(fill='x', padx=15, pady=10)
tk.Label(title_frame, text=week_data["title"],
font=('Arial', 16, 'bold'), fg='white', bg=color).pack(anchor='w')
# Lessons
lessons_frame = tk.Frame(week_frame, bg='white')
lessons_frame.pack(fill='x', padx=15, pady=(0, 10))
for lesson_idx, lesson in enumerate(week_data["lessons"]):
lesson_frame = tk.Frame(lessons_frame, bg='#f8f9fa', relief='groove', bd=1)
lesson_frame.pack(fill='x', pady=5)
# Lesson content
content_frame = tk.Frame(lesson_frame, bg='#f8f9fa')
content_frame.pack(fill='x', padx=10, pady=8)
# Lesson name and status
name_frame = tk.Frame(content_frame, bg='#f8f9fa')
name_frame.pack(fill='x')
lesson_key = f"{week_id}_{lesson_idx}"
completed = lesson_key in self.student_progress["completed_lessons"]
status_text = "✅" if completed else "⭕"
tk.Label(name_frame, text=f"{status_text} {lesson['name']}",
font=('Arial', 12, 'bold'), bg='#f8f9fa').pack(side='left')
# Buttons frame
buttons_frame = tk.Frame(content_frame, bg='#f8f9fa')
buttons_frame.pack(fill='x', pady=(5, 0))
# Watch video button
watch_btn = tk.Button(buttons_frame, text="🎥 Watch Video",
font=('Arial', 10, 'bold'),
bg='#FF4757', fg='white',
command=lambda url=lesson["video"]: self.open_video(url))
watch_btn.pack(side='left', padx=(0, 10))
# Mark complete button
if not completed:
complete_btn = tk.Button(buttons_frame, text="✓ Mark Complete",
font=('Arial', 10),
bg='#2ED573', fg='white',
command=lambda key=lesson_key: self.mark_complete(key))
complete_btn.pack(side='left')
# Project section
project_frame = tk.Frame(week_frame, bg='#FFF3CD', relief='groove', bd=1)
project_frame.pack(fill='x', padx=15, pady=(0, 15))
tk.Label(project_frame, text=f"🎯 Week Project: {week_data['project']}",
font=('Arial', 12, 'bold'), bg='#FFF3CD').pack(pady=8)
def open_video(self, video_url):
"""Open video in web browser"""
try:
webbrowser.open(video_url)
messagebox.showinfo("Video Opening", "Video is opening in your web browser!")
except:
messagebox.showerror("Error", "Could not open video. Please check your internet connection.")
def mark_complete(self, lesson_key):
"""Mark a lesson as complete"""
if lesson_key not in self.student_progress["completed_lessons"]:
self.student_progress["completed_lessons"].append(lesson_key)
self.save_progress()
# Show celebration message
messagebox.showinfo("Great Job! 🎉",
"Lesson completed! You're becoming a Photoshop expert!")
# Refresh the UI
self.refresh_ui()
def refresh_ui(self):
"""Refresh the entire UI"""
# Clear notebook
for tab in self.notebook.tabs():
self.notebook.forget(tab)
# Recreate phases
self.setup_phases()
self.update_progress()
def update_progress(self):
"""Update the progress bar"""
total_lessons = 0
completed_lessons = len(self.student_progress["completed_lessons"])
for phase_data in self.curriculum.values():
for week_data in phase_data["weeks"]:
total_lessons += len(week_data["lessons"])
if total_lessons > 0:
progress_percent = (completed_lessons / total_lessons) * 100
self.progress_var.set(progress_percent)
self.progress_label.config(text=f"{progress_percent:.1f}% Complete ({completed_lessons}/{total_lessons} lessons)")
# Check for milestones
if progress_percent == 100:
messagebox.showinfo("🏆 CONGRATULATIONS! 🏆",
"You've completed the entire Photoshop course!\nYou're now ready for advanced design work!")
elif completed_lessons > 0 and completed_lessons % 6 == 0: # Every 6 lessons
messagebox.showinfo("🌟 Milestone Reached! 🌟",
f"Amazing! You've completed {completed_lessons} lessons!\nKeep up the great work!")
def main():
"""Run the application"""
root = tk.Tk()
app = PhotoshopLearningApp(root)
# Add window icon and styling
try:
root.iconbitmap('photoshop_icon.ico') # Add if you have an icon file
except:
pass
# Center window on screen
root.update_idletasks()
width = root.winfo_width()
height = root.winfo_height()
x = (root.winfo_screenwidth() // 2) - (width // 2)
y = (root.winfo_screenheight() // 2) - (height // 2)
root.geometry(f'{width}x{height}+{x}+{y}')
# Make window resizable
root.minsize(800, 600)
# Start the app
root.mainloop()
if __name__ == "__main__":
main()