본문 바로가기
Python/Python tkinter

[Python tkinter] 7. Entry 위젯 생성

by Rosmary 2022. 2. 18.
728x90
반응형

 

Entry 위젯은 현대인들에게는 너무나 익숙한 위젯이다. 사이트 로그인 시 ID와 비밀번호를 입력하는, 또는 가입 시 인적정보를 작성하는 한 줄 짜리 입력창을 tkinter에서 Entry 위젯이라고 한다(html 등 웹 페이지 앞단에 대해 공부하셨던 분들이라면 Input이라는 단어가 더 익숙하다).

 

 

이번 포스팅은 tkinter에서 Entry 위젯의 생성과 그 사용법에 대해 알아보려 한다.

 

 

1. Entry() 클래스

 

Entry 위젯 생성을 위한 클래스 호출은 아래와 같이 진행하면 된다.

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

 

 

글자를 입력받는 Entry 위젯의 특성 상, 기본 인자는 master를 제외하면 특별히 요구되는 것은 없다. 다른 위젯과 다른 점이 하나 있는데, Entry 위젯의 경우 위젯 높이(height)의 조절은 불가능하다. 생각해보면 너무도 당연한 이야긴데, Entry의 경우 한 줄을 초과하여 입력되는 값을 받는 위젯이 아니기 때문이다. 

 

Listbox 객체 호출 시 추가로 지정할 수 있는 인자의 목록은 아래와 같다. 굵은 글씨는 기본값이다.

< 위젯 필수 속성 값>

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

 

< 위젯 크기 및 배치 관련 >

선택 속성(인자) 설명 입력값 타입
width Entry 위젯의 너비 설정 정수형(int),
Entry에 입력되는 최대 글자수 지정

 

< 위젯 디자인 관련 >

선택 속성(인자) 설명 입력값 타입
relief
Button 위젯의 테두리 설정 "flat", "sunken", "raised",
"ridge", "solid", "groove"
fg (또는 foreground) Entry에 입력되는 글자색 지정 색상값 문자열 입력(ex: "red")
bg (또는 background) Entry 배경색 지정 색상값 문자열 입력(ex: "red")
bd (또는 borderwidth) Entry 테두리 두께 지정 정수형(Int)
selectforeground Entry 입력 글자 블록 처리 시 글자 색상 지정 색상값 문자열 입력(ex: "red")
selectbackground Entry 입력 글자 블록 처리 시 배경 색상 지정 색상값 문자열 입력(ex: "red")
selectborderwidth Entry 입력 글자 블록 처리 시 커서 두께 지정 정수형(Int)
insertwidth Entry 키보드 커서 너비 지정 정수형(Int)
insertborderwidth Entry 키보드 커서 두께 지정 정수형(Int)
insertbackground Entry 키보드 커서 색상 지정 색상값 문자열 입력(ex: "red")
insertofftime Entry 키보드 커서 깜빡임 시간 지정(Off 시간) 정수형(Int), ms 단위
insertontime Entry 키보드 커서 깜빡임 시간 지정(On 시간) 정수형(Int), ms 단위
cursor Entry 위젯 마우스 오버 시, 마우스 커서 모양 설정 참고

 

< 위젯 상태 관련 >

선택 속성(인자) 설명 입력값 타입
state Button의 활성화 여부 설정 "normal", "active", "disabled"

 

 

 

2. Button 위젯의 배치

 

Entry 위젯의 배치는 pack(), place(), grid()를 사용하면 된다. 자세한 내용은 이 포스팅을 참고하자.

필자는 위젯의 pack() 매서드로 배치를 진행하였고, 결과는 아래와 같다.

 

 

 

3. Entry 값 읽어오기

Entry에 값이 입력되면, 이 값을 읽어들이는 과정이 반드시 따라와야 한다. 안 그러면 입력하는 의미가 없으니...

이 Entry 입력값을 읽어들이는 Entry 객체 매서드로 get()이 있다. 이름에서도 알 수 있듯이 Entry 입력값을 취득하는 기능을 한다.

 

이를 확인하기 위해, get() 매서드 기능을 적용한 Button을 하나 더 생성하였다. Python 파일을 실행하면,

 

Button을 누를 때 Entry의 입력값이 고스란히 출력되는 것을 확인할 수 있다. 

 

 

 

