이 수업에서 배우는 ‘패턴인식’이란?
선의 길이, 회전 각도, 색상 순서, 반복 횟수에 따라 만들어지는 시각적 규칙과 대칭 패턴을 관찰하는 활동입니다. 여기서는 Python의 turtle로 그림을 생성합니다. 데이터를 학습하는 머신러닝·카메라 영상 분류와는 다른 실습이며, 이를 바탕으로 패턴을 정량화하거나 AI 모델의 입력 데이터를 만드는 확장 학습을 할 수 있습니다.
1. 수업 전 준비 · 라즈베리파이 환경
- 라즈베리파이 바탕화면에서 Geany 1.33을 실행합니다. 별도의 Python 3.12.10 설치를 요구하지 않습니다.
- 터미널에서
python3 --version으로 Python 버전을 확인합니다. 현재 수업 환경인 Buster에서는 Python 3.7을 사용할 수 있습니다. - 다음 명령어로 turtle GUI 지원 여부를 검사합니다:
python3 -c "import turtle; print('turtle 준비 완료')" - 원격으로 수업한다면 노트북에서 VNC Viewer로 라즈베리파이 바탕화면에 접속한 상태에서 Geany를 조작합니다.
2. Geany에서 코드를 복사하여 실행하기
- 아래 실습에서 코드 복사하기 버튼을 클릭합니다.
- 라즈베리파이에서 Geany → 파일(File) → 새로 만들기(New)를 클릭합니다.
- Geany 편집 창에 Ctrl+V로 붙여넣습니다. 기존 코드를 바꿀 때는 Ctrl+A → Backspace로 비운 뒤 붙여넣습니다.
- Ctrl+Shift+S 또는 파일 → 다른 이름으로 저장에서
.py확장자로 저장합니다. 예:pattern_01.py. 저장 위치는/home/pi/도 좋습니다. - F5 (Build → Execute)로 실행합니다. 환경에 따라 Geany의 실행 설정에
python3 "%f"가 지정되어 있어야 합니다. - 입력형 예제는 Geany가 열어 준 실행 터미널에서 질문에 답합니다. 거북이 그림 창이 뜨면 화면을 관찰하고, 코드에
exitonclick()이 있는 경우 그림 창을 클릭해 종료합니다.
import turtle, for, def는 Geany의 .py 파일 안에 작성합니다. Linux 터미널 프롬프트에 직접 붙여넣지 않습니다.3. Python 기초 특강에서 가져온 5가지 패턴
반복문과 함수를 익히고 단순한 패턴을 직접 변형합니다.
01. 반복으로 도형 그리기
학습 목표: for 반복과 정다각형의 외각
원본 교재: 파이썬 기초 특강 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
# 오각형 그리기
# 오각형은 5개의 변이 있으므로 5번 반복합니다.
# 정오각형의 외각 = 360 ÷ 5 = 72도
for x in range(5):
t.forward(100) # 100만큼 앞으로 이동
t.left(72) # 72도 회전
# 이렇게 반복문을 사용하면 코드가 훨씬 간단해집니다!
# 100줄짜리 도형도 2줄로 그릴 수 있어요!
02. 원 반복해서 그리기
학습 목표: 원 그리기와 회전각
원본 교재: 파이썬 기초 특강 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
# 원을 여러 개 그려서 꽃 모양 만들기
# 36번 반복하면서 매번 10도씩 회전합니다.
for x in range(36):
t.circle(50) # 반지름 50인 원을 그립니다.
t.left(10) # 10도 왼쪽으로 회전합니다.
# 36번 × 10도 = 360도 (한 바퀴 회전)
# 아름다운 꽃 모양이 완성됩니다!
03. 선을 반복해서 그리기
학습 목표: 길이 증가와 회전의 규칙
원본 교재: 파이썬 기초 특강 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
# 아름다운 나선형 패턴 그리기
angle = 20 # 회전 각도를 변수에 저장
t.bgcolor("black") # 배경색을 검은색으로
t.color("green") # 선 색깔을 초록색으로
t.speed(6) # 그리기 속도 설정 (0이 가장 빠름, 1이 가장 느림)
# 50번 반복하면서 선을 그립니다.
# 매번 x만큼 앞으로 가므로 점점 더 멀리 갑니다!
for x in range(50):
t.fd(x) # x만큼 앞으로 (처음엔 0, 그 다음 1, 2, 3, ...)
t.lt(angle) # angle 각도만큼 왼쪽으로 회전
# angle 값을 바꾸면 다른 패턴이 나타납니다!
# 시도해보세요: 40, 89, 144 등
04. 다각형 그리는 함수
학습 목표: 함수와 매개변수, 반복 도형
원본 교재: 파이썬 기초 특강 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
# 다각형을 그리는 함수
# sides: 변의 개수, length: 변의 길이
def draw_polygon(sides, length):
# 회전 각도 계산: 360도를 변의 개수로 나눔
angle = 360 / sides
# sides번 반복하면서 도형 그리기
for i in range(sides):
t.forward(length) # 앞으로 이동
t.left(angle) # 계산한 각도만큼 회전
# 다양한 도형 그리기
draw_polygon(3, 100) # 삼각형
t.penup()
t.goto(150, 0)
t.pendown()
draw_polygon(4, 80) # 사각형
t.penup()
t.goto(-150, 0)
t.pendown()
draw_polygon(6, 60) # 육각형
05. 태극 모양 그리기
학습 목표: 곡선과 대칭 색상 패턴
원본 교재: 파이썬 기초 특강 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
# 태극 모양 그리기
t.speed(0) # 최고 속도
# 빨간색 반원 (위)
t.color("red")
t.begin_fill() # 색칠 시작
t.circle(100, 180) # 반지름 100, 180도만 그림
t.end_fill() # 색칠 끝
# 파란색 반원 (아래)
t.color("blue")
t.begin_fill()
t.circle(100, 180)
t.end_fill()
# 작은 빨간색 원 (위쪽)
t.color("red")
t.penup()
t.goto(0, 50)
t.pendown()
t.begin_fill()
t.circle(50)
t.end_fill()
# 작은 파란색 원 (아래쪽)
t.color("blue")
t.penup()
t.goto(0, -50)
t.pendown()
t.begin_fill()
t.circle(50)
t.end_fill()
t.hideturtle() # 거북이 감추기
4. Python 심화 특강에서 가져온 11가지 패턴
색상 목록, 조건문, 함수, 데이터 구조와 상호작용을 활용합니다.
06. 무지개 원 그리기
학습 목표: 리스트 인덱스와 원 반지름 변화
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t # turtle 모듈을 불러오고, 이름을 짧게 't'라고 부르기로 함
# 1. 사용할 색깔들을 리스트(목록)로 만듭니다.
# 총 6가지 색상이 들어있습니다. (인덱스 0~5)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
print("무지개 원 그리기 시작!")
# 2. 거북이(펜)의 기본 설정
t.bgcolor("black") # 배경색을 검정색으로 설정
t.shape("turtle") # 커서 모양을 거북이로 변경
t.speed(8) # 거북이의 속도 설정 (1:느림 ~ 10:빠름, 0:최고속도)
t.width(3) # 선의 두께를 3으로 설정 (잘 보이게)
# 3. 무지개 원 그리기 (핵심 반복문!)
# colors 리스트의 개수(6개)만큼 반복합니다.
# i는 0부터 5까지 1씩 커지면서 반복됩니다. (0, 1, 2, 3, 4, 5)
for i in range(6):
# (1) 펜 색깔 바꾸기
# colors[0]은 "red", colors[1]은 "orange"... 순서대로 색을 가져옵니다.
t.color(colors[i])
# (2) 원 그리기
# 첫 번째(i=0): 반지름 60 + (0 * 10) = 60 크기의 원
# 두 번째(i=1): 반지름 60 + (1 * 10) = 70 크기의 원 (점점 커짐)
current_radius = 60 + i * 10
t.circle(current_radius)
# (3) 다음 원을 그릴 위치로 조금 이동하기
t.penup() # 펜을 들어서 이동할 때 선이 그려지지 않게 함
t.forward(10) # 앞으로 10만큼 이동 (원들 사이에 간격을 줌)
t.pendown() # 다시 그림을 그리기 위해 펜을 내림
# (4) 왼쪽으로 살짝 90도 꺾어서 위치 조정 (선택 사항: 원의 중심을 이동시키는 효과)
t.left(90)
print("무지개 원 완성!")
t.hideturtle() # 그림이 완성되면 거북이 숨기기
t.exitonclick() # 화면을 클릭하면 종료되도록 설정
07. 별 그리기
학습 목표: 144도 회전과 별 다각형
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t # turtle 모듈을 불러오고, 't'라는 짧은 이름으로 부르기로 약속합니다.
print("별 그리기 시작!")
# 1. 화면 및 거북이 설정 (준비 단계)
t.bgcolor("navy") # 밤하늘 느낌이 나도록 배경을 남색(navy)으로 설정
t.shape("turtle") # 커서 모양을 귀여운 거북이로 변경
t.color("gold") # 별 색깔은 반짝이는 금색(gold)으로 설정
t.speed(6) # 거북이가 움직이는 속도 (1:느림 ~ 10:빠름, 0:즉시)
t.pensize(3) # 선의 굵기를 3으로 두껍게 설정 (기본값은 1)
# 2. 별 그리기 (핵심 그리기 단계)
# 별은 5개의 선으로 이루어져 있으므로 5번 반복합니다.
# begin_fill()과 end_fill() 사이에 그리기 명령을 넣으면, 다 그린 후 색을 채워줍니다.
t.begin_fill() # "이제부터 그리는 도형의 내부를 색칠할 거야!"라고 선언
for i in range(5): # 0, 1, 2, 3, 4 -> 총 5번 반복
# (1) 앞으로 이동
t.forward(200) # 거북이가 바라보는 방향으로 200만큼 앞으로 전진
# (2) 방향 회전 (별 모양의 핵심!)
# 왜 144도일까요?
# 별의 꼭짓점 각도는 36도이지만, 거북이가 진행하던 방향에서
# 획 꺾어서 돌아야 하는 외각은 180 - 36 = 144도입니다.
t.right(144) # 오른쪽으로 144도 회전
t.end_fill() # "도형 그리기가 끝났으니 색을 채워줘!" (gold 색으로 채워짐)
# 3. 마무리 단계
print("별 완성!")
t.hideturtle() # 그림을 다 그렸으니 거북이는 숨겨서 그림만 돋보이게 함
t.exitonclick() # 화면을 마우스로 클릭하면 창이 닫히도록 설정
08. 꽃 그리기
학습 목표: 원 반복과 꽃잎 대칭
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t # turtle 모듈을 't'라는 이름으로 불러옵니다.
print("꽃 그리기 시작!")
# 1. 화면 및 거북이 설정
t.bgcolor("lightgreen") # 봄 느낌이 나는 연두색 배경
t.shape("turtle") # 거북이 모양 커서
t.speed(8) # 적당히 빠른 속도
# 2. 꽃잎 그리기 (6장의 꽃잎)
# 빨간색 펜으로 6번 반복해서 동그라미를 그립니다.
t.color("red")
for i in range(6): # 0부터 5까지 총 6번 반복
t.circle(30) # 반지름이 30인 원(꽃잎)을 하나 그림
t.right(60) # 360도를 6개로 나누면 60도! 다음 꽃잎을 위해 60도 회전
# 3. 꽃 중심 그리기 (수술 부분)
# 노란색으로 꽃의 가운데를 채워줍니다.
t.color("yellow")
t.begin_fill() # "이제부터 그리는 건 색칠할 거야!"
t.circle(15) # 꽃잎(30)보다 작은 반지름 15짜리 원을 그림
t.end_fill() # 색칠 끝! (노란색으로 채워짐)
# 4. 줄기 그리기
# 꽃의 중심에서 아래로 줄기를 그려야 하므로 위치를 이동합니다.
t.penup() # 그림이 그려지지 않게 펜을 들어올림
t.goto(0, -15) # 꽃의 중심(0,0)에서 약간 아래(0, -15)로 이동
t.pendown() # 다시 그리기 위해 펜을 내림
t.color("green") # 줄기는 초록색
t.pensize(5) # 줄기는 튼튼하게 굵기 5로 설정
t.right(90) # 거북이가 아래쪽을 바라보도록 회전
t.forward(80) # 80만큼 쭉 내려가서 줄기 완성
# 5. 잎사귀 그리기 (심화: 호 그리기)
# 단순히 직선이 아니라 곡선(호)을 이용해 잎 모양을 냅니다.
t.pensize(2) # 잎맥은 섬세하게 다시 얇게 설정
t.left(45) # 줄기에서 45도 각도로 뻗어나감
# circle(반지름, 각도): 원을 다 그리지 않고 '각도'만큼만 그림 (곡선)
t.circle(20, 90) # 반지름 20인 원을 90도만큼만 그림 (둥근 잎의 윗부분)
t.backward(28) # 왔던 길을 살짝 되돌아가서 잎 모양을 다듬음 (모양 교정)
t.left(90) # 잎의 반대편을 그리기 위해 방향 전환
t.circle(-20, 90) # 반대 방향으로 휘어지는 곡선을 그려서 잎 완성
# 6. 마무리
print("꽃 완성!")
t.hideturtle() # 거북이 숨기기
t.exitonclick() # 클릭하면 종료
09. 소용돌이 그리기
학습 목표: 증가하는 선 길이와 색 순환
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t # turtle 모듈을 't'라는 별명으로 부르기
print("소용돌이 그리기 시작!")
# 1. 거북이(펜)의 기본 설정
t.bgcolor("black") # 배경을 검은색으로 해서 형광색 선이 잘 보이게 함
t.shape("turtle") # 주인공 거북이 등장
t.color("cyan") # 처음 색상은 밝은 청록색(cyan)으로 시작
t.speed(10) # 속도는 빠르게 (1~10 중 10이 제일 빠름)
# 2. 소용돌이 그리기 (핵심: range 함수의 활용)
# range(5, 101, 3)의 의미:
# - 시작값 5: 처음 선의 길이는 5
# - 끝값 101: 101 바로 앞인 100까지만 반복 (101은 포함 안 됨)
# - 증가값 3: 한 번 반복할 때마다 선의 길이가 3씩 늘어남 (5, 8, 11, 14...)
for length in range(5, 101, 3):
# (1) 선 그리기
# length 변수에 들어있는 숫자만큼 앞으로 이동
# 처음엔 5만큼, 그 다음엔 8만큼... 점점 길어지면서 소용돌이가 커짐
t.forward(length)
# (2) 회전하기
# 정각(90도)으로 돌면 네모가 되지만,
# 89도로 돌면 조금씩 어긋나면서 멋진 소용돌이 모양이 됨
t.right(89)
# (3) 색상 변화 (심화: 나머지 연산자 활용)
# length는 5, 8, 11, 14...처럼 5에서 시작해 3씩 늘어나므로 15의 배수(15, 30, 45...)가 될 일이 없습니다.
# 그래서 (length - 5)가 15의 배수가 되는 순간(즉 length가 5, 20, 35, 50...)마다 색을 바꿉니다.
if (length - 5) % 15 == 0:
# 현재 색이 청록(cyan)이면 -> 노랑(yellow)으로
if t.pencolor() == "cyan":
t.color("yellow")
# 현재 색이 노랑(yellow)이면 -> 자홍(magenta)으로
elif t.pencolor() == "yellow":
t.color("magenta")
# 그 외의 색이면 -> 다시 청록(cyan)으로
else:
t.color("cyan")
print("소용돌이 완성!")
t.exitonclick() # 화면을 클릭하면 종료
10. 입체 구 그리기
학습 목표: 원 회전으로 만드는 구형 착시
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t # turtle 모듈을 't'라는 이름으로 불러옵니다.
print("입체 구 그리기 시작!")
# 1. 화면 및 거북이 설정
t.bgcolor("black") # 우주 같은 검은 배경
t.speed(0) # 가장 빠른 속도
# 2. 색상 리스트 준비 (4가지 색을 돌아가며 사용)
colors = ["cyan", "magenta", "yellow", "white"]
# 3. 원을 조금씩 회전시키며 36번 그리기 (핵심: 입체감의 비밀!)
# 완전히 같은 자리에 원을 겹쳐 그리는 대신, 매번 살짝 회전한 뒤 그리면
# 마치 공(구)처럼 입체적으로 보이는 착시 효과가 생깁니다.
for i in range(36):
# (1) 색상 순환: i가 늘어날 때마다 다음 색으로 자동 전환
t.color(colors[i % len(colors)])
# (2) 반지름 100인 원 그리기
t.circle(100)
# (3) 10도 회전
# 36번 반복 × 10도 = 360도(한 바퀴)를 정확히 채웁니다.
t.right(10)
print("입체 구 완성!")
t.hideturtle()
t.exitonclick()
11. 무지개 별 폭발
학습 목표: 규칙적으로 길어지는 별 패턴
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
print("무지개 별 폭발 그리기 시작!")
# 1. 화면 및 거북이 설정
t.bgcolor("black") # 우주 같은 검은 배경
t.speed(0) # 가장 빠른 속도
t.pensize(2) # 선 굵기
# 2. 색상 리스트 준비 (6가지 무지개색)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
# 3. 별 모양 소용돌이 그리기 (핵심 반복문!)
# 120번 반복하면서 점점 길어지는 선을 그립니다.
for i in range(120):
# (1) 색상 순환: i가 늘어날 때마다 다음 색으로 자동 전환
t.color(colors[i % len(colors)])
# (2) 점점 길어지는 선 그리기
# i가 0, 1, 2, 3...으로 커질수록 forward 거리(i * 3)도 함께 커집니다.
t.forward(i * 3)
# (3) 144도 회전 (별 모양의 비밀!)
# 144도는 정오각형 별(펜타그램)을 그릴 때 쓰는 회전 각도입니다.
t.right(144)
print("무지개 별 폭발 완성!")
t.hideturtle()
t.exitonclick()
12. 만다라 그리기
학습 목표: 중첩 반복과 대칭 패턴
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
print("만다라 그리기 시작!")
# 1. 화면 및 거북이 설정
t.bgcolor("black") # 검은 배경 위에서 색이 더 화려하게 보임
t.speed(0) # 가장 빠른 속도
t.pensize(1) # 얇은 선으로 촘촘하게
# 2. 무지개색 리스트 준비
colors = ["red", "orange", "yellow", "green", "cyan", "blue", "purple", "magenta"]
# 3. 육각형을 아주 조금씩 돌려가며 60번 겹쳐 그리기 (핵심: 만다라의 비밀!)
# 육각형 한 개를 그린 뒤 살짝(6도)만 돌리고 또 그리기를 반복하면,
# 도형들이 서로 겹치면서 마치 만화경처럼 화려한 무늬가 완성됩니다.
for i in range(60):
t.color(colors[i % len(colors)]) # 60번 도는 동안 색이 계속 순환
# (1) 정육각형 하나 그리기 (변 6개, 회전 60도)
for side in range(6):
t.forward(150)
t.right(60)
# (2) 다음 육각형을 그리기 전에 아주 살짝 회전
# 60번 반복 × 6도 = 360도로 한 바퀴를 정확히 채웁니다.
t.right(6)
print("만다라 완성!")
t.hideturtle()
t.exitonclick()
13. 랜덤 아트 거북이
학습 목표: 무작위 위치·색깔·도형 선택
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle
import random # 랜덤 기능을 쓰기 위해 꼭 필요한 모듈입니다. (주사위 굴리기와 같아요!)
print("랜덤 아트 거북이")
print("아름다운 작품을 그립니다...")
# 1. 화면 및 거북이 설정
screen = turtle.Screen()
screen.bgcolor("black") # 배경을 검정색으로 해서 알록달록한 색이 잘 보이게 함
screen.setup(600, 600) # 화면 크기를 가로 600, 세로 600으로 고정
artist = turtle.Turtle()
artist.speed(0) # 가장 빠른 속도 (기다리는 시간을 줄이기 위해)
artist.pensize(2) # 선 굵기
# 2. 랜덤하게 고를 재료들 준비 (리스트)
# 색깔 바구니
colors = ["red", "orange", "yellow", "green", "blue", "purple",
"pink", "cyan", "magenta", "lime"]
# 도형 모양 바구니
shapes = ["circle", "square", "triangle"]
# 3. 랜덤 아트 그리기 (20번 반복)
# 매번 반복할 때마다 위치, 색깔, 모양, 크기가 다 달라집니다.
for i in range(20):
# (1) 랜덤한 위치로 순간이동
# random.randint(a, b): a부터 b 사이의 숫자 중 하나를 무작위로 뽑습니다.
# 화면 좌표가 -300~300 사이이므로 안전하게 -250~250 사이에서 뽑습니다.
x = random.randint(-250, 250)
y = random.randint(-250, 250)
artist.penup() # 이동할 때는 그림이 그려지지 않게 펜을 듦
artist.goto(x, y) # 뽑힌 좌표(x, y)로 이동
artist.pendown() # 도착했으니 다시 그릴 준비
# (2) 랜덤한 색깔 선택
# random.choice(리스트): 리스트 안에 있는 것 중 하나를 무작위로 고릅니다.
color = random.choice(colors)
artist.color(color) # 고른 색으로 펜 색깔 변경
# (3) 랜덤한 모양과 크기 결정
shape = random.choice(shapes) # 원, 사각형, 삼각형 중 하나 선택
size = random.randint(10, 80) # 크기도 10부터 80 사이에서 제멋대로 결정
# (4) 선택된 모양에 따라 그리기 (조건문 활용)
if shape == "circle":
# 원 그리기
artist.circle(size)
elif shape == "square":
# 사각형 그리기 (4번 반복)
for _ in range(4):
artist.forward(size)
artist.right(90)
else: # triangle (삼각형)
# 삼각형 그리기 (3번 반복)
for _ in range(3):
artist.forward(size)
artist.left(120)
# (5) 랜덤한 각도로 회전 (다음 도형을 그리기 전 방향 틀기)
# 0도에서 360도 사이의 각도 중 하나를 뽑아서 회전합니다.
# 이렇게 하면 도형들이 제각각 다른 방향을 보게 되어 더 예술적으로 보입니다.
artist.right(random.randint(0, 360))
# 4. 마무리
artist.hideturtle() # 다 그렸으니 거북이는 퇴장
print("작품 완성! 클릭하면 종료됩니다.")
screen.exitonclick() # 화면 클릭 시 종료
14. 인터랙티브 거북이 아트
학습 목표: 학생 입력에 따른 선택 패턴
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t # turtle 모듈을 't'라는 이름으로 불러옵니다.
# 1. 프로그램 시작 안내
# print() 함수는 화면에 글자를 보여주는 역할만 합니다.
print("인터랙티브 거북이 아트 스튜디오")
print("당신만의 특별한 작품을 만들어보세요!")
print("=" * 50) # 구분선 출력 ('=' 기호를 50번 반복)
# 2. 사용자 설정 입력받기 (문자열 입력)
# input("질문내용") : 사용자가 키보드로 입력할 때까지 기다립니다.
# 사용자가 입력한 내용은 변수(artist_name, artwork_title)에 저장됩니다.
print("작품 설정을 해주세요:")
artist_name = input("아티스트 이름: ") # 예: "홍길동" 입력 -> artist_name에 저장
artwork_title = input("작품 제목: ") # 예: "나의 꿈" 입력 -> artwork_title에 저장
# 3. 색상 선택 (숫자 입력 및 리스트 활용)
print("\n색상을 선택해주세요:")
print("1: 빨강, 2: 파랑, 3: 초록, 4: 노랑, 5: 보라")
# input()으로 받은 값은 무조건 '글자(문자열)'로 취급됩니다.
# 계산하거나 순서로 쓰려면 int()를 사용해 '숫자(정수)'로 바꿔줘야 합니다.
# 예: "1" (글자) -> 1 (숫자)
color_choice = int(input("색상 번호 (1-5): "))
# 색상 목록 리스트 (0번째부터 시작함에 주의!)
colors = ["red", "blue", "green", "yellow", "purple"]
# 사용자는 1번을 선택했지만, 리스트는 0번부터 시작하므로 1을 빼줍니다.
# (1번 선택 -> 0번 인덱스 'red', 2번 선택 -> 1번 인덱스 'blue')
chosen_color = colors[color_choice - 1]
# 4. 패턴 선택 (조건문 활용 준비)
print("\n패턴을 선택해주세요:")
print("1: 나선형, 2: 꽃모양, 3: 기하학적, 4: 자유형")
pattern_choice = int(input("패턴 번호 (1-4): ")) # 여기서도 숫자로 변환!
# 5. 크기와 속도 설정
# 사용자가 직접 그림의 크기와 그리는 속도를 결정합니다.
size = int(input("\n크기 (10-100 권장): "))
speed = int(input("속도 (1-10): "))
# 6. 거북이 기본 설정 적용
t.bgcolor("black") # 배경은 검은색
t.color(chosen_color) # 위에서 사용자가 고른 색(chosen_color) 적용
t.speed(speed) # 사용자가 입력한 속도 적용
t.pensize(2) # 선 굵기
# 창 제목 설정 (f-string을 사용해 변수 내용을 제목에 넣음)
t.title(f"{artwork_title} by {artist_name}")
print(f"\n'{artwork_title}' 작품을 그리고 있습니다...")
# 7. 패턴에 따른 그리기 (조건문 if-elif-else)
# 사용자가 선택한 pattern_choice 숫자에 따라 다른 그림을 그립니다.
if pattern_choice == 1: # 1번을 선택했다면? -> 나선형 그리기
for i in range(100):
# 원의 크기가 점점 커지면서 회전함
t.circle(i + size//5)
t.right(91) # 90도가 아니라 91도로 돌면 조금씩 비틀리며 나선이 됨
elif pattern_choice == 2: # 2번을 선택했다면? -> 꽃모양 그리기
for i in range(12):
t.circle(size) # 사용자가 정한 크기(size)만큼의 원 그리기
t.right(30) # 360도 / 12번 = 30도씩 회전하며 그리기
elif pattern_choice == 3: # 3번을 선택했다면? -> 기하학적 무늬(육각형 벌집)
for i in range(6): # 큰 육각형 회전 (6번)
for j in range(4): # 작은 사각형 그리기 (4번)
t.forward(size)
t.right(90)
t.right(60) # 다음 사각형을 그리기 위해 회전
else: # 1, 2, 3번이 아닌 다른 숫자(주로 4번)를 선택했다면? -> 자유형
for i in range(size):
t.forward(i * 2) # 점점 길게 뻗어나감
t.right(89) # 소용돌이치듯 회전
# 10번 움직일 때마다 색깔 바꾸기 (화려한 효과)
if i % 10 == 0:
# i는 항상 10의 배수(0, 10, 20...)이므로 i % len(colors)를 쓰면
# len(colors)가 5의 배수일 때 나머지가 항상 0이 되어 색이 안 바뀝니다!
# i // 10으로 "몇 번째로 바뀌는 색인지"를 먼저 구한 뒤 순환시켜야 합니다.
t.color(colors[(i // 10) % len(colors)])
# 8. 작품 서명 추가 (텍스트 출력)
t.penup() # 글씨를 쓸 위치로 이동하기 위해 펜 들기
t.goto(-200, -200) # 왼쪽 아래 구석으로 이동
t.pendown() # 다시 펜 내리기
t.color("white") # 글씨는 흰색으로
# 화면에 글자 쓰기 (사용자의 이름과 작품명을 남김)
t.write(f"'{artwork_title}' by {artist_name}",
font=("Arial", 12, "normal"))
# 9. 종료 안내
print("\n작품이 완성되었습니다!")
print(f"'{artwork_title}' - 아름다운 작품이네요!")
print("창을 클릭하면 종료됩니다.")
t.hideturtle() # 거북이 숨기기
t.exitonclick() # 클릭 시 종료
15. 무지개 데이터 시각화
학습 목표: 딕셔너리로 색상 데이터 관리
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
# =============================================================================
# 1. 딕셔너리 (Dictionary) 학습
# - 딕셔너리는 {키(Key) : 값(Value)} 쌍으로 데이터를 저장합니다.
# - 순서보다는 '이름'으로 데이터를 찾을 때 사용합니다. (예: "빨강"을 찾으면 코드값을 줌)
# =============================================================================
colors_db = {
"빨강": "#FF0000", # Key: "빨강", Value: "#FF0000"
"주황": "#FF8C00",
"노랑": "#FFD700",
"초록": "#32CD32",
"파랑": "#4169E1",
"보라": "#8A2BE2",
"분홍": "#FF69B4",
"하늘": "#87CEEB"
}
# =============================================================================
# 2. 리스트와 딕셔너리의 응용 (List of Dictionaries)
# - 리스트([]) 안에 딕셔너리({})를 넣어서 여러 개의 '설정 정보'를 순서대로 저장합니다.
# =============================================================================
patterns = [
{"크기": 20, "각도": 45}, # 0번 패턴: 작고 완만한 각도
{"크기": 35, "각도": 90}, # 1번 패턴: 중간 크기, 직각
{"크기": 50, "각도": 135}, # 2번 패턴: 큰 크기, 넓은 각도
{"크기": 65, "각도": 180} # 3번 패턴: 아주 큼, 평평한 각도
]
print("무지개 데이터 시각화 시작!")
# len(딕셔너리)는 딕셔너리에 들어있는 데이터 쌍의 개수를 알려줍니다.
print(f"사용 가능한 색상: {len(colors_db)}개")
# 화면 설정
t.bgcolor("black")
t.speed(8)
t.pensize(3)
# =============================================================================
# 3. 딕셔너리 데이터 추출 (keys, values)
# - .keys(): 딕셔너리의 '이름표(Key)'들만 모아줍니다. ["빨강", "주황", ...]
# - .values(): 딕셔너리의 '내용물(Value)'들만 모아줍니다. ["#FF0000", "#FF8C00", ...]
# - list(): 이것들을 순서가 있는 '리스트'로 변환합니다. (순서대로 꺼내 쓰기 위해)
# =============================================================================
color_list = list(colors_db.values()) # 색상 코드만 모은 리스트
color_names = list(colors_db.keys()) # 색상 이름만 모은 리스트
print(f"색상 목록: {color_names}")
# 중앙에서 시작하기 위해 이동
t.penup()
t.goto(0, 0)
t.pendown()
# =============================================================================
# 4. 반복문과 데이터 활용 (enumerate)
# - enumerate(리스트): 리스트의 '순번(0,1,2...)'과 '내용물'을 동시에 꺼내줍니다.
# - i: 순번 (0, 1, 2, 3)
# - pattern: 내용물 ({"크기": 20, "각도": 45} 같은 딕셔너리 하나)
# =============================================================================
for i, pattern in enumerate(patterns):
# (1) 색상 선택 (순환 구조)
# i(순번)를 색상 개수로 나눈 나머지(%)를 사용하면
# 패턴이 색상보다 많아도 에러 없이 색깔을 처음부터 다시 사용합니다.
color_code = color_list[i % len(color_list)]
color_name = color_names[i % len(color_names)]
t.color(color_code)
# 딕셔너리에서 값 꺼내기: pattern["키이름"]
print(f"패턴 {i+1}: {color_name} 색상으로 크기 {pattern['크기']} 그리기")
# (2) 다각형 그리기
# 딕셔너리인 pattern에서 '크기'와 '각도' 정보를 꺼내서 그림을 그립니다.
for side in range(8): # 8각형
t.forward(pattern["크기"]) # 딕셔너리에서 '크기' 값(20, 35...)을 사용
t.right(pattern["각도"] / 8) # 딕셔너리에서 '각도' 값(45, 90...)을 사용
# (3) 다음 패턴 그릴 위치로 이동
t.penup()
t.right(90)
t.forward(20)
t.left(90)
t.pendown()
# =============================================================================
# 5. 텍스트 정보 표시
# =============================================================================
t.penup()
t.goto(0, -200)
t.color("white")
t.write("딕셔너리 기반 무지개 패턴", align="center",
font=("Arial", 16, "bold"))
# 추가 정보 표시 (문자열 조작)
t.goto(-150, -240)
# len(): 개수 세기
# join(): 리스트의 문자들을 쉼표(,)로 연결해서 하나의 문장으로 만듦
# [:4]: 리스트 슬라이싱 (앞에서 4개만 자르기)
info_text = f"총 {len(colors_db)}개 색상 사용: "
info_text += ", ".join(color_names[:4]) + "..."
t.write(info_text, font=("Arial", 12, "normal"))
print("무지개 데이터 시각화 완성!")
print(f"딕셔너리 크기: {len(colors_db)}")
print(f"패턴 개수: {len(patterns)}")
t.hideturtle()
t.exitonclick()
16. 인터랙티브 아트 생성기
학습 목표: 함수와 입력으로 아트 생성
원본 교재: 파이썬 프로그래밍 실습 전체 강의 · 원본 코드 점검 및 Python 3.7 문법 확인
import turtle as t
import random
# =============================================================================
# 1. 기초 설정 함수 (매개변수 X, 리턴 X)
# 단순히 여러 줄의 설정 코드를 하나의 이름(setup_canvas)으로 묶어둔 것입니다.
# =============================================================================
def setup_canvas():
"""도화지(화면)를 준비하는 함수"""
t.speed(0) # 거북이 속도를 최고 속도로 설정
t.bgcolor("black") # 배경을 검은색으로
t.colormode(255) # 색상을 255단계(RGB)로 쓰겠다고 선언
# 이 함수는 return이 없으므로, 일을 마치면 조용히 끝납니다.
# =============================================================================
# 2. 값을 돌려주는 함수 (리턴 O)
# 실행 결과(색상 정보)를 이 함수를 부른 곳으로 '던져주는(return)' 역할입니다.
# =============================================================================
def get_random_color():
"""랜덤한 RGB 색상을 만들어서 반환하는 함수"""
# 50부터 255 사이의 숫자 중 하나를 랜덤으로 뽑음 (너무 어두운 색 제외)
r = random.randint(50, 255)
g = random.randint(50, 255)
b = random.randint(50, 255)
# 만든 색상 정보(r, g, b)를 호출한 곳으로 돌려줍니다.
return (r, g, b)
# =============================================================================
# 3. 매개변수가 있는 그리기 함수들 (매개변수 O)
# 괄호 안의 변수(size, petals, rays)가 밖에서 들어오는 '옵션' 역할을 합니다.
# =============================================================================
def draw_spiral(size):
"""나선형 패턴을 그리는 함수"""
# size: 밖에서 정해주는 크기 값
for i in range(100):
# 위에서 만든 get_random_color() 함수를 호출해서 색을 받아와서 칠합니다.
t.color(get_random_color())
t.forward(i + size) # 입력받은 size에 따라 나선의 시작 크기가 달라짐
t.right(91) # 91도로 회전하면 소용돌이 모양이 됨
def draw_flower(petals):
"""꽃 모양을 그리는 함수"""
# petals: 꽃잎의 개수를 밖에서 정해줌
for i in range(petals):
t.color(get_random_color()) # 랜덤 색상 적용
t.circle(50) # 꽃잎 하나 그리기
t.right(360 // petals) # 전체 360도를 꽃잎 개수만큼 나누어서 회전
def draw_star_burst(rays):
"""폭발하는 별 모양을 그리는 함수"""
# rays: 뻗어나가는 선의 개수
for i in range(rays):
t.color(get_random_color())
t.forward(100) # 밖으로 나갔다가
t.backward(100) # 다시 돌아옴
t.right(360 // rays) # 각도 조절
# =============================================================================
# 4. 전체를 조립하는 메인 함수
# 위에서 만든 '부품(함수)'들을 조립해서 프로그램을 완성하는 감독관 역할입니다.
# =============================================================================
def create_art():
# 1단계: 화면 설정 함수 호출
setup_canvas()
print("인터랙티브 아트 생성기!")
print("1. 나선형 2. 꽃 3. 별폭발")
# 사용자 입력 받기
# input()으로 받은 문자를 int()를 사용해 숫자로 변환
choice = int(input("패턴을 선택하세요 (1-3): "))
count = int(input("몇 개 그릴까요? "))
# 입력받은 개수(count)만큼 반복해서 그림
for i in range(count):
# (1) 랜덤 위치로 거북이 이동시키기
x = random.randint(-200, 200)
y = random.randint(-200, 200)
t.penup()
t.goto(x, y)
t.pendown()
# (2) 선택한 번호에 따라 다른 함수 호출하기
if choice == 1:
# 나선형은 크기(size)를 랜덤하게 정해서 함수에 전달
size = random.randint(1, 5)
draw_spiral(size)
elif choice == 2:
# 꽃은 꽃잎 개수(petals)를 랜덤하게 정해서 함수에 전달
petals = random.randint(6, 12)
draw_flower(petals)
elif choice == 3:
# 별폭발은 선의 개수(rays)를 랜덤하게 정해서 함수에 전달
rays = random.randint(8, 16)
draw_star_burst(rays)
# (3) 마무리 서명 쓰기
t.penup()
t.goto(0, -250)
t.color("white")
# f-string을 사용해 변수 내용을 글자에 포함
t.write(f"아트 생성 완료! {count}개 작품!",
align="center", font=("Arial", 16, "bold"))
print("아트 생성 완료!")
t.exitonclick() # 클릭하면 종료
# =============================================================================
# 프로그램 실행
# =============================================================================
# 정의만 해두면 아무 일도 일어나지 않습니다.
# 마지막에 이렇게 함수를 '호출(Call)'해줘야 프로그램이 작동합니다.
create_art()
5. 자주 발생하는 오류 해결
bash: import: command not found — Python 코드를 Linux 터미널에 입력한 경우입니다. Geany에서 Python 파일로 저장한 뒤 F5로 실행하세요.
ModuleNotFoundError: No module named _tkinter — 그래픽 창 지원 패키지가 빠진 경우입니다. 교사의 확인 후 sudo apt install python3-tk를 실행합니다.
TclError: no display name and no $DISPLAY environment variable — GUI 데스크톱이 없는 환경입니다. VNC 또는 라즈베리파이 화면의 데스크톱 세션에서 Geany를 실행하세요.
Geany 실행(F5) 시 Python 명령어 오류 — Geany 메뉴 Build → Set Build Commands에서 Execute 명령을 확인하세요. Linux에서는 Windows용 py -3.12가 아니라 python3를 씁니다.
한글 표시 깨짐 — 터미널에서 fc-match "NanumGothic"를 확인하고 편집기 파일을 UTF-8로 저장하세요. Turtle 안에 한글 텍스트를 쓰는 예제는 Tk 글꼴 설정이 추가로 필요할 수 있습니다.
실행 창이 닫히지 않음 — 거북이 창을 클릭하거나 닫기 버튼을 누르세요. 계속 실행 중이면 Geany 실행 터미널에서 Ctrl+C를 사용합니다.