# **Play: The Occupation of Childhood** 1. **Introduction** 2. **Definition of Play** 3. **Characteristics of Play** 4. **Importance of Play** 5. **Development of Play Across Age Groups** * Birth–3 Months * 3–6 Months * 6–12 Months * 1–2 Years * 2–3 Years * 3–5 Years * 5–7 Years * 7–12 Years * Adolescence 6. **Classification of Play** * **Parten's Social Stages of Play** * Unoccupied Play * Solitary Play * Onlooker Play * Parallel Play * Associative Play * Cooperative Play * **Piaget's Cognitive Stages of Play** * Practice (Sensorimotor) Play * Symbolic (Pretend) Play * Games with Rules * **Smilansky's Functional Classification of Play** * Functional Play * Constructive Play * Dramatic (Pretend) Play * Games with Rules 7. **Comparison of Play Classifications** 8. **Red Flags in Play Development** 9. **Play Assessment** * Clinical Observation * Parent/Caregiver Interview * Standardized Play Assessments 10. **Play as an Intervention** * Occupational Therapy * Physiotherapy * Speech-Language Therapy * Psychology * Special Education 11. **Clinical Applications / Case Example** 12. **Key Take-Home Messages** 13. **Conclusion** 14. **References** send clean clear and crisp details of the above topic for me to understand deeply, you can also yse flow chart and mindmaps , but make sure the content you send is correct clinically
| Source | Definition |
|---|---|
| Reilly (OT, 1974) | Play is the arena in which children practice the skills and roles necessary for adult life |
| Piaget (Developmental) | Play is a process by which the child assimilates experience to existing cognitive schema (pure assimilation) |
| Rubin et al. | Play is intrinsically motivated, freely chosen, process-oriented, non-literal, and actively engaged behavior |
| AOTA | Play is any spontaneous or organized activity that provides enjoyment, entertainment, amusement, or diversion |
CHARACTERISTICS OF PLAY
│
├── Intrinsically Motivated
│ └── Child plays because it is pleasurable, not for a reward
│
├── Freely Chosen
│ └── Self-selected; not externally directed
│
├── Process > Product
│ └── The experience matters more than the outcome
│
├── Non-literal / Symbolic
│ └── A stick can be a sword; a box can be a spaceship
│
├── Positive Affect
│ └── Generally associated with enjoyment and engagement
│
├── Active Engagement
│ └── Mental and/or physical involvement
│
└── Safe Exploration
└── Risk-taking within a protected context ("as if" world)
WHY PLAY MATTERS
│
├─── COGNITIVE ──── Problem-solving, creativity, symbolic thinking,
│ cause-and-effect, attention, memory
│
├─── LANGUAGE ───── Vocabulary expansion, narrative skills,
│ turn-taking, pragmatics
│
├─── SOCIAL ─────── Empathy, cooperation, conflict resolution,
│ rule understanding, Theory of Mind
│
├─── EMOTIONAL ───── Self-regulation, frustration tolerance,
│ expression of feelings, coping
│
├─── MOTOR ──────── Gross motor (balance, coordination),
│ Fine motor (manipulation, tool use),
│ Sensory integration
│
└─── IDENTITY ────── Sense of self, mastery, autonomy,
role exploration
Clinical Note: The UN Convention on the Rights of the Child (Article 31) recognizes play as a fundamental right of every child.
From Kaplan & Sadock: "By the age of 2, the individual can find hidden items, clearly demonstrating the achievement of object permanence. Make-believe games begin to take on a pleasurable role."
From Kaplan & Sadock Synopsis: "Between 2½ and 3 years, children commonly engage in parallel play... By age 3, play is often associative... By age 4, children are usually able to share and engage in cooperative play."
From Kaplan & Sadock Synopsis: "In the middle years, language expresses complex ideas... Logical exploration tends to dominate fantasy, and children show an increased interest in rules and orderliness."
PARTEN'S SOCIAL STAGES (least → most social)
│
├─ 1. UNOCCUPIED PLAY
│ Age: Birth - 3 months
│ Child makes random movements; no apparent purpose
│ Does NOT engage with toys or others
│
├─ 2. SOLITARY PLAY
│ Age: Birth - 2 years
│ Plays alone; completely independent
│ No interest in what others are doing
│ NORMAL and HEALTHY at this stage
│
├─ 3. ONLOOKER PLAY
│ Age: ~2 years
│ Watches others play but does not join
│ May talk to players but does not participate
│ Important: observational learning occurs here
│
├─ 4. PARALLEL PLAY
│ Age: 2 - 2.5 years
│ Plays BESIDE others with similar toys
│ NO interaction; no shared goals
│ Each child plays independently but in proximity
│
├─ 5. ASSOCIATIVE PLAY
│ Age: 3 - 4 years
│ Interacts with others; shares toys and space
│ Common theme BUT no organized goals or roles
│ "Playing together" without structure
│
└─ 6. COOPERATIVE PLAY
Age: 4+ years
Organized group play with a common goal
Defined roles, rules, and division of labor
Requires: turn-taking, negotiation, empathy
PIAGET'S COGNITIVE STAGES OF PLAY
┌──────────────────────────────────────────────────────────────────┐
│ STAGE 1: PRACTICE (SENSORIMOTOR) PLAY │
│ Age: Birth - 2 years │
│ Cognitive Stage: Sensorimotor │
│ Description: Repetition of motor actions for pleasure │
│ Examples: Banging blocks, splashing water, rolling a ball │
│ Purpose: Consolidating sensorimotor schemas │
│ Key feature: Pure ASSIMILATION - child repeats what is known │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ STAGE 2: SYMBOLIC (PRETEND) PLAY │
│ Age: 2 - 7 years │
│ Cognitive Stage: Preoperational │
│ Description: Use of symbols; one thing represents another │
│ Examples: Stick = sword; box = spaceship; doll = real baby │
│ Purpose: Development of semiotic function; language & thought │
│ Key feature: Deferred imitation; make-believe; role-playing │
└──────────────────────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
│ STAGE 3: GAMES WITH RULES │
│ Age: 7 years onward │
│ Cognitive Stage: Concrete Operational │
│ Description: Structured games governed by agreed rules │
│ Examples: Chess, cricket, tag, board games, team sports │
│ Purpose: Social coordination, logical reasoning, moral dev. │
│ Key feature: Rule understanding and rule following │
└──────────────────────────────────────────────────────────────────┘
From Kaplan & Sadock Comprehensive Textbook: "Symbols are used in play only after the sensorimotor period, in the type of play characterized by games of pretending. For example, a little girl may pretend that she is asleep, that a box is her pet cat, or that she is in a church. In each instance, symbols are generated 'to express everything in the child's life experience that cannot be formulated and assimilated by means of language alone.'"
SMILANSKY'S CLASSIFICATION
│
├─ 1. FUNCTIONAL PLAY
│ Age: 0 - 2 years
│ Simple, repetitive muscle movements with or without objects
│ Examples: Running, jumping, rolling a ball, shaking a rattle
│ Purpose: Sensorimotor skill building; exploring cause-effect
│
├─ 2. CONSTRUCTIVE PLAY
│ Age: 2 - 6 years (peaks 3-6)
│ Using objects/materials to construct or create something
│ Examples: Building blocks, sand castles, drawing, puzzles
│ Purpose: Problem-solving, spatial reasoning, persistence
│ NOTE: Most common type of play in preschool settings (~50%)
│
├─ 3. DRAMATIC (PRETEND) PLAY
│ Age: 2 - 7 years
│ Role-playing; acting out real or imagined scenarios
│ Examples: Playing house, doctor-patient, superheroes
│ Purpose: Language, Theory of Mind, emotional regulation
│ Sub-type: SOCIODRAMATIC = dramatic play with 2+ children
│
└─ 4. GAMES WITH RULES
Age: 6+ years
Activities with pre-established rules accepted by all
Examples: Cards, hide-and-seek, organized sports
Purpose: Social skills, inhibition, rule-following
| Feature | Parten (1932) | Piaget (1962) | Smilansky (1968) |
|---|---|---|---|
| Focus | Social complexity | Cognitive level | Functional category |
| Basis | Social participation | Developmental stage | Educational application |
| Stages | 6 (unoccupied → cooperative) | 3 (practice → rules) | 4 (functional → rules) |
| Unique contribution | Maps social development | Links play to cognition | Most practical for classroom/clinic |
| Used in | Social skill assessment | Developmental evaluation | OT, special ed, research |
| Limitation | Doesn't capture cognitive complexity | Undervalues social play | Stages not always sequential |
RED FLAGS - When to be Concerned
AGE RED FLAG
────── ────────────────────────────────────────────────────────
3 months Does not smile at faces; no eye contact; no response to voice
6 months No reaching for objects; no laughing or squealing
9 months No babbling; no joint attention (pointing/following gaze)
12 months No gesture (waving, pointing); no functional object use
18 months No pretend play; fewer than 10 words; no parallel play
24 months No 2-word phrases; no symbolic play; stuck in solitary play
36 months Cannot engage in simple dramatic play; no peer interaction
4 years Cannot engage in cooperative play; aggressive disruption of play
5+ years Cannot follow rules in structured games; excluded by peers
Any age Regression to earlier play stages (especially after a stressor)
Repetitive, stereotyped play without variation (consider ASD)
Play that is consistently aggressive or sexualized
Inability to shift between play themes
Reference: Cummings Otolaryngology - "Lack of symbolic play is listed as one of the earliest markers differentiating ASD from typical development and from specific language impairment."
PLAY ASSESSMENT APPROACH
│
├── 1. CLINICAL OBSERVATION
│ (naturalistic, structured, or semi-structured)
│
├── 2. PARENT/CAREGIVER INTERVIEW
│ (history, preferences, home play behaviors)
│
└── 3. STANDARDIZED ASSESSMENTS
(norm-referenced or criterion-referenced tools)
| Domain | What to Observe |
|---|---|
| Cognitive | Problem-solving, symbolic use, attention span, sequencing |
| Social-Emotional | Eye contact, turn-taking, affect, relatedness to examiner/caregiver |
| Sensorimotor | Coordination, motor control, sensory responses, tool use |
| Tool | Age Range | What It Measures | Used By |
|---|---|---|---|
| Test of Playfulness (ToP) | 6 mo - 18 yr | Playfulness using Bundy's model (intrinsic motivation, internal control, freedom from reality) | OT |
| Revised Knox Preschool Play Scale (RKPPS) | 0 - 6 yr | Space management, material management, imitation, participation | OT |
| Symbolic Play Test (SPT) | 1 - 3 yr | Symbolic play level; non-verbal cognitive ability | SLP, OT |
| Westby Play Scale | 9 mo - 5 yr | Sequential symbolic play development | SLP, OT |
| Child-Initiated Pretend Play Assessment (ChIPPA) | 3 - 7 yr | Elaborateness and spontaneity of pretend play | OT |
| Play History (Takata) | All ages | Interview-based occupational history of play | OT |
| Transdisciplinary Play-Based Assessment (TPBA) | Birth - 6 yr | Multi-domain developmental assessment through play | All disciplines |
PLAY-BASED INTERVENTION
│
┌────────┼─────────────────────────────────┐
│ │ │ │
OT PT SLP PSYCHOLOGY /
SPECIAL ED
From Kaplan & Sadock Comprehensive Textbook: "Subjects treated with trauma-processing activities, cooperative play, and creative-expressive elements improved and maintained improvement over 6 months in measurements of PTSD symptoms and hope."
┌─────────────────────────────────────────────────────────────────┐
│ KEY TAKE-HOME MESSAGES │
│ │
│ 1. Play is the PRIMARY OCCUPATION of childhood - not optional │
│ │
│ 2. Play reflects ALL domains of development simultaneously │
│ │
│ 3. THREE frameworks (Parten, Piaget, Smilansky) are │
│ COMPLEMENTARY lenses - use all three in assessment │
│ │
│ 4. Symbolic/pretend play is the MOST sensitive early marker │
│ of cognitive and social-communicative development │
│ │
│ 5. ABSENT pretend play by 18 months = RED FLAG for ASD │
│ │
│ 6. Play assessment = developmental assessment │
│ (you learn cognition, language, motor, social all at once) │
│ │
│ 7. All therapists use play - OT, PT, SLP, Psychology all have │
│ play-based approaches specific to their domain │
│ │
│ 8. A child who cannot play cannot fully participate in │
│ childhood occupations - this is a clinical emergency │
└─────────────────────────────────────────────────────────────────┘
Tip for Study: Master Parten's 6 stages with their ages and social features. Know Piaget's 3 play stages as extensions of his cognitive stages. Know Smilansky's 4 categories as the most clinically practical framework - especially for OT, SLP, and special education settings. Always link absent symbolic play to ASD screening.
ok orris, now the thing i expect is to do a topic dicussion in paeds for abt 15 mins to my interdiciplinary team in clinic, kinda oral seminnar on play, im an occupational therapist
TIMING GUIDE
- Opening + Definition: 2 min
- Why Play Matters: 1.5 min
- Play Development Across Ages: 2.5 min
- Classifications (Parten, Piaget, Smilansky): 4 min
- Red Flags: 2 min
- Our Roles as a Team: 2 min
- Closing + 1 question: 1 min
PRESENTER TIPS:
- Speak at a relaxed pace - 15 minutes is generous for this content
- Make eye contact with different team members when naming their profession
- The opening question ("what were you doing after school?") creates immediate engagement
- You don't need slides - but if you want one visual, write Parten's 6 stages on a whiteboard during that section
- Your strength as the OT presenter is that you own this topic - own it confidently
generate a handwritten notes format with all important content in it
Handwritten student medical/clinical notes on lined white paper, written with a blue ballpoint pen in neat but natural handwriting style. The page looks like real clinical study notes with the following content exactly: At the top center, large underlined heading: "PLAY: THE OCCUPATION OF CHILDHOOD" Below it, smaller: "OT Seminar Notes | Interdisciplinary Team" A horizontal divider line. Section heading (underlined, blue): "1. DEFINITION OF PLAY" Bullet points in handwriting: • Reilly (OT): "Play = arena where children practice skills & roles for adult life" • Bundy's 3 Core Qualities: 1. Intrinsic motivation – done for pleasure, no external reward 2. Internal locus of control – child directs the action 3. Freedom from reality – "what if" space; stick = sword, box = spaceship • Piaget: Play = pure assimilation (making world fit child's schema) • AOTA: Spontaneous/organized activity providing enjoyment & diversion Section heading (underlined): "2. CHARACTERISTICS OF PLAY" Small boxes drawn around each characteristic in a row: [ Intrinsically Motivated ] [ Freely Chosen ] [ Process > Product ] [ Non-literal / Symbolic ] [ Positive Affect ] [ Active Engagement ] [ Safe Exploration ] Short note below: "Child plays because it's pleasurable — not because it's on the therapy plan!" Section heading (underlined): "3. WHY PLAY MATTERS — Domains" A simple hand-drawn spider/mind-map with "PLAY" in a circle in the center, and 6 branches radiating out: → COGNITIVE: problem-solving, creativity, attention, memory → LANGUAGE: vocabulary, narrative, turn-taking, pragmatics → SOCIAL: empathy, cooperation, Theory of Mind, conflict resolution → EMOTIONAL: self-regulation, frustration tolerance, expression → MOTOR: gross & fine motor, sensory integration, tool use → IDENTITY: mastery, autonomy, role exploration, self-concept Small star note at bottom: "★ UN Convention on Rights of the Child, Article 31 — Play is a FUNDAMENTAL RIGHT" The page looks slightly worn, with ruled lines visible, and the handwriting is neat, genuine-looking student clinical notes. Include small arrows, underlines, stars for emphasis throughout. Page number "1" at bottom right.
u thr?
Handwritten clinical student notes on ruled white paper, written in blue ballpoint pen, neat natural handwriting, genuine study notes style with lined paper visible in background. TOP CENTER - Large underlined title: "PLAY: The Occupation of Childhood" Below: "(OT Seminar | Interdisciplinary Team)" in smaller writing Thick horizontal line underneath. SECTION 1 - Bold underlined: "DEFINITION" - Reilly (OT): "Play = arena to practice skills & roles for adult life" - Bundy's 3 Core Qualities (numbered list with small checkbox bullets): 1. Intrinsic motivation → no external reward 2. Internal locus of control → child directs the action 3. Freedom from reality → "what if" space / stick = sword - Piaget → pure assimilation (world fits child's schema) - AOTA → spontaneous activity providing enjoyment & diversion Small arrow note: "If these 3 are ABSENT → it's instruction, not play!" SECTION 2 - Bold underlined: "CHARACTERISTICS OF PLAY" Seven small hand-drawn boxes in a row each containing one word, like sticky notes: [Intrinsic] [Freely Chosen] [Process>Product] [Non-literal] [+ve Affect] [Active] [Safe Exploration] SECTION 3 - Bold underlined: "WHY PLAY MATTERS" Hand-drawn mind map: circle in center with "PLAY" written inside, 6 arrows radiating outward with labels: → COGNITIVE: problem-solving, attention, memory, creativity → LANGUAGE: vocab, narrative, turn-taking, pragmatics → SOCIAL: empathy, cooperation, Theory of Mind → EMOTIONAL: self-regulation, coping, expression → MOTOR: gross/fine motor, sensory integration → IDENTITY: mastery, autonomy, role exploration Bottom of page, starred box: "★ UN CRC Article 31 = Play is a FUNDAMENTAL RIGHT of every child ★" Page number "1" at bottom right corner. Ruled lines visible throughout. Natural handwriting variation, occasional underlines and stars for emphasis.
404 Not Found. {'message': '{\n "error": {\n "code": 404,\n "message": "Publisher model `projects/engaged-beaker-474810-u2/locations/global/publishers/google/models/gemini-3-pro-image-preview` was not found or your project does not have access to it. Ensure you are using a valid model name and that the model is available in the specified region. For more information, see: https://docs.cloud.google.com/gemini-enterprise-agent-platform/resources/locations.",\n "status": "NOT_FOUND"\n }\n}\n', 'status': 'Not Found'}
We encountered an error while processing your request. Please try again or reach out to us for help.
again?
okay sure
ls /tmp/workspace/ && pip show reportlab pillow 2>&1 | grep -E "Name|Version|not found" && python3 -c "from reportlab.lib.pagesizes import A4; print('reportlab OK')" && python3 -c "from PIL import Image; print('PIL OK')" && fc-list | grep -i "caveat\|patrick\|indie\|kalam\|handlee" | head -5
fc-list | grep -i "handwriting\|cursive\|hand\|script\|caveat\|kalam\|indie\|patrick\|handlee\|dancing" | head -20
pip install --user requests 2>/dev/null; python3 -c " import urllib.request, os # Download Caveat (handwriting) font from Google Fonts url = 'https://github.com/google/fonts/raw/main/ofl/caveat/Caveat-Regular.ttf' out = '/tmp/workspace/Caveat-Regular.ttf' try: urllib.request.urlretrieve(url, out) print('Downloaded:', os.path.getsize(out), 'bytes') except Exception as e: print('Failed:', e) "
python3 -c " import urllib.request, os urls = [ 'https://github.com/google/fonts/raw/refs/heads/main/ofl/caveat/Caveat%5Bwght%5D.ttf', 'https://fonts.gstatic.com/s/caveat/v18/WnznHAc5bAfYB2QRah7pcpNvOx-pjfJ9eIWpZA.woff2', ] for url in urls: try: out = '/tmp/workspace/Caveat.ttf' urllib.request.urlretrieve(url, out) print('Downloaded from', url, os.path.getsize(out), 'bytes') break except Exception as e: print('Failed', url, e) "
~/play_notes.py
"""
Handwritten-style clinical notes PDF generator
Topic: Play - The Occupation of Childhood
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import math, os, random
# ── Register handwriting font ───────────────────────────────────────────────
FONT_PATH = "/tmp/workspace/Caveat.ttf"
pdfmetrics.registerFont(TTFont("Caveat", FONT_PATH))
pdfmetrics.registerFont(TTFont("CaveatBold", FONT_PATH)) # use same for bold look
OUTPUT = "/tmp/workspace/Play_Handwritten_Notes.pdf"
W, H = A4 # 595.27 x 841.89 pt
MARGIN_L = 55
MARGIN_R = W - 30
MARGIN_TOP = H - 30
MARGIN_BOT = 40
LINE_GAP = 22 # ruled-line spacing
BLUE = colors.HexColor("#1a3a6b")
RED = colors.HexColor("#c0392b")
GREEN= colors.HexColor("#1e6b3a")
DARK = colors.HexColor("#1c1c2e")
PENCIL= colors.HexColor("#2255aa")
RULED= colors.HexColor("#c8d8f0")
MARGIN_LINE = colors.HexColor("#f4a0a0")
random.seed(42)
# ── Helpers ──────────────────────────────────────────────────────────────────
def draw_ruled_paper(c):
"""Draw lined-paper background."""
c.setFillColor(colors.HexColor("#fefef8"))
c.rect(0, 0, W, H, fill=1, stroke=0)
# horizontal lines
c.setStrokeColor(RULED)
c.setLineWidth(0.5)
y = MARGIN_TOP - 10
while y > MARGIN_BOT:
c.line(MARGIN_L - 10, y, MARGIN_R + 5, y)
y -= LINE_GAP
# red margin line
c.setStrokeColor(MARGIN_LINE)
c.setLineWidth(1.2)
c.line(MARGIN_L - 2, MARGIN_BOT, MARGIN_L - 2, MARGIN_TOP)
def draw_page_number(c, n, total):
c.setFont("Caveat", 13)
c.setFillColor(colors.gray)
c.drawCentredString(W/2, 22, f"— {n} / {total} —")
def htext(c, x, y, txt, size=15, color=DARK, bold=False, angle=0):
"""Draw handwriting-style text."""
c.saveState()
c.setFont("Caveat", size)
c.setFillColor(color)
if angle:
c.translate(x, y)
c.rotate(angle)
c.drawString(0, 0, txt)
else:
c.drawString(x, y, txt)
c.restoreState()
def section_title(c, x, y, txt, color=BLUE, size=19):
"""Underlined section heading."""
c.setFont("Caveat", size)
c.setFillColor(color)
c.drawString(x, y, txt)
tw = c.stringWidth(txt, "Caveat", size)
c.setStrokeColor(color)
c.setLineWidth(1.8)
c.line(x, y - 3, x + tw, y - 3)
return y - LINE_GAP - 4
def bullet(c, x, y, txt, size=14, color=DARK, symbol="•", sym_color=BLUE):
c.setFont("Caveat", size)
c.setFillColor(sym_color)
c.drawString(x, y, symbol)
c.setFillColor(color)
c.drawString(x + 14, y, txt)
def sub_bullet(c, x, y, txt, size=13, color=DARK):
c.setFont("Caveat", size)
c.setFillColor(colors.HexColor("#555555"))
c.drawString(x, y, "→")
c.setFillColor(color)
c.drawString(x + 14, y, txt)
def box_text(c, x, y, txt, size=13, bg=colors.HexColor("#e8f0fe"), border=BLUE):
tw = c.stringWidth(txt, "Caveat", size) + 12
th = 18
c.setFillColor(bg)
c.setStrokeColor(border)
c.setLineWidth(1)
c.roundRect(x, y - 3, tw, th, 4, fill=1, stroke=1)
c.setFont("Caveat", size)
c.setFillColor(BLUE)
c.drawString(x + 6, y + 2, txt)
return x + tw + 6
def star_box(c, x, y, w, lines, size=13, bg=colors.HexColor("#fff9e0"), border=colors.HexColor("#e0b800")):
"""Starred highlight box."""
h = len(lines) * LINE_GAP + 12
c.setFillColor(bg)
c.setStrokeColor(border)
c.setLineWidth(1.5)
c.roundRect(x, y - h + 14, w, h, 6, fill=1, stroke=1)
cy = y
for line in lines:
c.setFont("Caveat", size)
c.setFillColor(colors.HexColor("#7a5900"))
c.drawString(x + 8, cy, line)
cy -= LINE_GAP
def draw_arrow(c, x1, y1, x2, y2, color=BLUE):
c.setStrokeColor(color)
c.setLineWidth(1.2)
c.line(x1, y1, x2, y2)
# arrowhead
angle = math.atan2(y2 - y1, x2 - x1)
al = 8
ax = math.cos(angle)
ay = math.sin(angle)
c.line(x2, y2, x2 - al * ax + al/2 * ay, y2 - al * ay - al/2 * ax)
c.line(x2, y2, x2 - al * ax - al/2 * ay, y2 - al * ay + al/2 * ax)
def divider(c, y, color=BLUE):
c.setStrokeColor(color)
c.setLineWidth(1.5)
c.line(MARGIN_L - 10, y, MARGIN_R, y)
# ─────────────────────────────────────────────────────────────────────────────
# PAGE BUILDERS
# ─────────────────────────────────────────────────────────────────────────────
def page1(c):
draw_ruled_paper(c)
y = MARGIN_TOP - 15
# Title
c.setFont("Caveat", 26)
c.setFillColor(BLUE)
c.drawCentredString(W/2, y, "PLAY: The Occupation of Childhood")
y -= 10
c.setLineWidth(2.5); c.setStrokeColor(BLUE)
c.line(MARGIN_L, y, MARGIN_R, y)
y -= 8
c.setFont("Caveat", 14); c.setFillColor(RED)
c.drawCentredString(W/2, y, "OT Seminar Notes | Interdisciplinary Team | Paediatrics")
y -= LINE_GAP + 6
divider(c, y); y -= LINE_GAP
# Section 1 - Definition
y = section_title(c, MARGIN_L, y, "1. DEFINITION OF PLAY", BLUE, 20)
y -= 4
bullet(c, MARGIN_L, y, "Reilly (OT, 1974): \"Arena where children practice skills & roles for adult life\"")
y -= LINE_GAP
bullet(c, MARGIN_L, y, "Piaget: Play = pure assimilation (world fits child's schema)")
y -= LINE_GAP
bullet(c, MARGIN_L, y, "AOTA: Spontaneous/organized activity providing enjoyment & diversion")
y -= LINE_GAP + 4
# Bundy box
c.setFont("Caveat", 15); c.setFillColor(GREEN)
c.drawString(MARGIN_L, y, "Bundy's 3 Core Qualities ★ MOST IMPORTANT")
tw = c.stringWidth("Bundy's 3 Core Qualities ★ MOST IMPORTANT", "Caveat", 15)
c.setStrokeColor(GREEN); c.setLineWidth(1.5)
c.line(MARGIN_L, y-3, MARGIN_L+tw, y-3)
y -= LINE_GAP
c.setFont("Caveat", 14); c.setFillColor(DARK)
items = [
("①", "Intrinsic Motivation", "done for pleasure — NO external reward"),
("②", "Internal Locus of Control", "child directs the action"),
("③", "Freedom from Reality", "\"what if\" space → stick = sword, box = spaceship"),
]
for num, bold_part, rest in items:
c.setFillColor(RED); c.setFont("Caveat", 15); c.drawString(MARGIN_L + 10, y, num)
c.setFillColor(BLUE); c.setFont("Caveat", 15); c.drawString(MARGIN_L + 28, y, bold_part)
bw = c.stringWidth(bold_part, "Caveat", 15)
c.setFillColor(DARK); c.setFont("Caveat", 14); c.drawString(MARGIN_L + 30 + bw, y, f" – {rest}")
y -= LINE_GAP
c.setFont("Caveat", 13); c.setFillColor(RED)
c.drawString(MARGIN_L + 10, y, "⚠ If these 3 are ABSENT → it's instruction, not play!")
y -= LINE_GAP + 8
divider(c, y, colors.HexColor("#aaaaaa")); y -= LINE_GAP
# Section 2 - Characteristics
y = section_title(c, MARGIN_L, y, "2. CHARACTERISTICS OF PLAY", BLUE, 18)
y -= 4
chars = ["Intrinsically\nMotivated", "Freely\nChosen", "Process\n> Product", "Non-literal\n/ Symbolic", "Positive\nAffect", "Active\nEngagement", "Safe\nExploration"]
box_w = 70; box_h = 36; gap = 6
bx = MARGIN_L
for ch in chars:
c.setFillColor(colors.HexColor("#dceeff"))
c.setStrokeColor(BLUE)
c.setLineWidth(1.2)
c.roundRect(bx, y - box_h + 14, box_w, box_h, 5, fill=1, stroke=1)
c.setFont("Caveat", 11); c.setFillColor(BLUE)
lines_ch = ch.split("\n")
ty = y + 4
for lc in lines_ch:
c.drawCentredString(bx + box_w/2, ty, lc)
ty -= 14
bx += box_w + gap
y -= box_h + 8
divider(c, y, colors.HexColor("#aaaaaa")); y -= LINE_GAP
# Section 3 - Why Play Matters (mind map)
y = section_title(c, MARGIN_L, y, "3. WHY PLAY MATTERS — Domains", BLUE, 18)
y -= 8
# Draw mind map
cx = W/2; cy = y - 55
c.setFillColor(BLUE); c.setStrokeColor(BLUE); c.setLineWidth(2)
c.circle(cx, cy, 32, fill=1, stroke=1)
c.setFont("Caveat", 16); c.setFillColor(colors.white)
c.drawCentredString(cx, cy + 4, "PLAY")
domains = [
(0, "COGNITIVE", "problem-solving, attention,\nmemory, creativity"),
(60, "LANGUAGE", "vocabulary, narrative,\nturn-taking, pragmatics"),
(120, "SOCIAL", "empathy, cooperation,\nTheory of Mind"),
(180, "EMOTIONAL", "self-regulation,\ncoping, expression"),
(240, "MOTOR", "gross & fine motor,\nsensory integration"),
(300, "IDENTITY", "mastery, autonomy,\nrole exploration"),
]
domain_colors = [BLUE, GREEN, RED, colors.HexColor("#8b00aa"), colors.HexColor("#b35900"), colors.HexColor("#006666")]
for i, (angle_deg, domain_name, detail) in enumerate(domains):
angle = math.radians(angle_deg)
r_inner = 35; r_label = 100
lx = cx + r_label * math.cos(angle)
ly = cy + r_label * math.sin(angle)
ex = cx + r_inner * math.cos(angle)
ey = cy + r_inner * math.sin(angle)
draw_arrow(c, ex, ey, lx, ly, domain_colors[i])
c.setFont("Caveat", 13); c.setFillColor(domain_colors[i])
dlines = detail.split("\n")
if lx > cx:
c.drawString(lx + 6, ly + 8, domain_name)
c.setFont("Caveat", 11); c.setFillColor(DARK)
for di, dl in enumerate(dlines):
c.drawString(lx + 6, ly + 8 - (di+1)*12, dl)
else:
tw2 = c.stringWidth(domain_name, "Caveat", 13)
c.drawString(lx - tw2 - 6, ly + 8, domain_name)
c.setFont("Caveat", 11); c.setFillColor(DARK)
for di, dl in enumerate(dlines):
tw3 = c.stringWidth(dl, "Caveat", 11)
c.drawString(lx - tw3 - 6, ly + 8 - (di+1)*12, dl)
y = cy - 80
# Star box
star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
"★ UN Convention on Rights of the Child — Article 31",
" PLAY is a FUNDAMENTAL RIGHT of every child"
], size=14)
y -= LINE_GAP * 2 + 6
draw_page_number(c, 1, 5)
c.showPage()
def page2(c):
draw_ruled_paper(c)
y = MARGIN_TOP - 15
c.setFont("Caveat", 22); c.setFillColor(BLUE)
c.drawString(MARGIN_L, y, "PLAY DEVELOPMENT ACROSS AGE GROUPS")
y -= 8
c.setLineWidth(2); c.setStrokeColor(BLUE)
c.line(MARGIN_L, y, MARGIN_R, y)
y -= LINE_GAP + 2
age_groups = [
("0 – 3 months", RED, [
"Sensory exploration & reflexive interaction",
"Attends to faces, voices, contrasting visuals",
"Social smiling ~6 weeks",
"Early turn-taking via gaze & vocalization (proto-conversations)",
"Play type: Reactive; caregiver-initiated"]),
("3 – 6 months", colors.HexColor("#b35900"), [
"Reaches & grasps objects; mouths for oral exploration",
"Enjoys rattles, textures, visual mobiles",
"Laughter during social games (peek-a-boo precursors)",
"Cause-and-effect discovery begins",
"Play type: Sensorimotor"]),
("6 – 12 months", GREEN, [
"Bangs, drops, throws → exploring object properties",
"Object permanence ~9 months → peek-a-boo meaningful now",
"Joint attention emerges (pointing, following gaze) ← SLP key milestone",
"Functional object use: phone to ear, comb to hair",
"Play type: Exploratory + early functional"]),
("1 – 2 years", BLUE, [
"Functional object use (cup, spoon)",
"Early pretend with OWN body (pretends to eat/sleep)",
"Parallel play begins; sorts shapes/colours",
"Builds 2-4 block towers; make-believe begins",
"Play type: Functional + early symbolic"]),
("2 – 3 years", colors.HexColor("#8b00aa"), [
"Symbolic play expands: block = car, feeds mother",
"Pretend sequences emerge",
"Parallel play predominates",
"Builds 6-block towers; completes simple puzzles",
"Play type: Symbolic + parallel social"]),
("3 – 5 years", RED, [
"Dramatic/pretend play flourishes (doctor, parent, teacher)",
"Associative → cooperative play (by age 4-5)",
"Imaginary companions possible (up to 50% of children!)",
"Understands simple game rules",
"Play type: Dramatic, associative, early cooperative"]),
("5 – 7 years", GREEN, [
"Cooperative play with rules established",
"Board games, organized sports, team activities",
"Understands fairness, competition, turn-taking",
"Play type: Games with Rules + constructive"]),
("7 – 12 years", BLUE, [
"Complex team games; hobbies emerge",
"Rule-governed play dominates; logical strategy",
"Peer relationships & social hierarchy in play",
"Fantasy → structured creative activities",
"Play type: Games with Rules + competitive + constructive"]),
("Adolescence", colors.HexColor("#006666"), [
"Play → leisure, recreation, social activities",
"Sports, music, art, digital games, creative writing",
"Identity exploration through hobbies & group membership",
"Play type: Recreational/leisure + competitive/cooperative"]),
]
for age, col, points in age_groups:
if y < MARGIN_BOT + 60:
c.showPage()
draw_ruled_paper(c)
y = MARGIN_TOP - 20
# Age header pill
aw = c.stringWidth(age, "Caveat", 14) + 16
c.setFillColor(col)
c.setStrokeColor(col)
c.roundRect(MARGIN_L - 4, y - 4, aw, 20, 8, fill=1, stroke=0)
c.setFont("Caveat", 14); c.setFillColor(colors.white)
c.drawString(MARGIN_L + 4, y + 3, age)
y -= LINE_GAP
for p in points:
if y < MARGIN_BOT + 20:
c.showPage()
draw_ruled_paper(c)
y = MARGIN_TOP - 20
bold = p.startswith("Play type")
sym = "▸" if bold else "·"
sc = col if bold else DARK
c.setFont("Caveat", 13 if not bold else 14)
c.setFillColor(col if bold else colors.HexColor("#555555"))
c.drawString(MARGIN_L + 10, y, sym)
c.setFillColor(col if bold else DARK)
c.drawString(MARGIN_L + 22, y, p)
y -= LINE_GAP - 2
y -= 6
draw_page_number(c, 2, 5)
c.showPage()
def page3(c):
draw_ruled_paper(c)
y = MARGIN_TOP - 15
c.setFont("Caveat", 22); c.setFillColor(BLUE)
c.drawString(MARGIN_L, y, "CLASSIFICATION OF PLAY — Part 1")
y -= 8
c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
y -= LINE_GAP + 2
# ── PARTEN ───────────────────────────────────────────────────────────────
y = section_title(c, MARGIN_L, y, "A. PARTEN'S SOCIAL STAGES (1932)", RED, 18)
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L, y, "Classified by DEGREE OF SOCIAL PARTICIPATION → 6 stages, broadly sequential")
y -= LINE_GAP + 2
parten = [
("1. Unoccupied Play", "0–3 mo", "Random movements; no apparent purpose; no toy/person engagement"),
("2. Solitary Play", "0–2 yr", "Plays completely alone; no interest in others ✓ Normal & healthy"),
("3. Onlooker Play", "~2 yr", "Watches others play but doesn't join → observational learning"),
("4. Parallel Play", "2–2.5 yr","Plays BESIDE others with similar toys; NO interaction; no shared goal"),
("5. Associative Play", "3–4 yr", "Interacts; shares toys/space; common theme BUT no organised goal"),
("6. Cooperative Play", "4+ yr", "Organised group; common goal; defined roles, rules, turn-taking\n Requires: empathy, negotiation, inhibitory control"),
]
stage_colors = [colors.HexColor("#888888"), colors.HexColor("#3377cc"),
colors.HexColor("#33aa77"), colors.HexColor("#cc7733"),
colors.HexColor("#aa33aa"), RED]
for i, (stage, age, desc) in enumerate(parten):
sc = stage_colors[i]
# Stage pill
sw = c.stringWidth(stage, "Caveat", 14) + 14
c.setFillColor(sc); c.roundRect(MARGIN_L, y - 3, sw, 19, 7, fill=1, stroke=0)
c.setFont("Caveat", 14); c.setFillColor(colors.white)
c.drawString(MARGIN_L + 7, y + 3, stage)
# Age badge
aw = c.stringWidth(age, "Caveat", 12) + 10
c.setFillColor(colors.HexColor("#f0f0f0")); c.setStrokeColor(sc); c.setLineWidth(1)
c.roundRect(MARGIN_L + sw + 6, y - 2, aw, 17, 5, fill=1, stroke=1)
c.setFont("Caveat", 12); c.setFillColor(sc)
c.drawString(MARGIN_L + sw + 11, y + 2, age)
y -= LINE_GAP
desc_lines = desc.split("\n")
for dl in desc_lines:
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L + 16, y, dl)
y -= LINE_GAP - 2
y -= 3
# Clinical note
star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
"⚠ Clinical: Regression to earlier stages (e.g. sustained solitary play in a 4-yr-old)",
" is a significant developmental FLAG → assess for ASD, anxiety, social disorder"
], size=13, bg=colors.HexColor("#fff0f0"), border=RED)
y -= LINE_GAP * 2 + 14
divider(c, y); y -= LINE_GAP
# ── PIAGET ───────────────────────────────────────────────────────────────
y = section_title(c, MARGIN_L, y, "B. PIAGET'S COGNITIVE STAGES OF PLAY", GREEN, 18)
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L, y, "Play reflects how children PROCESS & ASSIMILATE the world")
y -= LINE_GAP + 2
piaget = [
("Stage 1: Practice (Sensorimotor) Play",
"Birth – 2 yrs | Sensorimotor Stage",
["Repetition of motor actions for PLEASURE",
"Examples: banging blocks, splashing water, rolling a ball",
"Purpose: consolidating sensorimotor schemas",
"Key feature: pure ASSIMILATION → child repeats what is known"],
colors.HexColor("#3377cc")),
("Stage 2: Symbolic (Pretend) Play",
"2 – 7 yrs | Preoperational Stage",
["Use of SYMBOLS → one thing represents another",
"Examples: stick = sword; box = spaceship; doll = real baby",
"Piaget: \"symbols express what language alone cannot formulate\"",
"Features: deferred imitation, make-believe, role-playing",
"Purpose: development of semiotic function"],
GREEN),
("Stage 3: Games with Rules",
"7+ yrs | Concrete Operational Stage",
["Structured games governed by AGREED rules",
"Examples: chess, cricket, board games, team sports",
"Child not only follows rules but CREATES & DEFENDS them",
"Purpose: social coordination, logical reasoning, moral development"],
RED),
]
for stage_name, subtitle, points, sc in piaget:
if y < MARGIN_BOT + 80:
break
sw = c.stringWidth(stage_name, "Caveat", 15) + 16
c.setFillColor(sc); c.roundRect(MARGIN_L - 4, y - 4, sw, 22, 8, fill=1, stroke=0)
c.setFont("Caveat", 15); c.setFillColor(colors.white)
c.drawString(MARGIN_L + 4, y + 4, stage_name)
y -= LINE_GAP + 2
c.setFont("Caveat", 12); c.setFillColor(sc)
c.drawString(MARGIN_L + 10, y, subtitle)
y -= LINE_GAP
for p in points:
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L + 14, y, "→ " + p)
y -= LINE_GAP - 2
y -= 6
draw_page_number(c, 3, 5)
c.showPage()
def page4(c):
draw_ruled_paper(c)
y = MARGIN_TOP - 15
c.setFont("Caveat", 22); c.setFillColor(BLUE)
c.drawString(MARGIN_L, y, "CLASSIFICATION — Part 2 & RED FLAGS")
y -= 8
c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
y -= LINE_GAP + 2
# ── SMILANSKY ─────────────────────────────────────────────────────────────
y = section_title(c, MARGIN_L, y, "C. SMILANSKY'S CLASSIFICATION (1968)", colors.HexColor("#8b00aa"), 18)
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L, y, "Most PRACTICALLY USEFUL for classroom & clinic settings → 4 categories")
y -= LINE_GAP + 2
smil = [
("1. Functional Play", "0–2 yrs",
"Simple repetitive muscle actions ± objects",
"Running, jumping, banging, rolling a ball",
colors.HexColor("#3377cc")),
("2. Constructive Play", "2–6 yrs",
"Using materials to CREATE or BUILD something",
"Blocks, sand castles, drawing, puzzles ← most common in preschool (~50%!)",
GREEN),
("3. Dramatic Play", "2–7 yrs",
"Role-playing; acting out real or imagined scenarios",
"Playing house/doctor/teacher | Sociodramatic = 2+ children together",
RED),
("4. Games with Rules", "6+ yrs",
"Activities with pre-established rules accepted by all",
"Cards, hide-and-seek, organised sports",
colors.HexColor("#8b00aa")),
]
for name, age, desc, example, sc in smil:
sw = c.stringWidth(name, "Caveat", 14) + 14
c.setFillColor(sc); c.roundRect(MARGIN_L, y - 3, sw, 19, 7, fill=1, stroke=0)
c.setFont("Caveat", 14); c.setFillColor(colors.white)
c.drawString(MARGIN_L + 7, y + 3, name)
aw = c.stringWidth(age, "Caveat", 12) + 10
c.setFillColor(colors.HexColor("#f0f0f0")); c.setStrokeColor(sc); c.setLineWidth(1)
c.roundRect(MARGIN_L + sw + 6, y - 2, aw, 17, 5, fill=1, stroke=1)
c.setFont("Caveat", 12); c.setFillColor(sc)
c.drawString(MARGIN_L + sw + 11, y + 2, age)
y -= LINE_GAP
c.setFont("Caveat", 13); c.setFillColor(DARK); c.drawString(MARGIN_L + 14, y, desc)
y -= LINE_GAP - 2
c.setFont("Caveat", 12); c.setFillColor(colors.HexColor("#555555")); c.drawString(MARGIN_L + 14, y, "eg: " + example)
y -= LINE_GAP + 2
# Comparison mini-table
y -= 4
divider(c, y); y -= LINE_GAP
y = section_title(c, MARGIN_L, y, "COMPARISON OF 3 FRAMEWORKS", BLUE, 17)
headers = ["Framework", "Focus", "Stages", "Best used for"]
rows = [
["Parten (1932)", "Social complexity", "6", "Social skill assessment"],
["Piaget (1962)", "Cognitive level", "3", "Developmental evaluation"],
["Smilansky (1968)", "Functional category", "4", "Clinic / classroom practice"],
]
col_x = [MARGIN_L, MARGIN_L + 110, MARGIN_L + 240, MARGIN_L + 290]
col_w = [108, 128, 48, 215]
# Header row
for i, h in enumerate(headers):
c.setFillColor(BLUE)
c.rect(col_x[i], y - 4, col_w[i], 19, fill=1, stroke=0)
c.setFont("Caveat", 12); c.setFillColor(colors.white)
c.drawString(col_x[i] + 4, y + 2, h)
y -= LINE_GAP + 2
row_colors = [colors.HexColor("#eef4ff"), colors.HexColor("#efffef"), colors.HexColor("#fff4ee")]
for ri, row in enumerate(rows):
for i, cell in enumerate(row):
c.setFillColor(row_colors[ri]); c.setStrokeColor(colors.HexColor("#aaaaaa"))
c.rect(col_x[i], y - 4, col_w[i], 18, fill=1, stroke=1)
c.setFont("Caveat", 11); c.setFillColor(DARK)
c.drawString(col_x[i] + 4, y + 1, cell)
y -= LINE_GAP + 1
c.setFont("Caveat", 13); c.setFillColor(GREEN)
c.drawString(MARGIN_L, y - 2, "★ These 3 frameworks are COMPLEMENTARY lenses — use all 3 in assessment!")
y -= LINE_GAP + 10
divider(c, y); y -= LINE_GAP
# ── RED FLAGS ─────────────────────────────────────────────────────────────
y = section_title(c, MARGIN_L, y, "RED FLAGS IN PLAY DEVELOPMENT ⚠", RED, 18)
flags = [
("12 months", "No functional object use; no gesture; no joint attention"),
("18 months", "No pretend play; no symbolic object use; < 10 words"),
("24 months", "No symbolic play; stuck in solitary play; no 2-word phrases"),
("36 months", "No dramatic play; no peer engagement of any kind"),
("4–5 years", "Cannot engage in cooperative play; aggressive disruption"),
("Any age", "Repetitive/stereotyped play with NO variation → ASD flag"),
("Any age", "Regression to earlier play stages after a stressor"),
("Any age", "Sexualized/aggressive scripted play child can't shift from → trauma screen"),
]
for age_f, flag in flags:
aw = c.stringWidth(age_f, "Caveat", 12) + 10
c.setFillColor(RED); c.roundRect(MARGIN_L, y - 2, aw, 17, 5, fill=1, stroke=0)
c.setFont("Caveat", 12); c.setFillColor(colors.white); c.drawString(MARGIN_L + 5, y + 2, age_f)
c.setFont("Caveat", 13); c.setFillColor(DARK); c.drawString(MARGIN_L + aw + 8, y + 2, flag)
y -= LINE_GAP
# ASD specific
y -= 4
star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
"ASD Red Flags in Play:",
" ✗ Absent/minimal pretend or symbolic play",
" ✗ No interest in interactive/shared play",
" ✗ Repetitive stereotyped object use (spinning, lining up)",
" ✗ No imitation; no sociodramatic play by age 3"
], size=13, bg=colors.HexColor("#fff0f0"), border=RED)
draw_page_number(c, 4, 5)
c.showPage()
def page5(c):
draw_ruled_paper(c)
y = MARGIN_TOP - 15
c.setFont("Caveat", 22); c.setFillColor(BLUE)
c.drawString(MARGIN_L, y, "ASSESSMENT | INTERVENTION | KEY MESSAGES")
y -= 8
c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
y -= LINE_GAP + 2
# Assessment
y = section_title(c, MARGIN_L, y, "PLAY ASSESSMENT", BLUE, 18)
c.setFont("Caveat", 14); c.setFillColor(GREEN)
c.drawString(MARGIN_L, y, "3 Approaches:")
y -= LINE_GAP
approaches = [
("1. Clinical Observation",
["Observe: cognitive (problem-solving, symbolic), social-emotional (eye contact, affect),",
" sensorimotor (coordination, tool use)",
"\"During imaginative play, observe: motor, speech/language, attention,",
" capacity for complex thought\" — Kaplan & Sadock",
"Tip: observe in CHILD-LED and THERAPIST-DIRECTED conditions"]),
("2. Parent/Caregiver Interview",
["What does child enjoy? Alone or with others?",
"Any pretend play? Describe scenarios?",
"Preferred objects? Repetitive patterns?",
"Recent change in play? (regression is significant)"]),
("3. Standardised Play Assessments",
[]),
]
for name, pts in approaches:
c.setFillColor(BLUE); c.setFont("Caveat", 15)
c.drawString(MARGIN_L + 6, y, name)
tw = c.stringWidth(name, "Caveat", 15)
c.setStrokeColor(BLUE); c.setLineWidth(1); c.line(MARGIN_L + 6, y-2, MARGIN_L + 6 + tw, y-2)
y -= LINE_GAP
for p in pts:
c.setFont("Caveat", 12); c.setFillColor(DARK)
c.drawString(MARGIN_L + 14, y, "→ " + p)
y -= LINE_GAP - 3
y -= 4
# Assessment tools mini-table
tools = [
("Test of Playfulness (ToP)", "6mo–18yr", "Bundy's 3 qualities: motivation, control, freedom", "OT"),
("Knox Preschool Play Scale", "0–6yr", "Space, material, imitation, participation", "OT"),
("Symbolic Play Test", "1–3yr", "Symbolic play level; non-verbal cognition", "SLP/OT"),
("Westby Play Scale", "9mo–5yr", "Sequential symbolic play development", "SLP/OT"),
("ChIPPA", "3–7yr", "Elaborateness & spontaneity of pretend play", "OT"),
("TPBA", "0–6yr", "Multi-domain assessment through play — TEAM tool", "All"),
]
col_x2 = [MARGIN_L, MARGIN_L + 148, MARGIN_L + 198, MARGIN_L + 420]
col_w2 = [146, 48, 220, 38]
hds2 = ["Tool", "Age", "Measures", "By"]
for i, h in enumerate(hds2):
c.setFillColor(BLUE); c.rect(col_x2[i], y - 4, col_w2[i], 17, fill=1, stroke=0)
c.setFont("Caveat", 11); c.setFillColor(colors.white); c.drawString(col_x2[i]+3, y+1, h)
y -= LINE_GAP
for ri, (t, ag, m, by) in enumerate(tools):
bg_c = colors.HexColor("#eef4ff") if ri % 2 == 0 else colors.HexColor("#f8f8f8")
for i, cell in enumerate([t, ag, m, by]):
c.setFillColor(bg_c); c.setStrokeColor(colors.HexColor("#aaaaaa"))
c.rect(col_x2[i], y-3, col_w2[i], 16, fill=1, stroke=1)
tc = RED if by == "All" else DARK
c.setFont("Caveat", 10); c.setFillColor(tc); c.drawString(col_x2[i]+3, y+1, cell)
y -= LINE_GAP - 2
y -= 8
divider(c, y); y -= LINE_GAP
# Play as Intervention
y = section_title(c, MARGIN_L, y, "PLAY AS INTERVENTION — Team Roles", GREEN, 17)
team_roles = [
("OT", BLUE, "Play = MEANS + END | Sensory integration, DIR/Floortime, CO-OP, Social Thinking"),
("PT", GREEN, "Play-based motor therapy | Obstacle courses, ball games | Child doesn't know it's therapy!"),
("SLP", RED, "Natural context for language | Symbolic play level ≈ language level | SCERTS, Hanen"),
("Psychology", colors.HexColor("#8b00aa"), "Play therapy (Axline) | Trauma-focused | Child expresses what words cannot"),
("Special Ed", colors.HexColor("#b35900"), "Peer-mediated play | Social skill groups | Play-based curriculum"),
]
for role, sc, desc in team_roles:
rw = c.stringWidth(role, "Caveat", 14) + 14
c.setFillColor(sc); c.roundRect(MARGIN_L, y-3, rw, 19, 7, fill=1, stroke=0)
c.setFont("Caveat", 14); c.setFillColor(colors.white); c.drawString(MARGIN_L+7, y+3, role)
c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(MARGIN_L + rw + 10, y + 3, desc)
y -= LINE_GAP + 2
y -= 8
# Key messages box
star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
"★ KEY TAKE-HOME MESSAGES",
"1. Play = PRIMARY OCCUPATION of childhood — not optional",
"2. Play reflects ALL domains of development simultaneously",
"3. Parten + Piaget + Smilansky = COMPLEMENTARY lenses (use all 3)",
"4. Symbolic play = most SENSITIVE early marker of development",
"5. Absent pretend play by 18 months = RED FLAG for ASD",
"6. A child who cannot play = clinical priority for all disciplines",
"7. Ideal: TPBA — observe play as a TEAM, plan as a TEAM",
], size=13, bg=colors.HexColor("#f0fff0"), border=GREEN)
# Footer quote
y -= LINE_GAP * 9 + 6
c.setFont("Caveat", 14); c.setFillColor(colors.HexColor("#555555"))
c.drawCentredString(W/2, y, "\"Play is the work of childhood.\" — Jean Piaget")
draw_page_number(c, 5, 5)
c.showPage()
# ── MAIN ──────────────────────────────────────────────────────────────────────
os.makedirs("/tmp/workspace", exist_ok=True)
c = canvas.Canvas(OUTPUT, pagesize=A4)
c.setTitle("Play: The Occupation of Childhood — Handwritten Notes")
c.setAuthor("OT Seminar — Interdisciplinary Team")
page1(c)
page2(c)
page3(c)
page4(c)
page5(c)
c.save()
print("PDF saved:", OUTPUT)
import os
print("File size:", os.path.getsize(OUTPUT), "bytes")
cd /tmp/workspace && python3 play_notes.py 2>&1
Play Handwritten Notes
PDF Document · PDF
| Page | Content |
|---|---|
| Page 1 | Title, Definition (Bundy's 3 Qualities), Characteristics, Why Play Matters (mind map), UN CRC note |
| Page 2 | Play Development - all 9 age groups (Birth to Adolescence) with colour-coded age pills |
| Page 3 | Parten's 6 Social Stages + Piaget's 3 Cognitive Stages - with clinical notes |
| Page 4 | Smilansky's 4 Categories, Comparison table of all 3 frameworks, Red Flags (including ASD flags) |
| Page 5 | Assessment tools table, Team roles (OT/PT/SLP/Psych/Special Ed), Key Take-home Messages, Piaget quote |
Generate a quick reference 1-page visual cheat sheet on play classifications
~/play_cheatsheet.py
"""
1-page visual cheat sheet: Play Classifications
Parten | Piaget | Smilansky + Comparison + Key Clinical Tips
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import math, os
pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))
OUTPUT = "/tmp/workspace/Play_Classification_Cheatsheet.pdf"
W, H = A4 # landscape would be wider but let's do A4 landscape
W, H = 841.89, 595.27 # A4 landscape
MARGIN = 18
BLUE = colors.HexColor("#1a3a8f")
RED = colors.HexColor("#c0392b")
GREEN = colors.HexColor("#1a7a3a")
PURPLE = colors.HexColor("#6a0dad")
ORANGE = colors.HexColor("#c55a00")
TEAL = colors.HexColor("#007070")
DARK = colors.HexColor("#1c1c2e")
BG = colors.HexColor("#f8f9ff")
YELLOW = colors.HexColor("#f0c800")
def cf(size): return ("Caveat", size)
c = canvas.Canvas(OUTPUT, pagesize=(W, H))
c.setTitle("Play Classifications — Quick Reference Cheat Sheet")
# ── Background ────────────────────────────────────────────────────────────────
c.setFillColor(BG)
c.rect(0, 0, W, H, fill=1, stroke=0)
# subtle grid lines
c.setStrokeColor(colors.HexColor("#dde4f5"))
c.setLineWidth(0.4)
for yy in range(0, int(H), 20):
c.line(0, yy, W, yy)
# ── Header bar ────────────────────────────────────────────────────────────────
c.setFillColor(BLUE)
c.rect(0, H - 42, W, 42, fill=1, stroke=0)
c.setFont("Caveat", 26)
c.setFillColor(colors.white)
c.drawCentredString(W/2, H - 28, "PLAY CLASSIFICATIONS — Quick Reference Cheat Sheet")
c.setFont("Caveat", 13)
c.setFillColor(colors.HexColor("#aac8ff"))
c.drawCentredString(W/2, H - 40, "Parten (Social) | Piaget (Cognitive) | Smilansky (Functional) OT Seminar · Paediatrics")
# ── helper fns ────────────────────────────────────────────────────────────────
def pill(c, x, y, txt, bg, fg=colors.white, fs=12):
tw = c.stringWidth(txt, "Caveat", fs) + 12
c.setFillColor(bg); c.roundRect(x, y - 3, tw, 18, 6, fill=1, stroke=0)
c.setFont("Caveat", fs); c.setFillColor(fg); c.drawString(x + 6, y + 2, txt)
return tw
def col_header(c, x, y, w, title, sub, bg):
c.setFillColor(bg)
c.roundRect(x, y - 28, w, 32, 8, fill=1, stroke=0)
c.setFont("Caveat", 17); c.setFillColor(colors.white)
c.drawCentredString(x + w/2, y - 10, title)
c.setFont("Caveat", 11); c.setFillColor(colors.HexColor("#ddeeff"))
c.drawCentredString(x + w/2, y - 23, sub)
def stage_row(c, x, y, w, num, name, age, desc, numcol, namecol, descsize=11):
# number circle
c.setFillColor(numcol); c.circle(x + 12, y + 5, 10, fill=1, stroke=0)
c.setFont("Caveat", 13); c.setFillColor(colors.white); c.drawCentredString(x + 12, y + 1, num)
# name
c.setFont("Caveat", 13); c.setFillColor(namecol); c.drawString(x + 26, y + 6, name)
# age badge
aw = c.stringWidth(age, "Caveat", 10) + 8
c.setFillColor(colors.HexColor("#eef2ff")); c.setStrokeColor(namecol); c.setLineWidth(0.7)
c.roundRect(x + 26, y - 5, aw, 13, 4, fill=1, stroke=1)
c.setFont("Caveat", 10); c.setFillColor(namecol); c.drawString(x + 30, y - 2, age)
# desc
c.setFont("Caveat", descsize); c.setFillColor(DARK)
c.drawString(x + 26 + aw + 5, y + 1, desc)
def draw_divider(c, x, y, h, col):
c.setStrokeColor(col); c.setLineWidth(1.5)
c.setDash(4, 3)
c.line(x, y, x, y - h)
c.setDash()
# ── LAYOUT: 3 columns + comparison strip + tips ────────────────────────────────
top_y = H - 52
col_h = 330
bot_y = top_y - col_h
COL1_X = MARGIN
COL2_X = MARGIN + 267
COL3_X = MARGIN + 534
COL_W = 257
# ── COLUMN 1: PARTEN ──────────────────────────────────────────────────────────
col_header(c, COL1_X, top_y, COL_W, "PARTEN'S SOCIAL STAGES", "1932 | Social Participation", RED)
parten_stages = [
("1", "Unoccupied", "Birth–3m", "Random movements; no purpose or engagement", colors.HexColor("#999999")),
("2", "Solitary", "0–2 yr", "Plays alone; unaware/uninterested in others", colors.HexColor("#3399cc")),
("3", "Onlooker", "~2 yr", "Watches others; doesn't join; observational learning", colors.HexColor("#33aaaa")),
("4", "Parallel", "2–2.5yr", "Beside others; same toys; NO interaction", colors.HexColor("#33aa55")),
("5", "Associative", "3–4 yr", "Shares toys/space; common theme; no goal/role", colors.HexColor("#cc7733")),
("6", "Cooperative", "4+ yr", "Organised; goal; roles; rules; turn-taking", RED),
]
y = top_y - 38
for num, name, age, desc, nc in parten_stages:
# alternating row bg
ri = int(num) - 1
bg_row = colors.HexColor("#fff0f0") if ri % 2 == 0 else colors.HexColor("#ffffff")
c.setFillColor(bg_row)
c.roundRect(COL1_X + 2, y - 8, COL_W - 4, 26, 4, fill=1, stroke=0)
stage_row(c, COL1_X + 6, y, COL_W - 8, num, name, age, desc, nc, nc, descsize=10)
y -= 30
# Arrow showing progression
c.setStrokeColor(RED); c.setLineWidth(1.5)
arrow_x = COL1_X + COL_W - 14
c.line(arrow_x, top_y - 38, arrow_x, y + 30)
c.line(arrow_x, y + 30, arrow_x - 5, y + 38)
c.line(arrow_x, y + 30, arrow_x + 5, y + 38)
c.setFont("Caveat", 9); c.setFillColor(RED)
c.saveState(); c.translate(arrow_x + 8, (top_y - 38 + y + 30)/2)
c.rotate(270); c.drawCentredString(0, 0, "Least → Most Social"); c.restoreState()
# note
c.setFont("Caveat", 10); c.setFillColor(RED)
c.drawString(COL1_X + 4, y - 4, "⚠ Regression = clinical flag")
# ── COLUMN 2: PIAGET ──────────────────────────────────────────────────────────
col_header(c, COL2_X, top_y, COL_W, "PIAGET'S COGNITIVE STAGES", "1962 | Cognitive Development", BLUE)
piaget_stages = [
("1", "Practice Play", "0–2 yr",
["Sensorimotor stage",
"Repetitive motor actions for pleasure",
"Banging, rolling, splashing",
"Pure ASSIMILATION",
"Consolidates sensorimotor schemas"],
colors.HexColor("#3377cc"), colors.HexColor("#eef4ff")),
("2", "Symbolic Play", "2–7 yr",
["Preoperational stage",
"One thing represents another",
"Stick = sword; box = spaceship",
"Semiotic function emerges",
"Deferred imitation, make-believe"],
BLUE, colors.HexColor("#e0eaff")),
("3", "Games w/ Rules", "7+ yr",
["Concrete Operational stage",
"Structured; agreed rules",
"Chess, cricket, team sports",
"Child creates & defends rules",
"Logical reasoning + moral dev."],
colors.HexColor("#1a5fa0"), colors.HexColor("#d0e0ff")),
]
y2 = top_y - 38
for num, name, age, pts, nc, bgc in piaget_stages:
bh = len(pts) * 15 + 26
c.setFillColor(bgc); c.roundRect(COL2_X + 2, y2 - bh + 18, COL_W - 4, bh, 6, fill=1, stroke=0)
# header row
c.setFillColor(nc); c.circle(COL2_X + 14, y2 + 5, 11, fill=1, stroke=0)
c.setFont("Caveat", 13); c.setFillColor(colors.white); c.drawCentredString(COL2_X + 14, y2 + 1, num)
c.setFont("Caveat", 14); c.setFillColor(nc); c.drawString(COL2_X + 30, y2 + 6, name)
aw = c.stringWidth(age, "Caveat", 11) + 8
c.setFillColor(colors.white); c.setStrokeColor(nc); c.setLineWidth(0.8)
c.roundRect(COL2_X + COL_W - aw - 8, y2 - 2, aw, 15, 4, fill=1, stroke=1)
c.setFont("Caveat", 11); c.setFillColor(nc); c.drawString(COL2_X + COL_W - aw - 4, y2 + 1, age)
y2 -= 20
for pt in pts:
c.setFont("Caveat", 10); c.setFillColor(DARK)
c.drawString(COL2_X + 16, y2, "· " + pt)
y2 -= 14
y2 -= 8
c.setFont("Caveat", 10); c.setFillColor(BLUE)
c.drawString(COL2_X + 4, y2 - 4, "⚠ Absent symbolic play by 18mo = ASD red flag")
# ── COLUMN 3: SMILANSKY ───────────────────────────────────────────────────────
col_header(c, COL3_X, top_y, COL_W, "SMILANSKY'S FUNCTIONAL", "1968 | Most Used Clinically", GREEN)
smil_stages = [
("1", "Functional", "0–2 yr",
["Simple repetitive actions ± objects",
"Running, banging, rolling",
"Builds sensorimotor skill",
"= Piaget's Practice Play"],
colors.HexColor("#3399aa"), colors.HexColor("#e0f5f5")),
("2", "Constructive", "2–6 yr",
["CREATE/BUILD with materials",
"Blocks, drawing, puzzles, sand",
"~50% of all preschool play",
"Spatial reasoning + persistence"],
GREEN, colors.HexColor("#e0ffe0")),
("3", "Dramatic", "2–7 yr",
["Role-play; act out scenarios",
"Playing house / doctor / teacher",
"Sociodramatic = 2+ children",
"ToM, language, self-regulation"],
RED, colors.HexColor("#fff0e0")),
("4", "Games w/ Rules","6+ yr",
["Pre-established; agreed rules",
"Cards, sports, board games",
"= Piaget's Games with Rules",
"Social coordination + inhibition"],
PURPLE, colors.HexColor("#f5eeff")),
]
y3 = top_y - 38
for num, name, age, pts, nc, bgc in smil_stages:
bh = len(pts) * 14 + 24
c.setFillColor(bgc); c.roundRect(COL3_X + 2, y3 - bh + 18, COL_W - 4, bh, 6, fill=1, stroke=0)
c.setFillColor(nc); c.circle(COL3_X + 14, y3 + 5, 11, fill=1, stroke=0)
c.setFont("Caveat", 13); c.setFillColor(colors.white); c.drawCentredString(COL3_X + 14, y3 + 1, num)
c.setFont("Caveat", 14); c.setFillColor(nc); c.drawString(COL3_X + 30, y3 + 6, name)
aw = c.stringWidth(age, "Caveat", 11) + 8
c.setFillColor(colors.white); c.setStrokeColor(nc); c.setLineWidth(0.8)
c.roundRect(COL3_X + COL_W - aw - 8, y3 - 2, aw, 15, 4, fill=1, stroke=1)
c.setFont("Caveat", 11); c.setFillColor(nc); c.drawString(COL3_X + COL_W - aw - 4, y3 + 1, age)
y3 -= 20
for pt in pts:
c.setFont("Caveat", 10); c.setFillColor(DARK)
c.drawString(COL3_X + 16, y3, "· " + pt)
y3 -= 13
y3 -= 8
c.setFont("Caveat", 10); c.setFillColor(GREEN)
c.drawString(COL3_X + 4, y3 - 4, "★ Constructive = most common in preschool!")
# ── Vertical dividers ─────────────────────────────────────────────────────────
draw_divider(c, COL2_X - 5, top_y + 4, col_h + 10, colors.HexColor("#aaaacc"))
draw_divider(c, COL3_X - 5, top_y + 4, col_h + 10, colors.HexColor("#aaaacc"))
# ── COMPARISON STRIP ─────────────────────────────────────────────────────────
strip_y = bot_y - 14
strip_h = 80
c.setFillColor(colors.HexColor("#1a2a5a"))
c.roundRect(MARGIN, strip_y - strip_h, W - 2*MARGIN, strip_h + 4, 8, fill=1, stroke=0)
c.setFont("Caveat", 14); c.setFillColor(colors.white)
c.drawString(MARGIN + 10, strip_y - 14, "COMPARISON AT A GLANCE")
tw = c.stringWidth("COMPARISON AT A GLANCE", "Caveat", 14)
c.setStrokeColor(YELLOW); c.setLineWidth(1.5); c.line(MARGIN + 10, strip_y - 17, MARGIN + 10 + tw, strip_y - 17)
headers = ["Feature", "Parten (1932)", "Piaget (1962)", "Smilansky (1968)"]
rows_cmp = [
["Focus", "Social participation", "Cognitive stage", "Functional category"],
["# Stages", "6", "3", "4"],
["Key addition","Social complexity ladder","Play ↔ cognition link", "Constructive Play"],
["Best for", "Social skill Ax", "Developmental eval", "Clinic / classroom"],
]
hcols = [130, 170, 170, 170]
hx = [MARGIN + 10, MARGIN + 148, MARGIN + 324, MARGIN + 500]
for i, h in enumerate(headers):
c.setFont("Caveat", 12)
hcol = [YELLOW, colors.HexColor("#ffaaaa"), colors.HexColor("#aaaaff"), colors.HexColor("#aaffaa")]
c.setFillColor(hcol[i])
c.drawString(hx[i], strip_y - 30, h)
for ri, row in enumerate(rows_cmp):
ry = strip_y - 44 - ri * 14
for ci, cell in enumerate(row):
tc = colors.HexColor("#cccccc") if ci == 0 else colors.white
c.setFont("Caveat", 11); c.setFillColor(tc)
c.drawString(hx[ci], ry, cell)
# ── BOTTOM TIPS STRIP ────────────────────────────────────────────────────────
tips_y = strip_y - strip_h - 6
tips_h = 52
c.setFillColor(colors.HexColor("#fff8e0"))
c.setStrokeColor(YELLOW); c.setLineWidth(1.5)
c.roundRect(MARGIN, tips_y - tips_h, W - 2*MARGIN, tips_h + 4, 8, fill=1, stroke=1)
c.setFont("Caveat", 13); c.setFillColor(colors.HexColor("#7a5900"))
c.drawString(MARGIN + 10, tips_y - 12, "★ CLINICAL PEARLS")
tips = [
"Use ALL 3 frameworks together — Parten tells you HOW social, Piaget tells you WHAT cognitive level, Smilansky tells you WHAT TYPE of play",
"Symbolic play level ≈ Language level | Absent pretend play by 18 months = RED FLAG (ASD screen) | Regression in play = psychosocial stress flag",
"Ideal assessment: TPBA (Transdisciplinary Play-Based Assessment) — observe as a team, plan as a team",
]
ty = tips_y - 24
for tip in tips:
c.setFont("Caveat", 10); c.setFillColor(DARK)
c.drawString(MARGIN + 10, ty, "→ " + tip)
ty -= 13
# ── Footer ────────────────────────────────────────────────────────────────────
c.setFont("Caveat", 10); c.setFillColor(colors.HexColor("#888888"))
c.drawCentredString(W/2, 8, "\"Play is the work of childhood.\" — Jean Piaget | OT Seminar · Paediatrics · Interdisciplinary Team")
c.save()
print("Done:", OUTPUT)
print("Size:", os.path.getsize(OUTPUT), "bytes")
cd /tmp/workspace && python3 play_cheatsheet.py 2>&1
Play Classification Cheatsheet
PDF Document · PDF
| Section | Content |
|---|---|
| Header bar | Title + framework names at a glance |
| Column 1 — Parten | All 6 social stages with age badges, colour-coded rows, progression arrow |
| Column 2 — Piaget | 3 cognitive stages with bullet details, cognitive stage label, age badges |
| Column 3 — Smilansky | 4 functional categories with colour-coded cards and clinical notes |
| Comparison strip | Dark panel comparing all 3 frameworks: focus, stages, key addition, best use |
| Clinical Pearls strip | 3 key takeaways: how to use all 3 together, symbolic play = language level, ASD flag, TPBA |
| Footer | Piaget quote |
hey whydidnt you add takata ,piaget, florey and all in that pdf
~/play_cheatsheet_v2.py
"""
COMPREHENSIVE Play Classifications Cheat Sheet - 2 pages A4 landscape
Covers: Parten, Piaget, Smilansky, Takata, Florey, Reilly, Knox, Bundy
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os
pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))
OUTPUT = "/tmp/workspace/Play_Classifications_Complete_Cheatsheet.pdf"
W, H = 841.89, 595.27 # A4 landscape
MARGIN = 16
# Colour palette
BLUE = colors.HexColor("#1a3a8f")
RED = colors.HexColor("#c0392b")
GREEN = colors.HexColor("#1a7a3a")
PURPLE = colors.HexColor("#6a0dad")
ORANGE = colors.HexColor("#c55a00")
TEAL = colors.HexColor("#007070")
DKRED = colors.HexColor("#8b0000")
NAVY = colors.HexColor("#001a5e")
DARK = colors.HexColor("#1c1c2e")
YELLOW = colors.HexColor("#e0a800")
BG1 = colors.HexColor("#f4f6ff")
BG2 = colors.HexColor("#f4fff8")
cv = canvas.Canvas(OUTPUT, pagesize=(W, H))
cv.setTitle("Play Classifications — Complete Quick Reference")
# ─── Helpers ──────────────────────────────────────────────────────────────────
def bg_page(cv, col=BG1):
cv.setFillColor(col)
cv.rect(0, 0, W, H, fill=1, stroke=0)
cv.setStrokeColor(colors.HexColor("#dde4f5"))
cv.setLineWidth(0.35)
for yy in range(0, int(H), 18):
cv.line(0, yy, W, yy)
def header_bar(cv, title, subtitle, pg, total, bg=BLUE):
cv.setFillColor(bg)
cv.rect(0, H - 40, W, 40, fill=1, stroke=0)
cv.setFont("Caveat", 23); cv.setFillColor(colors.white)
cv.drawCentredString(W/2, H - 24, title)
cv.setFont("Caveat", 12); cv.setFillColor(colors.HexColor("#aac8ff"))
cv.drawCentredString(W/2, H - 37, subtitle)
# page badge
cv.setFillColor(colors.HexColor("#ffffff33"))
cv.roundRect(W - 60, H - 36, 48, 24, 6, fill=1, stroke=0)
cv.setFont("Caveat", 12); cv.setFillColor(colors.white)
cv.drawCentredString(W - 36, H - 27, f"Page {pg}/{total}")
def section_card(cv, x, y, w, h, title, year, author_note, bg, header_col):
"""Draw a coloured card with header."""
cv.setFillColor(bg)
cv.roundRect(x, y - h, w, h, 8, fill=1, stroke=0)
# header strip
cv.setFillColor(header_col)
cv.roundRect(x, y - 28, w, 30, 8, fill=1, stroke=0)
cv.rect(x, y - 28, w, 14, fill=1, stroke=0) # square bottom corners
cv.setFont("Caveat", 15); cv.setFillColor(colors.white)
cv.drawString(x + 8, y - 13, title)
cv.setFont("Caveat", 10); cv.setFillColor(colors.HexColor("#ddeeff"))
cv.drawString(x + 8, y - 24, f"{year} | {author_note}")
def pill(cv, x, y, txt, bg, fg=colors.white, fs=11):
tw = cv.stringWidth(txt, "Caveat", fs) + 10
cv.setFillColor(bg); cv.roundRect(x, y - 2, tw, 15, 5, fill=1, stroke=0)
cv.setFont("Caveat", fs); cv.setFillColor(fg)
cv.drawString(x + 5, y + 2, txt)
return tw
def row_item(cv, x, y, num, name, age, desc, nc, small=False):
fs = 10 if small else 11
fs_desc = 9 if small else 10
# number
cv.setFillColor(nc); cv.circle(x + 10, y + 4, 8, fill=1, stroke=0)
cv.setFont("Caveat", 11); cv.setFillColor(colors.white)
cv.drawCentredString(x + 10, y + 1, str(num))
# name
cv.setFont("Caveat", fs); cv.setFillColor(nc)
cv.drawString(x + 22, y + 5, name)
nw = cv.stringWidth(name, "Caveat", fs)
# age tag
aw = cv.stringWidth(age, "Caveat", 9) + 8
cv.setFillColor(colors.HexColor("#eeeeee")); cv.setStrokeColor(nc); cv.setLineWidth(0.6)
cv.roundRect(x + 24 + nw, y - 1, aw, 13, 4, fill=1, stroke=1)
cv.setFont("Caveat", 9); cv.setFillColor(nc)
cv.drawString(x + 27 + nw, y + 2, age)
# desc
cv.setFont("Caveat", fs_desc); cv.setFillColor(DARK)
cv.drawString(x + 22, y - 8, desc)
def dot_list(cv, x, y, items, col=DARK, fs=10, gap=13):
for item in items:
cv.setFont("Caveat", fs); cv.setFillColor(col)
cv.drawString(x, y, "· " + item)
y -= gap
return y
def hdivider(cv, x1, x2, y, col=colors.HexColor("#cccccc")):
cv.setStrokeColor(col); cv.setLineWidth(0.8); cv.setDash(3,3)
cv.line(x1, y, x2, y); cv.setDash()
def vdivider(cv, x, y1, y2, col=colors.HexColor("#bbbbcc")):
cv.setStrokeColor(col); cv.setLineWidth(1.2); cv.setDash(4,3)
cv.line(x, y1, x, y2); cv.setDash()
# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 1 — Parten | Piaget | Smilansky | Takata
# ═══════════════════════════════════════════════════════════════════════════════
bg_page(cv, BG1)
header_bar(cv,
"PLAY CLASSIFICATIONS — Complete Quick Reference (Page 1 of 2)",
"Parten · Piaget · Smilansky · Takata | OT Seminar · Paediatrics",
1, 2, BLUE)
TOP = H - 48
BOT = 68
AVAIL = TOP - BOT
CW = (W - 2*MARGIN - 9) / 4 # 4 columns
C1X = MARGIN
C2X = MARGIN + CW + 3
C3X = MARGIN + 2*(CW + 3)
C4X = MARGIN + 3*(CW + 3)
# ── COL 1: PARTEN ─────────────────────────────────────────────────────────────
section_card(cv, C1X, TOP, CW, AVAIL,
"PARTEN'S SOCIAL STAGES", "1932", "Social Participation",
colors.HexColor("#fff0f0"), RED)
y = TOP - 34
parten = [
(1, "Unoccupied", "0–3m", "Random mvmt; no purpose", colors.HexColor("#999999")),
(2, "Solitary", "0–2yr", "Plays alone; ignores others", colors.HexColor("#3399cc")),
(3, "Onlooker", "~2yr", "Watches; doesn't join", colors.HexColor("#33aaaa")),
(4, "Parallel", "2–2.5yr", "Beside others; NO interaction", colors.HexColor("#33aa55")),
(5, "Associative", "3–4yr", "Shares toys; no goal/roles", ORANGE),
(6, "Cooperative", "4+yr", "Goal + roles + rules + turns", RED),
]
for num, name, age, desc, nc in parten:
row_item(cv, C1X + 4, y, num, name, age, desc, nc, small=True)
y -= 26
y -= 4
cv.setFont("Caveat", 10); cv.setFillColor(RED)
cv.drawString(C1X + 4, y, "Least → Most Social ▲")
y -= 13
cv.setFont("Caveat", 9); cv.setFillColor(DARK)
cv.drawString(C1X + 4, y, "★ All stages coexist; regression = flag")
y -= 12
cv.drawString(C1X + 4, y, "★ Cooperative needs empathy +")
y -= 11
cv.drawString(C1X + 6, y, " negotiation + inhibitory control")
# ── COL 2: PIAGET ─────────────────────────────────────────────────────────────
section_card(cv, C2X, TOP, CW, AVAIL,
"PIAGET'S COGNITIVE STAGES", "1962", "Cognitive Development",
colors.HexColor("#eef4ff"), BLUE)
y2 = TOP - 34
piaget = [
("1", "Practice Play", "0–2yr",
["Sensorimotor stage",
"Repetitive motor actions",
"Banging · rolling · splash",
"Pure ASSIMILATION",
"Consolidates schemas"],
colors.HexColor("#3377cc"), colors.HexColor("#d8e8ff")),
("2", "Symbolic Play", "2–7yr",
["Preoperational stage",
"1 thing represents another",
"Stick=sword; box=spaceship",
"Semiotic function emerges",
"Deferred imitation / pretend"],
BLUE, colors.HexColor("#c8daff")),
("3", "Games w/ Rules", "7+yr",
["Concrete Operational",
"Agreed structured rules",
"Chess · cricket · sport",
"Child creates & defends rules",
"Logical reasoning + moral dev"],
colors.HexColor("#0a2a80"), colors.HexColor("#b8caff")),
]
for num, name, age, pts, nc, bgc in piaget:
bh = len(pts)*12 + 22
cv.setFillColor(bgc); cv.roundRect(C2X+3, y2 - bh + 16, CW-6, bh, 5, fill=1, stroke=0)
cv.setFillColor(nc); cv.circle(C2X+12, y2+4, 9, fill=1, stroke=0)
cv.setFont("Caveat", 11); cv.setFillColor(colors.white); cv.drawCentredString(C2X+12, y2+1, num)
cv.setFont("Caveat", 13); cv.setFillColor(nc); cv.drawString(C2X+25, y2+5, name)
nw = cv.stringWidth(name,"Caveat",13)
aw = cv.stringWidth(age,"Caveat",10)+8
cv.setFillColor(colors.white); cv.setStrokeColor(nc); cv.setLineWidth(0.7)
cv.roundRect(C2X+CW-aw-6, y2-1, aw, 13, 4, fill=1, stroke=1)
cv.setFont("Caveat",10); cv.setFillColor(nc); cv.drawString(C2X+CW-aw-2, y2+2, age)
y2 -= 18
for pt in pts:
cv.setFont("Caveat",9); cv.setFillColor(DARK)
cv.drawString(C2X+14, y2, "· "+pt); y2 -= 12
y2 -= 6
cv.setFont("Caveat",9); cv.setFillColor(BLUE)
cv.drawString(C2X+4, y2-4, "⚠ Absent symbolic play by 18mo = ASD flag")
# ── COL 3: SMILANSKY ──────────────────────────────────────────────────────────
section_card(cv, C3X, TOP, CW, AVAIL,
"SMILANSKY'S FUNCTIONAL", "1968", "Most Used Clinically",
colors.HexColor("#f0fff0"), GREEN)
y3 = TOP - 34
smil = [
("1","Functional", "0–2yr",
["Repetitive actions ± objects",
"Running, banging, rolling",
"Builds sensorimotor skill",
"= Piaget Practice Play"],
TEAL, colors.HexColor("#d8f5f5")),
("2","Constructive", "2–6yr",
["CREATE or BUILD w/ materials",
"Blocks, drawing, puzzles, sand",
"~50% of all preschool play ★",
"Spatial reasoning + persistence"],
GREEN, colors.HexColor("#c8f0c8")),
("3","Dramatic", "2–7yr",
["Role-play; act out scenarios",
"House/doctor/teacher",
"Sociodramatic = 2+ children",
"ToM, language, self-reg"],
RED, colors.HexColor("#ffe8d8")),
("4","Games w/ Rules","6+yr",
["Pre-established agreed rules",
"Cards, sport, board games",
"= Piaget Games with Rules",
"Inhibition + coordination"],
PURPLE, colors.HexColor("#f0e0ff")),
]
for num, name, age, pts, nc, bgc in smil:
bh = len(pts)*12+20
cv.setFillColor(bgc); cv.roundRect(C3X+3,y3-bh+16,CW-6,bh,5,fill=1,stroke=0)
cv.setFillColor(nc); cv.circle(C3X+12,y3+4,9,fill=1,stroke=0)
cv.setFont("Caveat",11); cv.setFillColor(colors.white); cv.drawCentredString(C3X+12,y3+1,num)
cv.setFont("Caveat",13); cv.setFillColor(nc); cv.drawString(C3X+25,y3+5,name)
nw2 = cv.stringWidth(name,"Caveat",13)
aw2 = cv.stringWidth(age,"Caveat",10)+8
cv.setFillColor(colors.white); cv.setStrokeColor(nc); cv.setLineWidth(0.7)
cv.roundRect(C3X+CW-aw2-6,y3-1,aw2,13,4,fill=1,stroke=1)
cv.setFont("Caveat",10); cv.setFillColor(nc); cv.drawString(C3X+CW-aw2-2,y3+2,age)
y3 -= 18
for pt in pts:
cv.setFont("Caveat",9); cv.setFillColor(DARK)
cv.drawString(C3X+14,y3,"· "+pt); y3-=12
y3 -= 6
cv.setFont("Caveat",9); cv.setFillColor(GREEN)
cv.drawString(C3X+4,y3-4,"★ Constructive = most common in preschool!")
# ── COL 4: TAKATA ─────────────────────────────────────────────────────────────
section_card(cv, C4X, TOP, CW, AVAIL,
"TAKATA'S PLAY EPOCHS", "1974", "OT Play History Model",
colors.HexColor("#fffbe0"), ORANGE)
y4 = TOP - 34
takata_epochs = [
(1, "Sensorimotor", "0–2yr",
["Sensory + motor exploration",
"Pleasure from body movement",
"Object manipulation begins",
"No rules; self-focused"]),
(2, "Symbolic/Simple", "2–4yr",
["Imitation of adult roles",
"Make-believe + pretend",
"Begins cooperating briefly",
"Fantasy predominates"]),
(3, "Dramatic/Complex","4–7yr",
["Elaborate role-play",
"Peers essential in play",
"Constructive creation",
"Rules understood simply"]),
(4, "Games/Skills", "7–12yr",
["Rule-governed games",
"Competition + team play",
"Skill building (sports/crafts)",
"Peer approval important"]),
(5, "Recreational", "12+yr",
["Leisure & hobbies",
"Identity through play",
"Social & creative expression",
"Play → adult recreation"]),
]
for num, name, age, pts in takata_epochs:
bh = len(pts)*11+20
cv.setFillColor(colors.HexColor("#fff8e0"))
cv.roundRect(C4X+3,y4-bh+16,CW-6,bh,5,fill=1,stroke=0)
cv.setFillColor(ORANGE); cv.circle(C4X+12,y4+4,9,fill=1,stroke=0)
cv.setFont("Caveat",11); cv.setFillColor(colors.white); cv.drawCentredString(C4X+12,y4+1,str(num))
cv.setFont("Caveat",12); cv.setFillColor(ORANGE); cv.drawString(C4X+25,y4+5,name)
nw3 = cv.stringWidth(name,"Caveat",12)
aw3 = cv.stringWidth(age,"Caveat",9)+8
cv.setFillColor(colors.white); cv.setStrokeColor(ORANGE); cv.setLineWidth(0.7)
cv.roundRect(C4X+CW-aw3-6,y4-1,aw3,13,4,fill=1,stroke=1)
cv.setFont("Caveat",9); cv.setFillColor(ORANGE); cv.drawString(C4X+CW-aw3-2,y4+2,age)
y4 -= 17
for pt in pts:
cv.setFont("Caveat",9); cv.setFillColor(DARK)
cv.drawString(C4X+14,y4,"· "+pt); y4-=11
y4 -= 5
cv.setFont("Caveat",9); cv.setFillColor(ORANGE)
cv.drawString(C4X+4,y4-4,"★ Basis for PLAY HISTORY assessment (OT)")
y4 -= 13
cv.drawString(C4X+4,y4-4,"★ OT interviews caregiver about each epoch")
# ── Vertical dividers ─────────────────────────────────────────────────────────
for dx in [C2X-3, C3X-3, C4X-3]:
vdivider(cv, dx, TOP+2, BOT+40)
# ── BOTTOM COMPARISON BAND ────────────────────────────────────────────────────
band_y = BOT + 36
cv.setFillColor(colors.HexColor("#1a2a5a"))
cv.roundRect(MARGIN, BOT, W-2*MARGIN, band_y - BOT, 8, fill=1, stroke=0)
cv.setFont("Caveat",12); cv.setFillColor(YELLOW)
cv.drawString(MARGIN+10, band_y - 14, "QUICK COMPARE (Page 1):")
cols_lbl = ["Framework","Focus","# Stages","Based on","OT relevance"]
cxs = [MARGIN+160, MARGIN+300, MARGIN+380, MARGIN+480, MARGIN+600]
for i,lbl in enumerate(cols_lbl):
cv.setFont("Caveat",11); cv.setFillColor(colors.HexColor("#aaccff"))
cv.drawString(cxs[i], band_y-14, lbl)
rows_cmp = [
["Parten (1932)","Social participation","6","Observation","Social skills Ax"],
["Piaget (1962)","Cognitive stage","3","Development theory","Cognitive-play link"],
["Smilansky (1968)","Functional type","4","Piaget + education","Clinic/classroom use"],
["Takata (1974)","Play history epochs","5","OT model","Play History interview"],
]
row_cols = [colors.HexColor("#ffcccc"), colors.HexColor("#cce0ff"),
colors.HexColor("#ccffcc"), colors.HexColor("#ffeebb")]
for ri, row in enumerate(rows_cmp):
ry = band_y - 26 - ri*12
cv.setFont("Caveat",10); cv.setFillColor(row_cols[ri])
cv.drawString(MARGIN+12, ry, row[0])
for ci,cell in enumerate(row[1:]):
cv.setFont("Caveat",10); cv.setFillColor(colors.white)
cv.drawString(cxs[ci], ry, cell)
cv.setFont("Caveat",9); cv.setFillColor(colors.HexColor("#888888"))
cv.drawCentredString(W/2, 8, "\"Play is the work of childhood.\" — Jean Piaget | OT Seminar · Paediatrics · Interdisciplinary Team")
cv.showPage()
# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 2 — Florey | Reilly | Knox | Bundy + Master Comparison + Clinical Pearls
# ═══════════════════════════════════════════════════════════════════════════════
bg_page(cv, BG2)
header_bar(cv,
"PLAY CLASSIFICATIONS — Complete Quick Reference (Page 2 of 2)",
"Florey · Reilly · Knox · Bundy | OT-Specific Frameworks",
2, 2, colors.HexColor("#1a6a3a"))
TOP2 = H - 48
BOT2 = 68
AVAIL2= TOP2 - BOT2
# 4 columns same widths
D1X = MARGIN
D2X = MARGIN + CW + 3
D3X = MARGIN + 2*(CW+3)
D4X = MARGIN + 3*(CW+3)
# ── COL 1: FLOREY ─────────────────────────────────────────────────────────────
section_card(cv, D1X, TOP2, CW, AVAIL2,
"FLOREY'S PLAY MODEL", "1971", "OT — Intrinsic Motivation",
colors.HexColor("#e8fff8"), TEAL)
y = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D1X+4,y,"Core Premise:"); y-=13
cv.setFont("Caveat",10); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"Play = intrinsically motivated"); y-=11
cv.drawString(D1X+4,y,"behaviour that is ends-in-itself"); y-=15
cv.setFont("Caveat",12); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"Key Concepts:"); y-=13
concepts_florey = [
("Intrinsic motivation","No external reward needed"),
("Exploratory drive","Child naturally seeks novelty"),
("Effectance motivation","Child seeks to affect environment"),
("Process focus","Enjoyment in the doing, not product"),
("Freedom from external rules","Child sets own agenda"),
("Voluntary participation","Cannot be forced; must be chosen"),
]
for concept, explain in concepts_florey:
cv.setFillColor(colors.HexColor("#c0f0e8"))
cw2 = cv.stringWidth(concept,"Caveat",10)+10
cv.roundRect(D1X+4,y-3,cw2,14,4,fill=1,stroke=0)
cv.setFont("Caveat",10); cv.setFillColor(TEAL); cv.drawString(D1X+8,y+1,concept)
y-=14
cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D1X+10,y,"→ "+explain); y-=13
y-=4
cv.setFont("Caveat",11); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"Clinical Relevance:"); y-=12
items_f = [
"Helps distinguish true play from",
" directed/structured activity",
"If child is not intrinsically driven",
" → it is NOT play",
"Grounds OT's non-directive",
" play therapy approach",
"Florey stressed: play develops",
" competence for adult roles",
]
for item in items_f:
cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D1X+6,y,item); y-=11
y-=4
cv.setFont("Caveat",9); cv.setFillColor(TEAL)
cv.drawString(D1X+4,y,"★ Influenced Bundy's playfulness model")
y-=11
cv.drawString(D1X+4,y,"★ Closely linked to Reilly's OB theory")
# ── COL 2: REILLY ─────────────────────────────────────────────────────────────
section_card(cv, D2X, TOP2, CW, AVAIL2,
"REILLY'S OCCUPATIONAL BEHAVIOUR", "1974", "Play as Occupation",
colors.HexColor("#fff8e8"), ORANGE)
y2 = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D2X+4,y2,"Core Premise:"); y2-=13
cv.setFont("Caveat",10); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"\"Play is the arena in which children"); y2-=11
cv.drawString(D2X+4,y2,"practice skills & roles for adult life\""); y2-=15
cv.setFont("Caveat",12); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"Reilly's Hierarchy of Play:"); y2-=13
reilly_hier = [
("1. Exploratory","Birth–2yr","Sensory/motor; curiosity drive"),
("2. Competency", "2–7yr", "Practice; mastery motivation"),
("3. Achievement","7+yr", "Rules; competition; standards"),
]
for stage, age, desc in reilly_hier:
cv.setFillColor(colors.HexColor("#ffe8c0"))
cv.roundRect(D2X+4,y2-3,CW-10,14,4,fill=1,stroke=0)
cv.setFont("Caveat",11); cv.setFillColor(ORANGE); cv.drawString(D2X+8,y2+2,stage)
sw2 = cv.stringWidth(stage,"Caveat",11)
aw2 = cv.stringWidth(age,"Caveat",9)+6
cv.setFillColor(colors.white); cv.setStrokeColor(ORANGE); cv.setLineWidth(0.6)
cv.roundRect(D2X+10+sw2,y2-1,aw2,12,3,fill=1,stroke=1)
cv.setFont("Caveat",9); cv.setFillColor(ORANGE); cv.drawString(D2X+12+sw2,y2+2,age)
y2-=15
cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D2X+10,y2,"→ "+desc); y2-=13
y2-=4
cv.setFont("Caveat",11); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"Key Contributions:"); y2-=12
reilly_pts = [
"Play = preparation for adult work",
"Play is the child's OCCUPATION",
"3 play motives: curiosity →",
" competency → achievement",
"First OT theorist to frame play",
" as purposeful occupation",
"Foundation of OT's occupation-",
" based practice with children",
"Play develops habits, roles,",
" skills for life performance",
]
for pt in reilly_pts:
cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D2X+6,y2,pt); y2-=11
y2-=4
cv.setFont("Caveat",9); cv.setFillColor(ORANGE)
cv.drawString(D2X+4,y2,"★ Basis of modern OT paediatric practice")
y2-=11
cv.drawString(D2X+4,y2,"★ Play deprivation = occupational deprivation")
# ── COL 3: KNOX ───────────────────────────────────────────────────────────────
section_card(cv, D3X, TOP2, CW, AVAIL2,
"KNOX PRESCHOOL PLAY SCALE", "1974/1997", "Revised Knox Play Scale (RKPPS)",
colors.HexColor("#f0eeff"), PURPLE)
y3 = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D3X+4,y3,"Core Premise:"); y3-=13
cv.setFont("Caveat",10); cv.setFillColor(PURPLE)
cv.drawString(D3X+4,y3,"Observational assessment of play"); y3-=11
cv.drawString(D3X+4,y3,"across 4 dimensions | Age: 0–6 yr"); y3-=15
cv.setFont("Caveat",12); cv.setFillColor(PURPLE)
cv.drawString(D3X+4,y3,"4 Dimensions of Play:"); y3-=13
knox_dims = [
("1. Space Management",
["Use of body in space",
"Gross motor; body control",
"Rough & tumble; running",
"Interest in outdoor play"]),
("2. Material Management",
["How child handles objects",
"Manipulation, construction",
"Interest & attention to toys",
"Purpose + creativity w/ objects"]),
("3. Imitation",
["Social knowledge development",
"Imitates people & situations",
"Pretend & symbolic use",
"Understanding social world"]),
("4. Participation",
["Degree of social involvement",
"Type & amount of interaction",
"Lang. used in play contexts",
"Cooperation & independence"]),
]
dim_cols = [PURPLE, colors.HexColor("#8833bb"), colors.HexColor("#aa22cc"), colors.HexColor("#5500aa")]
for i,(dim_name,pts) in enumerate(knox_dims):
nc3 = dim_cols[i]
bh3 = len(pts)*11+18
cv.setFillColor(colors.HexColor("#ece0ff"))
cv.roundRect(D3X+3,y3-bh3+16,CW-6,bh3,5,fill=1,stroke=0)
cv.setFillColor(nc3); cv.roundRect(D3X+3,y3-14,CW-6,18,5,fill=1,stroke=0)
cv.setFont("Caveat",11); cv.setFillColor(colors.white)
cv.drawString(D3X+7,y3-7,dim_name)
y3-=16
for pt in pts:
cv.setFont("Caveat",9); cv.setFillColor(DARK)
cv.drawString(D3X+10,y3,"· "+pt); y3-=11
y3-=5
y3-=4
cv.setFont("Caveat",10); cv.setFillColor(PURPLE)
cv.drawString(D3X+4,y3,"Each dimension scored 0–6yr"); y3-=11
cv.drawString(D3X+4,y3,"in 6-month intervals"); y3-=13
cv.setFont("Caveat",9); cv.setFillColor(DARK)
cv.drawString(D3X+4,y3,"★ Naturalistic observation (indoor/outdoor)"); y3-=11
cv.drawString(D3X+4,y3,"★ No standard tasks required"); y3-=11
cv.drawString(D3X+4,y3,"★ Semi-structured; ecological validity")
# ── COL 4: BUNDY ──────────────────────────────────────────────────────────────
section_card(cv, D4X, TOP2, CW, AVAIL2,
"BUNDY'S PLAYFULNESS MODEL", "1993", "Test of Playfulness (ToP)",
colors.HexColor("#fff0ff"), colors.HexColor("#990099"))
BPURP = colors.HexColor("#990099")
y4 = TOP2 - 34
cv.setFont("Caveat",11); cv.setFillColor(DARK)
cv.drawString(D4X+4,y4,"Core Premise:"); y4-=13
cv.setFont("Caveat",10); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"Play is not just an activity —"); y4-=11
cv.drawString(D4X+4,y4,"it is a DISPOSITION (playfulness)"); y4-=15
cv.setFont("Caveat",12); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"3 Elements of Playfulness:"); y4-=13
bundy_elems = [
("1. Intrinsic Motivation",
["Doing for OWN sake",
"Not for external reward",
"Drives engagement"]),
("2. Internal Locus of Control",
["Child DIRECTS the action",
"Chooses what/how to play",
"Sense of agency & autonomy"]),
("3. Freedom from Reality",
["Suspend real-world rules",
"\"What if\" thinking",
"Stick = sword; box = castle"]),
]
for elem_name,pts in bundy_elems:
bh4 = len(pts)*12+18
cv.setFillColor(colors.HexColor("#f5e0ff"))
cv.roundRect(D4X+3,y4-bh4+16,CW-6,bh4,5,fill=1,stroke=0)
cv.setFillColor(BPURP); cv.roundRect(D4X+3,y4-14,CW-6,18,5,fill=1,stroke=0)
cv.setFont("Caveat",11); cv.setFillColor(colors.white); cv.drawString(D4X+7,y4-7,elem_name)
y4-=16
for pt in pts:
cv.setFont("Caveat",10); cv.setFillColor(DARK)
cv.drawString(D4X+10,y4,"· "+pt); y4-=12
y4-=6
y4-=4
cv.setFont("Caveat",11); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"Test of Playfulness (ToP):"); y4-=12
top_pts = [
"Age: 6 months – 18 years",
"Observational; 30 items",
"Rates: extent · intensity · skill",
"Measures QUALITY of play",
" not just play TYPE",
"Setting: natural play environment",
"Score helps identify children who",
" lack playful engagement",
"4th element (context) added later",
" — environment supports play?",
]
for pt in top_pts:
cv.setFont("Caveat",9); cv.setFillColor(DARK); cv.drawString(D4X+6,y4,pt); y4-=11
y4-=4
cv.setFont("Caveat",9); cv.setFillColor(BPURP)
cv.drawString(D4X+4,y4,"★ Built on Florey + Reilly foundations")
y4-=11
cv.drawString(D4X+4,y4,"★ Most OT-specific play measure available")
# ── Vertical dividers ─────────────────────────────────────────────────────────
for dx in [D2X-3, D3X-3, D4X-3]:
vdivider(cv, dx, TOP2+2, BOT2+40)
# ── MASTER COMPARISON BAND ────────────────────────────────────────────────────
band2_y = BOT2 + 36
cv.setFillColor(colors.HexColor("#0d3320"))
cv.roundRect(MARGIN, BOT2, W-2*MARGIN, band2_y-BOT2, 8, fill=1, stroke=0)
cv.setFont("Caveat",12); cv.setFillColor(YELLOW)
cv.drawString(MARGIN+10, band2_y-14, "ALL 8 FRAMEWORKS — MASTER SUMMARY:")
hxs = [MARGIN+12, MARGIN+148, MARGIN+258, MARGIN+368, MARGIN+490, MARGIN+610, MARGIN+718]
hdrs2 = ["Framework","Year","Focus","# Stages","Unique Contribution","Tool/Method","Best for"]
for i,h in enumerate(hdrs2):
cv.setFont("Caveat",10); cv.setFillColor(colors.HexColor("#88ddaa")); cv.drawString(hxs[i],band2_y-27,h)
all_rows = [
["Parten", "1932","Social participation","6","Social complexity ladder","Observation","Social skills Ax"],
["Piaget", "1962","Cognitive stage", "3","Play ↔ cognition link", "Play, Dreams & Imitation","Dev. evaluation"],
["Smilansky", "1968","Functional category", "4","Added constructive play", "Classroom/clinic Ax","Clinic/classroom"],
["Takata", "1974","Play history epochs", "5","OT play history method", "Play History Interview","OT Ax tool"],
["Florey", "1971","Intrinsic motivation", "-","Play = ends-in-itself", "Theoretical model","OT theory base"],
["Reilly", "1974","Occupational behav.", "3","Play as child's occupation","OB Theory","OT practice model"],
["Knox", "1997","4 play dimensions", "-","Naturalistic observation", "RKPPS (0–6yr)","Preschool OT Ax"],
["Bundy", "1993","Playfulness quality", "3","Playfulness disposition", "Test of Playfulness","Quality of play"],
]
row_cols2 = [colors.HexColor("#ffdddd"), colors.HexColor("#ddeeff"),
colors.HexColor("#ddffdd"), colors.HexColor("#ffeedd"),
colors.HexColor("#ddfff8"), colors.HexColor("#fff0dd"),
colors.HexColor("#f0ddff"), colors.HexColor("#ffeeff")]
for ri,row in enumerate(all_rows):
ry = band2_y - 38 - ri*11
cv.setFont("Caveat",9); cv.setFillColor(row_cols2[ri])
cv.drawString(hxs[0], ry, row[0])
cv.setFillColor(colors.white)
for ci,cell in enumerate(row[1:]):
cv.drawString(hxs[ci+1], ry, cell)
# Footer
cv.setFont("Caveat",9); cv.setFillColor(colors.HexColor("#888888"))
cv.drawCentredString(W/2, 8, "\"Play is the work of childhood.\" — Jean Piaget | OT Seminar · Paediatrics · Interdisciplinary Team")
cv.save()
print("Done:", OUTPUT)
print("Size:", os.path.getsize(OUTPUT), "bytes")
cd /tmp/workspace && python3 play_cheatsheet_v2.py 2>&1
Play Classifications Complete Cheatsheet
PDF Document · PDF
| Page | Frameworks |
|---|---|
| Page 1 | Parten (6 Social Stages) · Piaget (3 Cognitive Stages) · Smilansky (4 Functional Categories) · Takata (5 Play Epochs) |
| Page 2 | Florey (Intrinsic Motivation Model) · Reilly (Occupational Behaviour + 3-level hierarchy) · Knox (4 Dimensions + RKPPS) · Bundy (Playfulness + ToP) |
can you all those details to this notes pls
~/play_notes_extra_pages.py
"""
Generate extra pages (Page 6 & 7) in the SAME handwritten style as the original notes.
Then merge with the original Play_Handwritten_Notes.pdf
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from pypdf import PdfWriter, PdfReader
import os, math
pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))
EXTRA_PDF = "/tmp/workspace/play_notes_pages6_7.pdf"
ORIG_PDF = "/tmp/workspace/attachments/57b0a518-4742-4d01-b26f-256be626e53f/Play_Handwritten_Notes.pdf"
OUTPUT = "/tmp/workspace/Play_Handwritten_Notes_Complete.pdf"
W, H = A4
MARGIN_L = 55
MARGIN_R = W - 30
MARGIN_TOP= H - 30
MARGIN_BOT= 40
LINE_GAP = 22
# Colour palette — identical to original script
BLUE = colors.HexColor("#1a3a6b")
RED = colors.HexColor("#c0392b")
GREEN = colors.HexColor("#1e6b3a")
DARK = colors.HexColor("#1c1c2e")
ORANGE = colors.HexColor("#c55a00")
PURPLE = colors.HexColor("#6a0dad")
TEAL = colors.HexColor("#007070")
BPURP = colors.HexColor("#880088")
RULED = colors.HexColor("#c8d8f0")
MARGIN_LINE = colors.HexColor("#f4a0a0")
YELLOW = colors.HexColor("#e0a800")
# ── Helpers (same as original notes) ─────────────────────────────────────────
def draw_ruled_paper(c):
c.setFillColor(colors.HexColor("#fefef8"))
c.rect(0, 0, W, H, fill=1, stroke=0)
c.setStrokeColor(RULED); c.setLineWidth(0.5)
y = MARGIN_TOP - 10
while y > MARGIN_BOT:
c.line(MARGIN_L - 10, y, MARGIN_R + 5, y)
y -= LINE_GAP
c.setStrokeColor(MARGIN_LINE); c.setLineWidth(1.2)
c.line(MARGIN_L - 2, MARGIN_BOT, MARGIN_L - 2, MARGIN_TOP)
def draw_page_number(c, n, total):
c.setFont("Caveat", 13); c.setFillColor(colors.gray)
c.drawCentredString(W/2, 22, f"— {n} / {total} —")
def section_title(c, x, y, txt, color=BLUE, size=19):
c.setFont("Caveat", size); c.setFillColor(color)
c.drawString(x, y, txt)
tw = c.stringWidth(txt, "Caveat", size)
c.setStrokeColor(color); c.setLineWidth(1.8)
c.line(x, y - 3, x + tw, y - 3)
return y - LINE_GAP - 4
def bullet(c, x, y, txt, size=14, color=DARK, symbol="•", sym_color=BLUE):
c.setFont("Caveat", size); c.setFillColor(sym_color)
c.drawString(x, y, symbol)
c.setFillColor(color); c.drawString(x + 14, y, txt)
def sub_bullet(c, x, y, txt, size=13, color=DARK):
c.setFont("Caveat", size); c.setFillColor(colors.HexColor("#555555"))
c.drawString(x, y, "→"); c.setFillColor(color)
c.drawString(x + 14, y, txt)
def divider(c, y, color=BLUE):
c.setStrokeColor(color); c.setLineWidth(1.5)
c.line(MARGIN_L - 10, y, MARGIN_R, y)
def star_box(c, x, y, w, lines, size=13, bg=colors.HexColor("#fff9e0"), border=colors.HexColor("#e0b800")):
h = len(lines) * LINE_GAP + 12
c.setFillColor(bg); c.setStrokeColor(border); c.setLineWidth(1.5)
c.roundRect(x, y - h + 14, w, h, 6, fill=1, stroke=1)
cy = y
for line in lines:
c.setFont("Caveat", size); c.setFillColor(colors.HexColor("#7a5900"))
c.drawString(x + 8, cy, line); cy -= LINE_GAP
def stage_pill(c, x, y, txt, bg, fg=colors.white, fs=14):
tw = c.stringWidth(txt, "Caveat", fs) + 14
c.setFillColor(bg); c.roundRect(x, y - 4, tw, 20, 8, fill=1, stroke=0)
c.setFont("Caveat", fs); c.setFillColor(fg); c.drawString(x + 7, y + 3, txt)
return tw
def age_badge(c, x, y, age, col):
aw = c.stringWidth(age, "Caveat", 12) + 10
c.setFillColor(colors.HexColor("#f0f0f0")); c.setStrokeColor(col); c.setLineWidth(1)
c.roundRect(x, y - 2, aw, 17, 5, fill=1, stroke=1)
c.setFont("Caveat", 12); c.setFillColor(col); c.drawString(x + 5, y + 2, age)
return aw
def info_box(c, x, y, w, lines, bg, border, size=13):
h = len(lines) * (LINE_GAP - 2) + 14
c.setFillColor(bg); c.setStrokeColor(border); c.setLineWidth(1.2)
c.roundRect(x, y - h + 12, w, h, 6, fill=1, stroke=1)
cy = y
for line in lines:
c.setFont("Caveat", size); c.setFillColor(DARK)
c.drawString(x + 8, cy, line); cy -= (LINE_GAP - 2)
# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 6 — Takata + Florey + Reilly
# ═══════════════════════════════════════════════════════════════════════════════
def page6(c):
draw_ruled_paper(c)
y = MARGIN_TOP - 15
# Page heading
c.setFont("Caveat", 22); c.setFillColor(BLUE)
c.drawString(MARGIN_L, y, "OT-SPECIFIC PLAY FRAMEWORKS — Part 1")
y -= 8
c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
y -= LINE_GAP + 2
# ── TAKATA ────────────────────────────────────────────────────────────────
y = section_title(c, MARGIN_L, y, "A. TAKATA'S PLAY EPOCHS (1974)", ORANGE, 18)
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L, y, "Basis for the PLAY HISTORY interview in OT → 5 developmental epochs across the lifespan")
y -= LINE_GAP + 2
takata_epochs = [
("Epoch 1", "Sensorimotor", "0–2 yr",
"Sensory + motor exploration; pleasure from body movement; object manipulation; self-focused; no rules",
colors.HexColor("#cc8800")),
("Epoch 2", "Symbolic/Simple", "2–4 yr",
"Imitates adult roles; make-believe + pretend; begins brief cooperation; fantasy predominates",
colors.HexColor("#aa6600")),
("Epoch 3", "Dramatic/Complex", "4–7 yr",
"Elaborate role-play; peers essential; constructive creation; simple rules understood",
ORANGE),
("Epoch 4", "Games / Skills", "7–12 yr",
"Rule-governed games; competition + team play; skill building (sports, crafts); peer approval central",
colors.HexColor("#884400")),
("Epoch 5", "Recreational", "12+ yr",
"Leisure and hobbies; identity through play; social + creative expression; play → adult recreation",
colors.HexColor("#662200")),
]
for ep_num, ep_name, age, desc, col in takata_epochs:
pw = stage_pill(c, MARGIN_L, y, ep_num, col)
c.setFont("Caveat", 14); c.setFillColor(col)
c.drawString(MARGIN_L + pw + 6, y + 3, ep_name)
nw = c.stringWidth(ep_name, "Caveat", 14)
aw = age_badge(c, MARGIN_L + pw + nw + 12, y, age, col)
y -= LINE_GAP
c.setFont("Caveat", 12); c.setFillColor(DARK)
c.drawString(MARGIN_L + 16, y, desc)
y -= LINE_GAP + 2
star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
"★ Takata's Play History: OT interviews caregiver about play across ALL 5 epochs",
" Tells us: what child played, with whom, where, how long, and what was enjoyed",
"★ Deprivation in any epoch = occupational deprivation → assess + address in OT plan"
], size=13, bg=colors.HexColor("#fff4e0"), border=ORANGE)
y -= LINE_GAP * 3 + 14
divider(c, y); y -= LINE_GAP
# ── FLOREY ────────────────────────────────────────────────────────────────
y = section_title(c, MARGIN_L, y, "B. FLOREY'S PLAY MODEL (1971)", TEAL, 18)
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L, y, "Core premise: Play = intrinsically motivated behaviour that is ENDS-IN-ITSELF")
y -= LINE_GAP + 2
florey_concepts = [
("Intrinsic motivation", "No external reward needed; child plays because it IS pleasurable"),
("Exploratory drive", "Child naturally seeks novelty and new stimuli"),
("Effectance motivation", "Drive to affect and master the environment"),
("Process focus", "Enjoyment is in the DOING, not the product or outcome"),
("Freedom from ext. rules", "Child sets own agenda; cannot be imposed from outside"),
("Voluntary participation", "Play cannot be forced; if forced → it is NOT play"),
]
# 2-column layout for Florey
col1_x = MARGIN_L
col2_x = MARGIN_L + (W - MARGIN_L - 30) // 2 + 10
col_w = (W - MARGIN_L - 30) // 2 - 14
left_items = florey_concepts[:3]
right_items = florey_concepts[3:]
base_y = y
for concept, explain in left_items:
cw = c.stringWidth(concept, "Caveat", 13) + 12
c.setFillColor(colors.HexColor("#c0f0e8")); c.setStrokeColor(TEAL); c.setLineWidth(0.8)
c.roundRect(col1_x, y - 3, cw, 17, 5, fill=1, stroke=1)
c.setFont("Caveat", 13); c.setFillColor(TEAL); c.drawString(col1_x + 6, y + 2, concept)
y -= LINE_GAP - 2
c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(col1_x + 10, y, "→ " + explain)
y -= LINE_GAP
y_right = base_y
for concept, explain in right_items:
cw = c.stringWidth(concept, "Caveat", 13) + 12
c.setFillColor(colors.HexColor("#c0f0e8")); c.setStrokeColor(TEAL); c.setLineWidth(0.8)
c.roundRect(col2_x, y_right - 3, cw, 17, 5, fill=1, stroke=1)
c.setFont("Caveat", 13); c.setFillColor(TEAL); c.drawString(col2_x + 6, y_right + 2, concept)
y_right -= LINE_GAP - 2
c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(col2_x + 10, y_right, "→ " + explain)
y_right -= LINE_GAP
y = min(y, y_right) - 4
c.setFont("Caveat", 13); c.setFillColor(TEAL)
c.drawString(MARGIN_L, y, "Clinical Relevance:")
y -= LINE_GAP
florey_clinical = [
"Helps distinguish true play from directed/structured activity in assessment",
"If child is not intrinsically driven → it is NOT play (even if play-like)",
"Grounds OT's non-directive play therapy approach",
"Closely linked to Reilly's Occupational Behaviour theory",
"Influenced Bundy's playfulness model directly",
]
for pt in florey_clinical:
bullet(c, MARGIN_L, y, pt, size=13, sym_color=TEAL)
y -= LINE_GAP - 2
draw_page_number(c, 6, 7)
c.showPage()
# ═══════════════════════════════════════════════════════════════════════════════
# PAGE 7 — Reilly + Knox + Bundy + Master Comparison
# ═══════════════════════════════════════════════════════════════════════════════
def page7(c):
draw_ruled_paper(c)
y = MARGIN_TOP - 15
c.setFont("Caveat", 22); c.setFillColor(BLUE)
c.drawString(MARGIN_L, y, "OT-SPECIFIC PLAY FRAMEWORKS — Part 2 + Master Comparison")
y -= 8
c.setLineWidth(2); c.setStrokeColor(BLUE); c.line(MARGIN_L, y, MARGIN_R, y)
y -= LINE_GAP + 2
# ── REILLY ────────────────────────────────────────────────────────────────
y = section_title(c, MARGIN_L, y, "C. REILLY'S OCCUPATIONAL BEHAVIOUR (1974)", RED, 17)
c.setFont("Caveat", 13); c.setFillColor(DARK)
c.drawString(MARGIN_L, y, "\"Play is the arena in which children practice the skills & roles necessary for adult life\" — Mary Reilly")
y -= LINE_GAP + 2
# Reilly's 3-level hierarchy
c.setFont("Caveat", 14); c.setFillColor(RED)
c.drawString(MARGIN_L, y, "Reilly's Hierarchy of Play:")
y -= LINE_GAP
reilly_hier = [
("1. Exploratory", "Birth–2yr",
"Sensory/motor curiosity; intrinsic drive to explore; no goal; sensation-seeking",
colors.HexColor("#cc3333")),
("2. Competency", "2–7yr",
"Practice and repetition; mastery motivation; trying harder; skill development",
colors.HexColor("#aa1111")),
("3. Achievement", "7+ yr",
"Rules, competition, standards; external validation; performance in play",
RED),
]
for stage, age, desc, col in reilly_hier:
pw = stage_pill(c, MARGIN_L, y, stage, col, fs=13)
aw = age_badge(c, MARGIN_L + pw + 8, y, age, col)
y -= LINE_GAP
c.setFont("Caveat", 12); c.setFillColor(DARK)
c.drawString(MARGIN_L + 16, y, desc)
y -= LINE_GAP
reilly_pts = [
"First OT theorist to frame play as PURPOSEFUL OCCUPATION",
"Play develops habits, roles & skills for adult life performance",
"Play deprivation = occupational deprivation (clinical + ethical concern)",
"Foundation of ALL modern OT paediatric occupation-based practice",
]
for pt in reilly_pts:
bullet(c, MARGIN_L, y, pt, size=13, sym_color=RED)
y -= LINE_GAP - 2
y -= 4
divider(c, y, colors.HexColor("#aaaaaa")); y -= LINE_GAP
# ── KNOX + BUNDY side by side ─────────────────────────────────────────────
half_w = (W - MARGIN_L - 30) // 2 - 8
col1_x = MARGIN_L
col2_x = MARGIN_L + half_w + 16
# Knox heading
c.setFont("Caveat", 16); c.setFillColor(PURPLE)
c.drawString(col1_x, y, "D. KNOX PRESCHOOL PLAY SCALE (1974 / rev. 1997)")
tw = c.stringWidth("D. KNOX PRESCHOOL PLAY SCALE (1974 / rev. 1997)", "Caveat", 16)
c.setStrokeColor(PURPLE); c.setLineWidth(1.5); c.line(col1_x, y-3, col1_x+tw, y-3)
# Bundy heading
c.setFont("Caveat", 16); c.setFillColor(BPURP)
c.drawString(col2_x, y, "E. BUNDY'S PLAYFULNESS / ToP (1993)")
tw2 = c.stringWidth("E. BUNDY'S PLAYFULNESS / ToP (1993)", "Caveat", 16)
c.setStrokeColor(BPURP); c.setLineWidth(1.5); c.line(col2_x, y-3, col2_x+tw2, y-3)
y -= LINE_GAP + 4
# Knox content
y_k = y
c.setFont("Caveat", 12); c.setFillColor(DARK)
c.drawString(col1_x, y_k, "Observational scale | Age: 0–6 yr")
y_k -= LINE_GAP
c.drawString(col1_x, y_k, "4 Dimensions assessed in 6-month intervals:")
y_k -= LINE_GAP
knox_dims = [
("1. Space Management",
["Use of body in space", "Gross motor; body control", "Rough + tumble; running", "Outdoor + indoor interest"]),
("2. Material Management",
["How child handles objects", "Manipulation + construction", "Attention + interest in toys", "Purpose + creativity w/ objects"]),
("3. Imitation",
["Social knowledge development", "Imitates people + situations", "Pretend + symbolic use", "Understanding social world"]),
("4. Participation",
["Degree of social involvement", "Amount + type of interaction", "Language used in play", "Cooperation + independence"]),
]
dim_cols = [PURPLE, colors.HexColor("#7a22bb"), colors.HexColor("#9900cc"), colors.HexColor("#5500aa")]
for i, (dim, pts) in enumerate(knox_dims):
dc = dim_cols[i]
dw = c.stringWidth(dim, "Caveat", 13) + 12
c.setFillColor(colors.HexColor("#ece0ff")); c.setStrokeColor(dc); c.setLineWidth(0.8)
c.roundRect(col1_x, y_k - 3, dw, 17, 5, fill=1, stroke=1)
c.setFont("Caveat", 13); c.setFillColor(dc); c.drawString(col1_x + 6, y_k + 2, dim)
y_k -= LINE_GAP
for pt in pts:
c.setFont("Caveat", 11); c.setFillColor(DARK)
c.drawString(col1_x + 12, y_k, "· " + pt); y_k -= 14
y_k -= 4
c.setFont("Caveat", 12); c.setFillColor(PURPLE)
c.drawString(col1_x, y_k, "★ No standard tasks needed")
y_k -= LINE_GAP - 4
c.drawString(col1_x, y_k, "★ Naturalistic; high ecological validity")
y_k -= LINE_GAP - 4
c.drawString(col1_x, y_k, "★ Semi-structured; indoor AND outdoor")
# Bundy content
y_b = y
c.setFont("Caveat", 12); c.setFillColor(DARK)
c.drawString(col2_x, y_b, "Play = a DISPOSITION (playfulness), not just an activity")
y_b -= LINE_GAP + 2
c.setFont("Caveat", 13); c.setFillColor(BPURP)
c.drawString(col2_x, y_b, "3 Core Elements of Playfulness:")
y_b -= LINE_GAP
bundy_elems = [
("① Intrinsic Motivation",
"Doing for OWN sake; no external reward",
["Drives genuine engagement", "Child must WANT to play"]),
("② Internal Locus of Control",
"Child DIRECTS the action",
["Chooses what/how to play", "Sense of agency + autonomy"]),
("③ Freedom from Reality",
"Suspend real-world rules",
["\"What if\" thinking space", "Stick=sword; box=castle"]),
]
belem_cols = [BPURP, colors.HexColor("#aa00aa"), colors.HexColor("#660066")]
for i, (elem, tagline, pts) in enumerate(bundy_elems):
bc = belem_cols[i]
ew = c.stringWidth(elem, "Caveat", 13) + 12
c.setFillColor(colors.HexColor("#f5e0ff")); c.setStrokeColor(bc); c.setLineWidth(0.8)
c.roundRect(col2_x, y_b - 3, ew, 17, 5, fill=1, stroke=1)
c.setFont("Caveat", 13); c.setFillColor(bc); c.drawString(col2_x + 6, y_b + 2, elem)
y_b -= LINE_GAP - 2
c.setFont("Caveat", 12); c.setFillColor(DARK); c.drawString(col2_x + 10, y_b, "→ " + tagline)
y_b -= 14
for pt in pts:
c.setFont("Caveat", 11); c.setFillColor(DARK)
c.drawString(col2_x + 16, y_b, "· " + pt); y_b -= 13
y_b -= 5
c.setFont("Caveat", 13); c.setFillColor(BPURP)
c.drawString(col2_x, y_b, "Test of Playfulness (ToP):")
y_b -= LINE_GAP - 2
top_pts = [
"Age: 6 months – 18 years",
"30 items; rates extent, intensity + skill",
"Measures QUALITY of play (not just type)",
"Setting: natural play environment",
"4th element added later: CONTEXT",
" (does environment support play?)",
"Built on Florey + Reilly foundations",
"Most OT-specific play measure available",
]
for pt in top_pts:
c.setFont("Caveat", 11); c.setFillColor(DARK)
c.drawString(col2_x + 10, y_b, "· " + pt); y_b -= 13
y = min(y_k, y_b) - 8
# ── MASTER COMPARISON TABLE ───────────────────────────────────────────────
divider(c, y); y -= LINE_GAP
y = section_title(c, MARGIN_L, y, "MASTER COMPARISON — ALL 8 FRAMEWORKS", BLUE, 16)
# Table headers
col_xs = [MARGIN_L, MARGIN_L + 95, MARGIN_L + 148, MARGIN_L + 200, MARGIN_L + 300, MARGIN_L + 430, MARGIN_L + 530]
col_labels = ["Framework", "Year", "Focus", "Stages", "Unique Contribution", "Tool/Method", "Best Used For"]
for i, lbl in enumerate(col_labels):
c.setFillColor(BLUE); c.setFont("Caveat", 11)
bw = c.stringWidth(lbl, "Caveat", 11) + 8
c.roundRect(col_xs[i], y - 3, bw if i < len(col_labels)-1 else W-MARGIN_L-30-col_xs[i]+MARGIN_L, 16, 3, fill=1, stroke=0)
c.setFillColor(colors.white); c.drawString(col_xs[i] + 4, y + 1, lbl)
y -= LINE_GAP
all_rows = [
["Parten", "1932", "Social participation", "6", "Social complexity ladder", "Observation", "Social skills Ax"],
["Piaget", "1962", "Cognitive stage", "3", "Play ↔ cognition link", "Play, Dreams, Imitation","Dev. evaluation"],
["Smilansky", "1968", "Functional category", "4", "Added constructive play", "Classroom/clinic Ax", "Clinic/classroom"],
["Takata", "1974", "Play history epochs", "5", "OT play history interview", "Play History (OT)", "OT Ax + history"],
["Florey", "1971", "Intrinsic motivation", "–", "Play = ends-in-itself", "Theoretical model", "OT theory base"],
["Reilly", "1974", "Occupational behaviour", "3", "Play as child's occupation", "OB Theory", "OT practice model"],
["Knox", "1997", "4 play dimensions", "–", "Naturalistic observation", "RKPPS (0–6yr)", "Preschool OT Ax"],
["Bundy", "1993", "Playfulness quality", "3", "Playfulness as disposition", "Test of Playfulness", "Quality of play"],
]
row_bgs = [
colors.HexColor("#fff0f0"), colors.HexColor("#eef4ff"), colors.HexColor("#efffef"),
colors.HexColor("#fff4e0"), colors.HexColor("#e0fff8"), colors.HexColor("#fff0e8"),
colors.HexColor("#f0e8ff"), colors.HexColor("#ffe8ff"),
]
row_fgs = [RED, BLUE, GREEN, ORANGE, TEAL, RED, PURPLE, BPURP]
for ri, row in enumerate(all_rows):
c.setFillColor(row_bgs[ri]); c.setStrokeColor(colors.HexColor("#cccccc")); c.setLineWidth(0.5)
c.rect(MARGIN_L, y - 4, W - MARGIN_L - 30, 16, fill=1, stroke=1)
for ci, cell in enumerate(row):
tc = row_fgs[ri] if ci == 0 else DARK
c.setFont("Caveat", 11 if ci == 0 else 10)
c.setFillColor(tc); c.drawString(col_xs[ci] + 3, y + 1, cell)
y -= LINE_GAP - 4
y -= 8
# Final pearl
star_box(c, MARGIN_L, y + 4, W - MARGIN_L - 30, [
"★ KEY CLINICAL PEARL: Use Parten (HOW social) + Piaget (WHAT cognitive level) + Smilansky (WHAT type)",
" + Takata (HISTORY of play) + Bundy (QUALITY of playfulness) for a COMPLETE play assessment picture",
"★ Florey + Reilly = OT's theoretical BASE | Knox + Bundy = OT's ASSESSMENT TOOLS"
], size=13, bg=colors.HexColor("#f0fff0"), border=GREEN)
draw_page_number(c, 7, 7)
c.showPage()
# ── Generate extra pages ───────────────────────────────────────────────────────
c = canvas.Canvas(EXTRA_PDF, pagesize=A4)
c.setTitle("Play Notes — Pages 6-7")
page6(c)
page7(c)
c.save()
print("Extra pages saved:", EXTRA_PDF, os.path.getsize(EXTRA_PDF), "bytes")
# ── Merge with original ────────────────────────────────────────────────────────
writer = PdfWriter()
orig = PdfReader(ORIG_PDF)
for page in orig.pages:
writer.add_page(page)
print(f"Original: {len(orig.pages)} pages")
extra = PdfReader(EXTRA_PDF)
for page in extra.pages:
writer.add_page(page)
print(f"Extra: {len(extra.pages)} pages")
writer.add_metadata({
"/Title": "Play: The Occupation of Childhood — Complete Handwritten Notes",
"/Author": "OT Seminar — Interdisciplinary Team"
})
with open(OUTPUT, "wb") as f:
writer.write(f)
print(f"Merged PDF: {OUTPUT}")
print(f"Total pages: {len(writer.pages)}")
print(f"File size: {os.path.getsize(OUTPUT)} bytes")
cd /tmp/workspace && python3 play_notes_extra_pages.py 2>&1
Play Handwritten Notes Complete
PDF Document · PDF
ok js leave all tose you created , keep in mind i got a oral presentation to do in front of my intrerdiciplinary team and i want to give all details abt play and each ppl deinition and yr of findinf with brief classifications coorectly in a pdf format you also add Introduction** 2. **Definition of Play** 3. **Characteristics of Play** 4. **Importance of Play**Comparison of Play Classifications** 8. **Red Flags in Play Development** 9. **Play Assessment**Play as an Intervention** * Occupational Therapy * Physiotherapy * Speech-Language Therapy * Psychology * Special Education 11. **Clinical Applications / Case Example** 12. **Key Take-Home Messages** 13. **Conclusion* make the notes in handwritten format with clear spacing and no overlaping
yoo send me pls
~/play_final.py
"""
PLAY: The Occupation of Childhood
Complete Handwritten-Style Notes PDF
All 13 sections | All theorists | Clear spacing | No overlap
"""
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.pdfgen import canvas
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
import os
pdfmetrics.registerFont(TTFont("Caveat", "/tmp/workspace/Caveat.ttf"))
OUTPUT = "/tmp/workspace/Play_Complete_Notes_FINAL.pdf"
W, H = A4 # 595 x 842
# --- Margins & spacing
LM = 52 # left margin
RM = W - 28 # right margin
TM = H - 28 # top margin
BM = 38 # bottom margin
LG = 23 # line gap (standard)
# --- Colours
BL = colors.HexColor("#1a3a8f")
RD = colors.HexColor("#b52020")
GR = colors.HexColor("#1a6a2a")
OR = colors.HexColor("#b55000")
PU = colors.HexColor("#6600aa")
TE = colors.HexColor("#006666")
BPU = colors.HexColor("#880088")
DK = colors.HexColor("#1c1c1c")
GY = colors.HexColor("#555555")
RULE = colors.HexColor("#ccd8f0")
MARG = colors.HexColor("#f4a0a0")
YB = colors.HexColor("#fff8d0")
YBD = colors.HexColor("#c8a000")
RB = colors.HexColor("#fff0f0")
RBD = colors.HexColor("#cc4444")
GB = colors.HexColor("#f0fff4")
GBD = colors.HexColor("#2a8a2a")
BB = colors.HexColor("#eef4ff")
BBD = BL
OB = colors.HexColor("#fff5ea")
OBD = OR
PB = colors.HexColor("#f8eeff")
PBD = PU
cv = canvas.Canvas(OUTPUT, pagesize=A4)
cv.setTitle("Play: The Occupation of Childhood — Complete Notes")
# =========================================================================
# CORE DRAWING HELPERS
# =========================================================================
def ruled_bg(cv):
cv.setFillColor(colors.HexColor("#fefef6"))
cv.rect(0, 0, W, H, fill=1, stroke=0)
cv.setStrokeColor(RULE); cv.setLineWidth(0.5)
y = TM
while y > BM:
cv.line(LM - 12, y, RM + 4, y)
y -= LG
cv.setStrokeColor(MARG); cv.setLineWidth(1.2)
cv.line(LM - 3, BM, LM - 3, TM + 4)
def pgnum(cv, n, total):
cv.setFont("Caveat", 12); cv.setFillColor(colors.gray)
cv.drawCentredString(W/2, 18, f"— {n} / {total} —")
def sec_title(cv, x, y, txt, col=BL, fs=18):
"""Draw underlined section title, return new y."""
cv.setFont("Caveat", fs); cv.setFillColor(col)
cv.drawString(x, y, txt)
tw = cv.stringWidth(txt, "Caveat", fs)
cv.setStrokeColor(col); cv.setLineWidth(1.8)
cv.line(x, y-3, x+tw, y-3)
return y - LG - 6
def write(cv, x, y, txt, fs=13, col=DK):
cv.setFont("Caveat", fs); cv.setFillColor(col)
cv.drawString(x, y, txt)
def bul(cv, x, y, txt, fs=13, col=DK, sym="•", scol=BL):
cv.setFont("Caveat", fs); cv.setFillColor(scol)
cv.drawString(x, y, sym)
cv.setFillColor(col); cv.drawString(x+16, y, txt)
def subbul(cv, x, y, txt, fs=12, col=GY):
cv.setFont("Caveat", fs); cv.setFillColor(col)
cv.drawString(x+4, y, "→ "+txt)
def divline(cv, y, col=colors.HexColor("#bbbbcc")):
cv.setStrokeColor(col); cv.setLineWidth(1.0)
cv.setDash(4, 3); cv.line(LM-10, y, RM, y); cv.setDash()
def pill(cv, x, y, txt, bg, fg=colors.white, fs=13):
tw = cv.stringWidth(txt, "Caveat", fs) + 14
cv.setFillColor(bg); cv.roundRect(x, y-3, tw, 19, 7, fill=1, stroke=0)
cv.setFont("Caveat", fs); cv.setFillColor(fg); cv.drawString(x+7, y+3, txt)
return tw
def agebadge(cv, x, y, age, col):
aw = cv.stringWidth(age, "Caveat", 11) + 10
cv.setFillColor(colors.HexColor("#f0f0f0"))
cv.setStrokeColor(col); cv.setLineWidth(0.8)
cv.roundRect(x, y-2, aw, 16, 4, fill=1, stroke=1)
cv.setFont("Caveat", 11); cv.setFillColor(col); cv.drawString(x+5, y+2, age)
return aw
def colbox(cv, x, y, w, lines, bg, bdr, fs=12, title=None, tcol=None):
"""Box with optional title strip + content lines. Returns bottom y."""
lh = LG - 3
content_h = len(lines) * lh + 10
title_h = 22 if title else 0
total_h = content_h + title_h
# background
cv.setFillColor(bg); cv.setStrokeColor(bdr); cv.setLineWidth(1.2)
cv.roundRect(x, y - total_h, w, total_h, 6, fill=1, stroke=1)
if title:
cv.setFillColor(bdr)
cv.roundRect(x, y - title_h, w, title_h, 6, fill=1, stroke=0)
cv.rect(x, y - title_h, w, title_h/2, fill=1, stroke=0)
cv.setFont("Caveat", 13); cv.setFillColor(colors.white)
cv.drawString(x+8, y - title_h + 6, title)
cy = y - title_h - 14
for line in lines:
cv.setFont("Caveat", fs); cv.setFillColor(DK)
cv.drawString(x+8, cy, line); cy -= lh
return y - total_h - 6
def starbox(cv, x, y, w, lines, bg=YB, bdr=YBD, fs=12):
"""Yellow star highlight box. Returns bottom y."""
lh = LG - 2
h = len(lines) * lh + 14
cv.setFillColor(bg); cv.setStrokeColor(bdr); cv.setLineWidth(1.5)
cv.roundRect(x, y - h, w, h, 6, fill=1, stroke=1)
cy = y - 10
for line in lines:
cv.setFont("Caveat", fs); cv.setFillColor(colors.HexColor("#6a4800"))
cv.drawString(x+8, cy, line); cy -= lh
return y - h - 6
def page_header(cv, title, subtitle=None):
"""Big title block at top of each page."""
y = TM - 12
cv.setFont("Caveat", 20); cv.setFillColor(BL)
cv.drawString(LM, y, title)
y -= 7
cv.setStrokeColor(BL); cv.setLineWidth(2)
cv.line(LM, y, RM, y)
y -= 5
if subtitle:
cv.setFont("Caveat", 13); cv.setFillColor(GY)
cv.drawString(LM, y, subtitle)
y -= 5
return y - LG
# =========================================================================
# CONTENT PAGES
# =========================================================================
TOTAL_PAGES = 10
# ─────────────────────────────────────────────────────────────────────────
# PAGE 1 — Cover + Introduction + Definition of Play
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
# Cover title block
y = TM - 10
cv.setFont("Caveat", 28); cv.setFillColor(BL)
cv.drawCentredString(W/2, y, "PLAY: The Occupation of Childhood")
y -= 10
cv.setStrokeColor(BL); cv.setLineWidth(2.5)
cv.line(LM, y, RM, y)
y -= 8
cv.setFont("Caveat", 14); cv.setFillColor(RD)
cv.drawCentredString(W/2, y, "OT Oral Seminar · Interdisciplinary Team · Paediatrics")
y -= LG + 4
divline(cv, y); y -= LG
# 1. INTRODUCTION
y = sec_title(cv, LM, y, "1. INTRODUCTION", BL, 17)
intro_lines = [
"Play is the PRIMARY OCCUPATION of childhood — it is how children learn, grow, relate,",
"and make sense of the world around them.",
"For ALL members of our interdisciplinary team — OT, PT, SLP, Psychologist — understanding",
"play is not optional. It is the FOUNDATION of paediatric clinical practice.",
"Play is the child's natural medium for development across cognitive, social, emotional,",
"language, and motor domains simultaneously.",
"The UN Convention on the Rights of the Child (Article 31) recognises play as a",
"FUNDAMENTAL RIGHT of every child.",
"When a child cannot play → they are missing their primary occupation → clinical priority.",
]
for line in intro_lines:
write(cv, LM, y, line, fs=13); y -= LG - 1
y -= 6
divline(cv, y); y -= LG
# 2. DEFINITION OF PLAY
y = sec_title(cv, LM, y, "2. DEFINITION OF PLAY", BL, 17)
write(cv, LM, y, "No single universal definition — key definitions by theorist:", fs=13, col=GY)
y -= LG + 2
defs = [
(RD, "Reilly (1974)", "\"Play is the arena in which children practice the skills & roles necessary for adult life\""),
(BL, "Piaget (1962)", "Play = pure ASSIMILATION → child makes the world fit their existing schema"),
(GR, "Florey (1971)", "Play = intrinsically motivated behaviour that is ends-in-itself; no external reward"),
(OR, "AOTA", "Spontaneous or organised activity that provides enjoyment, entertainment & diversion"),
(TE, "Bundy (1993)", "Play is a DISPOSITION (playfulness) defined by 3 qualities: see below"),
(PU, "Takata (1974)", "Play is the child's occupational behaviour; assessed via Play History across epochs"),
]
for col, who, defi in defs:
pw = pill(cv, LM, y, who, col, fs=12)
cv.setFont("Caveat", 12); cv.setFillColor(DK)
# wrap if needed
if cv.stringWidth(defi, "Caveat", 12) > (RM - LM - pw - 12):
mid = len(defi)//2
# find nearest space
split = defi.rfind(" ", 0, mid+20)
cv.drawString(LM + pw + 8, y + 2, defi[:split])
y -= LG - 4
cv.drawString(LM + pw + 8, y + 2, defi[split+1:])
else:
cv.drawString(LM + pw + 8, y + 2, defi)
y -= LG + 2
y -= 4
# Bundy box
y = starbox(cv, LM, y, RM - LM, [
"★ BUNDY'S 3 CORE QUALITIES (most cited in OT):",
" ① Intrinsic Motivation → done for pleasure; NO external reward",
" ② Internal Locus of Control → child DIRECTS the action; sense of agency",
" ③ Freedom from Reality → 'what if' space; stick = sword; box = spaceship",
" If ANY of these 3 are absent → it is INSTRUCTION, not play",
], fs=12)
pgnum(cv, 1, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 2 — Characteristics + Importance of Play
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "3. CHARACTERISTICS OF PLAY & 4. IMPORTANCE OF PLAY")
# Characteristics
y = sec_title(cv, LM, y, "3. CHARACTERISTICS OF PLAY", BL, 17)
write(cv, LM, y, "7 universally accepted characteristics — must ALL be present for true play:", fs=13, col=GY)
y -= LG + 2
chars = [
(BL, "Intrinsically Motivated", "Done purely for pleasure; no external reward or goal"),
(GR, "Freely Chosen", "Self-selected; child voluntarily chooses to engage"),
(RD, "Process over Product", "The experience & enjoyment matter MORE than the outcome"),
(OR, "Non-literal / Symbolic", "Suspension of reality; 'what if' thinking is allowed"),
(PU, "Positive Affect", "Generally associated with enjoyment, fun, and enthusiasm"),
(TE, "Active Engagement", "Physical and/or mental involvement of the child"),
(BPU,"Safe Exploration", "Risk-taking occurs within a protected, non-threatening context"),
]
for col, char, explain in chars:
pw = pill(cv, LM, y, char, col, fs=12)
cv.setFont("Caveat", 12); cv.setFillColor(DK)
cv.drawString(LM + pw + 8, y + 2, explain)
y -= LG + 3
y -= 8
divline(cv, y); y -= LG
# Importance
y = sec_title(cv, LM, y, "4. IMPORTANCE OF PLAY", BL, 17)
write(cv, LM, y, "Play builds ALL domains of child development simultaneously:", fs=13, col=GY)
y -= LG + 4
domains = [
(BL, "COGNITIVE", ["Problem-solving, creativity, cause-and-effect", "Attention, memory, executive function", "Symbolic thinking, concept formation"]),
(GR, "LANGUAGE", ["Vocabulary expansion, narrative skills", "Turn-taking, pragmatics, conversational rules", "Joint attention and shared reference"]),
(RD, "SOCIAL", ["Empathy, cooperation, conflict resolution", "Theory of Mind (understanding others' perspective)", "Rule understanding, negotiation"]),
(OR, "EMOTIONAL", ["Self-regulation, frustration tolerance", "Expression of feelings, coping skills", "Resilience and emotional literacy"]),
(PU, "MOTOR", ["Gross motor: balance, coordination, strength", "Fine motor: manipulation, tool use", "Sensory integration and body awareness"]),
(TE, "IDENTITY", ["Sense of self, mastery, autonomy", "Role exploration and identity formation", "Confidence and self-efficacy"]],
]
# 2-column layout
col1x = LM; col2x = LM + (RM-LM)//2 + 8
cw = (RM - LM)//2 - 10
left = domains[:3]
right = domains[3:]
base_y = y
for col, dom, pts in left:
write(cv, col1x, y, dom, fs=14, col=col)
cv.setStrokeColor(col); cv.setLineWidth(1)
cv.line(col1x, y-2, col1x + cv.stringWidth(dom,"Caveat",14), y-2)
y -= LG - 2
for pt in pts:
subbul(cv, col1x, y, pt, fs=12); y -= LG - 5
y -= 6
y2 = base_y
for col, dom, pts in right:
write(cv, col2x, y2, dom, fs=14, col=col)
cv.setStrokeColor(col); cv.setLineWidth(1)
cv.line(col2x, y2-2, col2x + cv.stringWidth(dom,"Caveat",14), y2-2)
y2 -= LG - 2
for pt in pts:
subbul(cv, col2x, y2, pt, fs=12); y2 -= LG - 5
y2 -= 6
y = min(y, y2) - 8
y = starbox(cv, LM, y, RM-LM, [
"★ UN CRC Article 31: Play is a FUNDAMENTAL RIGHT of every child",
"★ Play is not a break from development — it IS development",
"★ A child deprived of play is experiencing OCCUPATIONAL DEPRIVATION (Reilly, 1974)",
], fs=12)
pgnum(cv, 2, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 3 — Play Development Across Age Groups (Birth–7 yr)
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "5. PLAY DEVELOPMENT ACROSS AGE GROUPS (Part 1)")
age_groups_1 = [
(RD, "Birth – 3 months",
["Sensory exploration; reflexive interaction",
"Attends to faces, voices, contrasting visuals",
"Social smiling emerges ~6 weeks",
"Early turn-taking via gaze + vocalisation (proto-conversations)",
"Play type: Reactive; caregiver-initiated"]),
(OR, "3 – 6 months",
["Reaches + grasps objects; mouths for oral exploration",
"Enjoys rattles, textures, visual mobiles",
"Laughter + vocalisation during social games",
"Cause-and-effect discovery begins",
"Play type: Sensorimotor"]),
(GR, "6 – 12 months",
["Bangs, drops, throws → exploring object properties",
"Object permanence ~9 months → peek-a-boo is now meaningful",
"Joint attention emerges: pointing + following gaze ← SLP key milestone",
"Functional object use begins: phone to ear, comb to hair",
"Play type: Exploratory + early functional"]),
(BL, "1 – 2 years",
["Functional object use (cup to drink, spoon to feed)",
"Early pretend with OWN body (pretends to eat, sleep)",
"Parallel play begins; sorts shapes + colours",
"Builds 2–4 block towers; make-believe begins",
"Play type: Functional + early symbolic"]),
(PU, "2 – 3 years",
["Symbolic play expands: block = car; feeds mother with empty spoon",
"Pretend sequences emerge (cooking then eating)",
"Parallel play predominates — plays BESIDE others, not WITH",
"Builds 6-block towers; completes simple puzzles",
"Play type: Symbolic + parallel social"]),
(TE, "3 – 5 years",
["Dramatic/pretend play flourishes (doctor, parent, teacher)",
"Associative play → cooperative play by age 4–5",
"Imaginary companions common (up to 50% of children age 3–10!)",
"Understands simple rules in games",
"Play type: Dramatic, associative, early cooperative"]),
(RD, "5 – 7 years",
["Cooperative play with rules established",
"Board games, organised sports, team activities",
"Understands fairness, competition, turn-taking",
"Play type: Games with Rules + constructive"]),
]
for col, age, pts in age_groups_1:
if y < BM + 60:
pgnum(cv, 3, TOTAL_PAGES); cv.showPage()
ruled_bg(cv); y = page_header(cv, "5. PLAY DEVELOPMENT (continued)")
pw = pill(cv, LM, y, age, col, fs=13)
y -= LG + 2
for pt in pts:
is_type = pt.startswith("Play type")
sym = "▸" if is_type else "·"
sc = col if is_type else GY
fc = col if is_type else DK
cv.setFont("Caveat", 12 if not is_type else 13)
cv.setFillColor(sc); cv.drawString(LM+14, y, sym)
cv.setFillColor(fc); cv.drawString(LM+24, y, pt)
y -= LG - 4
y -= 6
pgnum(cv, 3, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 4 — Play Development 7–Adolescence + Parten's Social Stages
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "5. PLAY DEVELOPMENT (Part 2) + 6. CLASSIFICATIONS — PARTEN")
age_groups_2 = [
(BL, "7 – 12 years",
["Complex team games; hobbies emerge (collecting, sports, crafts)",
"Rule-governed play dominates; logical strategy involved",
"Peer relationships and social hierarchy appear in play",
"Fantasy shifts to structured creative activities",
"Play type: Games with Rules + constructive + competitive"]),
(GR, "Adolescence",
["Play transitions to leisure, recreation, social activities",
"Sports, music, art, digital games, creative writing",
"Identity exploration through hobbies + group membership",
"Peer relationships are the central 'play' context",
"Play type: Recreational/leisure + competitive/cooperative"]),
]
for col, age, pts in age_groups_2:
pw = pill(cv, LM, y, age, col, fs=13)
y -= LG + 2
for pt in pts:
is_type = pt.startswith("Play type")
sc = col if is_type else GY; fc = col if is_type else DK
cv.setFont("Caveat", 12 if not is_type else 13)
cv.setFillColor(sc); cv.drawString(LM+14, y, "▸" if is_type else "·")
cv.setFillColor(fc); cv.drawString(LM+24, y, pt)
y -= LG - 4
y -= 8
divline(cv, y); y -= LG
# PARTEN
y = sec_title(cv, LM, y, "6A. PARTEN'S SOCIAL STAGES OF PLAY (1932)", RD, 17)
write(cv, LM, y, "Classified by DEGREE OF SOCIAL PARTICIPATION → 6 stages; broadly sequential but not mutually exclusive", fs=12, col=GY)
y -= LG + 4
parten_stages = [
(1, "Unoccupied Play", "Birth–3m", "Random movements; no purpose; not engaging with toys or people",
colors.HexColor("#999999")),
(2, "Solitary Play", "0–2 yr", "Plays completely alone; no interest in others ✓ Normal & healthy at this age",
colors.HexColor("#3388cc")),
(3, "Onlooker Play", "~2 yr", "Watches others play but does NOT join; observational learning still occurring",
colors.HexColor("#33aaaa")),
(4, "Parallel Play", "2–2.5 yr", "Plays BESIDE others with similar toys; NO interaction; no shared goal",
colors.HexColor("#33aa55")),
(5, "Associative Play", "3–4 yr", "Interacts; shares toys + space; common theme BUT no organised goal or roles",
OR),
(6, "Cooperative Play", "4+ yr", "Organised group; shared goal; defined roles + rules + turn-taking; needs empathy",
RD),
]
for num, name, age, desc, col in parten_stages:
# row background
bg = colors.HexColor("#fff5f5") if num % 2 == 0 else colors.HexColor("#ffffff")
cv.setFillColor(bg); cv.roundRect(LM, y-6, RM-LM, 22, 4, fill=1, stroke=0)
# number circle
cv.setFillColor(col); cv.circle(LM+10, y+5, 9, fill=1, stroke=0)
cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawCentredString(LM+10, y+2, str(num))
# name pill
nw = pill(cv, LM+24, y, name, col, fs=12)
# age badge
aw = agebadge(cv, LM+26+nw, y, age, col)
# description
cv.setFont("Caveat", 12); cv.setFillColor(DK)
cv.drawString(LM+30+nw+aw, y+2, desc)
y -= LG + 4
y -= 4
y = starbox(cv, LM, y, RM-LM, [
"⚠ CLINICAL NOTE: Regression to earlier social stages in older children = significant flag",
" Sustained solitary play in a 4-yr-old → assess for ASD, anxiety, social communication disorder",
"★ Stages are SEQUENTIAL in development but can ALL coexist in older children",
], fs=12)
pgnum(cv, 4, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 5 — Piaget + Smilansky + Takata
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "6. CLASSIFICATIONS — PIAGET | SMILANSKY | TAKATA")
# PIAGET
y = sec_title(cv, LM, y, "6B. PIAGET'S COGNITIVE STAGES OF PLAY (1962)", BL, 17)
write(cv, LM, y, "Play reflects how children PROCESS + ASSIMILATE the world → linked directly to cognitive development stage", fs=12, col=GY)
y -= LG + 4
piaget_stages = [
(BL, "Stage 1: Practice (Sensorimotor) Play", "Birth – 2 yrs | Sensorimotor Stage",
["Repetitive motor actions performed for PLEASURE",
"Examples: banging blocks, splashing water, rolling a ball",
"Purpose: consolidating sensorimotor schemas",
"Key feature: pure ASSIMILATION — repeating what is already known"]),
(colors.HexColor("#3355cc"), "Stage 2: Symbolic (Pretend) Play", "2 – 7 yrs | Preoperational Stage",
["USE OF SYMBOLS — one thing represents another",
"Examples: stick = sword; box = spaceship; doll = real baby",
"Piaget: 'symbols express what language alone cannot formulate'",
"Features: deferred imitation, make-believe, role-play, symbolisation",
"Semiotic function emerges here (language + thought connection)"]),
(colors.HexColor("#0a2080"), "Stage 3: Games with Rules", "7+ yrs | Concrete Operational Stage",
["Structured games governed by AGREED rules",
"Examples: chess, cricket, board games, team sports",
"Child not only FOLLOWS rules but CREATES + DEFENDS them",
"Purpose: social coordination, logical reasoning, moral development"]),
]
for col, sname, subtitle, pts in piaget_stages:
pw = pill(cv, LM, y, sname, col, fs=12)
y -= LG - 2
cv.setFont("Caveat", 11); cv.setFillColor(col); cv.drawString(LM+10, y, subtitle)
y -= LG - 2
for pt in pts:
cv.setFont("Caveat", 12); cv.setFillColor(DK)
cv.drawString(LM+14, y, "→ "+pt); y -= LG - 4
y -= 6
divline(cv, y); y -= LG
# SMILANSKY
y = sec_title(cv, LM, y, "6C. SMILANSKY'S FUNCTIONAL CLASSIFICATION (1968)", GR, 17)
write(cv, LM, y, "Built on Piaget; MOST PRACTICALLY USED in clinic + classroom → 4 categories", fs=12, col=GY)
y -= LG + 4
smil_stages = [
(TE, "1. Functional Play", "0–2 yr",
"Simple repetitive actions ± objects | Running, banging, rolling | = Piaget Practice Play | Builds sensorimotor skill"),
(GR, "2. Constructive Play", "2–6 yr",
"Using materials to CREATE/BUILD | Blocks, sand, drawing, puzzles | ~50% of all preschool play | Spatial reasoning + persistence"),
(RD, "3. Dramatic Play", "2–7 yr",
"Role-play + acting out scenarios | Playing house/doctor/teacher | Sociodramatic = 2+ children | ToM, language, self-regulation"),
(PU, "4. Games with Rules", "6+ yr",
"Pre-established rules accepted by all | Cards, sports, board games | = Piaget Games with Rules | Inhibitory control + social coord."),
]
for col, sname, age, desc in smil_stages:
pw = pill(cv, LM, y, sname, col, fs=13)
aw = agebadge(cv, LM+pw+8, y, age, col)
y -= LG
# split desc at |
parts = [p.strip() for p in desc.split("|")]
line1 = " · ".join(parts[:2])
line2 = " · ".join(parts[2:]) if len(parts) > 2 else ""
cv.setFont("Caveat", 12); cv.setFillColor(DK)
cv.drawString(LM+12, y, line1); y -= LG - 4
if line2:
cv.drawString(LM+12, y, line2); y -= LG - 4
y -= 5
divline(cv, y); y -= LG
# TAKATA
y = sec_title(cv, LM, y, "6D. TAKATA'S PLAY EPOCHS (1974)", OR, 17)
write(cv, LM, y, "OT-SPECIFIC model → basis for the PLAY HISTORY assessment interview | 5 epochs across the lifespan", fs=12, col=GY)
y -= LG + 4
takata_epochs = [
(1, "Sensorimotor", "0–2 yr", "Sensory/motor exploration; pleasure from movement; object manipulation; no rules; self-focused"),
(2, "Symbolic/Simple", "2–4 yr", "Imitates adult roles; make-believe + pretend; brief cooperation; fantasy predominates"),
(3, "Dramatic/Complex", "4–7 yr", "Elaborate role-play; peers essential; constructive creation; simple rules understood"),
(4, "Games / Skills", "7–12 yr", "Rule-governed games; competition + team play; skill building (sports, crafts); peer approval important"),
(5, "Recreational", "12+ yr", "Leisure + hobbies; identity through play; social + creative expression; play → adult recreation"),
]
for num, ename, age, desc in takata_epochs:
col = OR
cv.setFillColor(colors.HexColor("#fff5e0")); cv.roundRect(LM, y-6, RM-LM, 22, 4, fill=1, stroke=0)
cv.setFillColor(OR); cv.circle(LM+10, y+5, 9, fill=1, stroke=0)
cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawCentredString(LM+10, y+2, str(num))
nw = pill(cv, LM+24, y, ename, OR, fs=12)
aw = agebadge(cv, LM+26+nw, y, age, OR)
cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+30+nw+aw, y+2, desc)
y -= LG + 4
y = starbox(cv, LM, y, RM-LM, [
"★ Takata's Play History: OT interviews caregiver about play across ALL 5 epochs",
" Covers: what child played, with whom, where, for how long, what was enjoyed",
"★ Absence of play in any epoch = occupational deprivation → must address in OT plan",
], fs=12)
pgnum(cv, 5, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 6 — Florey, Reilly, Knox, Bundy
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "6. CLASSIFICATIONS — FLOREY | REILLY | KNOX | BUNDY")
# FLOREY
y = sec_title(cv, LM, y, "6E. FLOREY'S PLAY MODEL (1971)", TE, 17)
write(cv, LM, y, "Core premise: Play = intrinsically motivated behaviour that is ENDS-IN-ITSELF", fs=13)
y -= LG + 2
florey_pts = [
("Intrinsic motivation", "No external reward needed — child plays because it IS pleasurable"),
("Exploratory drive", "Child naturally seeks novelty and new stimuli in the environment"),
("Effectance motivation", "Drive to AFFECT and master the environment builds competence"),
("Process focus", "Enjoyment is in the DOING, not the product or outcome"),
("Freedom from ext. rules", "Child sets own agenda; cannot be externally imposed"),
("Voluntary participation", "Cannot be forced; if forced → it is NOT play by definition"),
]
for concept, explain in florey_pts:
cw2 = cv.stringWidth(concept, "Caveat", 12) + 12
cv.setFillColor(colors.HexColor("#c0f0ea")); cv.setStrokeColor(TE); cv.setLineWidth(0.8)
cv.roundRect(LM+4, y-2, cw2, 16, 4, fill=1, stroke=1)
cv.setFont("Caveat", 12); cv.setFillColor(TE); cv.drawString(LM+8, y+2, concept)
cv.setFont("Caveat", 12); cv.setFillColor(DK)
cv.drawString(LM+cw2+12, y+2, "→ "+explain)
y -= LG + 1
y -= 4
bul(cv, LM, y, "Influenced Bundy's playfulness model | Closely linked to Reilly's Occupational Behaviour theory", fs=12, scol=TE); y -= LG
y -= 6
divline(cv, y); y -= LG
# REILLY
y = sec_title(cv, LM, y, "6F. REILLY'S OCCUPATIONAL BEHAVIOUR (1974)", RD, 17)
write(cv, LM, y, "\"Play is the arena in which children practice the skills & roles necessary for adult life\" — Mary Reilly", fs=13, col=RD)
y -= LG + 4
write(cv, LM, y, "Reilly's 3-Level Hierarchy of Play:", fs=14, col=RD); y -= LG + 2
reilly_hier = [
("1. Exploratory", "Birth–2yr", "Sensory/motor curiosity; intrinsic drive to explore; no goal; sensation-seeking"),
("2. Competency", "2–7yr", "Practice + repetition; mastery motivation; trying harder; skill development"),
("3. Achievement", "7+ yr", "Rules, competition, standards; external validation; performance in play"),
]
for stage, age, desc in reilly_hier:
pw = pill(cv, LM, y, stage, RD, fs=13)
aw = agebadge(cv, LM+pw+8, y, age, RD)
cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+pw+aw+14, y+2, desc)
y -= LG + 4
reilly_pts = [
"First OT theorist to frame play as PURPOSEFUL OCCUPATION of childhood",
"Play develops habits, roles + skills for adult life performance",
"Play deprivation = OCCUPATIONAL DEPRIVATION (clinical + ethical concern)",
"Foundation of ALL modern OT paediatric occupation-based practice",
]
for pt in reilly_pts:
bul(cv, LM, y, pt, fs=12, scol=RD); y -= LG - 2
y -= 8
divline(cv, y); y -= LG
# KNOX
y = sec_title(cv, LM, y, "6G. KNOX PRESCHOOL PLAY SCALE (1974; revised 1997)", PU, 17)
write(cv, LM, y, "Observational scale | Age: 0–6 yr | Scored in 6-month intervals | Naturalistic; no standard tasks needed", fs=12, col=GY)
y -= LG + 4
write(cv, LM, y, "4 Dimensions of Play:", fs=14, col=PU); y -= LG + 2
knox_dims = [
(PU, "1. Space Management", "Use of body in space; gross motor control; rough & tumble; outdoor + indoor interest"),
(colors.HexColor("#7a22bb"), "2. Material Management", "How child handles objects; manipulation + construction; attention + creativity with objects"),
(colors.HexColor("#9900cc"), "3. Imitation", "Social knowledge dev.; imitates people + situations; pretend + symbolic use; understanding social world"),
(colors.HexColor("#5500aa"), "4. Participation", "Degree of social involvement; type + amount of interaction; language in play; cooperation"),
]
for col, dim, desc in knox_dims:
dw = cv.stringWidth(dim, "Caveat", 13) + 12
cv.setFillColor(colors.HexColor("#ece0ff")); cv.setStrokeColor(col); cv.setLineWidth(0.8)
cv.roundRect(LM+4, y-2, dw, 16, 4, fill=1, stroke=1)
cv.setFont("Caveat", 13); cv.setFillColor(col); cv.drawString(LM+8, y+2, dim)
cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+dw+14, y+2, desc)
y -= LG + 2
y -= 8
divline(cv, y); y -= LG
# BUNDY
y = sec_title(cv, LM, y, "6H. BUNDY'S PLAYFULNESS MODEL + TEST OF PLAYFULNESS (1993)", BPU, 17)
write(cv, LM, y, "Play = a DISPOSITION (playfulness) — not just an activity type | Quality of play matters more than category", fs=12, col=GY)
y -= LG + 4
bundy_elems = [
(BPU, "① Intrinsic Motivation", "0–2yr", "Doing for OWN sake; no external reward; drives genuine engagement"),
(colors.HexColor("#aa00aa"), "② Internal Locus of Control", "2–7yr", "Child DIRECTS the action; chooses what/how to play; sense of agency"),
(colors.HexColor("#660066"), "③ Freedom from Reality", "7+yr", "Suspend real-world rules; 'what if' thinking; stick=sword; box=castle"),
]
for col, elem, age, desc in bundy_elems:
pw = pill(cv, LM, y, elem, col, fs=13)
cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+pw+10, y+2, desc)
y -= LG + 3
y -= 2
write(cv, LM, y, "Test of Playfulness (ToP):", fs=14, col=BPU); y -= LG - 2
top_pts = [
"Age range: 6 months – 18 years",
"30 observational items; rates EXTENT, INTENSITY + SKILL of playfulness",
"Measures QUALITY of play — not just play type or category",
"Setting: natural play environment (NOT a clinic room with standard tasks)",
"4th element added later: CONTEXT (does the environment support play?)",
"Most OT-specific, clinically validated play measure available",
]
for pt in top_pts:
bul(cv, LM, y, pt, fs=12, scol=BPU); y -= LG - 2
pgnum(cv, 6, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 7 — Comparison Table + Red Flags
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "7. COMPARISON OF CLASSIFICATIONS + 8. RED FLAGS")
y = sec_title(cv, LM, y, "7. COMPARISON OF ALL PLAY CLASSIFICATION FRAMEWORKS", BL, 17)
# Table
headers = ["Framework", "Year", "Focus", "Stages", "Unique Contribution", "OT Tool / Method"]
col_xs = [LM, LM+105, LM+165, LM+225, LM+345, LM+480]
col_ws = [103, 58, 58, 118, 133, W-LM-30-480+LM]
# header row
cv.setFillColor(BL)
cv.rect(LM, y-4, RM-LM, 18, fill=1, stroke=0)
for i, h in enumerate(headers):
cv.setFont("Caveat", 11); cv.setFillColor(colors.white)
cv.drawString(col_xs[i]+3, y+1, h)
y -= LG + 2
table_rows = [
["Parten (1932)", "1932", "Social participation", "6", "Social complexity ladder", "Observation"],
["Piaget (1962)", "1962", "Cognitive stage", "3", "Play ↔ cognition link", "Play, Dreams & Imitation"],
["Smilansky (1968)", "1968", "Functional type", "4", "Added Constructive Play", "Classroom / clinic Ax"],
["Takata (1974)", "1974", "Play history epochs", "5", "OT Play History interview", "Play History (OT)"],
["Florey (1971)", "1971", "Intrinsic motivation", "–", "Play = ends-in-itself", "Theoretical model"],
["Reilly (1974)", "1974", "Occupational behaviour", "3", "Play as child's occupation", "OB Theory"],
["Knox (1974/1997)", "1997", "4 play dimensions", "–", "Naturalistic observation tool", "RKPPS (0–6 yr)"],
["Bundy (1993)", "1993", "Playfulness quality", "3", "Playfulness as disposition", "Test of Playfulness"],
]
row_bgs = [colors.HexColor("#fff0f0"), colors.HexColor("#eef4ff"), colors.HexColor("#efffef"),
colors.HexColor("#fff4e0"), colors.HexColor("#e8fff8"), colors.HexColor("#fff0e0"),
colors.HexColor("#f0e8ff"), colors.HexColor("#fff0ff")]
row_fgs = [RD, BL, GR, OR, TE, RD, PU, BPU]
for ri, row in enumerate(table_rows):
cv.setFillColor(row_bgs[ri]); cv.setStrokeColor(colors.HexColor("#cccccc")); cv.setLineWidth(0.5)
cv.rect(LM, y-4, RM-LM, 17, fill=1, stroke=1)
for ci, cell in enumerate(row):
cv.setFont("Caveat", 11 if ci == 0 else 10)
cv.setFillColor(row_fgs[ri] if ci == 0 else DK)
cv.drawString(col_xs[ci]+3, y, cell)
y -= LG
y -= 4
y = starbox(cv, LM, y, RM-LM, [
"★ These frameworks are COMPLEMENTARY — use multiple lenses for one child",
" Parten → HOW social | Piaget → WHAT cognitive level | Smilansky → WHAT type",
" Takata → play HISTORY | Bundy → QUALITY of playfulness | Knox → 4 DIMENSIONS",
], fs=12)
divline(cv, y); y -= LG
# RED FLAGS
y = sec_title(cv, LM, y, "8. RED FLAGS IN PLAY DEVELOPMENT", RD, 17)
write(cv, LM, y, "When to be concerned — act early!", fs=13, col=RD); y -= LG + 4
red_flags = [
("12 months", "No functional object use | No gesture | No joint attention"),
("18 months", "No pretend play of ANY kind | No symbolic object use | < 10 words"),
("24 months", "No symbolic play | Stuck in solitary play | No 2-word phrases"),
("36 months", "No dramatic or role play | No peer engagement of any kind"),
("4–5 years", "Cannot engage in cooperative play | Aggressive disruption of games"),
("Any age", "Repetitive / stereotyped play with NO variation → ASD red flag"),
("Any age", "Regression to earlier play stages after a stressor → psychological concern"),
("Any age", "Sexualised or aggressively scripted play child cannot shift away from → trauma screen"),
]
for age_f, flag in red_flags:
aw = cv.stringWidth(age_f, "Caveat", 12) + 10
cv.setFillColor(RD); cv.roundRect(LM, y-2, aw, 17, 5, fill=1, stroke=0)
cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawString(LM+5, y+2, age_f)
cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+aw+8, y+2, flag)
y -= LG + 2
y = starbox(cv, LM, y, RM-LM, [
"ASD-Specific Red Flags in Play:",
" ✗ Absent or minimal pretend / symbolic play",
" ✗ No interest in interactive or shared play with others",
" ✗ Repetitive stereotyped object use (spinning wheels, lining up objects)",
" ✗ No imitation of others | No sociodramatic play by age 3",
" → Any 2+ flags: refer for ASD assessment + OT + SLP + developmental paediatrics",
], fs=12, bg=colors.HexColor("#fff0f0"), bdr=RD)
pgnum(cv, 7, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 8 — Play Assessment
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "9. PLAY ASSESSMENT")
y = sec_title(cv, LM, y, "9. PLAY ASSESSMENT", BL, 17)
write(cv, LM, y, "3 complementary approaches — use in combination for complete picture:", fs=13, col=GY)
y -= LG + 6
# 9.1 Clinical Observation
y = sec_title(cv, LM, y, "9.1 Clinical Observation", GR, 15)
write(cv, LM, y, "Observe the child across 3 domains:", fs=13); y -= LG + 2
obs_domains = [
(BL, "Cognitive", "Problem-solving, symbolic use, attention span, sequencing, creativity"),
(GR, "Social-Emotional","Eye contact, turn-taking, affect, relatedness to examiner + caregiver"),
(RD, "Sensorimotor", "Coordination, motor control, sensory responses, tool use, body awareness"),
]
for col, dom, desc in obs_domains:
pw = pill(cv, LM+4, y, dom, col, fs=12)
cv.setFont("Caveat", 12); cv.setFillColor(DK); cv.drawString(LM+pw+12, y+2, desc)
y -= LG + 2
y -= 4
obs_tips = [
"Provide open-ended toys: blocks, dolls, play-dough, cars, kitchen set",
"Observe in CHILD-LED and THERAPIST-DIRECTED conditions",
"Note: flexibility, creativity, affect, persistence, frustration tolerance",
"Note what is ABSENT: no imitation, no pretend, no peer engagement",
"Kaplan & Sadock: 'during imaginative play, clinician observes coordination,",
" speech + language, attention span, readiness to engage, capacity for complex thought'",
]
for pt in obs_tips:
bul(cv, LM, y, pt, fs=12, scol=GR); y -= LG - 2
y -= 8
divline(cv, y, GY); y -= LG
# 9.2 Parent/Caregiver Interview
y = sec_title(cv, LM, y, "9.2 Parent / Caregiver Interview", OR, 15)
interview_qs = [
"What does the child enjoy playing? Alone or with others?",
"Does the child engage in pretend play? Can they describe scenarios?",
"Does the child play differently at home vs school vs unfamiliar settings?",
"Are there preferred objects? Any repetitive or rigid play patterns?",
"Has play changed recently? (regression is clinically significant)",
"Does the child invite others to play or prefer isolation?",
]
for q in interview_qs:
bul(cv, LM, y, q, fs=12, sym="Q:", scol=OR); y -= LG - 2
y -= 8
divline(cv, y, GY); y -= LG
# 9.3 Standardised Tools
y = sec_title(cv, LM, y, "9.3 Standardised Play Assessments", PU, 15)
tools = [
("Test of Playfulness (ToP)", "6mo–18yr", "Bundy's 3 qualities; extent, intensity + skill; naturalistic", "OT"),
("Knox RKPPS", "0–6yr", "4 dimensions: space, material, imitation, participation", "OT"),
("Symbolic Play Test (SPT)", "1–3yr", "Symbolic play level; non-verbal cognitive ability", "SLP / OT"),
("Westby Play Scale", "9mo–5yr", "Sequential symbolic play development milestones", "SLP / OT"),
("ChIPPA", "3–7yr", "Elaborateness + spontaneity of pretend play", "OT"),
("Play History (Takata)", "All ages", "OT interview-based occupational history of play", "OT"),
("TPBA (Transdisciplinary PBA)", "0–6yr", "Multi-domain developmental assessment through play — TEAM tool","ALL"),
]
t_xs = [LM, LM+164, LM+216, LM+396]
t_hds = ["Tool", "Age", "Measures", "Used By"]
cv.setFillColor(PU); cv.rect(LM, y-4, RM-LM, 17, fill=1, stroke=0)
for i, h in enumerate(t_hds):
cv.setFont("Caveat", 11); cv.setFillColor(colors.white); cv.drawString(t_xs[i]+3, y, h)
y -= LG
for ri, (tool, age, meas, by) in enumerate(tools):
bg2 = colors.HexColor("#f8f0ff") if ri % 2 == 0 else colors.HexColor("#ffffff")
cv.setFillColor(bg2); cv.setStrokeColor(colors.HexColor("#cccccc")); cv.setLineWidth(0.4)
cv.rect(LM, y-4, RM-LM, 17, fill=1, stroke=1)
cv.setFont("Caveat", 11); cv.setFillColor(PU if by=="OT" else (RD if by=="ALL" else GR))
cv.drawString(t_xs[0]+3, y, tool)
cv.setFillColor(DK); cv.drawString(t_xs[1]+3, y, age)
cv.drawString(t_xs[2]+3, y, meas)
cv.setFillColor(RD if by=="ALL" else BL); cv.drawString(t_xs[3]+3, y, by)
y -= LG
y = starbox(cv, LM, y, RM-LM, [
"★ GOLD STANDARD: TPBA — observe play as a TEAM; all disciplines together",
"★ Play assessment = developmental assessment: you learn cognitive + language + motor + social simultaneously",
], fs=12)
pgnum(cv, 8, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 9 — Play as Intervention + Clinical Case
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "10. PLAY AS INTERVENTION + 11. CLINICAL CASE EXAMPLE")
y = sec_title(cv, LM, y, "10. PLAY AS AN INTERVENTION", BL, 17)
disciplines = [
(BL, "Occupational Therapy",
["Play is BOTH the MEANS and the END in OT (AOTA Framework)",
"Play as MEANS: use play to build sensory processing, fine motor, ADL, social skills",
"Play as END: restore child's ability to engage in play as a meaningful occupation",
"Approaches: Sensory Integration (Ayres), DIR/Floortime, NDT, CO-OP, Social Thinking",
"Setting: clinic, home, school, hospital Child Life programmes"]),
(GR, "Physiotherapy",
["Uses play to achieve motor goals: balance, coordination, strength, gait",
"Play-based exercise (obstacle courses, ball games) increases engagement + motivation",
"Used in: cerebral palsy, developmental delay, post-surgical rehab, paediatric neurology",
"Key principle: child doesn't know they are 'doing therapy' — they are just playing"]),
(RD, "Speech-Language Therapy",
["Play provides the NATURAL CONTEXT for language intervention",
"Joint attention, turn-taking, narrative play all targeted through play",
"Symbolic play level ≈ language level → low symbolic play = language delay risk",
"Approaches: SCERTS, Hanen 'It Takes Two to Talk', DIR/Floortime",
"Assess play → determines cognitive-linguistic READINESS for therapy targets"]),
(OR, "Psychology",
["Play Therapy (Axline): structured or non-directive; child expresses through play",
"Child uses play to communicate what they cannot yet verbalise",
"Used in: trauma, anxiety, ADHD, family disruption, grief, abuse",
"Evidence: cooperative play + creative-expressive activities improve PTSD outcomes",
"(Kaplan & Sadock: maintained improvement over 6 months in PTSD symptoms + hope)"]),
(PU, "Special Education",
["Play-based learning embedded in curriculum for children with disabilities",
"Peer-mediated play interventions for children with ASD",
"Structured play groups to build social communication + executive function",
"Sociodramatic play used to develop literacy, numeracy, and joint planning skills"]),
]
for col, disc, pts in disciplines:
if y < BM + 55:
pgnum(cv, 9, TOTAL_PAGES); cv.showPage()
ruled_bg(cv); y = page_header(cv, "10. PLAY AS INTERVENTION (continued)")
pw = pill(cv, LM, y, disc, col, fs=13)
y -= LG + 2
for pt in pts:
cv.setFont("Caveat", 12); cv.setFillColor(col); cv.drawString(LM+12, y, "▸")
cv.setFillColor(DK); cv.drawString(LM+22, y, pt)
y -= LG - 3
y -= 6
divline(cv, y); y -= LG
# CASE EXAMPLE
y = sec_title(cv, LM, y, "11. CLINICAL CASE EXAMPLE", GR, 17)
write(cv, LM, y, "Aarav, 3.5 years — referred for developmental concern", fs=14, col=GR); y -= LG + 2
case_lines = [
"PRESENTING CONCERN: 'Plays alone all the time; doesn't play with other kids;",
" lines up toys and screams when moved'",
"",
"PLAY ASSESSMENT FINDINGS:",
" · No symbolic or pretend play (only functional/exploratory)",
" · No imitation of examiner's actions",
" · Object play: repetitive (spins wheels only — no functional car play)",
" · No eye contact during play; does not direct examiner's attention",
" · Parent report: no role-play at home; prefers same toys daily",
"",
"CLINICAL INTERPRETATION:",
" · Social play level: Solitary (Parten Stage 2) — expected 0–2yr, not 3.5yr",
" · Cognitive play: Functional only (Smilansky Stage 1) — expected 0–2yr",
" · Piaget level: remains in sensorimotor; no evidence of symbolic/preoperational play",
" · ASD Red Flags: absent symbolic play, no imitation, stereotyped object use",
"",
"OUTCOME: Referred for ASD evaluation + OT + SLP + Developmental Paediatrics",
"",
"INTERVENTION PLAN:",
" · OT: Sensory Integration + DIR/Floortime to develop symbolic play",
" · SLP: Joint attention + early symbolic play via SCERTS framework",
" · Psychology: Parent-mediated play coaching",
" · Special Ed: Structured peer play group",
]
for line in case_lines:
if line == "":
y -= 5; continue
col2 = GR if line.endswith(":") else DK
fs2 = 13 if line.startswith("PRESENTING") or line.startswith("PLAY") or line.startswith("CLINICAL") or line.startswith("OUTCOME") or line.startswith("INTERVENTION") else 12
write(cv, LM + (0 if not line.startswith(" ") else 10), y, line, fs=fs2, col=col2)
y -= LG - 3
pgnum(cv, 9, TOTAL_PAGES)
cv.showPage()
# ─────────────────────────────────────────────────────────────────────────
# PAGE 10 — Key Take-Home Messages + Conclusion
# ─────────────────────────────────────────────────────────────────────────
ruled_bg(cv)
y = page_header(cv, "12. KEY TAKE-HOME MESSAGES + 13. CONCLUSION")
y = sec_title(cv, LM, y, "12. KEY TAKE-HOME MESSAGES", BL, 17)
messages = [
(BL, "1", "Play = PRIMARY OCCUPATION of childhood — not trivial, not optional"),
(GR, "2", "Play reflects ALL domains of development simultaneously"),
(RD, "3", "Use Parten + Piaget + Smilansky + Takata + Knox + Bundy as COMPLEMENTARY lenses"),
(OR, "4", "Symbolic play is the MOST SENSITIVE early marker of cognitive + social-communicative dev."),
(PU, "5", "ABSENT pretend play by 18 months = RED FLAG for ASD — act immediately"),
(TE, "6", "Play assessment = developmental assessment (cognitive + language + motor + social at once)"),
(BPU, "7", "Every team member has a play-based approach specific to their domain — know yours"),
(RD, "8", "A child who CANNOT play = missing their primary occupation = clinical priority"),
(GR, "9", "Florey + Reilly = OT's THEORETICAL BASE | Knox + Bundy = OT's ASSESSMENT TOOLS"),
(BL, "10", "TPBA = gold standard: observe play as a team; plan as a team"),
]
for col, num, msg in messages:
# numbered circle
cv.setFillColor(col); cv.circle(LM+10, y+5, 10, fill=1, stroke=0)
cv.setFont("Caveat", 12); cv.setFillColor(colors.white); cv.drawCentredString(LM+10, y+2, num)
cv.setFont("Caveat", 13); cv.setFillColor(DK); cv.drawString(LM+26, y+2, msg)
y -= LG + 4
y -= 8
divline(cv, y); y -= LG
# CONCLUSION
y = sec_title(cv, LM, y, "13. CONCLUSION", BL, 17)
conclusion_lines = [
"Play is far more than entertainment. It is the mechanism through which children develop",
"cognitively, emotionally, socially, linguistically, and motorically.",
"",
"The eight classification frameworks — Parten, Piaget, Smilansky, Takata, Florey, Reilly,",
"Knox, and Bundy — each offer a unique and complementary lens through which we can observe,",
"assess, and interpret a child's play behaviour.",
"",
"Clinically, the ABSENCE or REGRESSION of play is a sentinel event that warrants systematic",
"evaluation. Every paediatric clinician, regardless of discipline, must be fluent in the",
"language of play — because it is how children speak about their development.",
"",
"Our job as an interdisciplinary team is to understand play well enough to recognise when",
"it is going wrong, assess it with precision, and intervene with intention.",
]
for line in conclusion_lines:
if line == "":
y -= 6; continue
write(cv, LM, y, line, fs=13); y -= LG - 2
y -= 12
# Final quote box
cv.setFillColor(colors.HexColor("#eef4ff")); cv.setStrokeColor(BL); cv.setLineWidth(2)
cv.roundRect(LM, y-32, RM-LM, 36, 8, fill=1, stroke=1)
cv.setFont("Caveat", 16); cv.setFillColor(BL)
cv.drawCentredString(W/2, y-8, "\"Play is the work of childhood.\"")
cv.setFont("Caveat", 13); cv.setFillColor(GY)
cv.drawCentredString(W/2, y-24, "— Jean Piaget")
y -= 44
y -= 10
# References line
write(cv, LM, y, "Key References: Kaplan & Sadock (Synopsis + Comprehensive Textbook) | Reilly 1974 | Piaget 1962 | Parten 1932", fs=11, col=GY)
y -= LG - 4
write(cv, LM, y, "Smilansky 1968 | Takata 1974 | Florey 1971 | Knox 1997 | Bundy 1993 | AOTA 2020 | UN CRC Article 31", fs=11, col=GY)
pgnum(cv, 10, TOTAL_PAGES)
cv.showPage()
# ─── SAVE ─────────────────────────────────────────────────────────────────────
cv.save()
print("DONE:", OUTPUT)
print("Size:", os.path.getsize(OUTPUT), "bytes")
cd /tmp/workspace && python3 play_final.py 2>&1
~/play_final.py
Successfully replaced 1 instance(s) of the string in '/tmp/workspace/play_final.py'
cd /tmp/workspace && python3 play_final.py 2>&1
Play Complete Notes FINAL
PDF Document · PDF
| Page | Content |
|---|---|
| 1 | Introduction + Definitions (Reilly, Piaget, Florey, AOTA, Bundy, Takata) with years |
| 2 | Characteristics of Play (7 qualities) + Importance of Play (6 domains, mind map layout) |
| 3 | Play Development: Birth → 5 years (age-by-age with play types) |
| 4 | Play Development: 7yr → Adolescence + Parten's 6 Social Stages |
| 5 | Piaget's 3 Cognitive Stages + Smilansky's 4 Functional Categories + Takata's 5 Epochs |
| 6 | Florey + Reilly (3-level hierarchy) + Knox (4 dimensions, RKPPS) + Bundy (ToP) |
| 7 | Master Comparison Table (all 8 frameworks) + Red Flags with ASD-specific flags |
| 8 | Play Assessment: Clinical observation + Parent interview + All standardised tools table |
| 9 | Play as Intervention (OT, PT, SLP, Psychology, Special Ed) + Clinical Case (Aarav, 3.5yr) |
| 10 | Key Take-Home Messages (10 numbered) + Conclusion + Piaget quote + References |