https://book.naver.com/bookdb/book_detail.nhn?bid=16268369
으뜸 파이썬과 함께 공부하는 포스트입니다.
turtle graphic은 그림을 그리는 기능이다. 거북이가 꼬리에 잉크를 묻혀 돌아다니는 것을 생각하면 재미있다.
파이썬에 기본적으로 내장되어있는 모듈이고, 많은 함수와 기능이 있다. 프로그래밍을 흥미롭게 배울 수 있는 아주 좋은 요소이다.
실행 결과
이런 패턴을 그릴 수 있다. 실행이 완료되면 프로그램은 정지된다. 종료버튼을 입력하면 프로그램이 종료되는 전형적인 윈도우 기반 프로그램이 나타난다.
※ 주의 : 파이썬 turtle 모듈의 파일 이름이 turtle.py 이므로 프로그램 이름을 이와 같이 하면 안된다. 저렇게 만들면 turtle모듈이 호출되지 않으므로 터틀 그래픽 시스템이 작동하지 않는다.
이제 실행을 하거나 선을 그리는 명령을 알아보자.
실행 결과
우선 t.setup(width = 400, height = 400)은 터틀 그래픽의 윈도우 크기와 속성을 지정하는데, 너비, 높이가 400으로 설정하였다.
t.forward는 앞으로 이동, t.left는 입력한 각도만큼 왼쪽으로 회전, t.right는 입력 각도만큼 오른쪽 회전, t.backward는 뒤로 이동하는 것이다. 그리고 마지막에 쓴 t.bye()는 터틀 그래픽을 종료하는 명령어이다.
터틀 그래픽에는 여러가지 커서가 있다. 화살표가 디폴트이다. shape() 함수가 커서를 바꾸는 기능을 하는 명령어이다. 화살표, 거북이, 원, 사각형, 삼각형 등이 있다.
실행 결과
커서의 모양은 t.shape("turtle")과 같이 인자의 이름을 따옴표로 묶어서 입력해야 한다. 그리고 이렇게 t.shapesize로 크기를 변경할 수도 있다.
스크립트 모드에서는 코드의 제일 마지막에 done()과 같은 코드를 입력하여 터틀 그래픽의 이벤트 루프를 구동시켜 주어야 사용자의 입력을 받고 종료하는 기능도 잘 동작한다.
done() 명령어는 프로그램을 이벤트 루프로 진입시키는 기능을 한다. 이벤트란 그래픽 기반 프로그램에서 마우스, 키보드 같은 사용자의 입력이나 시간의 진행과 같은 사건을 말하고 이 이벤트에 의해 실행되는 프로그램을 이벤트 기반 프로그램이라 한다.
이 프로그램이 이벤트 루프로 진입해야만 종료 버튼과 같은 버튼들이 마우스 이벤트를 받아 프로그램을 끝내는 일을 하게 된다.
다음은 좌표 이동이나 그리기에 사용되는 메소드를 알아보자.
그리기 뿐만 아니라 색상, 색 채우기, 상태 변경, 상태 값 얻기 명령도 있다.
이제 간단한 그림을 그려보자.
먼저 직사각형이다.
실행 결과
forward 명령과 left 명령만으로 만들 수 있다. 이 명령들을 반복하는 것을 보고 생각나는 것이 있지 않나?
그렇다. for문을 사용하여 코드를 짧게 만들 수 있다.
실행 결과
실행 결과
이렇게도 할 수 있고, for문을 이중으로 써서 만들 수도 있다.
실행 결과
사각형 뿐만 아니라 원도 forward와 left 두가지만으로 그릴 수 있다.
실행 결과
이 뿐만 아니라 circle() 명령으로 더욱 더 쉽게 구할 수 있다. 반지름만 명령 안에 입력해주면 끝난다.
실행 결과
이제 크기가 다른 원 4개를 한 점을 기준으로 그려보자.
실행 결과
이 때 커서의 방향을 바꾸는 setheading(90)을 추가하면 헤딩 방향이 위쪽으로 변경되므로 원점의 왼쪽에 4개의 원이 나타난다.
실행 결과
여러개를 겹쳐 그려보기도 했으니 이제 그린 도형 안에 색을 채워보자.
실행 결과
색 지정을 t.color('blue')와 같이 했다. 다른 색으로 바꾸려면 'blue'가 아니라 다른 색을 적으면 된다.
t.begin_fill()이 색을 채우는 명령어이고, 이를 쓴 다음 도형을 그리는 명령어를 적고 나서 t.end_fill()로 마무리해준다. t.end_fill()을 꼭 적어야 한다.
실행 결과
코드에서 선의 색상을 바꾸는 것만으로도 독특하고 아름다운 패턴을 만들 수 있다.
선의 색을 colors 요소에 리스트로 넣고. pencolor로 선의 색깔을 바꾼다. 이 때 항목이 교대로 나타나도록 colors[i % 4]를 이용하여 색상을 인덱싱 하는 것이 아래 코드이다.
실행 결과
여기에 배경 색상도 변경해보자. 변경 명령어는 bgcolor()이다. 더 느낌 있어보인다.
지금까지 다 다각형이었는데 X와 같이 연결되지 않은 2개의 선분은 어떨까? 이 때 사용하는 것이 penup(), goto(), pendown() 명령이다. goto()는 지정 위치로 커서를 이동하는데 디폴트로는 선을 그리며 이동한다.
따라서 penup() 명령으로 펜을 들어 이동시키고 pendown()을 이용하여 펜을 다운시키면 원하는 위치까지 선분을 그리지 않고 커서만 이동하는 것이 가능하다.
실행 결과
또 다른 터틀 그래픽의 재밌는 기능 중 하나는 random 모듈을 활용하여 임의의 선분을 마음대로 그리는 기능이나 스탬프 기능을 이용하여 터틀 커서가 지나간 곳에 자취를 남기는 기능이 있다.
실행 결과
이 코드를 수정하여 t.stamp() 명령을 for 블록의 마지막에 추가하면 이동 후 circle 형태의 스탬프를 출력한다.
sys 모듈은 파이썬 인터프리터가 제공하는 변수들과 함수들을 직접 제어할 수 있게 해주는 모듈이며 인터프리터 메소드와 상수에 관련된 정보도 살펴볼 수 있다.
prefix 속성은 파이썬의 설치 경로, version 속성은 파이썬 인터프리터의 버전을 알려준다.
copyright 속성은 파이썬의 저작권 관련 내용이다. 마지막으로 sys.path는 모듈을 찾을 때 참조하는 경로를 나타낸다. 파이썬이 서치되면 내장 모듈도 함께 설치되는데 모듈이 시스템의 경로상 어디에 있는지 알 수 있다.
그래픽 사용자 인터페이스는 컴퓨터와 같은 전자기기의 디스플레이에 시각적인 아이콘과 이미지를 정보를 표시하며 마우스나 터치패드와 같은 기기를 이용하여 사용자가 조작할 수 있는 인터페이스이다. 영어로 GUI라고 줄여서 표기하고 '구이'라고 발음한다.
파이썬에는 많은 GUI 기반 모듈이 있으나 tkinter가 가장 널리 이용된다. 티케이인터라고 발음한다.
Tk라는 유명한 GUI 도구를 기반으로 개발되었다.
실행 결과
코드를 하나하나 분석해보자. 맨 위의 from tkinter import * 는 모듈 내에 정의된 모든 클래스와 함수, 상수를 이 코드 안으로 가져오는 역할을 한다.
window = Tk()는 Tk라는 객체를 생성하는 코드인데 Tk 객체는 화면에 나타나는 윈도 창 객체로 최대화, 최소화, 닫기 버튼을 가진 기본적인 윈도우 창 객체이다.
그리고 이 프로그램에서 윈도우 객체는 window라는 이름의 변수명으로 참조할 수 있다.
이 윈도우에 문자를 넣기 위해서는 Label이라는 위젯이 필요하다.
GUI 프로그래밍을 위해서는 화면상에 나타나게 될 레이블, 버튼, 텍스트 상자, 리스트 상자, 메뉴 등의 많은 그래픽적 기능을 하는 요소들이 필요한데 이렇게 미리 만들어진 제어 가능한 요소들을 위젯이라고 한다.
Label 위젯을 생성할 때 첫번째 인자는 이 레이블이 표시되는 윈도우나 캔버스가 되는데 이를 부모 컨테이너라 한다. text = ' 헬로 파이썬'이 레이블 위젯에 뿌려질 문자열의 내용이다.
다음으로. label.pack()은 pack() 이라는 메소드를 사용하여 컨테이너에 레이블을 위치시킨다. 마지막으로 window.mainloop()는 이벤트 루프를 생성하는 역할을 한다.
이벤트는 사용자가 마우스로 버튼이나 체크상자를 클릭, 키보드에 입력을 하는 행위이고, 행위가 발생하면 이를 처리할 수 있도록 프로그램은 항상 대기상태가 되어야 한다.
대기상태는 윈도우를 닫을 때까지 지속된다. 이 코드가 없으면 윈도우 자체가 화면에 나타나지 않는다.
tkinter를 이용한 프로그램은 기본적으로 이와같은 틀을 갖는다. 이제 버튼과 레이블을 가지고 버튼 클릭시마다 서로 다른 레이블을 표시하는 프로그램을 만들어 보자.
실행 결과
위쪽이 처음에 생기고 클릭하면 아래쪽이 된다. 코드를 분석해보자.
1) tkinter라는 모듈 내 정의된 모든 클래스의 함수, 상수를 가져온다
2) 화면에 나타나는 윈도 창 객체인 Tk 객체를 생성한다.
3) 레이블과 버튼 객체를 각각 생성한다.
4) 이벤트 루프를 생성한다.
command는 버튼이 클릭될 때 호출되는 함수나 메소드를 지정해준다. 이 버튼을 클릭하면 change_label() 함수가 호출되어 레이블의 텍스트와 배경 색상을 오른쪽과 같이 변경한다.
엔트리 객체는 사용자의 키보드 입력을 문자열로 받을 때 유용하다. 생성하는것은 레이블이나 버튼과 유사하다.
input_entry = Entry(window, width = 50)과 같이 엔트리 객체를 생성하면 윈도우의 하위 노드로 엔트리가 생성되며 폭은 50이 된다.
실행 결과
버튼을 누르면 위와 같이 나오는 프로그램을 만들었다.
이제 bmi지수 계산기를 만들어보자.
실행 결과
bmi 계산을 하려면 체중 나누기 키의 제곱인데, 이 때 키의 단위는 미터를 써야한다. 그러므로 h에 키를 입력받을 때 100을 나누어 줌으로써 bmi 지수 계산기가 만들어진다.
bmi 계산기 뿐만 아니라 일반적인 계산기도 만들 수 있다.
일단 외형부터 만들어보자.
실행 결과
배치는 잘 되었다. 하지만 버튼에 할당 된 명령이 없으므로 아무런 동작이 일어나지 않는다.
버튼을 누르는 것이 위에서 이벤트라고 했다. 이벤트가 발생하면 프로그램의 메인루프는 발생 한 이벤트가 있는지 살펴본다.
이벤트가 확인되면 이벤트를 처리할 이벤트 처리 함수를 호출하는데 이를 콜백이라고 한다.
이제 명령을 만들고 실행해보자. command = None이 명령이 없어서 동작이 없다는 뜻이다.
실행 결과
(1) 덧셈
(2) 뺄셈
(3) 곱셈
(4) 나눗셈
함수를 정의하여 명령을 입력해넣어서 계산기가 완성되었다.
Tkinter 모듈은 이외에도 다양한 그래픽 사용자 인터페이스를 위한 위젯 컴포넌트와 컨테이너가 있고,
이 위젯을 배치하는 기법도 제공하고 있다.