본문 바로가기
Python/Python tkinter

[Python tkinter] 10. Text 위젯 생성

by Rosmary 2022. 3. 10.
728x90
반응형

 

 

 

Text 위젯은 한 줄 이상의 글자를 작성할 수 있는 위젯이다. 의외로 굉장히 광범위하게 볼 수 있는 위젯인데, 윈도우의 기본 프로그램인 메모장이나, 인터넷 카페나 블로그의 댓글 입력창 등을 Text 위젯의 예로 들 수 있다.

 

 

기능 자체가 워낙 단순한 위젯이기 때문에, 생성과 배치는 크게 어렵지는 않다. 속성이 조금 많아서 문제긴 하다만 말이다. 바로 시작해보자.

 

 

1. Text() 클래스 

 

Text() 클래스의 선언은 아래의 포맷으로 진행한다.

 

Text 위젯 변수명 = tkinter.Text(master=Text 위젯을 배치할 창 객체명)

 

다른 클래스들과 달리, master 속성으로 배치할 창이나 프레임 등만 지정해주면 위젯 생성이 끝난다. 기타 위젯 속성은 아래의 표를 참고하도록 하자.

 

<위젯 필수 속성 값>

필수 속성(인자) 설명 입력값 타입
master 위젯을 배치할 창 또는 위젯(ex: Frame) 지정  tkinter 창 객체 또는 위젯 객체


< 위젯 크기 및 배치 관련 >

선택 속성(인자) 설명 입력값 타입
width Text 위젯의 너비 설정 정수형(Int), 단 가로 문자열 수
height Text 위젯의 높이 설정 정수형(Int), 단, 입력받을 최대 줄 수
padx Text 위젯의 가로축 여백 설정 정수형(Int), 단 가로 너비 픽셀 값 입력
pady Text 위젯의 세로축 여백 설정 정수형(Int), 단 세로 너비 픽셀 값 입력

* 다른 위젯과 달리, Text 위젯의 width와 height 속성은 픽셀 크기가 아니라 가로-글자수, 세로-줄 수 를 입력한다.

< 위젯 디자인 관련 >

