Python - tkinter를 이용한 GUI 프로그래밍 찍어먹기

5 분 소요

tkinter활용한 ui 프로그래밍

  1. 윈도우 생성: tk.Tk()
  2. 위젯 생성: tk.Label(), tk.Button() => 윈도우에 붙일 버튼, 레이블, 입력박스 등 생성
  3. 이벤트 핸들러 등록. command 속성에 이벤트 발생시 호출될 함수 등록
  4. 생성한 위젯을 윈도우에 붙임 => 위젯.pack()
  5. window.mainloop()를 호출하여 ui실행
import tkinter as tk

def f1():
    print('button click')
    
window = tk.Tk()  #Tk 객체 생성. 기본 윈도우 객체
#tk.Label('부모객체', )
label = tk.Label(window, text = 'hello', width='100', height='5')#뷰 위젯의 하나인 레이블 객체 생성
btn1 = tk.Button(window, text = 'btn1', command=f1)#command: 이벤트 핸들러 등록. 
label.pack()#위젯(레이블, 버튼...)을 윈도우에 붙임
btn1.pack()
window.mainloop()#ui 쓰레드 실행하여 화면에 출력
import tkinter as tk

def f1():
    label_text = label.cget('text') #뷰위젯.cget(속성이름): 속성값 읽음
    btn_text = btn1.cget('text')
    print(label_text, ' / ', btn_text)
    
window = tk.Tk()  #Tk 객체 생성. 기본 윈도우 객체
#tk.Label('부모객체', )
label = tk.Label(window, text = 'hello', width='100', height='5')#뷰 위젯의 하나인 레이블 객체 생성
btn1 = tk.Button(window, text = 'btn1', command=f1)#command: 이벤트 핸들러 등록. 
label.pack()#위젯(레이블, 버튼...)을 윈도우에 붙임
btn1.pack()
window.mainloop()#ui 쓰레드 실행하여 화면에 출력
win = tk.Tk()
win.title('window title')
win.geometry('300x200+100+100')
win.resizable(False, False)

b1 = tk.Button(win, text='right', width=10)
b1.pack(side='right')#side: 윈도우에 붙일 방향
b2 = tk.Button(win, text='left', width=10)
b2.pack(side='left')
b3 = tk.Button(win, text='top', width=10)
b3.pack(side='top')
b4 = tk.Button(win, text='bottom', width=10)
b4.pack(side='bottom')

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

b1 = tk.Button(win, text='1', width=10)
b1.grid(row=0, column=0)#grid()격자로 배치
b2 = tk.Button(win, text='2', width=10)
b2.grid(row=0, column=1)
b3 = tk.Button(win, text='3', width=10)
b3.grid(row=0, column=2)
b4 = tk.Button(win, text='4', width=10)
b4.grid(row=1, column=0)
b5 = tk.Button(win, text='5', width=10)
b5.grid(row=1, column=1)
b6 = tk.Button(win, text='6', width=10)
b6.grid(row=1, column=2)

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

b1 = tk.Button(win, text='1', width=10)
b1.place(x=30, y=30)
b2 = tk.Button(win, text='2', width=10)
b2.place(x=100, y=100)
b3 = tk.Button(win, text='3', width=10)
b3.place(x=170, y=170)

win.mainloop()

계산기 구현

def f1(val):
    s = label.cget('text')
    s += val #s:12
    label.config(text=s)#config():위젯 속성의 값을 읽거나 설정
    
def calc():
    s = label.cget('text') #s:'5-1+6*2'
    print(s)
    res = eval(s)
    label.config(text=str(res))
    
def clear():
    label.config(text='')
    
win = tk.Tk()#Tk객체 생성=>기본 윈도우와 ui api를 제공하는 객체
win.title('window title')
win.geometry('300x400+100+100')
win.resizable(False, False)

#위젯 생성 및 배치
label = tk.Label(win, height=4)
label.grid(row=0, column=0)

b1 = tk.Button(text='1', width=7, height=4, command=lambda:f1('1'))
b1.grid(row=1, column=0)
b2 = tk.Button(text='2', width=7, height=4, command=lambda:f1('2'))
b2.grid(row=1, column=1)
b3 = tk.Button(text='3', width=7, height=4, command=lambda:f1('3'))
b3.grid(row=1, column=2)
b4 = tk.Button(text='+', width=7, height=4, command=lambda:f1('+'))
b4.grid(row=1, column=3)
b5 = tk.Button(text='4', width=7, height=4, command=lambda:f1('4'))
b5.grid(row=2, column=0)
b6 = tk.Button(text='5', width=7, height=4, command=lambda:f1('5'))
b6.grid(row=2, column=1)
b7 = tk.Button(text='6', width=7, height=4, command=lambda:f1('6'))
b7.grid(row=2, column=2)
b8 = tk.Button(text='-', width=7, height=4, command=lambda:f1('-'))
b8.grid(row=2, column=3)
b9 = tk.Button(text='7', width=7, height=4, command=lambda:f1('7'))
b9.grid(row=3, column=0)
b10 = tk.Button(text='8', width=7, height=4, command=lambda:f1('8'))
b10.grid(row=3, column=1)
b11 = tk.Button(text='9', width=7, height=4, command=lambda:f1('9'))
b11.grid(row=3, column=2)
b12 = tk.Button(text='*', width=7, height=4, command=lambda:f1('*'))
b12.grid(row=3, column=3)
b13 = tk.Button(text='0', width=7, height=4, command=lambda:f1('0'))
b13.grid(row=4, column=0)
b14 = tk.Button(text='C', width=7, height=4, command=clear)
b14.grid(row=4, column=1)
b15 = tk.Button(text='=', width=7, height=4, command=calc)
b15.grid(row=4, column=2)
b16 = tk.Button(text='/', width=7, height=4, command=lambda:f1('/'))
b16.grid(row=4, column=3)
    
