파이썬 - 18일차 - 중급 터틀&그래픽 사용자 인터페이스(GUI)

Shy·2023년 2월 24일

Python

목록 보기
6/9

터틀

GUI란?

  • Graphical User Interface

터틀 그래픽 이해하기 및 문서 사용법

터틀은, 등에 펜을 가지고 그림을 그리며 기어가는 거북이라 생각하면 된다.

from turtle import Turtle, Screen # 대문자 주의

timmy_the_turtle = Turtle()
timmy_the_turtle.shape("turtle") # 거북이로 모양을 바꾼다.
timmy_the_turtle.color("red") # 색을 변경함. color 안에는 Tk색을 입력할 수 있다. (Tkinter)
timmy_the_turtle.forward(100) # 100만큼 앞으로 간다
timmy_the_turtle.right(90) # 거북이 시점, 90도 만큼 오른쪽으로 돈다.

screen = Screen()
screen.exitonclick() # 클릭시 창이 사라짐
  • 프로그래머들이 위 터틀 그래픽과 같은 모듈 또는 패키지의 사용법을 알아내는 방법은 공식 문서를 이용하는 것이다. (turtle graphic documentation)
  • 혹은 스택오버플로(stack overflow)에 검색을 해본다. changing the turtle shape.stackoverflow를 구글에 검색하면 정확한 결과가 나올 수도 있음.



터틀 과제 - 정사각형 그리기

from turtle import Turtle, Screen

timmy_the_turtle = Turtle()

for _ in range(4):
	timmy_the_turtle.forward(100)
	timmy_the_turtle.left(90)
    
screen = Screen()
screen.exitonclick()

이름 간단히 바꾸기



모듈 임포트하기, 패키지 설치하기, 별칭

// 사용 횟수가 적다면 이렇게 사용
import turtle
tim = turtle.Turtle()
// 사용 횟수가 많다면 이렇게 사용
from turtle import Turtle
tim = Turtle()
tom = Turtle()
// 모든 것을 임포트 할 수 있다. 하지만 이 것은 굉장히 혼란스럽게 만드는데,
// 에디에서 온 것인지, 어떤 모듈이 이 기능을 포함하는지 알 수가 없다.
from turtle import *
from random import *
// 우리가 이름을 짧게 지정할 수 있다.
import turtle as t
tim = t.Turtle()



모듈 설치하기

빨간색 전구를 누르면, 패키지를 설치할 수 있다.



터틀 과제 2 - 점선 그리기

import turtle as t
from turtle import Screen

tim = t.Turtle()

for _ in range(15):
    tim.forward(10)
    tim.penup()
    tim.forward(10)
    tim.pendown()

screen = Screen()
screen.exitonclick()

10칸 앞으로 가고, 팬 업 한다음 다시 10칸 앞으로 가고 팬 다운을 하여, 점선이 그려지게 된다.

터틀 과제 3 - 다양한 도형 그리기

Draw a triangle, square, pentagon, hexagon, heptagon, octagon, nonagon and decagon

  • 각 변의 길이는 100이어야 한다.
import turtle as t
import random

tim = t.Turtle()

colours = ["CornflowerBlue", "DarkOrchid", "IndianRed", "DeepSkyBlue", "LightSeaGreen", "wheat", "SlateGray",
           "SeaGreen"]


# 그리기 위한 정의
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, 10):
    tim.color(random.choice(colours))
    draw_shape(shape_side_n)



터틀 과제 4 - 무작위 행보 구현하기

30만큼 가야 한다.
방향은 상하좌우 무작위로 제작한다.

import turtle as t
from turtle import Screen
import random
from typing import Set

tim = t.Turtle()

colours = ["CornflowerBlue", "DarkOrchid", 'IndianRed', "DeepSkyBlue", "LightSeaGreen", "wheat", "SlateGray",
           "SeaGreen"]
directions = [0, 90, 180, 270]
tim.pensize(15)
tim.speed("fastest")

for _ in range(200):
    tim.color(random.choice(colours))
    tim.forward(30)
    tim.setheading(random.choice(directions))

screen = Screen()
screen.exitonclick()



파이썬 튜플 및 임의의 RGB 색상 생성하기

