Tkinter를 활용한 UI 프로그래밍2

3 분 소요

tkinter를 활용한 UI 프로그래밍 2탄 입니다. 1탄에서 빠진 다른 기능들을 추가로 사용해 보겠습니다.

1. Entry

프로그램을 이용하다 보면 검색창 처럼 문자열 입력을 받아서 처리해야 할 때가 있습니다. 이때 사용하는 것이 Entry() 입니다.
또한 검색창 처럼 동작하게 하기 위해 Enter를 입력 했을때 이벤트를 발생하도록 .bind()를 이용하여 이벤트 객체를 실행 할 수 있도록 해 보겠습니다.

import tkinter as tk

def f1(e):
    print(e)
    s = entry.get() # 엔트리에 입력한 값 추출
    label.config(text=s) # 라벨에 입력한 값 출력
    entry.delete(0, tk.END) # 엔트리의 입력한 값 삭제
    
win = tk.Tk()
win.title('window title')
win.geometry('300x100+100+100')
win.resizable(False, False)

label = tk.Label(win, width=80)
entry = tk.Entry(win, width=80) # Entry 생성

# 뷰.bind(): 이벤트 핸들러 등록. param1:이벤트 종료 / param2:핸들러함수
entry.bind('<Return>', f1) # <Return>: 엔트리에서 엔터치면 발생하는 이벤트

label.pack()
entry.pack()

win.mainloop()

<KeyPress event state=Mod1 keysym=Return keycode=13 char=’\r’ x=422 y=-24>

1

2. bind

.bind()를 이용한 이벤트 객체를 좀 더 활용해 보겠습니다.
마우스 버튼을 클릭 했을때 이벤트가 발생하도록 하겠습니다.

import tkinter as tk

def f1(e):
    print(e)
    s = entry.get() # 엔트리에 입력한 값 추출
    label.config(text=s) # 라벨에 입력한 값 출력
    entry.delete(0, tk.END) # 엔트리의 입력한 값 삭제
    
def f2(e):
    print(e)
    print('마우스 왼쪽 버튼 클릭')
    
def f3(e):
    print(e)
    print('마우스 가운데 버튼 클릭')
    
def f4(e):
    print(e)
    print('마우스 오른쪽 버튼 클릭')
    
win = tk.Tk()
win.title('window title')
win.geometry('300x100+100+100')
win.resizable(False, False)

label = tk.Label(win, width=80)
entry = tk.Entry(win, width=80) # Entry 생성

# 뷰.bind(): 이벤트 핸들러 등록. param1:이벤트 종료 / param2:핸들러함수
entry.bind('<Return>', f1) # <Return>: 엔트리에서 엔터치면 발생하는 이벤트
entry.bind('<Button-1>', f2) # 마우스 왼쪽 버튼 클릭 이벤트
entry.bind('<Button-2>', f3) # 마우스 가운데 버튼 클릭 이벤트
entry.bind('<Button-3>', f4) # 마우스 오른쪽 버튼 클릭 이벤트

label.pack()
entry.pack()

win.mainloop()

<ButtonPress event state=Mod1 num=1 x=20 y=10>
마우스 왼쪽 버튼 클릭
<ButtonPress event state=Mod1 num=2 x=92 y=12>
마우스 가운데 버튼 클릭
<ButtonPress event state=Mod1 num=3 x=233 y=9>
마우스 오른쪽 버튼 클릭

Entry에 각각의 버튼을 클릭하면 이벤트가 발생 하는 것을 확인 할 수 있습니다.
더불어 입력 받은 파라미터를 통해서 클릭한 x, y축도 확인해 볼 수 있습니다.


3. Radiobutton

다음은 라디오 버튼을 생성하여 선택한 값이 Label에 출력 되도록 하겠습니다.

import tkinter as tk

def f1():
    num = val.get()
    msg = '당신이 선택한 값: ' + str(num)
    label.config(text=msg)
    
win = tk.Tk()
win.title('window title')
win.geometry('300x100+100+100')
win.resizable(False, False)

label = tk.Label(win, text='라디오버튼 테스트')
label.pack()

