본문 바로가기
Python/GUI(tkinter)

독학 Python tkinter(GUI) - 10.Entry1

by To올라운더 2023. 11. 8.
반응형

우리는 지난 포스팅을 통해 사용자와 소통을 할 수 있는 프로그램 개발자로 거듭났다.

 

지금까지 배운 내용을 정리해보면

Frame 이나 위치(pack, grid, place) 등은 GUI를 꾸미기 위한 내용이었으며,

Label 이나 Button, Messagebox 의 경우에는 사용자의 요청 사항이 개발자가 정해놓은 틀에서

단순한 선택 정도의 소통이 가능했다.

 

그런데 [예, 아니오] 같은 정해진 답만을 전달 받는건 프로그램으로써 많이 부족하다는 생각이 들 것이다.

 

가장 단순하게 사용자가 ID와 PW를 사용자가 입력하려 해도 지금까지 배운 것들로는 불가능하다.

이런 사용자의 입력을 위한 기능이 오늘 포스팅할 Entry와 다음 포스팅 주제인 Text이다.

 

1. Entry 언제 쓰일까?

 - 서두에 얘기된 것 처럼 사용자의 입력을 받을 때 사용한다.

 - Text와 차이가 있다면 Entry는 줄바꿈(Enter)를 포함하지 않는 1줄의 입력창이고,

   Text는 줄바꿈(Enter)를 포함하는 사용자 입력창이다.

 

2. 간단히 써보기

 - 기본 코드에 Label 만을 작성해보면 아래와 같은데,

   여기에 Entry 요소를 추가한다. 추가하는 방법의 Label과 다르지 않다.

 - [Entry명 = Entry(위치, 그외 파라미터) 로 등록한다.

from tkinter import *
import tkinter.messagebox as msb

root = Tk()
root.title('To올라운드의 알찬 GUI 강의')


root.geometry("200x300") # 가로 X 세로 / 대문자X 하면 실행안됨

msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')

body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)

id_label = Label(body_frame, text = 'ID : ')
id_label.pack()

id_input_entry = Entry(body_frame)
id_input_entry.insert(0,'ID를 입력하세요.')
id_input_entry.pack()

pw_label = Label(body_frame)
pw_label.pack()

pw_input_entry = Entry(body_frame, show='*')
pw_input_entry.pack()




root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()

 

 - Entry 작성시 기본 값은 아무런 내용도 없는 상태인데, 

   특정 값을 주고 싶다면 19라인 처럼 해당 entry를 생성한 뒤,

   insert로 내용을 입력하면 되는데, 앞의 숫자는 내용을 입력할 인덱스 값으로 0은 가장 앞, END는 가장 끝을 의미한다.

 

 - 그리고 비밀번호처럼 입력된 값을 UI에서 가리고 싶을 경우에는 25라인과 같이 show 파라미터를 할당하게 되면

   입력되는 문자가 해당 파라미터로 표시된다.

반응형

 

3. 기본적인 entry 사용 방법

 입력된 entry를 가져오거나 삭제, 수정하는 방법이 기본적인 사용 방법이고

  추가적인 활용 기능은 다음 포스팅에서 따로 작성해볼 예정입니다.

 

1) Entry 값 가져오기

  - Entry 값을 가져 오는 방법은 어렵지 않다. 

  - 해당 Entry명.get()을 이용하면 값을 가져 올 수 있는데, 

    input과 마찬가지로 문자열(string) 데이터를 가져오게 되므로,

    숫자로 사용해야 한다면 int 등 변환 과정을 가져야한다.

from tkinter import *
import tkinter.messagebox as msb

def print_id_entry_value():
    print(id_input_entry.get())

root = Tk()
root.title('To올라운드의 알찬 GUI 강의')


root.geometry("200x300") # 가로 X 세로 / 대문자X 하면 실행안됨

msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')

body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)

id_label = Label(body_frame, text = 'ID : ')
id_label.pack()

id_input_entry = Entry(body_frame)
id_input_entry.insert(0,'ID를 입력하세요.')
id_input_entry.pack()

pw_label = Label(body_frame)
pw_label.pack()

pw_input_entry = Entry(body_frame, show='*')
pw_input_entry.pack()


id_entry_print_btn = Button(body_frame, text='ID 출력', command=print_id_entry_value)
id_entry_print_btn.pack()

root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()

 - 21라인에서 생성한 id_input_entry 를 출력하는 print_id_entry_value 함수를 생성했다.

 - 해당 함수를 호출하는 id_entry_print_btn(32라인)을 생성하여 호출 버튼을 눌러보면

   우리가 원하는 id_input_entry 값을 가져올 수 있다.

 

