Dev

[Python] 3. 파이썬 터틀 그래픽 (feat.모듈 사용)

mlslly 2024. 5. 3. 13:36

 

* Udemy의 PythonBootcamp 수업 내용을 참고하여 작성

파이썬 터틀 python turtle 

파이썬 터틀은 스크린에 그래픽 그림을 그리게 할 수 있는 도구이다.

자세한 기능들은 모두 documentation에서 확인할 수 있다.

https://docs.python.org/3/library/turtle.html

 

turtle — Turtle graphics

Source code: Lib/turtle.py Introduction: Turtle graphics is an implementation of the popular geometric drawing tools introduced in Logo, developed by Wally Feurzeig, Seymour Papert and Cynthia Solo...

docs.python.org

 

가장 기본이 되는 화면 띄우기는 아래와 같이 할 수 있다. exitonclick()을 추가해 주어야만 스크린이 바로 사라지지 않고 클릭시에 종료될 수 있다.

from turtle import Turtle, Screen

timmy_the_turtle = Turtle()

screen = Screen()
screen.exitonclick()

 

기능 사용해보기 

shape : 모양 변경 

color : 터틀 컬러 변경 https://trinket.io/docs/colors

tkinter : 파이썬을 이용해 GUI (graphical user interface) 를 바꾸기 

움직이기 : forward, backward, right (각도), left(각도), goto. ...

from turtle import Turtle, Screen

timmy_the_turtle = Turtle()
timmy_the_turtle.shape('turtle')
timmy_the_turtle.color('red')
timmy_the_turtle.forward(30) # 거리 
timmy_the_turtle.right(30)
timmy_the_turtle.forward(30) # 거리 


screen = Screen()
screen.exitonclick()

 

정사각형 그리기 

from turtle import Turtle, Screen

timmy_the_turtle = Turtle()

for _ in range(4) : 
    timmy_the_turtle.forward(100) # 거리 
    timmy_the_turtle.right(90)

screen = Screen()
screen.exitonclick()

 


모듈 임포트 하기 

모듈을 다양한 방법으로 임포트 해서 사용할 수 있다.

 

1) 기본 모듈 import 

모듈이름.클래스 ()로 객체 생성 가능 

import turtle 

tim = turtle.Turtle()

 

2) from .. import 방법 

클래스를 바로 import하는 방법. 모듈 이름을 쓰지 않아도 됨. 특히 여러개의 Turtle() 객체를 생성해야 할때 유용

from turtle import Turtle

tim = Turtle()

 

3) from .. import * 방법 

모듈 안에 있는 모든 기능, 클래스 등을 import 하는 방법

from turtle import *

 

4) 모듈의 별칭 주기 

import turtle as t 

tim = t.Turtle()

 

5) 패키지를 설치해야 하는 경우 

모듈이 기본 파이썬 라이브러리 패키지에 설치되어 있는 경우 별도 설치 필요 없지만, 그렇지 않은 경우 필요한 라이브러리를 별도 설치 필요

(turtle은 기본 라이브러리에 포함됨) 

$ pip install heroes
import heroes

print(heroes.gen()) # 영웅 이름 생성

 


파이썬 터틀 모듈을 다양하게 활용해보기

이제 documentation을 찾아보면서 본격적으로 파이썬터틀을 이용해 다양한 문제를 풀어보자.

 

1. 점선 그리기

pen control, drawing control에 들어가서 penup( )을 활용

from turtle import Turtle, Screen

tim = Turtle()

for _ in range(15) : 
    tim.forward(10) 
    tim.penup() # 펜들기
    tim.forward(10)
    tim.pendown() # 펜내리기

screen = Screen()
screen.exitonclick()

 

 

2. 다양한 도형 그리기 

삼각형부터 십각형까지 random 한색깔로 그려보자. random 모듈의 활용, 각도의 정의 (360/변의 수)에 주의

from turtle import Turtle, Screen
import random

tim = Turtle()

colors = ['midnight blue','aquamarine','firebrick','tomato','yellow','magenta']

def draw_shape(num_sides):
    angle = 360 / num_sides
    for _ in range(num_sides) : 
        tim.forward(100)
        tim.right(angle)