val = tk.IntVar() # 정수타입의 값
r1 = tk.Radiobutton(win, text='val1', variable=val, value=1, command=f1)
r1.pack()
r2 = tk.Radiobutton(win, text='val2', variable=val, value=2, command=f1)
r2.pack()
r3 = tk.Radiobutton(win, text='val2', variable=val, value=3, command=f1)
r3.pack()

win.mainloop()
2

‘RadioButtoon 에서 variable로 정수타입의 값을 지정하고 함수를 호출하면 선택한 값의 value의 숫자가 Label에 출력 되는 것을 확인 할 수 있습니다.


4. Checkbutton

다음은 체크 버튼을 생성하여 선택한 값이 Label에 출력 되도록 하겠습니다.

import tkinter as tk

def f1():
    x = []
    if v1.get():
        x.append(ch1.cget('text'))
    if v2.get():
        x.append(ch2.cget('text'))
    if v3.get():
        x.append(ch3.cget('text'))
    
    msg = '당신이 선택한 값: '
    for i in x:
        msg += i+', '
    label.config(text=msg)      
    
win = tk.Tk()
win.title('window title')
win.geometry('300x130+100+100')
win.resizable(False, False)

label = tk.Label(win, text='좋아하는 배우')
label.pack()

v1 = tk.IntVar()
v2 = tk.IntVar()
v3 = tk.IntVar()

# 여러개 선택 가능. 체크버튼은 variable로 지정한 변수에 체크유무 값을 저장. 체크(1), 체크안함(0)
ch1 = tk.Checkbutton(win, text='김태리', variable=v1)
ch1.pack()
ch2 = tk.Checkbutton(win, text='김고은', variable=v2)
ch2.pack()
ch3 = tk.Checkbutton(win, text='김다미', variable=v3)
ch3.pack()

btn  = tk.Button(win, text='입력완료', width=30, command=f1)
btn.pack()

win.mainloop()
3

체크버튼은 라디오버튼과 달리 여러개를 선택 가능하기에 선택시 바로 처리 하지 않고 버튼을 하나 더 생성해서 선택된 체크버튼의 text가 동작 되도록 하였습니다. 체크버튼은 등록된 variable에 체크시 1 미체크시 0이 입력됩니다.


5. Listbox

다음은 리스트박스를 사용해 보겠습니다. Listbox를 이용하여 목록을 불러와 추가, 제거를 선택하기 위한 기능을 구현 할 수 있습니다.

def f1():
    val = entry.get()
    listbox.insert(tk.END, val)
    entry.delete(0, tk.END)
    
def f2():
    idx = listbox.curselection()[0] # 선택한 항목의 인덱스
    item = listbox.get(idx) #인덱스 위치에 있는 항목을 반환
    print(item, '삭제함')
    listbox.delete(idx)

win = tk.Tk()
win.title('window title')
win.geometry('300x240+100+100')
win.resizable(False, False)

x = ['사과', '수박', '키위', '참외', '자두']
# listbox = tk.Listbox(win, width=40, selectmode='extended') 여러줄 선택 가능
listbox = tk.Listbox(win, width=40) # 한줄 선택
for i in range(0, len(x)):
    listbox.insert(i, x[i]) #(항목의 순서, 값)
listbox.pack()

entry = tk.Entry(win, width=30)
entry.pack()

add_btn  = tk.Button(win, text='add', width=20, command=f1)
add_btn.pack()

del_btn  = tk.Button(win, text='del', width=20, command=f2)
del_btn.pack()

win.mainloop()

복숭아 삭제함
자두 삭제함

4

Entry를 사용하여 입력한 ‘복숭아’를 add 버튼을 통해 Listbox에 추가하고
Listbox에서 선택한 자두, 복숭아를 del 버튼을 통해 삭제하는 것을 확인 할 수 있습니다.

지금까지 tkinter를 이용한 Python UI 프로그래밍을 1차에 이어 추가로 사용해 보았습니다.
tkinter의 기능은 아직 더 많이 있으니 추가할 내용이 있으면 3편에 이어서 포스팅 하겠습니다.