장점
단점
사용하는 방법
from tkinter import *
from tkinter import ttk
from tkinter import *
frame = Tk()
frame.title("frame")
frame.geometry("640x480+100+300")
frame.resizable(False, False)
frame.mainloop()

from tkinter import *
frame = Tk()
frame.title("frame")
Label(frame, text="Menu").pack(side="top")
Button(frame, text="주문하기").pack(side="bottom")
frame_burger = Frame(frame, relief="solid", bd=1)
Button(frame_burger, text="hamburger").pack()
Button(frame_burger, text="cheeze burger").pack()
Button(frame_burger, text="chicken burger").pack()
frame_burger.pack(side="left", fill="both", expand=True)
frame_drink = LabelFrame(frame, text="drinks")
Button(frame_burger, text="coke").pack()
Button(frame_burger, text="cider").pack()
frame_drink.pack(side="right", fill="both", expand=True)
frame.mainloop()
from tkinter import *
frame = Tk()
frame.title("frame")
btn1 = Button(frame, text="버튼1")
btn1.pack() # pack()을 사용하면 위젯을 창에 배치할 수 있다.
btn2 = Button(frame, padx=5, pady=10, text="*******버튼2*******")
btn2.pack()
btn3 = Button(frame, padx=5, pady=10, text="버튼3")
btn3.pack()
btn4 = Button(frame, width=10, height=3, text="버튼4")
btn4.pack()
btn5 = Button(frame, fg="red", bg="yellow", text="버튼5")
btn5.pack()
photo = PhotoImage(file="python_gui/button_bg.png")
btn6 = Button(frame, image=photo)
btn6.pack()
def btncmd():
print("버튼이 클릭되었습니다.")
btn7 = Button(frame, text="동작하는 버튼", command=btncmd)
btn7.pack()
frame.mainloop()

레이블은 화면에 글자나 이미지를 보여줄 때 사용하는 도구이다.
from tkinter import *
frame = Tk()
frame.title("frame")
label1 = Label(frame, text="Hello World")
label1.pack()
photo = PhotoImage(file="python_gui/button_bg.png")
label2 = Label(frame, image=photo)
label2.pack()
def change():
label1.config(text="Good Bye")
global change_photo # 전역변수로 선언해야 변경사항을 적용함
change_photo = PhotoImage(file="python_gui/change_bg.png")
label2.config(image=change_photo)
btn = Button(frame, text="Click Me", command=change)
btn.pack()
frame.mainloop()
버튼 누르기 전 | 버튼 누르기 후 |
|---|
텍스트와 엔트리는 문자열을 입력할 수 있는 위젯이다.
텍스트
from tkinter import *
frame = Tk()
frame.title("frame")
txt = Text(frame, width=30, height=5)
txt.pack()
txt.insert(END, "Insert Contents\n")
frame.mainloop()

엔트리
from tkinter import *
frame = Tk()
frame.title("frame")
entry = Entry(frame)
entry.insert(0, "한 줄만 입력 가능")
entry.pack()
frame.mainloop()