4. 비밀번호를 입력받고 싶은데...?

 

Entry의 경우, 로그인 시 패스워드 입력에도 100%라는 압도적인 비율로 사용되고 있다. 하지만 우리가 현재 만든 Entry의 경우 입력한 글자가 Entry 내에 고스란히 출력되는 문제를 가지고 있어 패스워드 입력 폼으로 사용하기에 적절하지 않다. 

 

 

필자가 이전에 CLI에서 비밀번호 입력 관련 코드를 작성할 때 굉장히 고생했던 기억이 있었는데, 다행히 GUI인 tkinter는 오히려 매우 단순한 방법으로 이 문제를 해결했다. Entry 클래스 호출 시 들어가는 선택 인자 중 show를 사용하면 간단히 해결되는데, 이 show의 경우 입력받은 글자를 모두 show에 지정된 문자, 문자열로 치환해서 Entry에 입력하도록 한다.

 

 

참고로 show 인자 설정을 하더라도 get으로 나타나는 값은 키보드로 입력받은 값이 그대로 출력된다. 

 

 

5. 입력값의 초기화

간혹 어떤 사이트들을 보다보면, 회원 가입 시 입력한 폼을 초기화하는 버튼이 존재하는 곳이 있다(옛날 갬성인듯 하다). tkinter의 Entry 객체도 Entry 입력값을 한 번에 지우는 매서드를 제공한다. delete()라는 매서드가 그 역할을 하는데, 인자로는 삭제할 문자열 중 첫 문자열의 index와 끝 문자의 index 값을 입력해주면 된다.

 

가령 필자가, Hello Word라고 작성된 entry1 위젯에서 Hello라는 단어만 지우고자 한다면 entry1.delete(0,5)로 작성하면 된다. Button 위젯을 추가로 하나 더 생성하여 알아보자.

 

6. 미리 Entry 값을 입력하기

 

그럼 반대로, 값을 Entry에 미리 입력하는 것도 가능할까? 당연히 해당 기능을 가지는 매서드를 제공한다. insert()라는 매서드인데, 로그인 시, "ID 기억하기" 체크 박스를 클릭한 경우, 다음 로그인 때 ID 값이 자동으로 입력되도록 하는 것에 많이 사용한다. 또는 주민등록번호 뒷자리가 1이나 3일 경우 성별 Entry를 "남성"으로 고정한다던가 등등등... 사례는 굉장히 많다.

 

insert() 매서드는 추가할 문자를 입력할 index 위치, 그리고 입력값 자체를 인자로 지정해주어야 한다. 이 insert() 매서드는 위젯이 생성된 이후 어느 순간에나 사용이 가능하다. 즉, 위젯이 화면에 배치되기 이전/이후 모두 사용이 가능하다는 말이다.

 

7. Entry 상태 변경

 

이제 필자는 첫 Entry 위젯에 글자가 입력되지 않도록 설정하고 싶다. 이 때 사용할 수 있는 Entry 객체 인자가 바로 state다. Button 위젯과 동일하게 state 인자를 "disabled"로 지정해주면, Entry에 입력자체가 불가능하게 된다. 심지어 insert() 매서드를 쓰더라도 말이다.

 

 

만약, 기본값이 입력된 상태로 Entry가 수정되지 않도록 만들고자 한다면 어떻게 해야 할까? Entry가 disabled 상태일 때는 insert() 매서드를 써도 Entry에 입력이 되지 않기 때문에 약간의 편법을 써야 한다. 

 

먼저 Entry 위젯을 만들고, insert로 기본값을 Entry에 입력한다. 그리고 위젯 인자의 설정을 변경하는 config() 매서드를 사용하여 state="disabled" 값을 추가해주면 된다. 

 

참 쉽죠?

 


 

 

이번 포스팅에서는 tkinter의 Entry 위젯의 생성과 사용법에 대해 알아보았다. 사실 Entry에서 제공하는 기능이 더 많기는 한데... 실제 필자가 프로젝트를 진행하다보니 주요하게 사용하는 인자 외에는 거의 쓰이지 않아 별도로 기능을 시연하지는 않았다.

 

007_tkinter_Entry.py
0.00MB

 

 

다음 포스팅은... Radiobutton에 대해 알아보려 한다.

 

 

 

Fin.

반응형

댓글