파이썬 GUI 프로그래밍 (여러 이미지 합치기 프로그램) 1 – 나도코딩
파이썬 코딩 무료 강의 (활용편2) – GUI 프로그래밍을 배우고 ‘여러 이미지 합치기’ 프로그램 [나도코딩] (youtube.com)
https://www.youtube.com/watch?v=bKPIcoou9N8
[나도코딩] 파이썬 활용편2 GUI 프로그래밍 – 소개
https://nadocoding.tistory.com/9
- 1_create_frame.py
- 2_button.py
- 3_label.py
- 4_text_entry.py
- 5_listbox.py
- 6_checkbox.py
- 7_radiobutton.py
- 8_combobox.py
- 9_progressbar.py
- 10_menu.py
- 11_messagebox.py
- 12_frame.py
- 13_scrollbar.py
- 14_grid.py
- 15_quiz.py
1_create_frame.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
#root.geometry("640x480+300+100") # 가로 * 세로 + x좌표 + y좌표
root.resizable(True, False) # x(너비), y(높이) 값 변경 불가 (창 크기 변경 불가)
root.mainloop()
2_button.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
btn1 = Button(root, text="버튼1")
btn1.pack()
btn2 = Button(root, padx=5, pady=10, text="버튼2")
btn2.pack()
btn3 = Button(root, padx=10, pady=5, text="버튼3")
btn3.pack()
btn4 = Button(root, width=10, height=3, text="버튼4")
btn4.pack()
btn5 = Button(root, fg="red", bg="yellow", text="버튼5")
btn5.pack()
photo = PhotoImage(file="img.png")
btn6 = Button(root, image=photo)
btn6.pack()
def btncmd():
print("버튼이 클릭되었어요")
btn7 = Button(root, text="동작하는 버튼", command=btncmd)
btn7.pack()
root.mainloop()
3_label.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480")
label1 = Label(root, text="안녕하세요")
label1.pack()
photo = PhotoImage(file="img.png")
label2 = Label(root, image=photo)
label2.pack()
def change():
label1.config(text="또 만나요")
# Garbage Collection : 불필요한 메모리 공간 해제
# 전역변수로 만들어야 해제되지 않음
global photo2
photo2 = PhotoImage(file="img2.png")
label2.config(image=photo2)
btn = Button(root, text="클릭", command=change)
btn.pack()
root.mainloop()
4_text_entry.py
from tkinter import *
root = Tk()
root.title("Nado 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 : 0번째 column 위치
print(e.get())
# 내용 삭제
txt.delete("1.0", END)
e.delete(0, END)
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
root.mainloop()
5. 5_listbox.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
listbox = Listbox(root, selectmode="extended", height=0) # height 0이면 모든 항목 보여주기
listbox.insert(0, "사과")
listbox.insert(1, "딸기")
listbox.insert(2, "바나나")
listbox.insert(END, "수박")
listbox.insert(END, "포도")
listbox.pack()
def btncmd():
# 삭제
#listbox.delete(0) # 맨 앞 항목을 삭제, END 는 마지막 항목 삭제
# 갯수 확인
#print("리스트에는", listbox.size(), "개가 있어요")
# 항목 확인 (시작 idx, 끝 idx)
#print("1번째부터 3번째까지의 항목 : ", listbox.get(0, 2))
# 선택된 항목 확인 (위치로 반환 (ex) (1, 2, 3) )
print("선택된 항목 : ", listbox.curselection())
btn = Button(root, text="클릭", command=btncmd)
btn.pack()
root.mainloop()
6. 6_checkbox.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
chkvar = IntVar() # chkvar 에 int 형으로 값을 저장한다
chkbox = Checkbutton(root, text="오늘 하루 보지 않기", variable=chkvar)
# 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. 7_radiobutton.py
from tkinter import *
root = Tk()
root.title("Nado 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()) # 햄버거 중 선택된 라디오 항목의 값(value)을 출력
print(drink_var.get()) # 음료 중 선택된 값을 출력
btn = Button(root, text="주문", command=btncmd)
btn.pack()
root.mainloop()
8. 8_combobox.py
import tkinter.ttk as ttk # 콤보 박스는 다른 파일에 존재
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
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=10, 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()
9_progressbar.py
import time
import tkinter.ttk as ttk
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
#progressbar = ttk.Progressbar(root, maximum=100, mode="indeterminate")
# progressbar = ttk.Progressbar(root, maximum=100, mode="determinate")
# progressbar.start(10) # 10 ms 마다 움직임
# progressbar.pack()
# def btncmd():
# progressbar.stop() # 작동 중지
# btn = Button(root, text="중지", command=btncmd)
# btn.pack()
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() # ui 업데이트
print(p_var2.get())
btn = Button(root, text="시작", command=btncmd2)
btn.pack()
root.mainloop()
10_menu.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
def create_new_file():
print("새 파일을 만듭니다.")
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="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")
# Language 메뉴 추가 (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="C++")
menu.add_cascade(label="Language", menu=menu_lang)
# View 메뉴
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()
11. 11_messagebox.py
import tkinter.messagebox as msgbox
from tkinter import *
root = Tk()
root.title("Nado 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: # 재시도
print("재시도")
elif response == 0: # 취소
print("취소")
def yesno():
msgbox.askyesno("예 / 아니오", "해당 좌석은 역방향입니다. 예매하시겠습니까?")
def yesnocancel():
response = msgbox.askyesnocancel(title=None, message="예매 내역이 저장되지 않았습니다.\n저장 후 프로그램을 종료하시겠습니까?")
# 네 : 저장 후 종료
# 아니오 : 저장 하지 않고 종료
# 취소 : 프로그램 종료 취소 (현재 화면에서 계속 작업)
print("응답:", response) # True, False, None -> 예 1, 아니오 0, 그 외
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()
12. 12_frame.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
Label(root, text="메뉴를 선택해 주세요").pack(side="top")
Button(root, text="주문하기").pack(side="bottom")
# 메뉴 프레임
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()
13. 13_scrollbar.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
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) + "일") # 1일, 2일, ...
listbox.pack(side="left")
scrollbar.config(command=listbox.yview)
root.mainloop()
14. 14_grid.py
from tkinter import *
root = Tk()
root.title("Nado GUI")
root.geometry("640x480") # 가로 * 세로
# btn1 = Button(root, text="버튼1")
# btn2 = Button(root, text="버튼2")
# # btn1.pack()
# # btn2.pack()
# # btn1.pack(side="left")
# # btn2.pack(side="left")
# btn1.grid(row=0, column=0)
# btn2.grid(row=1, column=1)
# 맨 윗줄
btn_f16 = Button(root, text="F16", width=5, height=2) # padx, pady 는 여백
btn_f17 = Button(root, text="F17", width=5, height=2) # width, height 는 크기
btn_f18 = Button(root, text="F18", width=5, height=2)
btn_f19 = Button(root, text="F19", width=5, height=2)
btn_f16.grid(row=0, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_f17.grid(row=0, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_f18.grid(row=0, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_f19.grid(row=0, column=3, sticky=N+E+W+S, padx=3, pady=3)
# clear 줄
btn_clear = Button(root, text="clear", width=5, height=2)
btn_equal = Button(root, text="=", width=5, height=2)
btn_div = Button(root, text="/", width=5, height=2)
btn_mul = Button(root, text="*", width=5, height=2)
btn_clear.grid(row=1, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_equal.grid(row=1, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_div.grid(row=1, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_mul.grid(row=1, column=3, sticky=N+E+W+S, padx=3, pady=3)
# 7 시작 줄
btn_7 = Button(root, text="7", width=5, height=2)
btn_8 = Button(root, text="8", width=5, height=2)
btn_9 = Button(root, text="9", width=5, height=2)
btn_sub = Button(root, text="-", width=5, height=2)
btn_7.grid(row=2, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_8.grid(row=2, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_9.grid(row=2, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_sub.grid(row=2, column=3, sticky=N+E+W+S, padx=3, pady=3)
# 4 시작 줄
btn_4 = Button(root, text="4", width=5, height=2)
btn_5 = Button(root, text="5", width=5, height=2)
btn_6 = Button(root, text="6", width=5, height=2)
btn_add = Button(root, text="+", width=5, height=2)
btn_4.grid(row=3, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_5.grid(row=3, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_6.grid(row=3, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_add.grid(row=3, column=3, sticky=N+E+W+S, padx=3, pady=3)
# 1 시작 줄
btn_1 = Button(root, text="1", width=5, height=2)
btn_2 = Button(root, text="2", width=5, height=2)
btn_3 = Button(root, text="3", width=5, height=2)
btn_enter = Button(root, text="enter", width=5, height=2) # 세로로 합쳐짐
btn_1.grid(row=4, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_2.grid(row=4, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_3.grid(row=4, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_enter.grid(row=4, column=3, rowspan=2, sticky=N+E+W+S, padx=3, pady=3) # 현재 위치로부터 아래쪽으로 몇 줄을 더함
# 0 시작 줄
btn_0 = Button(root, text="0", width=5, height=2) # 가로로 합쳐짐
btn_point = Button(root, text=".", width=5, height=2)
btn_0.grid(row=5, column=0, columnspan=2, sticky=N+E+W+S, padx=3, pady=3) # 현재 위치로부터 오른쪽으로 몇 칸 더함
btn_point.grid(row=5, column=2, sticky=N+E+W+S, padx=3, pady=3)
root.mainloop()
15. 15_quiz.py
import os
from tkinter import *
root = Tk()
root.title("제목 없음 - Windows 메모장")
root.geometry("640x480") # 가로 * 세로
# 열기, 저장 파일 이름
filename = "mynote.txt"
def open_file():
if os.path.isfile(filename): # 파일 있으면 True, 없으면 False
with open(filename, "r", encoding="utf8") as file:
txt.delete("1.0", END) # 텍스트 위젯 본문 삭제
txt.insert(END, file.read()) # 파일 내용을 본문에 입력
def save_file():
with open(filename, "w", encoding="utf8") as file:
file.write(txt.get("1.0", END)) # 모든 내용을 가져와서 저장
menu = Menu(root)
menu_file = Menu(menu, 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)
menu.add_cascade(label="파일", menu=menu_file)
# 편집, 서식, 보기, 도움말
menu.add_cascade(label="편집")
menu.add_cascade(label="서식")
menu.add_cascade(label="보기")
menu.add_cascade(label="도움말")
# 스크롤 바
scrollbar = Scrollbar(root)
scrollbar.pack(side="right", fill="y")
# 본문 영역
txt = Text(root, yscrollcommand=scrollbar.set)
txt.pack(side="left", fill="both", expand=True)
scrollbar.config(command=txt.yview)
root.config(menu=menu)
root.mainloop()