크리스마스가 다가 오네요.
파이썬으로 크리스마스 트리를 만들어 보겠습니다.
먼저 이미지를 만드는 python3 내장 라이브러인 turtle를 사용합니다.
python3 명령어는 기본적으로 설치가 되어있어야 합니다.
아래의 코드를 파이썬 개발도구에서 chrismas_tree.py 파일로 만들어 준 뒤 코드를 복사합니다.
파일에 복사 후 아래의 코드를 실행하면 트리가 만들어 집니다.
크리스마스트리 만들기 실행 명령어 : python3 chrismas_tree.py

import turtle as t
from turtle import *
import random as r
import time
# 거북이 그래픽을 시작합니다.
# t는 거북이 프로그램을 뜻하고, 화면을 만들고 색을 칠하는 역할을 합니다.
t.title("Merry Christmas")
screensize (bg='black') # 배경색입니다
setup(700, 700, startx=None, starty=None) # 창 크기 700x700
speed("fastest") # 그림을 가장 빠르게 그립니다.
# 나무의 기본 색을 초록색으로 정하고, 펜 두께를 두껍게 합니다.
pencolor("#008500")
pensize(10)
penup()
hideturtle()
goto(0, 150)
showturtle()
pendown()
shape(name="classic")
# 1. 나무의 가장 윗부분을 그립니다.
# 왼쪽과 오른쪽으로 살짝 비틀면서 둥근 모양의 나무 꼭대기를 만듭니다.
seth(-120)
for i in range(10):
fd(12)
right(2)
penup()
goto(0, 150)
seth(-60)
pendown()
for i in range(10):
fd(12)
left(2)
seth(-150)
penup()
fd(10)
pendown()
for i in range(5):
fd(10)
right(15)
seth(-150)
penup()
fd(8)
pendown()
for i in range(5):
fd(10)
right(15)
seth(-155)
penup()
fd(5)
pendown()
for i in range(5):
fd(7)
right(15)
# 2. 나무의 첫 번째 큰 층을 그립니다.
# 큰 가지가 아래쪽으로 퍼지게 하여 나무 몸체를 넓혀 줍니다.
penup()
goto(-55, 34)
pendown()
seth(-120)
for i in range(10):
fd(8)
right(5)
penup()
goto(50, 35)
seth(-60)
pendown()
for i in range(10):
fd(8)
left(5)
seth(-120)
penup()
fd(10)
seth(-145)
pendown()
for i in range(5):
fd(10)
right(15)
penup()
fd(10)
seth(-145)
pendown()
for i in range(5):
fd(12)
right(15)
penup()
fd(8)
seth(-145)
pendown()
for i in range(5):
fd(10)
right(15)
penup()
seth(-155)
fd(8)
pendown()
for i in range(5):
fd(11)
right(15)
# 3. 나무의 중간 층을 그립니다.
# 나무를 더 넓고 둥글게 만들기 위해 곧게 뻗는 줄기를 보조합니다.
penup()
goto(-100, -40)
seth(-120)
pendown()
for i in range(10):
fd(6)
right(3)
penup()
goto(80, -39)
seth(-50)
pendown()
for i in range(10):
fd(6)
left(3)
seth(-155)
penup()
fd(10)
pendown()
for i in range(5):
fd(8)
right(10)
penup()
fd(8)
seth(-145)
pendown()
for i in range(7):
fd(8)
right(10)
penup()
fd(8)
seth(-145)
pendown()
for i in range(7):
fd(7)
right(10)
penup()
fd(8)
seth(-145)
pendown()
for i in range(7):
fd(7)
right(10)
penup()
fd(8)
seth(-140)
pendown()
for i in range(7):
fd(6)
right(10)
# 4. 나무의 아래쪽 큰 가지를 그립니다.
# 가장 아래쪽은 가장 넓게 퍼져서 나무 밑둥을 더 안정적으로 보이게 합니다.
penup()
goto(-120, -95)
seth(-130)
pendown()
for i in range(7):
fd(10)
right(5)
penup()
goto(100, -95)
seth(-50)
pendown()
for i in range(7):
fd(10)
left(5)
penup()
seth(-120)
fd(10)
seth(-155)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-155)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-155)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-160)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-160)
pendown()
for i in range(6):
fd(8)
right(10)
penup()
seth(-160)
fd(10)
seth(-165)
pendown()
for i in range(5):
fd(10)
right(11)
# 5. 나무 줄기와 밑부분을 정리합니다.
# 트리의 밑동을 만들고, 줄기 쪽을 조금 더 단단하게 보이게 합니다.
penup()
goto(-70, -165)
seth(-85)
pendown()
for i in range(3):
fd(5)
left(3)
penup()
goto(70, -165)
seth(-95)
pendown()
for i in range(3):
fd(5)
right(3)
seth(-170)
penup()
fd(10)
pendown()
pendown()
for i in range(10):
fd(12)
right(2)
# 6. 나무 줄기와 밑면을 그립니다.
# 초록색으로 땅에 닿는 줄기 부분을 만들어서 트리가 서 있게 합니다.
penup()
goto(70, -165)
pendown()
seth(-90)
pensize(8)
pencolor("#00cc00")
circle(-20, 90)
penup()
goto(30, -185)
pendown()
seth(-180)
pensize(8)
pencolor("#00cc00")
fd(40)
penup()
goto(-5, -170)
pendown()
seth(-180)
pensize(8)
pencolor("#00cc00")
fd(35)
# 가지를 그리는 도구 함수들입니다.
# 함수는 자주 쓰는 행동을 한 번 만들어 두는 것입니다.
# guest는 오른쪽으로 가지가 퍼지게, guet는 왼쪽으로 가지가 퍼지게, qu는 특별한 가지 모양을 그립니다.
def guest(x, y, z):
penup()
goto(x, y)
seth(-z)
pendown()
for angel in range(5):
fd(10)
right(10)
def guet(x, y, z):
penup()
goto(x, y)
seth(-z)
pendown()
for angel in range(5):
fd(10)
left(10)
def qu(x, y, z):
penup()
goto(x, y)
seth(-z)
pendown()
for angel in range(5):
fd(6)
right(10)
seth(-150)
fd(20)
# 실제로 나뭇가지들을 여러 위치에 그려서 트리를 완성합니다.
guest(-70, -150, 160)
guest(100, -150, 160)
guet(110, -110, 50)
guest(160, -140, 150)
qu(80, -120, 180)
guest(70, -85, 165)
guest(-40, -85, 165)
guet(90, -50, 50)
guest(130, -80, 150)
pencolor("#00cc00")
qu(-40, -60, 180)
pencolor('#00cc00')
qu(80, -30, 180)
pencolor("#00cc00")
qu(40, 10, 180)
pencolor("#00cc00")
guest(-60, 30, 120)
guest(-20, -20, 150)
guet(45, 40, 60)
guest(-30, 40, 170)
guest(-30, 110, 115)
guet(40, 90, 60)
guest(80, 50, 160)
pencolor("red")
# 리본 모양의 장식 함수를 만듭니다.
# 빨간색이나 분홍색 장식이 트리를 더 화려하게 보이게 합니다.
def hdj(x, y):
penup()
goto(x, y)
seth(80)
pendown()
pensize(2)
circle(5)
seth(10)
fd(15)
seth(120)
fd(20)
seth(240)
fd(20)
seth(180)
fd(20)
seth(-60)
fd(20)
seth(50)
fd(20)
seth(-40)
fd(30)
seth(-130)
fd(5)
seth(135)
fd(30)
seth(-60)
fd(30)
seth(-150)
fd(6)
seth(110)
fd(30)
# 이 함수는 다른 모양의 리본 장식을 그립니다.
def uit(x, y):
penup()
goto(x, y)
pendown()
pensize(2)
circle(5)
seth(-10)
fd(15)
seth(90)
fd(15)
seth(200)
fd(15)
seth(160)
fd(15)
seth(-90)
fd(15)
seth(10)
fd(15)
seth(-60)
fd(20)
seth(-180)
fd(5)
seth(110)
fd(20)
seth(-90)
fd(20)
seth(-180)
fd(6)
seth(70)
fd(15)
hideturtle()
# 작은 별 모양 장식 함수입니다.
# 여러 번 돌면서 약간씩 비켜가서 별처럼 보이게 만듭니다.
def yut(x, y, z):
penup()
goto(x, y)
pendown()
seth(z)
for po in range(5):
fd(4)
left(36)
def ytu(x, y, z):
penup()
goto(x, y)
pendown()
seth(z)
for kk in range(5):
fd(4)
left(36)
# 작은 장식 리본을 여러 위치에 붙입니다.
# 색을 바꾸고 위치를 조금씩 옮기면서 트리를 예쁘게 꾸밉니다.
seth(0)
uit(40, -160)
hdj(-80, -120)
yut(-67, -115, 120)
yut(-86, -123, 150)
hdj(40, -50)
yut(52, -45, 130)
yut(34, -55, 160)
seth(0)
pencolor("pink")
uit(-20, -60)
ytu(-4, -60, 100)
ytu(-20, -60, 120)
hdj(-30, 20)
yut(-15, 25, 130)
yut(-40, 20, 180)
uit(30, 70)
ytu(45, 70, 100)
ytu(30, 70, 120)
# 큰 리본과 중앙 장식을 그립니다.
# 트리의 한가운데에 크고 눈에 띄는 장식을 붙이는 부분입니다.
pencolor("yellow")
pensize(5)
penup()
seth(0)
goto(0, 150)
pendown()
circle(10)
seth(-15)
fd(40)
seth(90)
fd(40)
seth(200)
fd(40)
seth(160)
fd(40)
seth(-90)
fd(40)
seth(15)
fd(40)
seth(-70)
pencolor("yellow")
pensize(4)
fd(40)
seth(-180)
fd(10)
seth(100)
fd(40)
seth(-100)
fd(40)
seth(-180)
fd(10)
seth(70)
fd(40)
penup()
seth(0)
goto(0, 130)
pencolor("yellow")
pendown()
# 중앙 장식을 더 아름답게 만드는 작은 별 모양 함수입니다.
def iou(x, y, z):
penup()
goto(x, y)
pencolor("yellow")
pendown()
seth(z)
for po in range(10):
fd(4)
left(18)
# 중앙 위쪽을 더 반짝이게 합니다.
seth(0)
iou(35, 145, 100)
iou(-7, 145, 110)
pencolor("red")
pensize(7)
penup()
goto(-35, 135)
pendown()
# 산타 모자처럼 위쪽 장식을 만듭니다.
# 트리 위에 작은 모자와 장식을 추가해서 크리스마스 느낌을 냅니다.
seth(-20)
pensize(2)
penup()
goto(-30, -120)
pencolor("white")
pendown()
fillcolor("red")
fd(30)
circle(4, 180)
fd(30)
circle(4, 180)
penup()
goto(-25, -115)
seth(75)
pendown()
begin_fill()
for i in range(5):
fd(6)
right(20)
seth(-10)
for i in range(5):
fd(8)
right(15)
seth(145)
for i in range(5):
fd(5)
left(2)
seth(90)
for i in range(5):
fd(1)
left(2)
seth(-90)
for i in range(4):
fd(4)
right(6)
seth(161)
fd(30)
end_fill()
pensize(1)
pencolor("white")
# 별을 그리는 함수입니다.
# 정사각형이 아니라 여러 각도로 선을 그려서 별 모양을 만듭니다.
def koc(x, y, size):
pensize(2)
pencolor("yellow")
penup()
goto(x, y)
pendown()
begin_fill()
fillcolor("yellow")
for i in range(5):
left(72)
fd(size)
right(144)
fd(size)
end_fill()
# 여러 별을 트리 주변에 놓습니다.
seth(-15)
koc(-120, -70, 10)
seth(10)
koc(100, -20, 10)
seth(-10)
koc(10, 40, 10)
seth(30)
koc(-80, 60, 10)
koc(100, -150, 10)
koc(-140, -150, 10)
koc(20, 120, 10)
# 양말 장식도 추가합니다.
# 트리 밑에 선물처럼 보이게 만들기 위해 양말 모양을 그립니다.
seth(-20)
pensize(2)
penup()
goto(-20, 80)
pencolor("white")
pendown()
fillcolor("red")
fd(25)
circle(4, 180)
fd(25)
circle(4, 180)
penup()
goto(-15, 80)
pendown()
begin_fill()
fillcolor("red")
seth(-120)
fd(20)
seth(150)
fd(5)
circle(7, 180)
fd(15)
circle(5, 90)
fd(30)
seth(160)
fd(18)
end_fill()
penup()
seth(0)
goto(100, -230)
pendown()
# 마지막으로 메세지를 적고 눈송이를 뿌립니다.
# 화면에 글씨를 쓰고, 무작위 위치에 흰 눈송이를 그려서 겨울 느낌을 줍니다.
pencolor("yellow")
write("Merry Christmas ", align="center", font=("Comic Sans MS", 24, "bold"))
def drawsnow():
t.ht() # 펜을 눈에 보이지 않게 숨깁니다.
t.pensize(2)
for i in range(70):
t.pencolor("white")
t.pu() # 펜을 들고 이동합니다.
t.setx(r.randint(-350, 350))
t.sety(r.randint(-80, 350))
t.pd() # 펜을 내려서 그리기 시작합니다.
dens = 6 # 눈송이의 가지 수를 6개로 정합니다.
snowsize = r.randint(1, 10)
for j in range(dens):
t.fd(int(snowsize))
t.backward(int(snowsize))
t.right(int(360 / dens)) # 한 번에 회전하는 각도입니다.
drawsnow()
done()'카페에서 IT 산책 (일반) > Python' 카테고리의 다른 글
| Python list 생성, 접근, 반복문, 제거 등 (파이썬 리스트) (0) | 2023.01.10 |
|---|---|
| Python Strings 처리 (substring, 빈공간 제거, 길이 리턴, 소문자 변환, 대문자 변환, Split) (0) | 2023.01.07 |
| python whl 파일 일괄 설치 (2) | 2023.01.05 |
| pip3 install --user (파이썬 사용자 계정에 패키지 설치) (0) | 2023.01.05 |
| Python 랜덤 번호 생성 예시 (0) | 2023.01.03 |