win.mainloop()
import tkinter as tk
def f1(val):
    s = label.cget('text')
    s += val
    label.config(text=s)#config():위젯 속성의 값을 읽거나 설정

def calc():
    s = label.cget('text') #s:'5-1+6*2'
    print(s)
    res = eval(s)
    label.config(text=str(res))
    
def clear():
    label.config(text='')
    
win = tk.Tk()
win.title('window title')
win.geometry('300x400+100+100')
win.resizable(False, False)
label = tk.Label(win, height=4)
label.grid(row=0, column=0)

nums = [['1', '2', '3','+'],['4','5','6','-'],['7','8','9','*'],['0','C','=','/']]

for i in range(0, 4):
    for j in range(0, 4):
        num = nums[i][j]
        if num=='C':
            b = tk.Button(text=num, width=7, height=4, command=clear)
        elif num=='=':
            b = tk.Button(text=num, width=7, height=4, command=calc)
        else:
            b = tk.Button(text=num, width=7, height=4, command=lambda val=num : f1(val))
        b.grid(row=(i+1), column=j)
    
win.mainloop()

값 입력받고 출력

def f1(e):
    print(e)
    s = entry.get()  #.get(): 엔트리로 입력한 값을 추출하는 함수
    label.config(text=s)
    entry.delete(0, tk.END)  #.delete(): 엔트리에 입력한 값을 지우는 함수, param1: 지우는 위치 시작점 / param2: 지우는 위치 끝.
                             #.END: 끝을 나타내는 상수
        
win = tk.Tk()
win.title('This is Title')
win.geometry('300x400+1500+100')
win.resizable(False, False)

label = tk.Label(win, width=40)
entry = tk.Entry(win, width=40)

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

label.pack()
entry.pack()

win.mainloop()

클릭 입력

def f1(e):
    print(e)
    s = entry.get()  #.get(): 엔트리로 입력한 값을 추출하는 함수
    label.config(text=s)
    entry.delete(0, tk.END)  #.delete(): 엔트리에 입력한 값을 지우는 함수, param1: 지우는 위치 시작점 / param2: 지우는 위치 끝.
                             #.END: 끝을 나타내는 상수

def f2(e):
    print(e)
    print(e.x, ' / ', e.y)
    print('왼쪽 버튼 클릭')

def f3(e):
    print(e)
    print('가운데 버튼 클릭')

def f4(e):
    print(e)
    print('오른쪽 버튼 클릭')

                
win = tk.Tk()
win.title('This is Title')
win.geometry('300x400+1500+100')
win.resizable(False, False)

label = tk.Label(win, width=40)
entry = tk.Entry(win, width=40)
btn = tk.Button(win, text='click', width=30)

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

label.pack()
entry.pack()
btn.pack()

win.mainloop()

라디오버튼 만들기

def f1():
    num = val.get()
    msg = '당신이 선택한 값: '+str(num)
    label.config(text=msg)

win = tk.Tk()
win.title('This is Title')
win.geometry('300x400+1500+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)
r2 = tk.Radiobutton(win, text='val2', variable=val, value=2, command=f1)
r3 = tk.Radiobutton(win, text='val3', variable=val, value=3, command=f1)
r4 = tk.Radiobutton(win, text='val4', variable=val, value=4, command=f1)

r1.pack()
r2.pack()
r3.pack()
r4.pack()

win.mainloop()

체크박스 만들기

def f1():
    num1 = v1.get()
    num2 = v2.get()
    num3 = v3.get()
    msg = '당신이 선택한 값: '+str(num1)+', '+str(num2)+', '+str(num3)
    label.config(text=msg)

win = tk.Tk()
win.title('This is Title')
win.geometry('300x400+1500+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='val1', variable=v1)
ch2 = tk.Checkbutton(win, text='val2', variable=v2)
ch3 = tk.Checkbutton(win, text='val3', variable=v3)

ch1.pack()
ch2.pack()
ch3.pack()

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

win.mainloop()

다른 작성 방식

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'))
    if v4.get():
        x.append(ch4.cget('text'))

    msg = '당신이 선택한 값: '
    for i in x:
        msg += i+', '
    label.config(text=msg)

win = tk.Tk()
win.title('This is Title')
win.geometry('300x400+1500+100')
win.resizable(False, False)

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


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

#여러개 선택 가능, 체크버튼은 variable로 지정한 변수에 체크유무 값을 저장, 체크(1), 체크안함(0)
ch1 = tk.Checkbutton(win, text='로버트 다우니 주니어', variable=v1)
ch2 = tk.Checkbutton(win, text='베네딕트 컴버배치', variable=v2)
ch3 = tk.Checkbutton(win, text='크리스 에반스', variable=v3)
ch4 = tk.Checkbutton(win, text='크리스 햄스워스', variable=v4)

ch1.pack()
ch2.pack()
ch3.pack()
ch4.pack()

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

win.mainloop()

리스트박스 만들기

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('300x400+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, width=20, text='add', command=f1)
add_btn.pack()

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


win.mainloop()   

댓글남기기