본문 바로가기
Programming/Python

[ L2P ] Turtle Screen, Coloring and Speed : Windmill - 001

by The Programmer 2025. 7. 28.

1. Introduction


LOGO2Python 연습 예제입니다. 바람개비 혹은 풍차 모양 문양을 그리고 색칠해 봅시다. 그리고 그리기 속도 역시 개선해 봅시다. 다만 Notes 설명에는 제가 참고하려고 이런저런 조사를 한 내용도 포함되어 있어서 초보자에게는 무리무리무리 데스... 내용도 포함되어 있습니다. 코드의 기본적이 내용만 이해하시면 됩니다. 심화 과정은 포기하셔도 무방합니다.

Python L2P. 컬러링 연습 -1

 

2. Code


# Python Turtle Graphic Coloring
# Coded by HiSun. ^.^;  Hi!!

# Edited by J. ^.^;

import turtle

win1 = turtle.Screen()   
# 스크린 객체 생성

win1.bgcolor("lightblue")   # 배경색 설정
win1.title("나의 터틀 그래픽 창")  
# 창 제목 변경
win1.tracer(0)

# win1.tracer(0, 0)형식으로 옵션을 추가해서 표현할 수도 있습니다.
# Turns turtle animation on/off and set delay for update drawings.


t = turtle.Pen()
# turtle.tracer(0) not supported
# turtle.delay(0) "


def tri1():
    t.fd(20)
    t.lt(150)
    t.fd(17.3)
    t.lt(90)
    t.fd(10)

def intotri():
    t.pu()
    t.rt(10)
    t.bk(3)
    t.pd()

def outtotri():
    t.pu()
    t.fd(3)
    t.lt(10)
    t.pd()

def windmill():
    r = 0.2
    g = 0.6
    b = 0
    
t.fillcolor(r, g, b)
    for _ in range(4):    
# i to _
        
t.begin_fill()
        tri1()
        
t.end_fill()
        t.lt(30)
        r = r + 0.15
        b = b + 0.2
        
t.fillcolor(r, g, b)

def move1():
    t.pu()
    t.fd(45)
    t.pd()

def move2():
    t.pu()
    t.rt(90)
    t.fd(45)
    t.rt(90)
    t.fd(675)
    t.rt(180)
    t.pd()

def setup():
    t.speed(100)
    t.pu()
    t.lt(90)
    t.fd(300)
    t.lt(90)
    t.fd(320)
    t.rt(180)
    t.pd()


def draw():
    
for _ in range(15):    # i to _
        for _ in range(15):    
# i to _
            windmill()
            move1()
        
move2()   
# 이하 들여쓰기 주의.
바깥쪽 for 문 직속.
    t.ht()

    turtle.done()   
# 들여쓰기 주의. 바깥쪽 for 문과 동등한 자리.
    # draw() 함수 직속.

def main():
    setup
    draw


main()

    
# reWritten by J. Jul. 29, 2025

3. Result


안드로이드 폰, PyDroid 3에서만 테스트되었습니다.

[ Windmill - 001, Android에서의 실행 결과 ]


안드로이드 폰에서, 대략 결과는 위 그림과 같습니다. 다음은  PC Windows 11 환경에서의 결과. 배경색과 윈도 타이틀 추가됨.
 

[ Windmill - 001, Win 11에서의 실행 결과 ]



4. Notes

 
■ Screen 객체를 직접 생성하면 더 많은 컨트롤이 가능해집니다.

  • 창 배경 색 바꾸기 (win.bgcolor("black"))
  • 창 제목 설정 (win.title("나의 터틀 프로그램"))
  • 이벤트 바인딩 등 다양한 GUI 동작도 설정할 수 있습니다.
  • 생략하면 : 자동으로 백그라운드에서 기본 스크린이 생성되어 사용됩니다.

 
■ 심화 과정 : 스크린 객체의 명시적 생성을 생략한 경우, 내부 작동 보충 설명.
 
파이썬 turtle 모듈 소스 코드를 뜯어보면 전부 알 수 있는 내용입니다만. 시간 압박이.. 조금은 있겠죠. ㅡ.ㅡ;
심화 과정 내용에는 초보자들은 몰라도 되는 내용이 포함되어 있습니다.
 
의문점 1.
 
import turtle로 모듈을 로드한 다음, 스크린 객체 생성 부분을 생략하고 이어서
t = turtle.Turtle() 처럼 거북이 객체를 생성하고 그림을 그리기 시작하면
t 객체는 그림을 그릴 스크린이 없는 것 아닙니까? 허공에 그리시나요? ^.^;

import turtle

t = turtle.Turtle()
t.forward(100)
 
 
도움말 :
 
위 거북이 t 객체와 스크린 객체가 어떻게 연결될까요. 백그라운드에 숨어 있는 자동 생성된 스크린 객체 또는 win1 스크린 객체처럼 코드로 분명하게 명시적으로 생성된 스크린 객체와 t와 같은 거북이 객체 사이에 "명시적 연결"이 없어 보입니다. 하지만 내부적으로는 묵시적 연결(implicit association)이 성립되고 있습니다. 백그라운드에서 자동으로 숨겨진 상태로 이 연결이 처리됩니다.

