티스토리 뷰

9.4 위젯 클래스(The Widget Classes)

- TkinterGUI 클래스버튼, 라벨,  확인 버튼, 캔버스 등의 공통 GUI 위젯들이 정의되어 있다.

- 아래의 표는 Tkinter가 제공하는 핵심 위젯 클래스이다.

 

*Tkinter 위젯 클래스

 Widget Class

Description 

 Button

 명령을 실행하는 간단한 버튼이다.

 Canvas

 그래프나 도면, 그래픽 에디터 생성, 커스텀 위젯 구현 등에 이용될 캔버스, 일종의 그림판이다.? (다음 챕터에서 따로 다룬다.)

 Checkbutton

 값을 토글(toggle)하는 체크박스이다.

 Entry

 텍스트(Text)가 들어갈 필드이다. 이를 텍스트 필드(text field), 또는 텍스트 박스(text box)라고 부르기도 한다.

 Frame

 다른 위젯들을 가지는(containing) 컨테이너 위젯(container widget)이다.

 Label

 텍스트나 이미지를 출력하는 라벨이다. 

 Menu

 펼침 목록(pull-down menu)와 팝업 메뉴(pop-up menu)를 구현하는 메뉴 판이다.

 Menubutton

 펼침 목록(pull-down menu)에 쓰일 메뉴 버튼이다.

 Message

 텍스트를 출력한다. 라벨(Label) 위젯과 비슷하지만 차이점은 텍스트의 크기를 비율에 맞게 자동으로 맞춰준다(wraping). 

 Radiobutton

 동그란 버튼(radio button)을 생성한다. 값을 변수에 할당하고 같은 변수를 가진 다른 동그란 버튼들의 값을

 Text

 서식화한 텍스트(formatted text)를 출력한다.

 

- 위의 클래스 안에는 위젯을 만들기 위한 많은 옵션들이 존재한다.

 

- 제일 처음 필요한 요소로는 부모 컨테이너(parents container)이다.

- 위젯을 만들 때 전면색(foreground color), 배경색(background color), 폰트, 그리고 커서 스타일도 마음대로 설정 할 수 있다.

- 색을 지정하기 위해서, 색깔 이름(ex. red, yellow, blue, white, black, purple)을 사용하거나 아니면 빨강(red), 초록(green), 파랑(blue)(이하 RGB 컬러)와 같은 색은 ##RRGGBB 문자열을 이용해 표현할 수 있다. 

 

- 그리고 폰트 이름과 사이즈, 스타일을 이용해 문자열의 폰트를 지정할 수 있다.

- 아래가 예가 있다.

 

*폰트 지정 형식

Times 10 bold

Helvetica 10 bold italic

CourierNew 20 bold italic

Courier 20 bold italic overstrike underline

- 기본적으로(by default), 라벨(label)과 버튼(button) 안에 있는 텍스트는 가운데에 정렬된다. 이 정렬은 justify 옵션을 이용해 변경이 가능하다(ex. 콘스턴트 LEFT, CENTER, RIGHT)

 

- cursor 옵션을 이용해 마우스 커서 스타일도 지정할 수 있다.(ex. arrow(기본형), circle, cross, plus)

- 그 외에도 위젯을 생성 할 때, 다양한 특성(properties)들을 직접 지정할 수 있다. (ex. fg, bg, font, cursor, text, command)

- 아래와 같은 문법을 이용해 위젯의 특성을 바꿀 수 있다.

 

*위젯 특성 형식

widgetName["propertyName"] = newPropertyValue

- 예를 들어, 아래의 코드는 버튼(button)을 만들어 이 버튼의 텍스트의 특성을 바꾸는 코드이다.

- 숨기고, 배경색을 빨갛게하고, 전경색을 #AB84F9. #AB84F 색(from RRGGBB)으로 지정하는 코드이다.

 

*버튼 특성 예제

btShowOrHide = Button(window, text = "Show", bg = "white")

btShowOrHide["text"] = "Hide"

btShowOrHide["bg"] = "red"

btShowOrHide["fg"] = "#AB84F9" # Change fg color to #AB84F9

btShowOrHide["cursor"] = "plus" # Change mouse cursor to plus

btShowOrHide["justify"] = LEFT # Set justify to LEFT

 

- 아래의 예제가 위에서 소개한 클래스들의 예제코드이다.

 