텍스트와 엔트리의 차이
엔트리는 한 줄만 입력을 받을 수 있지만, 텍스트는 여러 줄을 입력 받을 수 있다.
즉, 엔트리에서는 Enter를 입력 받을 수 없다.
버튼을 이용하여 텍스트와 엔트리 내용 추가 및 수정
from tkinter import *
frame = Tk()
frame.title("frame")
txt = Text(frame, width=30, height=5)
txt.insert(END, "Insert Contents\n")
txt.pack()
entry = Entry(frame)
entry.insert(0, "한 줄만 입력 가능")
entry.pack()
def btncmd():
print(txt.get("1.0", END))
print(entry.get())
txt.delete("1.0", END)
entry.delete(0, END)
btn = Button(frame, text="Click Me", command=btncmd)
frame.mainloop()
버튼 누르기 전 | 버튼 누른 후 |
|---|
리스트 박스와 콤보 박스는 박스 안의 항목들 중에서 선택을 할 수 있도록 하는 위젯이다.
리스트 박스
from tkinter import *
frame = Tk()
frame.title("frame")
listbox = Listbox(frame, selectmode="extended", height=0)
listbox.insert(0, "Apple")
listbox.insert(1, "Banana")
listbox.insert(2, "Cherry")
listbox.insert(END, "Grape")
listbox.pack()
def btncmd():
listbox.delete(END)
listbox.delete(0)
print("Listbox Size: ", listbox.size())
print("1st to 3rd: ", listbox.get(0, 2))
print("Selected Item: ", listbox.curselection())
btn = Button(frame, text="Click Me", command=btncmd)
btn.pack()
frame.mainloop()
버튼 클릭 전 | 버튼 클릭 후 |
|---|
콤보 박스
from tkinter import *
import tkinter.ttk as ttk
frame = Tk()
frame.title("frame")
date = [str(i) + "일" for i in range(1, 32)]
combobox = ttk.Combobox(frame, height=5, values=date, state="readonly")
# state : readonly(선택만 가능), normal(수정 가능)
combobox.pack()
combobox.set("날짜 선택") # 최초 목록 제목 설정
# combobox.current(0) # 0번째 인덱스 값 선택
def btncmd():
print(combobox.get()) # 선택된 값 표시
print(date.index(combobox.get()) + 1) # 선택된 값의 인덱스 표시
btn = Button(frame, text="Click Me", command=btncmd)
btn.pack()
frame.mainloop()
버튼 누르기 전 | 버튼 누른 후 |
|---|
체크 버튼과 리디오 버튼은 선택할 항목 버튼 중에서 선택하도록 하는 위젯이다.
체크 버튼
from tkinter import *
frame = Tk()
frame.title("frame")
chkvar = IntVar() # chkvar에 int형으로 값을 저장
chkbox = Checkbutton(frame, text="오늘 하루 보지 않기", variable=chkvar)
chkbox.select() # 자동 선택 처리
chkbox.pack()
chkvar2 = IntVar()
chkbox2 = Checkbutton(frame, text="일주일동안 보지 않기", variable=chkvar2)
chkbox2.deselect()
chkbox2.pack()
def btncmd():
print(chkvar.get()) # 0 : 해제, 1 : 선택
print(chkvar2.get())
btn = Button(frame, text="Click Me", command=btncmd)
btn.pack()
frame.mainloop()
실행 후 버튼만 클릭한 화면 |
|---|
라디오 버튼
from tkinter import *
frame = Tk()
frame.title("frame")
label1 = Label(frame, text="burger").pack()
burger_var = IntVar()
btn_burger1 = Radiobutton(frame, text="classic burger", value=1, variable=burger_var)
btn_burger1.select()
btn_burger2 = Radiobutton(frame, text="cheese burger", value=2, variable=burger_var)
btn_burger3 = Radiobutton(frame, text="chicken burger", value=3, variable=burger_var)
btn_burger1.pack()
btn_burger2.pack()
btn_burger3.pack()
label2 = Label(frame, text="drink").pack()
drink_var = IntVar()
btn_drink1 = Radiobutton(frame, text="coke", value=1, variable=drink_var)
btn_drink1.select()
btn_drink2 = Radiobutton(frame, text="sprite", value=2, variable=drink_var)
btn_drink1.pack()
btn_drink2.pack()
def btncmd():
print(burger_var.get())
print(drink_var.get())
btn = Button(frame, text="Order", command=btncmd)
btn.pack()
frame.mainloop()
체크 버튼과 라디오 버튼의 차이
체크 버튼은 중복해서 선택할 수 있지만 라디오 버튼은 중복해서 선택할 수 없다