내부 동작 설명:
- t = turtle.Turtle()을 실행하면 t는 Turtle 객체가 되고,
- 이때 turtle 모듈은 자동으로 기본 Screen 객체를 생성하거나 기존 Screen을 가져다 씁니다.
- 따라서 t는 코드에는 보이지 않는 자동 생성된 '숨겨진' Screen()을 백그라운드에서 참조하고,
t 거북이를 통해서 그 Screen 화면 위에 그려집니다.
 
- win1 = turtle.Screen()을 명시적으로 따로 만들었어도,
turtle.Turtle()은 그 win1에 자동으로 연결되지 않는 것처럼 보일 수 있습니다.
- 이때에도 역시 turtle 모듈은 자동으로 기본 Screen 객체를 생성하거나 기존 Screen을 가져다 씁니다. 이번에는 명시적으로 만들어진 기존 Screen 객체 win1을 가져다 쓰는 경우가 됩니다.
 
주의
- 사실상 turtle.Screen()이 싱글톤(singleton)처럼 동작해서, 여러 번 호출해도 동일한 Screen 객체를 반환해요.
즉, win1이든 자동 생성된 것이든 둘은 결국 같은 객체가 됩니다.
 
# turtle.Screen() 은 거북이 스크린 생성자임.
win1 = turtle.Screen()    # 스크린 객체가 하나 생성됨. 
t = turtle.Turtle()

print(win1 == turtle.Screen())    # 동등성을 비교하면서 또 하나의 스크린 객체가 생성됨.   
# True가 출력됨 → 같은 객체!
 
 
■ turtle 거북이 컬러링
 
def windmill():
    r = 0.2
    g = 0.6
    b = 0
    
t.fillcolor(r, g, b)
    for _ in range(4):    
# i to _
        
t.begin_fill()
        tri1()
        
t.end_fill()
        t.lt(30)
        r = r + 0.15
        b = b + 0.2
        
t.fillcolor(r, g, b)

 
 
순서 :
 
이 예제에서는 면 색만 다루고 있어서 면 색을 결정하는 부분만 살펴봅니다.
 
1) 면 색을 구성하는 값들을 결정하고(0~1 사이의 실수값으로. 0.00정도가 최소값, 1.00 정도가 최대값. 빛의 양임.)
2) 거북이 메소드 함수로 fillcolor(r, g, b) 형태로 컬러값을 실제로 대입하여 함수 콜. 여기까지가 색상을 결정하는 과정임.
3) 거북이로 그리기 전에 begin_fill() 함수를 먼저 호출하고 그림을 다 그리면 end_fill()을 호출합니다.
 
그러면 begin_fill()과 end_fill() 이 두 함수 사이의 모든 도형의 면은 자동으로 지정한 색상으로 색이 칠해집니다.
 
위 코드에서는 tri1() 함수로 그려지는 모든 도형의 모든 면들이 여기에 해당됩니다.
 
 
■ 그리기 속도 요소.
1) Screen객체.tracer(0)
2) t.speed(100)
 
win1.tracer(0)
# win1.tracer(0, 0) 형식으로 옵션을 추가해서 표현할 수도 있습니다.
# Turns turtle animation on/off and set delay for update drawings.

# For hispeed drawing.
# or win1.tracer(2, 10), 적당한 타협안임.

# 그리기 진행 상황이나 그 모양을 봐야 하는 경우도 있기 때문.
# 스크린 윈도 크기 설정을 생략 시,
# 안드로이드 폰에서는 윈도 모양이
# 기대와는 다를 수도 있습니다. ^.^;

 
t.speed(100)
 
t.speed(n) 형식으로 사용되어 n에 적당한 정수 숫자를 넣어 거북이 이동 속도를 결정합니다.

 
숫자 n 값의 의미 (n은 0~10 사이)

   
0즉시 완료애니메이션 없이 곧바로 그려짐
1가장 느린 속도 (slowest)움직임이 매우 천천히 보임
3~5중간 속도적절히 천천히 움직임
10가장 빠른 속도 (fastest)빠르게 선을 그림

 
 
아래처럼 문자열로도 대신 설정이 가능합니다.
 
t.speed("slowest")  # == t.speed(1)
t.speed("normal")   # == t.speed(6)  (기본값)
t.speed("fast")     # == t.speed(10)
 
기본값은 "normal" (숫자로는 약 6 정도)입니다. 그래서 별도로 설정하지 않으면 적당한 속도로 이동합니다.
 
t.speed(100)의 100은 0, 또는 10 정도로 수정할 수 있습니다. 100이라고 해도 오류가 발생하지는 않습니다만.

.
.


5. 응용 연습

Not Yet
.
.
 

6. Files

Turtle_Screen_Coloring_n_turtle_Speed_Ex_001_.py
0.00MB

 
.
.
 
 

7. Ref.

 
1) Python 내장 turtle 도움말
2) 김영탁, 컴퓨팅 사고와 파이썬 프로그래밍, 홍릉. 2022. 서울.
3) 우재남, 파이썬. 3판.
4) Mark Lutz, Programming Python. 4th. O'Reilly.
5) Mark Lutz, Learning Python. 5th. O'Reilly.
 
.
.


Happy Programming!
^.^;