tkinter 텍스트박스 | 파이썬 GUI 2

tkinter 텍스트박스

Tkinter 텍스트박스

이번 포스팅에서는 파이썬 GUI 프로그램에서 사용자에게 텍스트박스를 통해 문자열을 입려받는 방법을 알아보겠습니다.

지난 학습에서는 레이블과 버튼의 사용법까지 배웠습니다. 여기에 텍스트 입력까지 할 수 있다면 멋진 GUI 프로그램을 만들 수 있습니다.

Tkinter 에는 텍스트를 다루는 Entry 객체가 있어서 사용자에게 입력받을 폼을 쉽게 만들 수 있습니다. 사용법은 Entry 객체에 입력한 값을 버튼을 통해서 함수에 전달하고 다시 레이블에 출력합니다.

ttk.Entry 객체(텍스트 박스)

아래는 사용자로 부터 문자열 입력을 받아서 다시 레이블로 문자를 출력하는 코드입니다. 아주 간단한 구조이지만 레이블, 버튼, 텍스트 컴포넌트가 서로 데이터를 어떻게 주고 받는지 이해할 수 있다면 상당한 진전입니다.

컴퓨터에서 GUI프로그램을 많이 써봤다면 이 원리가 그리 어렵지 않을 것입니다.

# import
import tkinter
from tkinter import ttk
 
# instance
window = tkinter.Tk()
 
# title
window.title("First Window")
 
# geomerty
window.geometry('300x100')
 
# preventing GUI from resizing
window.resizable(False, False)
 
def buttonClicked():
    label.configure(foreground='blue')
    labelNew.configure(text='안녕하세요! ' + name.get())
 
# Label
label = ttk.Label(window, text="이름을 입력하세요")
label.grid(column=0, row=0)
 
# Button
button = ttk.Button(window, text="클릭", command=buttonClicked)
button.grid(column=1, row=1)
 
# Text Box
name = tkinter.StringVar()
textbox = ttk.Entry(window, width=12, textvariable=name)
textbox.grid(column=0, row=1)
 
# Label
labelNew = ttk.Label(window, text="")
labelNew.grid(column=1, row=2)
 
# start GUI
window.mainloop()

tkinter 안에 ttk 라는 모듈을 import 합니다. ttk 는 tk 보다 업그레이드된 객체로 보면 됩니다. 바둑판 모양의 grid 레이아웃을 손쉽게 적용할 수 있습니다.

화면에 구역을 나누는 선같은 것은 보이지 않지만 grid 의 column 과 row 의 숫자에서 위치가 결정되있습니다.

텍스트박스는 사용자가 텍스트를 입력할 수 있는 폼입니다. 커서를 옮긴 후 키보드로 글자를 입력할 수 있습니다. 글자를 입력한 후에는 변수와 연결이 되야 합니다. 이 변수는 name = tkinter.StringVar() 의 객체에 담아서 사용합니다.

여기서 봐야하는 것은 순서입니다.

  1. 텍스트박스에 입력을 한다
  2. 버튼을 클릭한다
  3. 레이블에 출력한다

순서를 알면 중간에 어떤 일이 일어나는지 알 수 있습니다. 텍스트박스에 입력이 끝나면 실행하기 위해 버튼을 클릭합니다. 텍스트박스의 내용을 변수을 함수에 전달합니다.

텍스트를 전달하기 위해서 StringVar 라는 타입을 사용했습니다. 그냥 문자열로 전달해도 될 것같은데 타입을 사용하는 것은 문자열 말고 다른 정보도 필요하기 때문입니다.

마지막으로 함수에서 전달받은 텍스트를 새로운 레이블에 출력하도록 합니다.

몇가지 팁

윈도우창을 생성하면 텍스트박스를 클릭하기 전에 키보드입력을 할 수 없습니다. 아래의 코드는 윈도우창이 나오자마자 문자를 입력할 수 있도록 focus를 줍니다.

	
# focus to Entry
textbox.focus()

