티스토리 뷰

파이썬/파이썬 GUI

[파이썬]캔버스

cll179 2017. 10. 30. 19:26

9.5 캔버스(Canvas)

- 모양을 나타내기 위해 캔버스(Canvas) 위젯을 이용할 수 있다.

- 우리는 아래의 메소드들을 이용해 모양을 그릴 수 있다.

ex) create_rectangle(사각형), create_oval(타원), create_arc(호), create_polygon(다각형), create_line(선분)

- 아래의 예제는 캔버스(Canvas) 위젯을 어떻게 사용하는지 보여주는 예이다.

 

*캔버스 예제(CanvasDemo.py)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from tkinter import * #tkinter의 모든 정의를 임포트한다.
 
class CanvasDemo :
    def __init__(self) :
        window = Tk() #창을 생성한다.
        window.title("Canvas Demo"#창 제목 설정
 
        #윈도우 창에 캔버스 배치한다.
        self.canvas = Canvas(window, width = 200, height = 100, bg = "white")
        self.canvas.pack()
 
        #프레임에 버튼을 배치한다.
        frame = Frame(window)
        frame.pack()
 
        btRectangle = Button(frame, text = "Rectangle", command = self.displayRect)
 
        btOval = Button(frame, text = "Oval", command = self.displayOval)
 
        btArc = Button(frame, text = "Arc", command = self.displayArc)
 
        btPolygon = Button(frame, text = "Polygon", command = self.displayPolygon)
 
        btLine = Button(frame, text = "Line", command = self.displayLine)
 
        btString = Button(frame, text = "String", command = self.displayString)
 
        btClear = Button(frame, text = "Clear", command = self.clearCanvas)
 
        btRectangle.grid(row = 1, column = 1)
        btOval.grid(row = 1, column = 2)
        btArc.grid(row = 1, column = 3)
        btPolygon.grid(row = 1, column = 4)
        btLine.grid(row = 1, column = 5)
        btString.grid(row = 1, column = 6)
        btClear.grid(row = 1, column = 7)
 
        window.mainloop() #이벤트 루프를 생성한다.
 
    #사각형 출력 
    def displayRect(self):
        self.canvas.create_rectangle(10,10,190,90,tags = "rect")
 
    #타원 출력
    def displayOval(self):
        self.canvas.create_oval(10,10,190,90, fill = "red", tags = "oval")
 
    #호 출력
    def displayArc(self):
        self.canvas.create_arc(10,10,190,90,start = 0, extent = 90, width = 8, fill = "red", tag = "arc")
 
    #다각형 출력
    def displayPolygon(self):
        self.canvas.create_polygon(10,10,190,90,30,50,tags = "polygon")
 
    #선분 출력
    def displayLine(self):
        self.canvas.create_line(10,10,190,90,fill = "red", tags = "line")
        self.canvas.create_line(10,90,190,10, width = 9, arrow = "last", activefill = "blue", tags = "line")
 
    #문자열 출력
    def displayString(self):
        self.canvas.create_text(6040, text = "Hi, I am a string",
                                font = "Times 10 bold underline", tags = "string")
 
    #그림 제거
    def clearCanvas(self):
        self.canvas.delete("rect""oval""arc""polygon""line""string")
 
CanvasDemo() # GUI 생성
 
cs

 

<실행 결과>

 

 

- Line 9-10, 너비 200픽셀, 높이 100픽셀, 배경색이 하얀색인 캔버스 위젯이 창에 배치되어 있다.

- Line 16-28, 7개의 버튼을 Rectangle, Oval, Arc, Polygon, Line String, Clear 란 텍스트 라벨과 함께 생성하였다.

- Line 30-36, 그리드 매니저(Grid Manager)를 이용해 버튼을 한 행에 차례로 배치하였다.

 

- 그림을 나타내기 위해선, 캔버스 위젯에게 어느 위치에다 그림을 그릴 것인지 알려주어야 한다.

- 각 위젯들은 왼쪽 상단 (0, 0)으로 설정되어 있는 자기 고유의 위치를 이미 보유하고 있다.

 

- Tkinter의 x축, y축 좌표계와 우리가 일반적으로 알고 있는 좌표계는 다르다는 것을 명심하자.

- Tkinter의 x좌표는 증가하면 우측방향을 향하고, y좌표는 증가하면 아래방향으로 향한다.

 

- Line 42-59 까지, 그림을 그리기 위한 메소드들을 사용하였다.

ex) create_rectangle(사각형), create_oval(타원), create_arc(호), create_polygon(다각형), or create_line(선분)

 

- create_text 메소드는 텍스트 문자열을 그리는데 사용되는 함수이다.

*creat_text 사용형식

create_text(x, y, text) #(x, y) 좌표에 텍스트를 그린다.

 

- 모든 드로잉 메소드에 사용된 tags 명령문그림들을 식별하는데 이용된다. 이 태그들은 delete 메소드에서 이용되었다.

 

- Line 50, 59의 width 명령문은 그림에 사용될 펜 사이즈를 픽셀단위로 지정하는데 사용된다. Line50, 59

- Line 59, arrow 명령문은 선분에 화살표를 그릴때 사용된다. first, end, last와 같은 값을 이용해 선분의 시작지점, 끝지점, 선분 양 끝지점에 화살표를 그릴 수 있다.

- Line 59, activefill 명령문은 그림에 마우스를 올렸을 때 색이 바뀌게 해주는 명령문이다.

 

참고 문헌 : Introduction to Programming Using Python / Y.DANIEL LIANG



본 게시물은 개인적인 용도로 작성된 게시물입니다. 이후 포트폴리오로 사용될 정리 자료이니 불펌과 무단도용은 하지 말아주시고 개인 공부 목적으로만 이용해주시기 바랍니다.


교재 영어 원서를 직접 번역하여 정리한 게시물이므로 일부 오타, 의역이 존재할 수 있습니다. 틀린 부분이 있다면 댓글로 알려주시면 감사하겠습니다. 

댓글