2) Entry 값 삭제하기

 - 값을 삭제해주는 방법 또한 어렵지 않다.

 - 우리가 insert로 기본값을 설정 할 때 첫번째 파라미터로 index값을 준것을 기억하고 있을까?

   삭제도 동일한 조건이 필요한데, entry명.delete(시작 index 값, 종료 index 값)으로 내용을 부분 삭제할 수도있고,

   전체를 지우려 할 때는 delete(0, END)로 파라미터 값을 설정하면 전체를 지울 수 있다.

from tkinter import *
import tkinter.messagebox as msb

def print_id_entry_value():
    print(id_input_entry.get())

def id_entry_delete():
    id_input_entry.delete(0, END)

root = Tk()
root.title('To올라운드의 알찬 GUI 강의')


root.geometry("200x300") # 가로 X 세로 / 대문자X 하면 실행안됨

msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')

body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)

id_label = Label(body_frame, text = 'ID : ')
id_label.pack()

id_input_entry = Entry(body_frame)
id_input_entry.insert(0,'ID를 입력하세요.')
id_input_entry.pack()

pw_label = Label(body_frame)
pw_label.pack()

pw_input_entry = Entry(body_frame, show='*')
pw_input_entry.pack()


id_entry_print_btn = Button(body_frame, text='ID 출력', command=print_id_entry_value)
id_entry_print_btn.pack()

id_entry_delete_btn = Button(body_frame, text ='ID 삭제', command=id_entry_delete)
id_entry_delete_btn.pack()

root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()

 

3) Entry 값 수정하기

 - 사실 Entry 값을 추가하고 삭제하는 건

   우리가 처음 기본값을 입력하면서 insert를 이용하는 것과 delete 를 통해 진행할 수 있다는 사실을 알게되었다.

 - 그래서 이 2가지를 조합하면 우리는 능숙히 entry 값을 수정할 수 있는데,

    위에서 작성한 'ID 삭제' 버튼 대신 메일 주소가 들어오면

    기존 메일의 도메인 부분을 삭제하고 우리가 원하는 도메인을 입력하는 작업을 진행해보겠다.

from tkinter import *
import tkinter.messagebox as msb

def print_id_entry_value():
    print(id_input_entry.get())

def id_entry_edit():

    if '@' in id_input_entry.get() :    # 입력된 id 란에 '@'를 포함한 문자가 있을 경우,    
        idx_no = id_input_entry.get().find('@')    # 해당 위치를 idx_no 변수에 저장하고

        id_input_entry.delete(idx_no, END)         # 해당 위치부터 마지막까지 삭제를 진행한다.
    
    id_input_entry.insert(END, '@to_allrounder.com') # 이후, 우리가 원하는 도메인을 추가한다.

root = Tk()
root.title('To올라운드의 알찬 GUI 강의')


root.geometry("200x300") # 가로 X 세로 / 대문자X 하면 실행안됨

msb.showinfo('Welcome','안녕하세요. To올라운더와 함께 하는 GUI입니다.')

body_frame = Frame(root, relief='solid', bd=2, background='orange', padx=5, pady=5)
body_frame.pack(fill='both', expand=True)

id_label = Label(body_frame, text = 'ID : ')
id_label.pack()

id_input_entry = Entry(body_frame)
id_input_entry.insert(0,'ID를 입력하세요.')
id_input_entry.pack()

pw_label = Label(body_frame)
pw_label.pack()

pw_input_entry = Entry(body_frame, show='*')
pw_input_entry.pack()


id_entry_print_btn = Button(body_frame, text='ID 출력', command=print_id_entry_value)
id_entry_print_btn.pack()

id_entry_delete_btn = Button(body_frame, text ='ID 도메인 변경', command=id_entry_edit)
id_entry_delete_btn.pack()

root.resizable(False,False) # x너비, y 변경 허용 여부
root.mainloop()

 - 위의 id_entry_edit 함수에서 보듯이 입력된 내용을 확인하고 우리가 원하는 도메인으로 변경하는 과정을 진행할 수 있다.

  (* 마지막 id_input_entry.insert 의 코드 블럭이 if 문과 다른 이유는 사용자가 처음 입력했을 때부터 도메인이 없을 때에도 정상적으로 처리하기 위함이다.)

 

여기까지가 기본적인 entry의 내용이다.

그런데, 조금 더 길게 활용적인 측면의 글도 공유하고 싶어 해당 내용은 다음 포스팅에서 진행해보도록 하겠다.

 

 

 

 

 

 

 

 

 

 

 

 

반응형