공부하는게 취미인 사람들 투딩
1. tkinter 기본
코드
from tkinter import *
root = Tk()
root.title("nado gui")
root.geometry("640x480") #가로 세로, 소문자x 를 써야 됨. X,* 쓰면 오류남
root.resizable( False , False ) # x 너비 , y 높이 값 변경 불가 (창크기 변경 못하게)
root.mainloop() # 창이 닫히지 않도록
# root.geometry("640x480+300+100") #가로 , 세로 , x 좌표, y좌표 (창의 위치 지정도 가능)
2 위젯 - 버튼
from tkinter import *
코드
root = Tk()
root.title("파이썬 GUI")
#버튼 생성
btn1 = Button(root, text="버튼") # 어디에 만들지, 버튼텍스트
btn1.pack()
btn2 = Button(root, padx=5 , pady =10 , text="버튼2") #padding 값 줄수 있다.
btn2.pack()
btn3 = Button(root, padx=10 , pady =5 , text="버튼3") #padding 값 줄수 있다.
btn3.pack()
btn4 = Button(root, width=10 , height=3, text="버튼5555555555") #버튼 사이즈 fix 시킴
btn4.pack()
btn5 = Button(root, fg="red" , bg="yellow" , text = "버튼5") #fg : 포그라운드(글자)색상 bg:백그라운드 색상
btn5.pack()
photo = PhotoImage(file="gui_basic/img.png")
btn6 = Button(root, image=photo)
btn6.pack()
#버튼 동작
def btncmd():
print("버튼이 클릭되었어요")
btn7 = Button(root, text = "동작하는 버튼" , command=btncmd) #command=함수명
btn7.pack()
root.mainloop() # 창이 닫히지 않도록
3. 위젯 - 레이블
코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
label1 = Label(root , text = "안녕하세요")
label1.pack()
#이미지 넣기
photo = PhotoImage(file="gui_basic/img.png")
label2 = Label(root,image=photo)
label2.pack()
#이벤트
def change():
label1.config(text = "또만나요") #config 속성 변경
global photo2 # 전역변수로 선언
photo2 = PhotoImage(file="gui_basic/img2.png") # 전역변수 선언을 하지 않으면 가비지컬렉션에 의해 없어져 버림
label2.config(image=photo2)
btn = Button(root, text="클릭", command=change)
btn.pack()
root.mainloop() # 창이 닫히지 않도록
4. # 위젯 - 텍스트(여러줄 입력) ,엔트리(한줄입력)
코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
txt = Text(root, width=30 , height=5)
txt.pack()
txt.insert(END, "글자를 입력하세요") #기본값, 힌트 텍스트 제공
e = Entry(root, width=30) # 한줄 입력
e.pack()
e.insert(0, "한 줄만 입력해요")
def btncmd():
# 내용 출력
print(txt.get("1.0", END)) #처음부터 끝 글자까지 가지고 온다. 1: 첫번째 라인 0 은 첫번째 컬럼
print(e.get())
# 내용 삭제
txt.delete("1.0" , END)
e.delete(0,END)
btn = Button(root, text="클릭" , command=btncmd)
btn.pack()
root.mainloop() # 창이 닫히지 않도록
5. 위젯 - 리스트 박스 : 여러줄 목록 관리
코드
from tkinter import *root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
listbox = Listbox(root, selectmode = "extended" , height=0) # selectmode : single 은 하나만 선택가능 extended 는 다중선택가능 # 0이면 리스트에 있는 텍스트 만큼, 높이지정하면 그 갯수만큼 (스크롤바 필요)
listbox.insert(0, "사과")
listbox.insert(1, "딸기")
listbox.insert(2, "바나나")
listbox.insert(END, "수박") #END 는 맨 마지막에 순서대로 붙인다.
listbox.insert(END, "포도")
listbox.pack()
def btncmd():
#삭제
listbox.delete(END) # 맨 뒤부터 항목 삭제
listbox.delete(0) # 맨 앞부터 항목 삭제
#갯수확인
print("리스트에는" , listbox.size(), "개가 있어요.")
# 항목확인 (시작 idx , 끝 idx)
print("1번째 부터 3번째 까지의 항목:" , listbox.get(0,2))
##선택된 항목 확인 (위치(idx 값으로 반환))
print("선택된 항목 : ", listbox.curselection())
btn = Button(root, text="클릭" , command=btncmd)
btn.pack()
root.mainloop()
6. 위젯 - 체크박스
코드
from tkinter import *root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
chkvar = IntVar() # chkvar 에 int 형으로 값을 저장한다.
chkbox = Checkbutton(root, text="오늘 하루 보지 않기", variable=chkvar) # variable 체크 했을때, 해제했을때의 값을 변수값으로 가져올수 있다.
# chkbox.select() #자동 선택처리
# chkbox.deselect() # 선택해제 처리
chkbox.pack()
chkvar2 = IntVar()
chkbox2 = Checkbutton(root, text="일주일동안 하루 보지 않기", variable=chkvar2)
chkbox2.pack()
def btncmd():
print(chkvar.get()) #0: 체크 해제, 1: 체크
print(chkvar2.get())
btn = Button(root, text="클릭" , command=btncmd)
btn.pack()
root.mainloop()
7. 위젯 - 라디오버튼
코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
Label(root, text="메뉴를 선택하세요").pack() #변수선언 없이 바로 설정할때
burger_var = IntVar() #여기에 int 형으로 값을 저장한다.
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_drink1.pack()
btn_drink2.pack()
def btncmd():
print(burger_var.get()) #햄버거 중 선택된 라디오 항목의 값을 출력
print(drink_var.get()) #음료 중 선택된 라디오 항목의 값을 출력
btn = Button(root, text="주문" , command=btncmd)
btn.pack()
root.mainloop()
8. 위젯 - 콤보박스
코드
import tkinter.ttk as ttk #콤보박스를 쓰려면 tkinter.ttk 를 추가 해야 한다.
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
values = [str(i) + "일" for i in range(1,32)] #1~31까지의 숫자
combobox = ttk.Combobox(root, height=5, values=values) # height=5 :목록 5개까지 보여줌
combobox.pack()
combobox.set("카드결제일") # 최초 목록 제목 설정
#읽기 전용 콤보박스 state="readonly"
readonly_combobox = ttk.Combobox(root, height=10, values=values , state="readonly") #height=10 : 목록 10개까지 보여줌
readonly_combobox.current(0) # 0번째 index 값 선택
readonly_combobox.pack()
def btncmd():print(combobox.get()) #선택된 값 표시
print(readonly_combobox.get()) #선택된 값 표시
btn = Button(root, text="선택" , command=btncmd)
btn.pack()
root.mainloop()
9. 위젯 - 프로그래스바
기초
import tkinter.ttk as ttk #프로그래스바 를 쓰려면 tkinter.ttk 를 추가 해야 한다.
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
progressbar = ttk.Progressbar(root, maximum = 100 , mode = "indeterminate") # mode = "indeterminate" 결정되지 않음. 언제끝날지 모른다
progressbar = ttk.Progressbar(root, maximum = 100 , mode = "determinate") # mode = "determinate" 처음 부터 끝까지
progressbar.start(10) #10ms 마다 움직임
progressbar.pack()
def btncmd():
progressbar.stop() #작동 중지
btn = Button(root, text="중지" , command=btncmd)
btn.pack()
root.mainloop()
# 효과
import time
import tkinter.ttk as ttk #프로그래스바 를 쓰려면 tkinter.ttk 를 추가 해야 한다.
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
p_var2 = DoubleVar() # %가 실수로 나올수 있으므로
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() #gui 없데이트 시각적 효과
print(p_var2.get())
btn = Button(root, text="시작" , command=btncmd2)
btn.pack()
root.mainloop()
10 위젯 - 메뉴바
코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
def create_new_file():
print("새 파일을 만듭니다.")
menuv = Menu(root) #메뉴를 root 에 넣겠다
#File 메뉴 (첫번째 대메뉴)
menu_file = Menu(menuv, tearoff=0)
menu_file.add_command(label="New File" , command=create_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="disable") # 비활성화
menu_file.add_separator() # 구분자
menu_file.add_command(label = "Exit" , command=root.quit)
menuv.add_cascade(label="File", menu=menu_file)
#Edit 메뉴 (빈값 , 두번째 대메뉴)
menuv.add_cascade(label="Edit")
#Language 메뉴 추가 (radio 버튼을 통해서 택1)
menu_lang = Menu(menuv,tearoff=0)
menu_lang.add_radiobutton(label = "Python")
menu_lang.add_radiobutton(label = "Java")
menu_lang.add_radiobutton(label = "C++")
menuv.add_cascade(label = "Language" , menu=menu_lang)
# View 메뉴 추가 (체크박스를 통해서 : 다중 선택 )
menu_view = Menu(menuv,tearoff=0)
menu_view.add_checkbutton(label="Show1 Minimap")
menu_view.add_checkbutton(label="Show2 Minimap")
menu_view.add_checkbutton(label="Show3 Minimap")
menuv.add_cascade(label="View" , menu=menu_view)
root.config(menu=menuv) # 14줄의 메뉴를 넣는다.
root.mainloop()
11. 위젯 - 메세지박스 (alert)
코드
import tkinter.messagebox as msgbox
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
#기차 예매 시스템으로 가정
def info():
msgbox.showinfo("알림","정상적으로 예매 완료되었습니다.")
def warn():
msgbox.showwarning("경고","해당 좌석은 매진 되었습니다.")
def error():
msgbox.showerror("에러","결제오류가 발생했습니다.")
def okcancel():
msgbox.askokcancel("확인/취소","해당 좌석은 유아동반석입니다. 예매하시겠습니까?")
def retrycancel():
response = msgbox.askretrycancel("재시도/취소","일시적인 오류입니다. 다시 시도하시겠습니까?")
if response == 1: # True : 1
print("재시도")
elif response == 0 : # False : 0
print("취소")
def yesno():
msgbox.askyesno("예/아니오","해당 좌석은 역방향 입니다. 예매하시겠습니까?")
#예 / 아니오 / 취소
def yesnocancel():
response = msgbox.askyesnocancel(title=None, message="예매 내역이 저장되지 않았습니다. \n 저장 하신 후 프로그램을 종료 하시겠습니까? ")
#네 : 저장 후 종료
#아니오 : 저장 하지 않고 종료
#취소 : 프로그램 종료 취소(현재 화면에서 계속 작업)
print("응답:",response) #True , False , None -> 예 1, 아니오 그외 취소
if response == 1:
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()
12. 위젯 - 프레임
코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
Label(root, text="메뉴를 선택해 주세요").pack(side="top" , pady=10)
Button(root, text="주문하기").pack(side="bottom" , pady=10)
#버거 메뉴 프레임
frame_burger = Frame(root, relief="solid" , bd=1) # relief=테두리 모양, bd : 외곽선 보더
frame_burger.pack(side="left", fill="both" , expand=True) #fill : 위아래로 꽉 채움, expand : 양옆으로 꽉채움
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()
13. 위젯 - 스크롤바
코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
frame = Frame(root)
frame.pack()
scrollbar = Scrollbar(frame)
scrollbar.pack(side="right" , fill="y") #fill=y : 위아래로 꽉 채움
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")
scrollbar.config(command=listbox.yview) #스크롤바에 리스트박스 매핑
root.mainloop()
# 위젯 - 그리드
기초코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
btn1 = Button(root, text="버튼1")
btn2 = Button(root, text="버튼2")
##기본
# btn1.pack()
# btn2.pack()
# #배치 side를 사용한 배치는 쌓는 느낌
# btn1.pack(side="left")
# btn2.pack(side="right")
btn1.grid(row=0,column=0)
btn2.grid(row=1,column=1)
root.mainloop()
# 위젯 - 그리드
배치 코드
from tkinter import *
root = Tk()
root.title("파이썬 GUI")
root.geometry("640x480")
#계산기 키보드 구성
btn_f16 = Button(root, text="F16")
btn_f17 = Button(root, text="F17")
btn_f18 = Button(root, text="F18")
btn_f19 = Button(root, text="F19")
btn_f16.grid(row=0, column=0)
btn_f17.grid(row=0, column=1)
btn_f18.grid(row=0, column=2)
btn_f19.grid(row=0, column=3)
#clear 줄 (두번째 줄)
btn_clear = Button(root, text="clear")
btn_equal = Button(root, text="=")
btn_div = Button(root, text="/")
btn_mul = Button(root, text="*")
btn_clear.grid(row=1, column=0)
btn_equal.grid(row=1, column=1)
btn_div.grid(row=1, column=2)
btn_mul.grid(row=1, column=3)
# 7시작줄 세번째 줄
btn_7 = Button(root, text="7")
btn_8 = Button(root, text="8")
btn_9 = Button(root, text="9")
btn_sub = Button(root, text="-")
btn_7.grid(row=2, column=0)
btn_8.grid(row=2, column=1)
btn_9.grid(row=2, column=2)
btn_sub.grid(row=2, column=3)
# 4시작줄 네번째 줄
btn_4 = Button(root, text="4")
btn_5 = Button(root, text="5")
btn_6 = Button(root, text="6")
btn_add = Button(root, text="+")
btn_4.grid(row=3, column=0)
btn_5.grid(row=3, column=1)
btn_6.grid(row=3, column=2)
btn_add.grid(row=3, column=3)
# 1시작줄 다섯번째 줄
btn_1 = Button(root, text="1")
btn_2 = Button(root, text="2")
btn_3 = Button(root, text="3")
btn_enter = Button(root, text="enter") #세로로 합쳐짐
btn_1.grid(row=4, column=0)
btn_2.grid(row=4, column=1)
btn_3.grid(row=4, column=2)
btn_enter.grid(row=4, column=3 , rowspan=2) #현재 위치로부터 아래쪽으로 더함
# 0시작줄 다섯번째 줄
btn_0 = Button(root, text="0") #가로로 합쳐짐
btn_dot = Button(root, text=".")
btn_0.grid(row=5, column=0 , columnspan=2) #현재 위치로부터 아래쪽으로 더함
btn_dot.grid(row=5, column=2)
root.mainloop()
#메모장 기본
from tkinter import *
root = Tk()
root.title("nado gui")
root.geometry("640x480") #가로 세로, 소문자x 를 써야 됨. X,* 쓰면 오류남
def open():
pass
def save():
pass
menuv = Menu(root)
#파일
#대메뉴>중메뉴 설정
menu_file = Menu(menuv, tearoff=0)
menu_file.add_command(label="열기" , command=open)
menu_file.add_command(label="저장" , command=save)
menu_file.add_separator() # 구분자
menu_file.add_command(label="끝내기" , command=root.quit)
menuv.add_cascade(label="파일", menu=menu_file) #대메뉴 명
menuv.add_cascade(label="편집") #대메뉴만
menuv.add_cascade(label="서식") #대메뉴만
menuv.add_cascade(label="보기") #대메뉴만
menuv.add_cascade(label="도움말") #대메뉴만
#스크롤바
scrollbar = Scrollbar(root)
scrollbar.pack(side="right" , fill="y") #fill=y : 위아래로 꽉 채움
#본문 영역
txt = Text(root , yscrollcommand=scrollbar.set)
txt.pack(side="left" , fill="both" , expand=True)
scrollbar.config(command=txt.yview) #스크롤바에 리스트박스 매핑
root.config(menu=menuv) # 14줄의 메뉴를 넣는다.
root.mainloop() # 창이 닫히지 않도록
#메모장 기능 추가
완성코드
import os # 파일 처리시 필요
from tkinter import *
root = Tk()
root.title("제목없음 - Window메모장")
root.geometry("640x480") #가로 세로, 소문자x 를 써야 됨. X,* 쓰면 오류남
#열기, 저장 파일 이름
filename = "mynote.txt"
def open_file():
if os.path.isfile(filename): #있으면 True , 없으면 False
with open(filename, "r" , encoding="utf-8") as file:
txt.delete("1.0", END) #텍스트 위젯 본문 삭제
txt.insert(END, file.read()) # 파일 내용을 본문에 입력
def save_file():
with open(filename, "w" , encoding="utf-8") as file:
file.write(txt.get("1.0", END)) # 모든 내용을 가져와서 저장
menuv = Menu(root)
#파일
#대메뉴>중메뉴 설정
menu_file = Menu(menuv, tearoff=0)
menu_file.add_command(label="열기" , command=open_file)
menu_file.add_command(label="저장" , command=save_file)
menu_file.add_separator() # 구분자
menu_file.add_command(label="끝내기" , command=root.quit)
menuv.add_cascade(label="파일", menu=menu_file) #대메뉴 명
menuv.add_cascade(label="편집") #대메뉴만
menuv.add_cascade(label="서식") #대메뉴만
menuv.add_cascade(label="보기") #대메뉴만
menuv.add_cascade(label="도움말") #대메뉴만
#스크롤바
scrollbar = Scrollbar(root)
scrollbar.pack(side="right" , fill="y") #fill=y : 위아래로 꽉 채움
#본문 영역
txt = Text(root , yscrollcommand=scrollbar.set)
txt.pack(side="left" , fill="both" , expand=True)
scrollbar.config(command=txt.yview) #스크롤바에 리스트박스 매핑
root.config(menu=menuv) # 14줄의 메뉴를 넣는다.
root.mainloop() # 창이 닫히지 않도록
width 참고 wikidocs.net/26
블로그에는 우클릭 방지가 걸려있어요. 코드복사는 카페에서 가능 합니다.
파이썬 기초는 나도코딩님이 인프런사이트에서 강의한 내용을 바탕으로 공부한 내용을 정리한 것 입니다.
추천 : ★★★★★
'코딩(개발) > 파이썬' 카테고리의 다른 글
파이썬 이미지 합치기 프로젝트 (0) | 2020.12.30 |
---|---|
파이썬 오토스크린 샷 (0) | 2020.12.30 |
파이썬 게임 2 (0) | 2020.12.27 |
파이썬 똥 피하기 게임 (0) | 2020.12.25 |
파이썬 게임 만들기 (0) | 2020.12.24 |
댓글