선택 속성(인자) 설명 입력값 타입
fg (또는 foreground) Text 위젯의 글자색 설정 색상값 문자열 입력(ex: "red")
bg (또는 background) Text 위젯의 배경색 설정 색상값 문자열 입력(ex: "red")
bd (또는 borderwidth) Text 위젯 두께 설정 정수형(Int), 기본값 1
insertwidth
Text 위젯 내 키보드 커서 너비 정수형(Int), 기본값 2
insertborderwidth Text 위젯 내 키보드 커서 두께 정수형(Int), 기본값 0
insertbackground Text 위젯 내 키보드 커서 색상 색상값 문자열 입력(ex: "red")
selectborderwidth Text 위젯 내 블록처리 글자 테두리 두께 정수형(Int), 기본값 0
selectbackground Text 위젯 내 블록처리 글자 배경 색 색상값 문자열 입력(ex: "red")
selectforeground Text 위젯 내 블록처리 글자 색 색상값 문자열 입력(ex: "red")
relief Text 위젯 테두리 설정 "flat", "sunken", "raised",
"ridge", "solid", "groove"
font Text 위젯 내 입력되는 글자의 font 설정 font("글꼴", 크기(int), "bold"/"Italic/"underline")


< 위젯 내 텍스트 설정>

선택 속성(인자) 설명 입력값 타입
wrap 자동 줄 바꿈 설정 "char" , "none", "word"
tabs 탭 키 입력 시 간격 설정 정수형(Int), 7~8 값 지정 시, 한 글자 간격 설정
spacing2 텍스트의 줄 간 사이 설정 정수형(Int), 기본값 0

 

< 위젯 상태 및 동작 설정 >

선택 속성(인자) 설명 입력값 타입
state Text 위젯 활성화 여부 설정 "normal", "disabled", "active"
undo 입력한 Text의 실행 취소 여부 설정
Ctrl + Z
Boolean
maxundo 실행 취소 최대 횟수 지정 정수형(Int), 기본값 없음

 

 

 

2. Text 위젯의 배치

 

Text 위젯의 배치는 pack(), place(), grid()를 사용하면 된다. 자세한 내용은 이 포스팅을 참고하자.
텍스트 위젯은 특이하게도, 크기에 대한 별도의 설정이 없는 경우, master 창의 크기를 따라 위젯이 생성된다. 따라서 특정 크기의 Text 위젯을 생성하고자 한다면 width와 height 속성에 대해 설정을 진행하는 것이 좋다.

 

필자는 우선 간략하게 하나의 Text 위젯을 생성하고 배치해 보았다.

 

 

3. Text 위젯 자동 줄 바꿈 설정: wrap 속성

 

윈도우의 메모장을 열어보자. 아마 별도의 설정이 되어 있지 않다면, 엔터 없이 계속 글자를 입력할 때, 줄 바뀜 없이 글자가 끝까지 입력되는 것을 알 수 있다.

 

오늘 자 스포츠 기사 한 단락을 붙여넣어보았다.

 

가로 창의 크기를 벗어날 때, 자동으로 줄 바꿈이 일어날 수 있도록 메모장의 설정을 변경할 수 있다. 메모장 '서식' 메뉴를 보면 '자동 줄 바꿈' 항목이 있는데, 이 항목이 체크되어 있다면 메모장 가로 크기에 맞게 자동 줄 바꿈을 진행해준다.

 

 

tkinter의 Text 위젯도 동일한 설정을 진행할 수 있다. 이와 관련된 속성은 wrap이 있는데, 이 속성의 값으로 char, word, none 세 가지가 있다. char는 줄 바꿈 시, 문자를 기준으로, word는 단어(띄어쓰기)를 기준으로 줄 바꿈을 진행한다. None은 메모장의 기본 설정처럼 줄 바꿈 없이 입력을 받을 때 지정하는 값이다. 기본값은 char로 되어 있다. 

 

따라서 필자가 만든 Text 위젯에 위의 예시와 동일한 문장을 넣으면 글자 단위로 줄 변경이 일어나는 것을 확인할 수 있다.

 

 

글자를 기준으로 줄 바꿈이 일어나다보니 선수 이름이 두 줄에 걸쳐 출력된다. 이제 wrap 속성을 word로 바꿔보자. 그럼 위의 결과와 달리, 선수 이름이 통째로 다음 줄에 출력되는 것을 확인할 수 있다.

 

 

마지막으로 wrap 값을 none으로 지정해보자. 그럼 문단 자체가 줄 바꿈 없이 한 줄로 출력되어 일부 내용이 잘리는 것을 확인할 수 있다.

 

 

 

4. 입력 글자 폰트 지정하기: font 속성

 

Text 위젯에 입력하는 글자의 기본 글꼴은 뭔가 예쁜 모양새는 아니다. 디자인을 중시하는 프로그래머라면 글꼴 서식도 변경하고자 하는 욕심이 있을 것이다. tkinter Text 위젯은 입력 글자의 폰트를 지정할 수 있는 속성을 제공한다. 속성의 이름은 단순히 font다. font는 Tuple 형태로 구성된 값을 사용하며, 첫 번째 index는 글꼴, 두 번째 index는 글자 크기를 지정하면 된다. 만약 볼드체나 이태리체 등을 적용하고자 한다면 세 번째 인자에 해당 값을 지정해주면 된다.

 

font = ("글꼴", 크기(int), "기타 속성")

 

필자는 글꼴을 Times로, 크기는 20으로 지정하고 입력 글자가 기울임체(이태리체)로 출력되도록 설정해보려 한다.

 

 

"어?? 그런데 저는 글꼴이랑 크기 변경 없이 볼드체만 적용하고 싶은데 어떻게 하나요?"

 

세 번째 인자를 지정하지 않는다면 글꼴과 크기는 공란으로 둘 경우 기본 글꼴이 적용된다. 

 

 

그러나 특이하게도 세 번째 인자값(italic, bold, underline)이 font 속성에 포함되는 경우 반드시 글자의 크기는 명시가 되어야 하는 듯 하다. 글자 크기 지정 없이 font=("", ,"bold) 속성을 적용하면 에러가 발생한다.

 

 

 

 

4. 텍스트 자동 입력: insert()

 

Text 위젯은 사용자가 직접 키보드를 두들기지 않더라도, Text 위젯 내에 글자 작성을 가능하도록 하는 insert()라는 매서드를 제공한다.

 

insert() 매서드 인자는 두 가지 값이 들어간다. 글자를 입력하는 매서드라 입력할 글자만 인자로 받으면 될 것 같은데, 특이하게도 Text위젯은 insert매서드로 글자 입력 시, 위치까지도 지정하도록 설계되어 있다. 

 

insert(글자를 입력할 줄 수.글자 입력할 문자 위치, "입력값")

 

만약, 필자가 첫 번째 줄의 첫 글자에 "Hello Word"라는 문장을 입력하는 버튼을 하나 만들고 싶다면, 아래와 같이 코드를 작성하면 된다.

 

 

필자는 먼저 123, 456, 789라는 문자열을 한 행 씩 키보드로 입력하고, insert 버튼을 눌렀다. 그러면 button 동작 함수에 정의된대로, 첫 번째 줄 0 번째 문자(제일 앞)에 Hello word\n가 입력된다.

 

만약 필자가 2번째 줄의 2번째 글자에 Hello word를 추가하고자 한다면, insert() 매서드의 첫 인자값을 2.2로 변경하면 된다.

 

 

이제, Text 위젯을 조금 다른 방법으로 활용해보자. 필자의 경우 Text 위젯을 실시간으로 로그 기록하는데 사용하곤 한다. 이럴 경우, 프로그램이 자동으로 자신의 로그를 Text 위젯의 가장 마지막에 추가해 주어야 하는데, insert에서 삽입할 줄 수가 계속해서 변하니 특정 값으로 지정할 수 없다는 문제가 있다. 

 

다행히 insert() 매서드는 이러한 문제점을 개발자가 일찌감치 파악해서인지, 아주 간단한 방법으로 이를 해결할 수 있도록 만들어놓았다. 첫 번째 인자에 문자열 "end"를 입력할 경우, Text에 입력된 글자의 줄 수에 상관없이 가장 마지막 줄 첫 번째 위치에 문자를 추가하게 된다.

 

 

 

5. 텍스트 자동 삭제: delete()

 

이제 Text 위젯에 입력된 문자들을 삭제하는 delete() 매서드에 대해 알아보자. delete()는 인자로 두 가지 값을 받는다. 삭제를 시작할 문자의 행.위치와 삭제를 끝낼 문자의 행.위치 값을 지정하면 된다. 

 

필자가 위의 Hello Word를 3 줄 입력하고 delete 매서드로 첫 줄의 d부터 마지막 줄의 H까지 삭제를 진행하려고 한다면 아래와 같이 delete 함수를 정의해주면 된다.

 

 

insert 버튼을 세 번 눌러 Hello word 세 줄이 자동 입력되도록 한 뒤, delete 버튼을 누르면 필자가 의도한대로 두 번째 줄의 Hello word와 첫 줄 마지막, 그리고 마지막 줄 첫 문자까지 삭제된 것을 확인할 수 있다.

 

 

5. 특정 위치의 문자열 반환: get()

 

Text 위젯에 입력받은 값을 별도로 변수에 저장하기 위해, 입력값을 한 번에 받아오는 매서드도 존재한다. Entry나 CheckButton 등의 위젯에서도 많이 보았던 get()이라는 매서드로 입력값을 호출할 수 있다. 다만 인자가 필요없는 다른 위젯의 get() 매서드와 달리, Text 위젯의 get() 매서드는 두 가지 인자를 필요로 한다. 두 인자는 delete() 매서드에서 사용한 것과 동일한 인자다. 문자열을 반환받을 시작 문자의 행.위치와 끝 문자의 행.위치를 입력하면 된다.

 

 

 만약 입력받은 문자를 처음부터 끝까지 모두 얻고자 한다면 get(1.0, "end")로 인자값을 지정해주면 된다.

 

 

 

 


 

 

지금까지 tkinter Text 위젯에서 많이 사용하는 속성과 매서드에 대해 알아보았다. 늘 그래왔듯이 오늘 포스팅에 사용한 코드도 아래에 공유한다.

010_tkinter_Text.py
0.00MB

 

 

 

 

Fin.

 

반응형

댓글