Python - tkinter를 이용한 GUI 프로그래밍 찍어먹기
tkinter활용한 ui 프로그래밍
- 윈도우 생성: tk.Tk()
- 위젯 생성: tk.Label(), tk.Button() => 윈도우에 붙일 버튼, 레이블, 입력박스 등 생성
- 이벤트 핸들러 등록. command 속성에 이벤트 발생시 호출될 함수 등록
- 생성한 위젯을 윈도우에 붙임 => 위젯.pack()
- 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()
댓글남기기