for shape_side_n in range(3,11) :
    tim.color(random.choice(colors))
    draw_shape(shape_side_n)
    
screen = Screen()
screen.exitonclick()

 

 

3. 랜덤 워크 Random Walk 구현하기 

 

랜덤 워크는 다양한 패턴을 모델링, 시각화 하는 데에 활용되는 개념 https://en.wikipedia.org/wiki/Random_walk 

 

Random walk - Wikipedia

From Wikipedia, the free encyclopedia Mathematical formalization of a path that consists of a succession of random steps Five eight-step random walks from a central point. Some paths appear shorter than eight steps where the route has doubled back on itsel

en.wikipedia.org

완전 랜덤한 방향, 색깔로 랜덤워크를 그려보자.

랜덤한 색상을 고를때는 RGB 컬러 튜플을 활용해서, 임의의 색깔을 정한 후 사용해보자.

https://www.w3schools.com/colors/colors_rgb.asp 

 

Colors RGB and RGBA

W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.

www.w3schools.com

import turtle as t
import random


tim = t.Turtle()
t.colormode(255)

def random_color():
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)
    random_color = (r,g,b)
    return random_color

directions = [0, 90, 180, 270]

tim.pensize(5)
tim.speed(0) #fastest

for i in range(200):
    tim.color(random_color())
    tim.forward(20)
    tim.setheading(random.choice(directions))

 

4. 스피로 그래프 Spirograph 그리기 

 

반지름이 100인 원을 다수 그려서 원 그래프를 그려보자

import turtle as t
import random

tim = t.Turtle()
t.colormode(255)

def random_color():
    r = random.randint(0,255)
    g = random.randint(0,255)
    b = random.randint(0,255)
    random_color = (r,g,b)
    return random_color

tim.speed(0)

def draw_spirograph(size_of_gap) :
    for _ in range(int(360/ size_of_gap)):
        tim.color(random_color())
        tim.circle(100)
        tim.setheading(tim.heading() + size_of_gap)

draw_spirograph(5)

screen = t.Screen()
screen.exitonclick()

 

5. 허스트의 스팟 페인팅 그리기 

 

colorgram 라이브러리 패키지를 받아서 이미지로부터 추출된 색상 팔레트를 얻을 수 있다.

https://pypi.org/project/colorgram.py/

 

colorgram.py

A Python module for extracting colors from images. Get a palette of any picture!

pypi.org

1) 색상 리스트 뽑기

$ pip3 install colorgram.py
import colorgram
import turtle as t
import random

colors = colorgram.extract('/Users/python-code/python100/day-18/hisrt-painting/hirst spot.png', 20)
rgb_colors = []

for color in colors : 
     r = color.rgb.r
     g = color.rgb.g
     b = color.rgb.b
     new_colors = (r,g,b)
     rgb_colors.append(new_colors)


print(rgb_colors)

 

2)  허스트 페인팅 그리기 

import turtle as turtle_module
import random

tim = turtle_module.Turtle()
turtle_module.colormode(255)
color_list = [(250, 248, 245), (250, 246, 248), (242, 248, 245), (239, 244, 249), (235, 225, 80), (219, 162, 87), (202, 5, 69), (235, 51, 128), (107, 180, 218), (203, 75, 19), (36, 186, 120), (26, 105, 171), (212, 136, 175), (13, 24, 65), (15, 30, 174), (188, 161, 36), (17, 183, 212), (204, 30, 140), (229, 168, 196), (120, 191, 151)]

tim.speed(2)
tim.penup()
tim.hideturtle()

tim.setheading(225)
tim.forward(300)
tim.setheading(0)

# 허스트 작품처럼 그려보기 
num_of_dots = 100

for dot_count in range(1, num_of_dots+1):
    tim.dot(20,random.choice(color_list))
    tim.forward(50)

    if dot_count % 10 == 0 : 
        tim.setheading(90)
        tim.forward(50)
        tim.setheading(180)
        tim.forward(500)
        tim.setheading(0)

screen = turtle_module.Screen()
screen.exitonclick()