프로그레스 바는 진행도를 나타내는 위젯이다.
from tkinter import *
import tkinter.ttk as ttk
import time
frame = Tk()
frame.title("frame")
progressbar = ttk.Progressbar(frame, maximum=100, mode="indeterminate")
progressbar.start(10)
progressbar.pack()
def btncmd():
progressbar.stop()
print("중지")
btn = Button(frame, text="중지", command=btncmd)
btn.pack()
def btncmd2():
for i in range(1, 101):
time.sleep(0.01) # 0.01초 대기
p_var2.set(i)
progressbar2.update()
p_var2 = DoubleVar()
progressbar2 = ttk.Progressbar(frame, maximum=100, length=150, variable=p_var2, mode="determinate")
progressbar2.pack()
btn2 = Button(frame, text="시작", command=btncmd2)
btn2.pack()
frame.mainloop()
버튼 누르기 전 | 버튼 누른 후 |
|---|
from tkinter import *
frame = Tk()
frame.title("frame")
main_menu = Menu(frame)
# File Menu
menu_file = Menu(main_menu, tearoff=0)
menu_file.add_command(label="New File")
menu_file.add_command(label="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="disabled") # 비활성화
menu_file.add_command(label="Exit", command=frame.quit)
main_menu.add_cascade(label="File", menu=menu_file)
# Edit Menu
main_menu.add_cascade(label="Edit")
# Language Menu (Radio 버튼을 통해 택1)
menu_lang = Menu(main_menu, tearoff=0)
menu_lang.add_radiobutton(label="Python")
menu_lang.add_radiobutton(label="C++")
menu_lang.add_radiobutton(label="Java")
main_menu.add_cascade(label="Language, ", menu=menu_lang)
# View Menu ()
menu_view = Menu(main_menu, tearoff=0)
menu_view.add_checkbutton(label="Show Minimap")
menu_view.add_checkbutton(label="Open View")
main_menu.add_cascade(label="View", menu=menu_view)
frame.config(menu=main_menu)
frame.mainloop()
command & seperator | radiobutton | checkbutton |
|---|
메시지 박스는 Error 메시지 등을 팝업 형태로 표출하는 위젯이다.
from tkinter import *
import tkinter.messagebox as msgbox
frame = Tk()
frame.title("frame")
def info():
msgbox.showinfo("알림", "info")
def warn():
msgbox.showwarning("경고", "warning")
def error():
msgbox.showerror("에러", "error")
def okcancel():
msgbox.askokcancel("확인 / 취소", "ok? or cancel?")
def retrycancel():
msgbox.askretrycancel("재시도 / 취소", "Retry? or Cancel?")
def yesno():
msgbox.askyesno("예 / 아니오", "yes? or no?")
def yesnocancel():
response = msgbox.askyesno(title=None, message="yes? or no? or cancel?")
print("응답:", response) # True(1), False(0), None(기타)
if response == 1:
print("예")
elif response == 0:
print("아니요")
else:
print("취소")
Button(frame, command=info, text="알림").pack()
Button(frame, command=warn, text="경고").pack()
Button(frame, command=error, text="에러").pack()
Button(frame, command=okcancel, text="확인 / 취소").pack()
Button(frame, command=retrycancel, text="재시도 / 취소").pack()
Button(frame, command=yesno, text="예 / 아니요").pack()
Button(frame, command=yesnocancel, text="예 / 아니요 / 취소").pack()
frame.mainloop()







from tkinter import *
frame = Tk()
frame.title("frame")
miniframe = Frame(frame)
miniframe.pack()
scrollbar = Scrollbar(frame)
scrollbar.pack(side="right", fill="y")
listbox = Listbox(miniframe, selectmode="extended", height=10, yscrollcommand=scrollbar.set) # set하지 않으면 스크롤을 내려도 다시 올라옴
for i in range(1, 32):
listbox.insert(END, str(i), "일")
listbox.pack()
scrollbar.config(command=listbox.yview) #scrollbar에서도 listbox에 사용 할거라고 알려줘야 함함
frame.mainloop()

그리드는 Frame을 격자로 나누어서 배치할 때 사용한다.
from tkinter import *
frame = Tk()
frame.title("frame")
btn_minus = Button(frame, text="-", width=5, height=2)
btn_plus = Button(frame, text="+", width=5, height=2)
btn_div = Button(frame, text="NumLk", width=5, height=2)
btn_7 = Button(frame, text="7", padx=10, pady=10)
btn_8 = Button(frame, text="8", padx=10, pady=10)
btn_9 = Button(frame, text="9", padx=10, pady=10)
btn_4 = Button(frame, text="4", padx=10, pady=10)
btn_5 = Button(frame, text="5", padx=10, pady=10)
btn_6 = Button(frame, text="6", padx=10, pady=10)
btn_1 = Button(frame, text="1", padx=10, pady=10)
btn_2 = Button(frame, text="2", padx=10, pady=10)
btn_3 = Button(frame, text="3", padx=10, pady=10)
btn_0 = Button(frame, text="0", padx=10, pady=10)
btn_dot = Button(frame, text=".", padx=10, pady=10)
btn_minus.grid(row=0, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_plus.grid(row=0, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_div.grid(row=0, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_7.grid(row=1, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_8.grid(row=1, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_9.grid(row=1, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_4.grid(row=2, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_5.grid(row=2, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_6.grid(row=2, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_1.grid(row=3, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_2.grid(row=3, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_3.grid(row=3, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_0.grid(row=4, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_dot.grid(row=4, column=1, columnspan=2, sticky=N+E+W+S, padx=3, pady=3)
frame.mainloop()

출처

from tkinter import *
main = Tk()
main.title("메모장")
scrollbar = Scrollbar(main)
scrollbar.pack(side='right', fill='y')
txt = Text(main, yscrollcommand=scrollbar.set)
txt.pack(fill="both", expand=True)
scrollbar.config(command=txt.yview)
main.mainloop()

※ 위의 코드에 다음 내용을 추가
main_menu = Menu(main)
file_menu = Menu(main_menu, tearoff=0)
file_menu.add_command(label = "새 탭")
file_menu.add_command(label = "새 창")
--- (중략) ---
file_menu.add_command(label = "창 닫기")
file_menu.add_command(label = "종료")
edit_menu = Menu(main_menu, tearoff=0)
edit_menu.add_command(label = "실행 취소")
edit_menu.add_separator()
--- (중략) ---
edit_menu.add_separator()
edit_menu.add_command(label = "글꼴")
view_menu = Menu(main_menu, tearoff=0)
view_menu.add_command(label = "확대")
view_menu.add_command(label = "축소")
--- (중략) ---
view_menu.add_checkbutton(label = "상태 표시줄")
view_menu.add_checkbutton(label = "자동 줄바꿈")
main_menu.add_cascade(label="파일", menu=file_menu)
main_menu.add_cascade(label="편집", menu=edit_menu)
main_menu.add_cascade(label="보기", menu=view_menu)
main.config(menu=main_menu)
파일 메뉴 | 편집 메뉴 |
|---|---|
보기 메뉴 |

(1) 열기
--- (생략) ---
def open_file():
with open("mynote.txt", "r", encoding="utf8") as content:
txt.delete(1.0, END)
txt.insert(END, content.read())
file_menu.add_command(label = "열기", command=open_file)
--- (생략) ---
def open_file():
content = open("mynote.txt", "r", encoding="utf8")
while True:
line = content.readline()
if not line:
break
txt.insert(END, line)
txt.insert("\n")
file_menu.add_command(label = "열기", command=open_file)
![]() | ![]() |
|---|
(2) 저장
--- (생략) ---
def save_file():
with open("mynote.txt", "w", encoding="utf8") as content:
content.write(txt.get(1.0, END))
file_menu.add_command(label = "저장")
--- (생략) ---
![]() | ![]() |
|---|
(3) 끝내기
--- (생략) ---
file_menu.add_command(label = "종료", command = main.quit)
--- (생략) ---