Python Tuples: 파이썬의 데이터 타입 중 하나로, 다음과 같이 생겼다.
(1, 3, 8)
내부의 각 아이템은 쉼표로 구분된다.

  • 튜플은 수정 하거나, 내부 아이템을 제거 할 수 없다. 이러한 특성을 immutable이라 한다.
  • 만약 튜플은 리스트로 변경이 가능하다.
my_tuple = (1, 3, 8)
my_tuple[2] # 8
my_tuple[2] = 12
# Error: 'tuple' object does not support item assignment

list(my_tuple) # [1, 3, 8]
my_tuple # (1, 3, 8)
my_tuple = (2, 4, 6)

my_tuple # (2, 4, 6)

임의의 RGB색상을 생성하는 코드는 다음과 같다.

import turtle as t
from turtle import Screen
import random

tim = t.Turtle()
t.colormode(255) #rgb모드로 변경


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(15)
tim.speed("fastest")

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

screen = Screen()
screen.exitonclick()



터틀 과제 5 - 스피로그래피 그리기

계속해서 원이 그려지는 모양. (Spirograph)
터틀을 움직여 반지름이 100인 여러 개의 원을 그린다.

import turtle as t
from turtle import Screen
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)
    color = (r, g, b)
    return color


tim.speed("fastest")


def draw_spirograph(size_of_gap):
    for _ in range(int(360 / size_of_gap)):
    # range는 float를 입력 받을 수 없기에, integer로 바꿔주어야 한다.
        tim.color(random_color())
        tim.circle(100)  # 지름이 100인 원을 그린다.
        tim.setheading(tim.heading() + size_of_gap)  # 기존 각도 + 돌릴 각도


draw_spirograph(5)

screen = Screen()
screen.exitonclick()



허스트 페인팅 프로젝트1부

허스트 페인팅을 제작하기 위해서, 원 작품의 색을 추출해야 한다.

해당 그림의 색을 추출하기 위해서, 알맞는 패키지를 설치한다.

[ctrl] + [alt] + [s] 를 한 후, colorgram 패키지를 설치한다.

이렇게 설치를 하면, 외부 패키지 사용이 가능하다.

해당 패키지는, 칼러를 출력하는 패키지이다.

r=, g=, b= 를 따로따로 for 형식으로 만들어서 append한 이유는, 튜플 형식으로 만들기 위해서이다.

이렇게 추출한, rgb값은 허스트 페인팅 2부에서 활용하도록 한다.



허스트 페인팅 프로젝트2부 - 점그리기

위에서 출력한 컬러 리스트를 가지고, 허스트 페인팅을 제작해 본다.

import turtle as turtle_module
import random

turtle_module.colormode(255)
tim = turtle_module.Turtle()
tim.speed("fastest")
tim.penup()
tim.hideturtle()  # 터틀 팬 숨기기
color_list = [(202, 164, 109), (238, 240, 245), (150, 75, 49), (223, 201, 135), (52, 93, 124), (172, 154, 40),
              (140, 30, 19), (133, 163, 185), (198, 91, 71), (46, 122, 86), (72, 43, 35), (145, 178, 148), (13, 99, 71),
              (233, 175, 164), (161, 142, 158), (105, 74, 77), (55, 46, 50), (183, 205, 171), (36, 60, 74),
              (18, 86, 90), (81, 148, 129), (148, 17, 20), (14, 70, 64), (30, 68, 100), (107, 127, 153), (174, 94, 97),
              (176, 192, 209)]
tim.setheading(225)
tim.forward(300)
tim.setheading(0)  # 초기 터틀 값
number_of_dots = 100   # 내가 그릴 점의 갯수

for dot_count in range(1, number_of_dots + 1):
    tim.dot(20, random.choice(color_list))  # 20 크기 만큼의 점을 찍는다.
    tim.forward(50)  # 50 만큼 앞으로 전진

    if dot_count % 10 == 0:
        tim.setheading(90)  # 90도(위를 향하는 방향)
        tim.forward(50)  # 50만큼 위로 올라감
        tim.setheading(180)  # 180도(왼쪽을 향하는 방향)
        tim.forward(500)  # 500만큼 전진
        tim.setheading(0)

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

profile
신입사원...

0개의 댓글