Tkinter를 활용한 UI 프로그래밍2
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>
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()
‘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()
체크버튼은 라디오버튼과 달리 여러개를 선택 가능하기에 선택시 바로 처리 하지 않고 버튼을 하나 더 생성해서 선택된 체크버튼의 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()
복숭아 삭제함
자두 삭제함
Entry를 사용하여 입력한 ‘복숭아’를 add 버튼을 통해 Listbox에 추가하고
Listbox에서 선택한 자두, 복숭아를 del 버튼을 통해 삭제하는 것을 확인 할 수 있습니다.
지금까지 tkinter를 이용한 Python UI 프로그래밍을 1차에 이어 추가로 사용해 보았습니다.
tkinter의 기능은 아직 더 많이 있으니 추가할 내용이 있으면 3편에 이어서 포스팅 하겠습니다.