*widget 예제(WidgetsDemo.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
from tkinter import * # tkinter의 모든 정의를 임포트한다.
 
class WidgetsDemo:
    def __init__(self):
        window = Tk() # 창을 생성한다.
        window.title("위젯 데모"# 제목을 설정한다.
 
         # 체크 버튼과 라디오 버튼을 frame1에 추가한다.
        frame1 = Frame(window) # 프레임을 생성하고 창에 추가한다.
        frame1.pack()
        self.v1 = IntVar()
        cbtBold = Checkbutton(frame1, text = "굵게",
            variable = self.v1, command = self.processCheckbutton)
        self.v2 = IntVar()
        rbRed = Radiobutton(frame1, text = "빨간색", bg = "red",
            variable = self.v2, value = 1,
            command = self.processRadiobutton)
        rbYellow = Radiobutton(frame1, text = "노란색",
            bg = "yellow", variable = self.v2, value = 2,
            command = self.processRadiobutton)
        cbtBold.grid(row = 1, column = 1)
        rbRed.grid(row = 1, column = 2)
        rbYellow.grid(row = 1, column = 3)
 
         # 레이블, 엔트리, 버튼, 메시지를 frame2에 추가한다.
        frame2 = Frame(window) # 프레임을 생성하고 창에 추가한다.
        frame2.pack()
        label = Label(frame2, text = "이름을 입력하세요: ")
        self.name = StringVar()
        entryName = Entry(frame2, textvariable = self.name)
        btGetName = Button(frame2, text = "이름 가져오기",
                                   command = self.processButton)
        message = Message(frame2, text = "위젯 데모입니다.")
        label.grid(row = 1, column = 1)
        entryName.grid(row = 1, column = 2)
        btGetName.grid(row = 1, column = 3)
        message.grid(row = 1, column = 4)
 
        # 텍스트를 추가한다.
        text = Text(window) # 텍스트를 생성하고 창에 추가한다.
        text.pack()
        text.insert(END,
            "팁\nTkinter를 학습하는 최고의 방법은 잘 짜여진 ")
        text.insert(END,
            "예제를 세세히 읽고 애플리케이션을 생성하는데 ")
        text.insert(END, "직접 사용해 보는 것이다.")
 
        window.mainloop() # 이벤트 루프를 생성한다.
 
    def processCheckbutton(self):
        print("체크 버튼이 "
            + ("선택되었습니다. " if self.v1.get() == 1 else "해제되었습니다."))
 
    def processRadiobutton(self):
        print(("빨간색" if self.v2.get() == 1 else "노란색")
            + " 이 선택되었습니다." )
 
    def processButton(self):
        print("당신의 이름은 " + self.name.get() + "입니다.")
 
WidgetsDemo() # GUI를 생성한다.
 
cs

 

예제 코드 추가 설명 :

 

* IntVar, DoubleVar, StringVar

- tkinter 모듈 안에는 IntVar, DoubleVar, StringVar 클래스가 정의되어 있다.

- IntVar은 정수, DoubleVar은 소수, StringVar은 문자열을 나타내는 클래스이다.

- 이 클래스들은 위젯에 쓰이는 값(value)들을 객체로 만들 때 이용한다.

- 즉 위젯에 쓰이는 값(value)은 IntVar, StringVar, DoubleVar의 객체(object)이어야만 한다.

 

- Line 11의 체크버튼(check button)을 예로 들어 설명하자면

- 이 버튼은 변수 v1을 이용하는 체크버튼이다.

- v1IntVar의 인스턴스이며, 체크버튼에 쓰일 값저장된 객체를 가르킨다.

- v1은 체크버튼을 눌렸다면 정수 '1'로 설정되고, 체크버튼을 누르지 않으면 정수 '0'으로 된다.  

 

*grid 기하 관리자(geometry manager)

- Line 21-23 의 .gird(row, col)은 위젯의 배치를 담당하는 관리자이다.

- Line 21-23 의 위젯들은 같은 줄의 1, 2, 3 열에 제 각각 배치된다.

- 기하관리자는 이후에 다시 다룬다.

 

*insert 메소드

- insert 메소드를 이용하여 텍스트를 이 위젯안에 삽입 할 수 있다.

- 'END' 옵션은 문자열 맨 뒤에 특정 텍스트들 삽입한다는 의미를 가지고 있다. 

 

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



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


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

 

댓글