728x90
파이썬에서 tkinter는 GUI 프로그래밍을 할 수 있도록 만들어주는 라이브러리입니다.
1. 기본 세팅
먼저 아래 라이브러리를 추가합니다.
from tkinter import *
그리고 tk 변수를 생성합니다.
# tk 변수 설정
root = Tk()
프로그램의 제목을 생성합니다. 기본값은 tk로 되어있습니다.
# 제목 입력
root.title("제목")
프로그램의 크기를 지정합니다. 물론 크기를 지정하지 않아도 기본값으로 지정되어있는 크기가 있습니다.
# 프로그램의 크기
root.geometry("640x480+300+300") #가로크기*세로크기+x좌표+y좌표
마지막에는 mainloop함수를 넣어줘야 프로그램이 실행되며 닫히지 않습니다.
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
2. 크기 변경 여부
#가로길이 ,세로길이 변경 여부. false는 변경불가
root.resizable(False,False)
3. button 위젯
from tkinter import *
# tk 변수 설정
root = Tk()
btn1 = Button(root, text="버튼1") # tk변수 , text=버튼의 이름
btn1.pack() #pack() 함수를 호출해야 프로그램에 추가됨
btn2 = Button(root,padx=5,pady=10,text="버튼2") # padx= 가로 패딩의 크기,pady= 세로 패딩의 크기. 버튼의 text에 따라 버튼크기가 변함
btn2.pack()
btn3 = Button(root,width=10,height=3,text="버튼3") # 버튼의 크기 width=가로,height=세로. 버튼의 text에 따라 버튼크기가 고정
btn3.pack()
btn4 = Button(root,fg="red",bg="yellow",text="버튼4") #fg는 버튼의 글자의 색깔, bg는 버튼의 background 색깔
btn4.pack()
img = PhotoImage(file="img.png")
btn5 = Button(root,image=img)
btn5.pack()
#버튼 실행 함수
def btnCmd():
print("버튼 실행")
btn6 = Button(root,text="버튼 실행",command=btnCmd)
btn6.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
실행결과
버튼 실행 버튼을 클릭하면 콘솔에 내용이 출력되는 것을 확인할 수 있습니다.
4.label 위젯
from tkinter import *
# tk 변수 설정
root = Tk()
root.geometry("300x300")
#글자 출력
lable1 = Label(root,text="내용")
lable1.pack()
#이미지 출력
img = PhotoImage(file="img.png")
lable2 = Label(root,image=img)
lable2.pack()
def change():
#config는 변화시키는 함수
lable1.config(text="내용이 변경되었습니다")
global img2 # 전역변수로 설정하지않으면 가비지콜렉션이 이미지를 없애버릴 수 있음
# 함수내에서 label의 이미지 등을 바꾸기 위해서는 img는 전역변수로 설정해야 한다.
img2 = PhotoImage(file="img2.png")
lable2.config(image=img2)
btn = Button(root,text="글자변경",command=change)
btn.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
5.text, entry 위젯
from tkinter import *
# tk 변수 설정
root = Tk()
root.geometry("300x300")
txt = Text(root,width=30,height=5)
txt.pack()
# 텍스트에 값을 넣어놓는 기능
txt.insert(END,"글자를 입력하세요")
#entry는 엔터기능을 사용할 수 없음
e = Entry(root,width=30)
e.pack()
e.insert(0,"엔트리 미리 입력")
def textDelete():
# 처음부터 끝까지 모든 글자를 가져옴
#1은 시작라인, 0은 시작 컬럼
print(txt.get("1.0",END))
print(e.get())
# 텍스트, 엔트리 삭제
txt.delete("1.0",END)
e.delete(0,END)
def texUpdate():
# 업데이트 할때는 삭제하고 삽입
txt.delete("1.0",END)
txt.insert(END,"업데이트")
btn1 = Button(root,text="삭제",command=textDelete)
btn1.pack()
btn2 = Button(root,text="업데이트",command=texUpdate)
btn2.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
6.listBox 위젯
from tkinter import *
# tk 변수 설정
root = Tk()
root.geometry("300x300")
# selectmode는 리스트박스의 옵션. extended는 확장가능, single은 하나만 선택가능
# height는 리스트가 포함된 크기만큼 바로보임. 1~은 리스트의 개수만큼 보임.
# 스크롤 내리면 다른 리스트가 존재하긴 하나 보이는 것은 height만큼만 보인다.
listbox = Listbox(root,selectmode="extended",height=0)
#리스트박스에 내용 삽입. index,내용
listbox.insert(0,"사과")
listbox.insert(1,"바나나")
listbox.insert(2,"포도")
#index 자리에 END를 넣으면 마지막에 삽입한다.
listbox.insert(END,"파인애플")
listbox.insert(END,"수박")
listbox.pack()
def listDelete():
#delete 괄호안에는 index를 입력. END는 맨뒤의 내용을 삭제
listbox.delete(END)
def listCount():
print("리스트 개수: ",listbox.size())
print("1번째부터 3번째까지의 항목: ",listbox.get(0,2))
# 선택한 항목의 index값 출력
print("선택한 항목: ",listbox.curselection())
btn1 = Button(root,text="삭제",command=listDelete)
btn1.pack()
btn2 = Button(root,text="개수확인",command=listCount)
btn2.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
7.checkBox 위젯
from tkinter import *
# tk 변수 설정
root = Tk()
root.geometry("300x300")
# variable 체크했을 때의 값
ch_var = IntVar() #ch_var에 int형으로 값을 저장한다.
ch = Checkbutton(root,text="체크박스",variable=ch_var)
ch.select() #자동 선택처리
ch.deselect() # 선택해제 처리
ch.pack()
ch_var2 = IntVar()
ch2 = Checkbutton(root,text="체크박스2",variable=ch_var2)
ch2.pack()
def checkStatus():
print(ch_var.get()) # 0 : 체크해제, 1: 체크
print(ch_var2.get())
btn1 = Button(root,text="체크상태",command=checkStatus)
btn1.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
8.radioButton 위젯
from tkinter import *
# tk 변수 설정
root = Tk()
root.geometry("300x300")
# 레이블 값이 변하지 않는다면 이런 방식도 가능
Label(root,text="과일 선택").pack()
radio_var = IntVar()
# 라디오버튼에서 variable은 그룹명 같은 의미
radio1 = Radiobutton(root,text="포도",value=1,variable=radio_var)
radio1.select() # 기본값 선택
radio2 = Radiobutton(root,text="사과",value=2,variable=radio_var)
radio3 = Radiobutton(root,text="오렌지",value=3,variable=radio_var)
radio1.pack()
radio2.pack()
radio3.pack()
Label(root,text="음식 선택").pack()
radio_var2 = StringVar()
radio4 = Radiobutton(root,text="피자",value="피자",variable=radio_var2)
radio4.select()
radio5 = Radiobutton(root,text="햄버거",value="햄버거",variable=radio_var2)
radio4.pack()
radio5.pack()
def checkStatus():
# 라디오버튼의 value 값을 출력
print(radio_var.get())
print(radio_var2.get())
btn1 = Button(root,text="선택",command=checkStatus)
btn1.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
9.comboBox 위젯
from tkinter import *
import tkinter.ttk as ttk # 콤보박스는 라이브러리를 추가해야 함
# tk 변수 설정
root = Tk()
root.geometry("300x300")
values = [str(i) + "일" for i in range(1,32)] #1~32까지의 숫자를 문자열 형태로
#height는 리스트박스처럼 보이는 개수, values는 목록 리스트값
combo = ttk.Combobox(root,height=5,values=values)
combo.set("카드 결제일") # 최초 목록 제목 설정
combo.pack()
# state는 상태값 readonly는 읽기전용 -> 선택은 가능하지만 입력은 불가
combo2 = ttk.Combobox(root,height=10,values=values,state="readonly")
combo2.current(0) # 0번째 인덱스값 선택
combo2.pack()
def checkStatus():
# 선택된 값 출력
print(combo.get())
print(combo2.get())
btn1 = Button(root,text="선택",command=checkStatus)
btn1.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
10.progressBar 위젯
import time
from tkinter import *
import tkinter.ttk as ttk # 프로그래스바는 라이브러리를 추가해야 함
# tk 변수 설정
root = Tk()
root.geometry("300x300")
# mode indeterminate는 결정되지 않은 것
# mode determinate는 결정된 것
progressbar = ttk.Progressbar(root,maximum=100,mode="determinate")
# start는 실행. 함수 내의 값은 반복 실행 간격 ms 단위
progressbar.start(10)
progressbar.pack()
p_var2 = DoubleVar()
progressbar2 = ttk.Progressbar(root,maximum=100,length=150,variable=p_var2)
progressbar2.pack()
def stop():
# 값은 전부 사라짐
progressbar.stop()
def start():
for i in range(1,100):
time.sleep(0.1) # 0.01초 대기
p_var2.set(i)
#for문 동작할때마다 gui 업데이트
progressbar2.update()
print(p_var2.get())
btn1 = Button(root,text="중지",command=stop)
btn1.pack()
btn1 = Button(root,text="시작",command=start)
btn1.pack()
# mainloop는 창이 닫히기 않게 하는 함수
root.mainloop()
11.menu 위젯
from tkinter import *
import os
root = Tk()
root.geometry("600x300")
file_name = "note.txt"
def create_new_file():
print("새파일 생성")
def open_file():
# os.path.isfile은 file_name 값이 존재하는지 확인하는 함수
if os.path.isfile(file_name):
with open(file_name,"r",encoding="utf8") as file:
txt.delete("1.0",END) #전체 삭제 후
txt.insert(END,file.read()) #파일 내용을 입력
def save_file():
with open(file_name,"w",encoding="utf8") as file:
file.write(txt.get("1.0",END)) # 모든 내용을 가져와서 저장
menu = Menu(root)
# File 메뉴의 세부 내용들 생성
menu_file = Menu(menu,tearoff=0)
menu_file.add_command(label="New File",command=create_new_file)
menu_file.add_command(label="Open File",command=open_file)
menu_file.add_command(label="Save File",command=save_file)
#구분자 생성
menu_file.add_separator()
menu_file.add_command(label="Save All", state="disabled") # 비활성화
menu_file.add_separator()
menu_file.add_command(label="Exit",command=root.quit) # tkinter를 종료하는 함수
#메뉴 하나의 제목->File 메뉴
menu.add_cascade(label="File",menu=menu_file)
#메뉴 하나의 제목->Edit 메뉴
menu.add_cascade(label="Edit")
menu_lang = Menu(menu,tearoff=0)
# 라디오버튼 생성
menu_lang.add_radiobutton(label="파이썬")
menu_lang.add_radiobutton(label="자바")
menu_lang.add_radiobutton(label="자바스크립트")
menu.add_cascade(label="Language",menu=menu_lang)
menu_check = Menu(menu,tearoff=0)
menu_check.add_checkbutton(label="Show Option")
menu.add_cascade(label="Check",menu=menu_check)
root.config(menu=menu)
txt = Text()
txt.pack(side="left",expand=True)
root.mainloop()
12. messageBox 위젯
from tkinter import *
import tkinter.messagebox as msgbox # 메시지박스를 사용하려면 라이브러리를 추가해야함
root = Tk()
root.geometry("600x300")
def functions():
#알림창
msgbox.showinfo("알림","알림창")
def warning():
msgbox.showwarning("경고","경고창")
def err():
msgbox.showerror("에러","에러발생")
def okCancel():
result = msgbox.askokcancel("확인창","확인하셨습니까?")
# 예는 True,1
# 아니오는 False,0
# 취소는 None,그 외
if result == 1:
print("yes1")
else:
print("no1")
def retryCancel():
result = msgbox.askretrycancel("재시도취소","재시도하시겠습니까?")
if result == 1:
print("try2")
else:
print("no2")
def yesNo():
result = msgbox.askyesno("예아니오 확인버튼","실행하시겠습니까?")
if result == 1:
print("yes3")
else:
print("no3")
def yesNoCancel():
# title을 None으로 하면 메세지창의 제목이 나타나지 않는다.
result = msgbox.askyesnocancel(title=None,message="저장하시겠습니까?")
#if 문에 True,False로도 가능
if result == True:
print("yes4")
elif result == False:
print("no4")
else:
print("cancel4")
btn1 = Button(root,text="버튼",command=functions)
btn1.pack()
#버튼은 아래방식으로도 생성가능
Button(root,command=warning,text="경고창").pack()
Button(root,command=err,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()
13. Frame 위젯
from tkinter import *
root = Tk()
root.geometry("600x300")
Label(root,text="가장 위의 Label").pack(side="top")
Button(root,text="가장 아래의 버튼").pack(side="bottom")
#relief는 테두리 모양 , bd는 테두리크기
frame = Frame(root,relief="solid",bd=1)
#side는 위치, fill은 채우기, expand는 확장옵션
# expand 없이 fill 옵션만 사용하면 글자크기만큼 width가 지정되고 아래로 가득차게(height=max) 된다.
# expand를 사용하면 빈공간을 모두 채우게 된다.
frame.pack(side="left",fill="both",expand=True)
# 위젯안에 frame을 넣으면 해당 프레임안에 위젯이 들어가게 된다.
Button(frame,text="오렌지").pack()
Button(frame,text="포도").pack()
Button(frame,text="사과").pack()
#LabelFrame은 제목이 있는 프레임, groupBox 같은 형태
frame2 =LabelFrame(root,text="음료")
frame2.pack()
Button(frame2,text="콜라").pack()
Button(frame2,text="사이다").pack()
root.mainloop()
14.scrollBar 위젯
from tkinter import *
root = Tk()
root.geometry("600x300")
frame = Frame(root)
frame.pack()
scrollbar = Scrollbar(frame)
scrollbar.pack(side="right",fill="y")
#yscrollcommand는 상하로 스크롤바를 넣겠다는 의미
# set과 scrollbar.config가 없으면 스크롤을 내려도 다시 올라옴
listbox = Listbox(frame,selectmode="extended",height=10,yscrollcommand=scrollbar.set)
for i in range(1,32):
listbox.insert(END,str(i)+"일")
listbox.pack(side="left")
#리스트박스에 mapping
scrollbar.config(command=listbox.yview)
root.mainloop()
15.grid 위젯
from tkinter import *
root = Tk()
root.geometry("600x300")
btn_a = Button(root,text="a")
btn_c = Button(root,text="c")
btn_d = Button(root,text="d")
# 그리드 위젯은 행렬처럼 배열된다.
# sticky 옵션은 남은 여백만큼 붙이는 옵션. N+E+W+S는 동서남북 방향임
btn_a.grid(row=0,column=0,columnspan=2,sticky=N+E+W+S) #가로 병합
btn_c.grid(row=0,column=2)
btn_d.grid(row=0,column=3,rowspan=2,sticky=N+E+W+S) #세로 병합
btn_e = Button(root,text="e")
btn_f = Button(root,text="f")
btn_g = Button(root,text="g")
#padx=좌우 padding ,pady=위아래 padding 여기서는 버튼의 margin이 된다.
btn_e.grid(row=1,column=0,sticky=N+E+W+S,padx=3,pady=3)
btn_f.grid(row=1,column=1,sticky=N+E+W+S)
btn_g.grid(row=1,column=2,sticky=N+E+W+S)
root.mainloop()
'PYTHON Programming > Python' 카테고리의 다른 글
[python] 정렬함수(sort() vs sorted()) (0) | 2024.05.23 |
---|---|
[python] namedTuple (0) | 2024.05.23 |
[python] requests (0) | 2024.05.22 |
[python] exe 파일 만들기(pyinstaller) (0) | 2024.05.22 |
[python] 스케줄 (0) | 2024.05.22 |