버튼의 configure 메소드는 여러가지 속성을 조작할 수 있습니다. 아래의 diabled 는 버튼 클릭을 기능을 정지시킵니다.

버튼이 더이상 안눌리는 것이죠. 버튼 컴포넌트에 대하여 설명한 바가 있지만 레이블과 다른 점은 이벤트가 발생하는가의 여부, 또 버튼은 클릭하면 그래픽이 변화가 있다는 것 두 가지 입니다.

버튼이라고 특별한 것이 아니라 레이블에 약간의 변화로 사용자와 상호작용할 수 있다는 것 입니다.

이렇게 생각하면 tkinter 안의 구성요소들이 서로간에 공통점이 많다는 것을 알 수있습니다. (구성요소라는 말보다 위젯이라는 단어를 많이 사용합니다)

def buttonClicked():
    label.configure(foreground='blue')
    labelNew.configure(text='안녕하세요! ' + name.get())
 
    button.configure(state='disabled')
 
    textbox.focus()

tkinter 텍스트박스 사용하기

ttk가 아니라 tkinter 모듈에서 텍스트 입력을 해보겠습니다. 여기서는 Frame 객체를 사용합니다. Frame 이 레이블, 엔트리같은 위젯들을 묶어주는 틀이라고 생각하면 됩니다.

모듈을 가져올 때 as tk 라고 한 것은 tk를 tkinter를 tk 라고 부르겠다는 뜻입니다. 이렇게 하는 이유는 tkinter 가 길어서 타이핑하기 힘들기 때문이죠.

파이썬에서는 많은 경우 import as 로 타이핑수를 줄입니다. 코드를 많이 읽다보면 일정한 규칙을 가지고 줄이는 것을 알 수 있습니다.

# import
import tkinter as tk
 
root = tk.Tk() # instance
root.title("First Window") # title
root.geometry('200x100') # geomerty
root.resizable(False, False) # preventing GUI from resizing
 
def buttonClicked():
    button.configure(text='이름은 ' + textbox1.get() + ' 입니다')
 
frame = tk.Frame(root)
frame.pack()
 
textbox1 = tk.Entry(frame, width=20, bg = 'yellow')
textbox1.insert(0, "이름을 입력하세요")
textbox1.pack(pady=20)
 
button = tk.Button(frame, text='클릭', command=buttonClicked)
button.pack(pady=0)
 
# focus to Entry
textbox1.focus()
 
# start GUI
root.mainloop()

tkinter 의 Entry 는 ttk의 Entry와 차이는 ttk 가 확장판이기 때문에 메소드나 사용법이 더 향상되었습니다.

헷갈리면 파이썬 Documentation에서 reference를 확인하는 것을 권장합니다.

요약

이번 포스팅에서 파이썬 Tkinter 텍스트박스 입력에 대하여 알아봤습니다.

사용자에게 Entry 객체에 입력 받은 문자열을 함수에 전달해서 원하는 레이블에 출력하는 것이 가능합니다.

레이블, 버튼, 엔트리(텍스트박스) 와 같은 구성요소를 컴포넌트라 하기도 하고 객체라 하기도 해서 용어의 혼동이 있습니다. GUI 프로그래밍에서 제일 보편적으로 사용되는 용어는 위젯입니다.

이는 꼭 tkinter 가 아니라도 다른 GUI 에도 적용되므로 개념을 정리해 두는 것이 좋습니다.

GUI 프로그래밍이라 해서 복잡해 보이지만 큰 어려움은 없습니다.

외부참조문서

파이썬 GUI 프로그래밍 4 Tkinter 텍스트박스, Entry, Check

파이썬 GUI 프로그래밍 1 Tkinter 유래와 윈도우창 참고사이트 모음

tkinter — Tcl/Tk 파이썬 인터페이스 — Python 3.9.2 문서

Leave a Comment