Tkinter는 Tcl/Tk에 대한 파이썬 Wrapper로서 Tcl/Tk를 파이썬에 사용할 수 있도록 한 Lightweight GUI 모듈이다. Tcl은 Tool Command Language의 약자로서 일종의 프로그래밍 언어이며, Tk는 크로스 플랫폼에 사용되는 일종의 GUI 툴킷이다. Tkinter는 타 GUI 프레임워크나 툴킷에 비해 지원되는 위젯들이 부족하고 UI도 그렇게 예쁘지 않다는 단점이 있지만, Python 설치시 기본적으로 내장되어 있는 파이썬 표준 라이브러리이기 때문에 쉽고 간단한 GUI 프로그램을 만들 때 활용될 수 있다.
여기서는 Python 3.4에 있는 Tkinter를 사용하며, Tkinter의 기본적인 개념 및 기초 사용법 만을 소개한다.
create_frame
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
# root.geometry("640x480+300+100") # 가로 x 세로 크기 + x좌표 + y좌표
root.resizable(False, False) # x(너비), y(높이) 값 변경 불가 ( 창크기 변경 불가)
root.mainloop() # 창이 닫히지 않게 해주는 것
tkinter를 이용해서 GUI를 만들기 위해서는 root = Tk()와 root.mainloop()를 양끝에 적어줘야한다.
root.title(title)
말 그대로 타이틀의 명을 지정한다.
root.geometry()
root.geometry("가로x세로") 가로 세로의 크기를 지정
root.geometry("가로x세로+x좌표+y좌표") GUI의 창이 켜지는 좌표를 지정해주는 것 모니터의 왼쪽 위 맨 끝이 0,0 을 기준
resizable()
resizable(x값 변경 , y값 변경)
True는 너비 or 높이가 변경 가능하게 만들어주는
False는 너비 or 높이가 변경 불가능하게 만들어준다.
button 위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
btn1 = Button(root, text="버튼1") # root는 메인을 의미한다.
btn1.pack() # pack을 해줘야 실제로 적용이 된다.
btn2 = Button(root, padx=5, pady=10, text="버튼2") # padx 는 x공간에 padding을 주는
btn2.pack()
btn3 = Button(root, padx=10, pady=5, text="버튼3")
btn3.pack()
btn4 = Button(root, width=10, height=3, text="버튼4") # 버튼의 크기를 고정시키는
btn4.pack()
# btn4번은 글자가 많아지면 글자가 짤림, btn2,3번은 같이 커진다.
btn5 = Button(root, fg="red", bg="yellow", text="버튼5")
btn5.pack()
photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
btn6 = Button(root, image=photo)
btn6.pack()
def btncmd():
print("버튼이 클릭 되었어요")
btn7 = Button(root, text="동작 하는 버튼", command=btncmd)
btn7.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
Button()
btn1 = Button(root, text="버튼1") # root는 메인을 의미한다.
btn1.pack() # pack을 해줘야 실제로 적용이 된다.
root는 GUI main 화면을 가르킨다.
text는 버튼의 이름을 정할 수 있다.
Pack 위젯들을 부모 위젯에 모두 패킹하여 불필요한 공간을 없앤다. 위젯.pack() 메서드를 사용
btn2 = Button(root, padx=5, pady=10, text="버튼2") # padx 는 x공간에 padding을 주는
btn2.pack()
padx, pady 버튼의 크기를 padding을 줄 수 있다.
.
padding이기 때문에 글자수가 늘어나면 버튼도 같이 늘어난다.
btn4 = Button(root, width=10, height=3, text="버튼4") # 버튼의 크기를 고정시키는
btn4.pack()
width, height 버튼의 크기를 절대크기로 지정할 수 있다
절대크기이기 때문에 글자수가 늘어나면 글자가 짤리게 나온다.
btn5 = Button(root, fg="red", bg="yellow", text="버튼5")
btn5.pack()
fg, 글자색
bg, 버튼 배경색
image 불러오기
PhotoImage를 이용하여 위젯들의 공간에 이미지를 불러올 수 있다.
PhotoImage(file ="경로") 기본 경로는 현재 프로젝트의 위치가 된다.
Button에 이미지를 적용하기
Button(root, image=photo) Button에 text가 아닌 image에 PhotoImage로 불러온 값을 넣어준다.
photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
btn6 = Button(root, image=photo)
btn6.pack()
이미지버튼
Button에 이벤트 주기
def btncmd():
print("버튼이 클릭 되었어요")
btn7 = Button(root, text="동작 하는 버튼", command=btncmd)
btn7.pack()
Button의 속성안에 command를 이용해서 동작하고 싶은 함수를 연결한다.
btncmd라는 함수는 "버튼이 클릭 되었어요"라는 문구를 출력해주는 함수이다.
Button이 눌리면 command에 있는 btncmd함수가 실행되게 된다
label 위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480")
label1 = Label(root, text="안녕하세요")
label1.pack()
photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
label2 = Label(root, image=photo)
label2.pack()
def change():
label1.config(text="또 만나요") # config 속성 값을 바꿔주고 싶을 때
global photo2 # Garbage Collection : 불필요한 메모리 공간 해제
# 전역변수로 만들어야 불필요한 메모리라고 인식이 안되기 때문에
# 전역변수가 아니면 필요없는 것인지 알고 메모리 삭제해버림
photo2 = PhotoImage(file="D:\\python\\project\\tkinter\\image2.png")
label2.config(image=photo2)
btn = Button(root, text="클림", command=change)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
label은 텍스트 혹은 이미지를 보여주는 위젯
텍스트
label1 = Label(root, text="안녕하세요")
label1.pack()
텍스트를 넣을 수 있다.
이미지
photo = PhotoImage(file="D:\\python\\project\\tkinter\\image.png")
label2 = Label(root, image=photo)
label2.pack()
이미지도 넣을 수 있다.
button을 이용해서 label의 내용을 변경하는 것도 가능
def change():
label1.config(text="또 만나요") # config 속성 값을 바꿔주고 싶을 때
global photo2 # Garbage Collection : 불필요한 메모리 공간 해제
# 전역변수로 만들어야 불필요한 메모리라고 인식이 안되기 때문에
# 전역변수가 아니면 필요없는 것인지 알고 메모리 삭제해버림
photo2 = PhotoImage(file="D:\\python\\project\\tkinter\\image2.png")
label2.config(image=photo2)
btn = Button(root, text="클림", command=change)
btn.pack()
change()라는 함수를 만들어서
label.config(text="txt"), config를 사용하면 label의 속성값을 바꿀 수 있다.
위에 코드에서 주의할 점은,
photo를 변경할려고 할 경우에 photo2라는 변수의 위치가 함수안에 있기 때문에 전역변수가 아니다
그러면 garbage collection 이라는 불필요한 메모리 공간을 해제하는 역할을 하는 친구가 이 photo2를 먹어버려서
동작을 안하게 된다.
그렇기 때문에, 전역변수로 만들기 위해 앞에 global photo2라는 것을 추가해주면 정상적으로 동작을 함
변경전
변경후
text_entry 위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
txt = Text(root, width=30, height=5)
txt.pack()
txt.insert(END, "글자를 입력하세요") # 디폴트 txt값을 입력
# END입력될 위치를 선택 지금은 아무것도 없으니 처음부터 입력됨
e = Entry(root, width=30) # enter불가, 한줄로 txt를 받을 경우
e.pack()
e.insert(0, "한 줄만 입력해요") # 처음에 아무런 입력값이 없으니 index 0이나 END나 똑같이 처음부터 입력
def btncmd():
# 내용출력
print(txt.get("1.0", END)) # "1.0" 1은 첫번째 줄부터 가져와라 0은 0번째 컬럼부터 가져와라
# 그래서 END 끝까지 다 가져와라
print(e.get())
# 내용 삭제
txt.delete("1.0", END)
e.delete(0, END)
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
text와 entry둘다 텍스트 박스를 만들어주는 위젯이지만
text는 박스의 크기를 정할 수 있고
entry는 박스의 크기를 정할 수없음 , 한 줄의 박스 형태밖에 못만든다.
text
txt = Text(root, width=30, height=5)
txt.pack()
width= 글자수 크기, height = 글자수 크기
insert()
txt.insert(END, "글자를 입력하세요")
text상자에 속성값을 미리 지정해 놓는 방법도 있다.
END가 의미하는것은 값의 맨 끝에 위치에 "텍스트"문을 추가한다는 소리
현제는 값이 아무것도 없기 때문에 맨처음 (0)과 마찬가지
Entry()
e = Entry(root, width=30) # enter불가, 한줄로 txt를 받을 경우
e.pack()
e.insert(0, "한 줄만 입력해요") # 처음에 아무런 입력값이 없으니 index 0이나 END나 똑같이 처음부터 입력
entry()는 한줄로 txt를 받는 아이디 비번이라던가 그런 경우에 사용된다.
Button을 이용해 이벤트 가능
def btncmd():
# 내용출력
print(txt.get("1.0", END)) # "1.0" 1은 첫번째 줄부터 가져와라 0은 0번째 컬럼부터 가져와라
# 그래서 END 끝까지 다 가져와라
print(e.get())
# 내용 삭제
txt.delete("1.0", END)
e.delete(0, END)
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
get()
print(txt.get("1.0", END)) # "1.0" 1은 첫번째 줄부터 가져와라 0은 0번째 컬럼부터 가져와라
# 그래서 END 끝까지 다 가져와라
print(e.get())
text인 경우에는 너비가 있기 때문에, 글을 가져올 위치를 정할 수 있다.
위에서 "1.0"에서 1이 의미하는 것은 첫번째 줄부터 가져와라, 0이 의미하는 것은 0번째 컬럼부터 가져와라
END는 끝까지 가져와라라는 의미이다.
entry에서는 get()만 사용하면 된다.
delete()
# 내용 삭제
txt.delete("1.0", END)
e.delete(0, END)
삭제하는 경우에는 text, entry 둘다 어디부터 어디까지 삭제할지를 정해줘야한다.
listbox 위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
listbox = Listbox(root, selectmode="extended", height=0) # single은 한가지만 선택가능
# extended는 여러개 선택가능
# height 값이 0이되면 리스트에 포한된것을 전부 한번에 보여줌
# 만약 3으로 지정하면 3칸만 보여주고 나머지는 스크롤로 볼 수 있게됨
listbox.insert(0, "딸기") # insert값을 추가할 때
listbox.insert(1, "사과")
listbox.insert(2, "딸기")
listbox.insert(END, "수박") # END는 가장 마지막에 넣어주겠다는 의미
listbox.insert(END, "바나나")
listbox.pack()
def btncmd():
# listbox.delete(END) # END 맨 뒤에 항목을 삭제 ,0 맨 앞 항목 삭제
# # 개수 확인
# print("리스트에느 ", listbox.size(), "개가 있어요")
# 항목 확인
# print("1번째 부터 3번째까지의 항복 : ", listbox.get(0, 2)) #시작과 끝 index를 지정
# 선택된 항목 확인(index 위치로 반환)
print("선택된 항목 : ", listbox.curselection()) # 항목이 index값으로 반환한다.
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
Listbox()
listbox = Listbox(root, selectmode="extended", height=0) # single은 한가지만 선택가능
selectmode에서 extended는 list의 항목중 여러개를 선택할 수있고
single을 하게 되면 한가지 밖에 선택을 못하게 된다.
height는 listbox의 높이를 지정해주는데 0을 하게되면 목록전체를 다 보여줄 만큼의 높이가 된다.
3을 하게되면 3칸만 보이도록하고 나머지는 scroll형식으로 바뀐다.
Insert()
역시나 값을 추가하기 위해서는 insert()를 사용
listbox.insert(0, "딸기") # insert값을 추가할 때
listbox.insert(1, "사과")
listbox.insert(2, "딸기")
listbox.insert(END, "수박") # END는 가장 마지막에 넣어주겠다는 의미
listbox.insert(END, "바나나")
listbox.pack()
insert할 index위치를 지정해줘야 한다. END를 사용하면 가장 끝에 위치
Button을 이용한 이벤트
def btncmd():
listbox.delete(END) # END 맨 뒤에 항목을 삭제 ,0 맨 앞 항목 삭제
# 개수 확인
print("리스트에느 ", listbox.size(), "개가 있어요")
항목 확인
print("1번째 부터 3번째까지의 항복 : ", listbox.get(0, 2)) #시작과 끝 index를 지정
선택된 항목 확인(index 위치로 반환)
print("선택된 항목 : ", listbox.curselection()) # 항목이 index값으로 반환한다.
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
delete()
listbox.delete(END)
삭제할 index번호를 입력하게 되면 삭제됨
size()
print("리스트에느 ", listbox.size(), "개가 있어요")
list 항목의 갯수를 알려주는 함수
get()
print("1번째 부터 3번째까지의 항복 : ", listbox.get(0, 2))
시작 인덱스, 끝 인덱스 까지의 항목의 내용을 가져옴
튜플타입
curselection()
print("선택된 항목 : ", listbox.curselection())
현재 GUI에서 선택된 list의 항목을 index의 위치로 반환해줌
현재 선택된 딸기,수박,바나나에 index번호를 튜플타입으로 반환
checkbox 위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
checkvar = IntVar() # Checkvar에 int형으로 값을 저장한다.
checkbox = Checkbutton(root, text="오늘하루 보지않기", variable=checkvar)
# checkbox.select() # 자동 선택 처리
# checkbox.deselect() # 선택 해제 처리
checkbox.pack()
checkvar2 = IntVar()
checkbox2 = Checkbutton(root, text="일주일 동안 보지 않기", variable=checkvar2)
checkbox2.pack()
def btncmd():
print(checkvar.get()) # 값이 0 : 체크 x 값이 1 : 체크 o
print(checkvar2.get())
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
Checkbutton()
checkvar = IntVar() # Checkvar에 int형으로 값을 저장한다.
checkbox = Checkbutton(root, text="오늘하루 보지않기", variable=checkvar)
# checkbox.select() # 자동 선택 처리
# checkbox.deselect() # 선택 해제 처리
checkbox.pack()
text는 체크박스에 나타날 문구를 정하는 것이고
variable은 현재 체크 되어있는지 안되어있는지를 값을 변수에 저장시키기 위해서 사용된다.
checkvar = IntVar()에서 IntVar()는 int형으로 값을 저장하기 위함
select()는 처음에 자동으로 체크 되어있도록하는
deselect()는 자동으로 선택 해제처리하는 기능
Button을 이용한 이벤트
def btncmd():
print(checkvar.get()) # 값이 0 : 체크 x 값이 1 : 체크 o
print(checkvar2.get())
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
get()
print(checkvar.get())
checkvar의 값을 가져온다. 체크가 되어있을 때는 1, 체크가 안된 경우에는 0값을 반환
radiobutton위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
#variable이 같은 것 끼리 하나의 한 묶음이 된다.
#같은 variable 끼리만 서로 영향을 준다.
Label(root, text="메뉴를 선택하세요").pack()
burger_var = IntVar() # 인트형으로 값을 저장
btn_burger1 = Radiobutton(root, text="햄버거", value=1, variable=burger_var)
btn_burger1.select()
btn_burger2 = Radiobutton(root, text="치즈버거", value=2, variable=burger_var)
btn_burger3 = Radiobutton(root, text="치킨버거", value=3, variable=burger_var)
btn_burger1.pack()
btn_burger2.pack()
btn_burger3.pack()
Label(root, text="음료를 선택하세요").pack()
drink_var = StringVar()
btn_drink1 = Radiobutton(root, text="콜라", value="콜라", variable=drink_var)
btn_drink1.select()
btn_drink2 = Radiobutton(root, text="사이다", value="사이다", variable=drink_var)
btn_drink3 = Radiobutton(root, text="환타", value="환타", variable=drink_var)
btn_drink1.pack()
btn_drink2.pack()
btn_drink3.pack()
def btncmd():
print(burger_var.get()) # 햄버거 중 선택된 라이도 항복의 값(value)를 출력
print(drink_var.get())
btn = Button(root, text="주문", command=btncmd)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
Radiobutton()
burger_var = IntVar() # 인트형으로 값을 저장
btn_burger1 = Radiobutton(root, text="햄버거", value=1, variable=burger_var)
btn_burger1.select()
btn_burger2 = Radiobutton(root, text="치즈버거", value=2, variable=burger_var)
btn_burger3 = Radiobutton(root, text="치킨버거", value=3, variable=burger_var)
btn_burger1.pack()
btn_burger2.pack()
btn_burger3.pack()
value 값을 지정해주게 되고, variable을 통해서 그 value값을 해당 변수에 저장한다.
select()는 처음부터 자동 선택되도록
Button으로 이벤트
def btncmd():
print(burger_var.get()) # 햄버거 중 선택된 라이도 항복의 값(value)를 출력
print(drink_var.get())
btn = Button(root, text="주문", command=btncmd)
btn.pack()
get()
print(burger_var.get())
어떤 burger를 선택했는지를 value값을 알수가 있다.
combobox 위젯
# combobox는 따로 불러와야함
import tkinter.ttk as ttk
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
values = [str(i)+"일" for i in range(1, 32)] # 1~31 까지의 숫자
combobox = ttk.Combobox(root, height=5, values=values)
combobox.pack()
combobox.set("카드 결제일") # 최초 목록 제목 설정 / 버튼 클릭을 통한 값 설정도 가능
readonly_combobox = ttk.Combobox(
root, height=5, values=values, state="readonly")
readonly_combobox.current(0) # 0번째 인덱스 값 선택
readonly_combobox.pack()
def btncmd():
print(combobox.get())
print(readonly_combobox.get())
btn = Button(root, text="선택", command=btncmd)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
combobox를 사용하기 위해서는 tkinter.ttk 모듈을 따로 import 해와야한다.
import tkinter.ttk as ttk
편하게 쓰기위해 as로 약어처리
values = [str(i)+"일" for i in range(1, 32)] # 1~31 까지의 숫자
combobox = ttk.Combobox(root, height=5, values=values)
combobox.pack()
combobox.set("카드 결제일") # 최초 목록 제목 설정 / 버튼 클릭을 통한 값 설정도 가능
values에는 combobox에 넣고싶은 value값들을 넣어준다.
set()을 통해 최초의 목록의 제목을 설정할 수 있음
위에 코드의 문제점은 사용자가 이상한 문자를 입력할 수 있기 때문에 잘본된 정보가 들어오는 경우가 있다.
이것을 해결하기 위해서
state
readonly_combobox = ttk.Combobox(
root, height=5, values=values, state="readonly")
readonly_combobox.current(0) # 0번째 인덱스 값 선택
readonly_combobox.pack()
state에 readonly라는 속성을주면 읽기 전용이기 때문에 따로 값을 지정하거나 입력하는것이 불가능하다.
Button을 이용한 이벤트
def btncmd():
print(combobox.get())
print(readonly_combobox.get())
btn = Button(root, text="선택", command=btncmd)
btn.pack()
get()
def btncmd():
print(combobox.get())
print(readonly_combobox.get())
combobox에서 선택한 항목의 내용을 get을 통해 가져온다
progressbar 위젯
# progressbar 따로 불러와야함
import time
import tkinter.ttk as ttk
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
# progressbar는 진행상태를 알려줄 경우에 사용
indeterminate 정해지지 않은 , 언제 끝날지 모른다.
progressbar = ttk.Progressbar(root, maximum=100, mode="indeterminate")
progressbar = ttk.Progressbar(root, maximum=100, mode="determinate")
progressbar.start(10) # 10ms 마다 움직임 / 실행을 시켜줌
progressbar.pack()
# def btncmd():
# progressbar.stop() # 작동 중지
# btn = Button(root, text="중지", command=btncmd)
# btn.pack()
p_var2 = DoubleVar() # 진행값은 실수로도 진행 될 수 있기 때문에 Double
progressbar2 = ttk.Progressbar(root, maximum=100, length=150, variable=p_var2)
progressbar2.pack()
def btncmd2():
for i in range(1, 101): # 1~100
time.sleep(0.01) # 0.01초 대기
p_var2.set(i) # progress bar 의 값 설정
progressbar2.update() # for문이 동작할 때마다 ui적으로 업데이트 시켜줌
print(p_var2.get())
btn = Button(root, text="시작", command=btncmd2)
btn.pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
현재의 진행상황을 알고싶을 때 사용한다.
progress를 사용하기 위해서는 tkinter.ttk 모듈을 따로 import 해와야한다.
import tkinter.ttk as ttk
Progressbar()
progressbar = ttk.Progressbar(root, maximum=100, mode="indeterminate")
progressbar = ttk.Progressbar(root, maximum=100, mode="determinate")
progressbar.start(10) # 10ms 마다 움직임 / 실행을 시켜줌
progressbar.pack()
mode에서 indeterminate는 진행상태가 정해지지 않을 때, 언제 끝날지 모른다.
determinate는 현재 진행상태가 어느정도인지 알수있다.
start(int) 는 (int)ms 마다 실행을 시켜줌으로 움직이게 한다.
stop() 은 반대로 실행을 중지시킨다.
실행정도를 수치로 확인하기 위해서
p_var2 = DoubleVar() # 진행값은 실수로도 진행 될 수 있기 때문에 Double
progressbar2 = ttk.Progressbar(root, maximum=100, length=150, variable=p_var2)
progressbar2.pack()
Progressbar()에variable를 통해서 p_var2라는 변수에 저장을하는데 DoubleVar() 즉 실수형태로 받아들인다.
Button을 통한 이벤트
def btncmd2():
for i in range(1, 101): # 1~100
time.sleep(0.01) # 0.01초 대기
p_var2.set(i) # progress bar 의 값 설정
progressbar2.update() # for문이 동작할 때마다 ui적으로 업데이트 시켜줌
print(p_var2.get())
btn = Button(root, text="시작", command=btncmd2)
btn.pack()
sleep은 프로그램을 지정시간 만큼 정지시키는 역할을 한다.
import를 통해스 time 모듈을 가져와야지 사용가능하다.
for문으 통해서 p_var2에 값을 넣어준다.
for문에 맞추서 progressbar가 동작하게 해주기 위해서 update()를 사용한다.
현재 p_var2의 값, 즉 progressbar의 진행상태를 가져오기위해 get()을 사용
menu위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
menu = Menu(root)
menu_file = Menu(menu, tearoff=0)
def create_new_file():
print("새 파일을 만듭니다")
def create_new_window():
print("새 창을 만듭니다")
# File 메뉴
menu_file.add_command(label="New File", command=create_new_file)
menu_file.add_command(label="New Window", command=create_new_window)
menu_file.add_separator() # 구분자 추가
menu_file.add_command(label="Open File...")
menu_file.add_separator()
menu_file.add_command(label="Save All", state="disable") # 비활성화
menu_file.add_separator()
menu_file.add_command(label="Exit", command=root.quit)
menu.add_cascade(label="File", menu=menu_file)
# Edit메뉴 (빈값)
menu.add_cascade(label="Edit")
# languge 메뉴 추가 (radio 버튼을 통해서 택1)
menu_lang = Menu(menu, tearoff=0)
menu_lang.add_radiobutton(label="Python")
menu_lang.add_radiobutton(label="Java")
menu_lang.add_radiobutton(label="PHP")
menu.add_cascade(labe="languge", menu=menu_lang)
# View 메뉴 (check박스로 )
menu_view = Menu(menu, tearoff=0)
menu_view.add_checkbutton(label="Show Minimap")
menu.add_cascade(label="View", menu=menu_view)
root.config(menu=menu)
root.mainloop() # 창이 닫히지 않게 해주는 것
messagebox 위젯
import tkinter.messagebox as msgbox
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
# 에러가 떳을 때 팝업이 뜨는 것이 메세지
# 기차 예매 시스템이라고 가정
def info():
msgbox.showinfo("알림", "정상적으로 예매 완료되었습니다.") # showinfo("알림타이틀", "알림 내용")
def warn():
msgbox.showwarning("경고", "해당 좌석은 매진되었습니다.")
def error():
msgbox.showerror("에러", "결제오류가 발생했습니다.")
def okcancel():
msgbox.askokcancel("확인 / 취소", "해당 좌석은 유아동반석입니다. 예매하시겠습니까?.")
def retrycancel():
response = msgbox.askretrycancel("재시도 / 취소", "일시적인 오류입니다. 다시 시도하시겠습니까?")
print("응답 :", response)
if response == 1: # 네 ok
print("재시도")
elif response == 0: # 아니요
print("취소")
def yesno():
msgbox.askyesno("예 / 아니요", "해당 좌석은 역방향입니다. 예매하시겠습니까?")
def yesnocancel():
response = msgbox.askyesnocancel(
title=None, message="예매 내역이 저장되지 않았습니다.\n 저장후 프로그램을 종료하시겠습니까?")
print("응답 :", response)
if response == 1: # 네 ok
print("예")
elif response == 0: # 아니요
print("아니요")
else:
print("취소")
# 네 : 저장후 종료
# 아니요 : 저장하지 않고 종료
# 취소 : 프로그램 종료 취소 ( 현재 화면 계속 작업)
Button(root, command=info, text="알림").pack()
Button(root, command=warn, text="경고").pack()
Button(root, command=error, text="에러").pack()
Button(root, command=okcancel, text="확인취소").pack()
Button(root, command=retrycancel, text="재시도취소").pack()
Button(root, command=yesno, text="예 아니요").pack()
Button(root, command=yesnocancel, text="예 아니요 취소").pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
frame 위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
Label(root, text="메뉴를 선택해주세요").pack(side="top")
Button(root, text="주문하기").pack(side="bottom")
# 버거 프레임
# relief = solid 테두리 , bd = 1 외각선 굵기
frame_burger = Frame(root, relief="solid", bd=1)
frame_burger.pack(side="left", fill="both", expand=True) # 위치 정의
Button(frame_burger, text="햄버거").pack()
Button(frame_burger, text="치즈버거").pack()
Button(frame_burger, text="치킨버거").pack()
# 음료 프레임
frame_drink = LabelFrame(root, text="음료")
frame_drink.pack(side="right", fill="both", expand=True)
Button(frame_drink, text="콜라").pack()
Button(frame_drink, text="사이다").pack()
root.mainloop() # 창이 닫히지 않게 해주는 것
scrollbar위젯
from tkinter import *
root = Tk()
root.title("Jong GUI") # 타이틀명 지정
root.geometry("640x480") # 가로 x 세로의 크기 지정
# 스크롤바는 위젯과 스크롤바를 하나의 프레임에 넣고 관리하는 것이 편하다
frame = Frame(root)
frame.pack()
scrollbar = Scrollbar(frame)
scrollbar.pack(side="right", fill="y")
# set이 없으면 스크롤을 내려도 다시 올라옴
listbox = Listbox(frame, selectmode="extended",
height=10, yscrollcommand=scrollbar.set)
for i in range(1, 32): # 1~31일
listbox.insert(END, str(i)+"일")
listbox.pack(side="left")
# 서로서로를 맵핑시켜줘야지 서로가 연동되서 동작을한다.
# listbox에서는 yscrollcommand로 scrollbar을 , scrollbar에서는 config command로 listbox을 맵핑
scrollbar.config(command=listbox.yview)
root.mainloop() # 창이 닫히지 않게 해주는 것
frame 생성
frame = Frame(root)
frame.pack()
Scrollbar 생성
scrollbar = Scrollbar(frame)
scrollbar.pack(side="right", fill="y")
fill = "y" 를 이용해서 y축으로 scrollbar를 꽉 채움
side="right"를 이용해서 오른쪽에 위치시킴
listbox 생성
# set이 없으면 스크롤을 내려도 다시 올라옴
listbox = Listbox(frame, selectmode="extended",
height=10, yscrollcommand=scrollbar.set)
for i in range(1, 32): # 1~31일
listbox.insert(END, str(i)+"일")
listbox.pack(side="left")
extended는 여러개 선택가능
insert() 를 이용해서 list박스에 추가시킨다.
side = "left" listbox 왼쪽에 위치시킴
scrollbar와 listbox를 서로 맵핑해줘야한다.
listbox = Listbox(frame, selectmode="extended",
height=10, yscrollcommand=scrollbar.set)
scrollbar.config(command=listbox.yview)
그래야 서로 연동되서 동작을 할 수 있다.
scrollbar.set 에서 set을 해줘야지만 스크롤바가 위로 초기화 되지않고 동작한다
scrollbar에서는 config(command = listbox.yview) 를 통해서 listbox와 연동을 시켜줌
'IT 공부 > python' 카테고리의 다른 글
[ python ] Web Scraping 총정리 (1) | 2020.12.14 |
---|---|
[ python ] 화면 스크린샷 (0) | 2020.12.13 |
[ python ] 프로젝트 starcraft 개인공부 (0) | 2020.12.09 |
[ python ] 사주사용되는 함수/라이브러리 정리 (0) | 2020.12.07 |
[ python ] 예외 처리 raise (0) | 2020.11.29 |