나를 기록하다
article thumbnail
반응형

1. 기본 프레임

기본 프레임

 

from tkinter import *

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로
# root.geometry("640x480+300+100")  # 가로 * 세로 + x 좌표 + y 좌료

root.resizable(True, False)  # x(너비), y(너비) 값 변경 불가 (창 크기 변경 불가)

root.mainloop()

tkinter라는 라이브러리를 사용하고 창 이름, 창 크기, 창 사이즈 조절 기능 등을 설정한다.

 

 

 

2. 버튼

버튼 동작

 

from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO GUI")

btn1 = Button(root, text="버튼1")
btn1.pack()

# padx, pady : 여백 / width, height : 고정된 크기
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="/Users/prao/Desktop/DEV.PRAO/pythonworkspace/gui_basic/img.png")
btn6 = Button(root, image=photo)
btn6.pack()


def btncmd():
    print("버튼이 클릭되었어요")


btn7 = Button(root, text="동작하는 버튼", command=btncmd)
btn7.pack()

root.mainloop()

여러가지 종류의 버튼을 만든다. macos의 경우 pip3 install tkmacosx 를 통해 tkmacosx를 설치하고 Button을 import 해주어야 bg(버튼 배경)이 설정이 가능하다.

 

 

 

3. 레이블

레이블 설정
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")

label1 = Label(root, text="안녕하세요")
label1.pack()

photo = PhotoImage(file="/Users/prao/Desktop/DEV.PRAO/pythonworkspace/gui_basic/img.png")
label2 = Label(root, image=photo)
label2.pack()


def change():
    label1.config(text="또 만나요")

    global photo2
    photo2 = PhotoImage(file="/Users/prao/Desktop/DEV.PRAO/pythonworkspace/gui_basic/img2.png")
    label2.config(image=photo2)


btn = Button(root, text="클릭", command=change)
btn.pack()

root.mainloop()
가비지 컬렉션(garbage collection)이 존재하기 때문에 지역변수에서 global을 기입하여 전역변수로 선언하지 않으면 photo2에 저장한 이미지가 나오지 않는다.

따라서 photo2에 저장한 x 이미지를 사용하기 위해 photo2를 global로 전역변수 선언을 해준다.

  • 가비지 컬렉션이란?

    가비지 컬렉션은 프로그래밍 언어에서 사용되는 메모리 관리 기법 중 하나입니다.

    프로그램이 동적으로 메모리를 할당할 때, 이 할당된 메모리를 언제 해제할지에 대한 문제가 있습니다. 일부 프로그래밍 언어에서는 개발자가 직접 메모리를 할당하고 해제하는 작업을 수행해야 합니다. 하지만 가비지 컬렉션을 지원하는 언어에서는 프로그램 실행 도중에 사용되지 않는 메모리를 자동으로 해제하는 기능을 제공합니다.

    가비지 컬렉션은 프로그램이 실행되는 동안, 사용되지 않는 메모리를 찾아서 해제합니다. 이러한 과정에서, 더 이상 참조되지 않는 객체를 "가비지"라고 부릅니다. 가비지 컬렉션은 이러한 가비지 객체를 검사하여, 해당 객체가 더 이상 사용되지 않는지 여부를 판단하고 메모리를 해제합니다.

    가비지 컬렉션은 프로그래머가 일일이 메모리를 관리하지 않아도 되므로, 프로그래밍 작업을 단순화하고 버그 발생 가능성을 줄일 수 있습니다. 하지만 가비지 컬렉션의 작동 방식에 따라 프로그램 실행 속도가 느려지는 등의 부작용이 있을 수 있습니다. 따라서, 언어와 애플리케이션의 특성에 맞는 가비지 컬렉션 방식을 선택하는 것이 중요합니다.

 

 

 

4. 텍스트 & 엔트리

텍스트와 엔트리 설정
 
 
 
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로

txt = Text(root, width=30,height=5)     # Text는 여러줄 입력 가능 (Enter 사용 가능)
txt.pack()

txt.insert(END, "글자를 입력하세요")

e = Entry(root, width=30)               # Entry는 한줄 입력 가능 (Enter 사용 불가)
e.pack()
e.insert(0, "한 줄만 입력해요")

def btncmd():
    # 내용 출력
    print(txt.get("1.0", END)) # 1.0 -> 1 : 첫번째 라인부터 / 0 : 컬럼기준 0번째부터(맨 왼쪽부터)
    print(e.get())

    # 내용 삭제
    txt.delete("1.0", END)
    e.delete(0,END)


btn = Button(root,text="클릭",command=btncmd)
btn.pack()

root.mainloop()

텍스트로 창을 열면 글자가 적혀져 있게 구현하였다.

여러 줄을 입력 받을 때는 Text, 한 줄만 입력 받을 때는 Entry를 사용한다.

내용을 입력하고 버튼을 누르면 내용 출력과 함께 텍스트와 엔트리칸이 비워지게 구현했다.

 

 

 

5. 리스트 박스

리스트 박스 생성
 
 
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로

listbox = Listbox(root, selectmode="extended", height=0) # single : 하나만 선택 가능, extended : 여러 개 선택 가능
# 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 : 맨 뒤에 항목 삭제, 0 : 맨 앞 항목 삭제

    # 개수 확인
    # print("리스트에는 ", listbox.size(), "개가 있어요")

    # 항목 확인 get(시작 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()
# 결과
선택된 항목 :  (1, 2, 3)
선택된 항목 :  (3, 4)
선택된 항목 :  (0, 4)
선택된 항목 :  (2,)
선택된 항목 :  (0, 1, 2, 3, 4)

listbox를 활용하여 selectmode, height 설정, btncmd 함수를 선언하고 함수의 기능으로

삭제 - listbox.delete(), 개수 확인 - listbox.size(),

항목 확인 - listbox.get(), 선택 항목 확인 - listbox.curselection() 등을 사용했다.

 

 

 

6. 체크 버튼

체크 버튼 생성, 확인
 
 
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO 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()

체크박스를 만들고 기본값 설정, 그리고 버튼을 누르면 체크되었을 때 1 반환, 되지 않았을 때 0을 반환하도록 구현했다.

  • 작성하다가 중간에 궁금해진 Checkbutton(root, …) 에서 root의 역할

    Python에서 GUI(Graphical User Interface) 프로그래밍을 할 때, root는 주요한 역할을 합니다.

    root는 일반적으로 Tkinter 라이브러리에서 사용되는 최상위 윈도우(Toplevel Window) 객체를 의미합니다. 이 최상위 윈도우 객체는 프로그램의 메인 창이 되며, 다른 위젯(버튼, 라벨, 체크박스 등)들을 포함하는 부모 위젯 역할도 수행합니다.

    Tkinter에서 GUI 프로그램을 만들 때, 일반적으로 다음과 같은 단계를 거칩니다.

    1. Tkinter 라이브러리를 import 합니다.
    1. 최상위 윈도우 객체를 생성합니다.
    1. 다른 위젯들을 생성하고 최상위 윈도우 객체에 추가합니다.
    1. mainloop() 메소드를 호출하여 이벤트 루프를 실행합니다.

    따라서, "chkbox = Checkbutton(root, text="오늘 하루 보지 않기", variable=chkvar)" 코드에서 root는 최상위 윈도우 객체를 의미합니다. 체크박스 위젯을 생성하고 최상위 윈도우 객체에 추가하기 위해 root를 인자로 전달하고 있습니다. 이 코드는 "오늘 하루 보지 않기"라는 텍스트와 chkvar라는 변수와 연동된 체크박스 위젯을 생성하고, 최상위 윈도우 객체에 추가하는 역할을 합니다.

 

 

 

7. 라디오 버튼

라디오 버튼 구현
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO 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_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())  # 음료 중 선택된 라디오 항목의 값(value)을 출력


btn = Button(root, text="주문", command=btncmd)
btn.pack()

root.mainloop()
# 결과
1
콜라
3
환타
2
사이다
3
사이다
3
콜라

각각의 라디오 버튼을 생성하였다. value 값 설정을 통해 반환되는 값을 설정할 수 있고 위의 Label로 바로 선언하고 pack을 하면 코드를 간결하게 할 수 있으나 label1 = ~ 로 설정한 것과 다르게 값을 변경할 수는 없다.

 

 

 

8. 콤보 박스

콤보 박스 생성 및 설정
 
 
import tkinter.ttk as ttk
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로



values = [str(i) + "일" for i in range(1,32)] # 1 부터 31 까지의 숫자
combobox = ttk.Combobox(root, height=5,values= values, state="readonly")
# 읽기 전용 설정
combobox.pack()
combobox.set("카드 결제일") # 최초 목록 제목 설정 및 버튼 클릭을 통한 값 설정 가능



def btncmd():
    print(combobox.get())


btn = Button(root, text="주문", command=btncmd)
btn.pack()

root.mainloop()

콤보박스를 구현했다.

콤보박스는 import tkinter.ttk as ttk 와 같이 ttkimport 해야 구현이 가능하다.

set 을 통해서 최초 목록 제목 설정 및 버튼 클릭을 통한 값 설정이 가능하도록 했고,

버튼은 combobox.get으로 콤보박스에 고른 값을 반환하게 구현했다.

이대로만 구현하면 콤보박스에 마음대로 값을 기입할 수 있는데 이때 필요한 설정이 state = “readonly”로, 읽기 전용으로 변경하여 정해진 값 내에서 선택만 가능하게 한다.

 

 

 

9. 프로그래스 바

import time
import tkinter.ttk as ttk
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로

# # 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()
progressbar2 = ttk.Progressbar(root, maximum=100, length=150, variable=p_var2)
progressbar2.pack()


def btncmd2():
    for i in range(1, 101):
        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. 메뉴

메뉴 만들기
 
from tkinter import *
from tkmacosx import Button

root = Tk()
root.title("PRAO 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()
  • tearoff의 역할 Tkinter에서 메뉴 위젯(Menu Widget)은 기본적으로 "메뉴 항목"과 "하위 메뉴"를 포함할 수 있다. tearoff는 하위 메뉴의 메뉴 항목을 가져와 별도의 창에 띄우는 기능 tearoff 기능은 메뉴 항목을 클릭하면 해당 메뉴를 띄우는 것이 아니라, 해당 메뉴의 항목들을 담고 있는 별도의 창을 띄우게 되는데 이 기능은 사용자가 별도의 창에서 메뉴 항목을 선택할 수 있도록 해주는 역할을 한다. tearoff 옵션은 0 또는 1의 값을 가질 수 있는데 1일 경우 tearoff 기능이 활성화되어 별도의 창을 띄울 수 있고, 0일 경우 기능이 비활성화되어 별도의 창을 띄울 수 없다. 기본값은 1입니다.

 

  • menu.add_cascade(label="View", menu=menu_view) View 메뉴를 menu 위젯의 하위 메뉴로 추가

 

[Error] root.quit()을 설정했으나 Exit을 눌러도 창이 닫히지 않음

menu_file.add_command(label="Exit", command=root.quit())

찾아봐도 아직 이유를 모르겠다. 코드에 이상은 없어 보이는데 mac os와 window의 차이일지도 모른다는 생각이 든다.

 

 

11. 메시지 박스

메시지 박스 생성, 맥에서는 구현되지 않는 기능 존재
 
import tkinter.messagebox as msgbox
from tkinter import *
from tkmacosx import *

root = Tk()
root.title("PRAO 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)
    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()

mac os에서 표현되지 않는 기호들이 많다. 메세지 박스 버튼을 설정하고 함수에 텍스트를 넣어서 구현한다.

 

 

 

12. 프레임

프레임 분할 구현
from tkinter import *

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로

Label(root, text="메뉴를 선택해 주세요.").pack(side="top")

Button(root, text="주문하기").pack(side="bottom")

# 메뉴 프레임
frame_burger = Frame(root, relief="solid", bd=1)  # relief 테두리, bd 외곽선
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()

중간에 LabelFrame을 설정하였으나 보이지 않아서 당황하였는데, fillexpand 옵션을 설정하고 나니 제대로 구현이 가능했다.

 

13. 스크롤 바

스크롤바 생성
from tkinter import *

root = Tk()
root.title("PRAO 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()

스크롤바도 프레임에 넣어서 구현한다. fill=”y”로 채워줘야 보는 것처럼 스크롤바가 꽉 채워지고 yscrollcommand 옵션을 통해 set을 해야 list와 함께 위아래로 움직인다.

 

 

 

14. 그리드 기본

그리드를 활용한 계산기 만들기 - 기본
from tkinter import *

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로

btn1 = Button(root, text="버튼1")
btn2 = Button(root, text="버튼2")

# pack은 쌓는 느낌, grid는 좌표에 넣는 느낌
# btn1.pack()
# btn2.pack()

# btn1.pack(side="left")
# btn2.pack(side="right")

# btn1.grid(row=0,column=0)
# btn2.grid(row=1,column=1)

# 1st line
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)

# 2nd line
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)

# 3rd line
btn_seven = Button(root, text="7")
btn_eight = Button(root, text="8")
btn_nine = Button(root, text="9")
btn_minus = Button(root, text="-")

btn_seven.grid(row=2, column=0)
btn_eight.grid(row=2, column=1)
btn_nine.grid(row=2, column=2)
btn_minus.grid(row=2, column=3)

# 4th line
btn_four = Button(root, text="4")
btn_five = Button(root, text="5")
btn_six = Button(root, text="6")
btn_plus = Button(root, text="+")

btn_four.grid(row=3, column=0)
btn_five.grid(row=3, column=1)
btn_six.grid(row=3, column=2)
btn_plus.grid(row=3, column=3)

# 5th line
btn_one = Button(root, text="1")
btn_two = Button(root, text="2")
btn_three = Button(root, text="3")
btn_enter = Button(root, text="enter")  # 세로로 합쳐짐

btn_one.grid(row=4, column=0)
btn_two.grid(row=4, column=1)
btn_three.grid(row=4, column=2)
btn_enter.grid(row=4, column=3, rowspan=2)  # 현재 위치로부터 아래쪽으로 더함

# 6th line
btn_zero = Button(root, text="0")  # 가로로 합쳐짐
btn_dot = Button(root, text=".")

btn_zero.grid(row=5, column=0, columnspan=2)  # 현재 위치로부터 오른쪽으로 더함
btn_dot.grid(row=5, column=1)

root.mainloop()

 

 

15. 그리드 심화

그리드의 각종 기능을 활용한 계산기 만들기 심화 버전
 

 

from tkinter import *

root = Tk()
root.title("PRAO GUI")
root.geometry("640x480")  # 가로 * 세로

btn1 = Button(root, text="버튼1")
btn2 = Button(root, text="버튼2")

# pack은 쌓는 느낌, grid는 좌표에 넣는 느낌
# btn1.pack()
# btn2.pack()

# btn1.pack(side="left")
# btn2.pack(side="right")

# btn1.grid(row=0,column=0)
# btn2.grid(row=1,column=1)

# 1st line
btn_f16 = Button(root, text="F16", width=5, height=2)
btn_f17 = Button(root, text="F17", width=5, height=2)
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)

# 2nd line
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)

# 3rd line
btn_seven = Button(root, text="7", width=5, height=2)
btn_eight = Button(root, text="8", width=5, height=2)
btn_nine = Button(root, text="9", width=5, height=2)
btn_minus = Button(root, text="-", width=5, height=2)

btn_seven.grid(row=2, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_eight.grid(row=2, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_nine.grid(row=2, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_minus.grid(row=2, column=3, sticky=N+E+W+S, padx=3, pady=3)

# 4th line
btn_four = Button(root, text="4", width=5, height=2)
btn_five = Button(root, text="5", width=5, height=2)
btn_six = Button(root, text="6", width=5, height=2)
btn_plus = Button(root, text="+", width=5, height=2)

btn_four.grid(row=3, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_five.grid(row=3, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_six.grid(row=3, column=2, sticky=N+E+W+S, padx=3, pady=3)
btn_plus.grid(row=3, column=3, sticky=N+E+W+S, padx=3, pady=3)

# 5th line
btn_one = Button(root, text="1", width=5, height=2)
btn_two = Button(root, text="2", width=5, height=2)
btn_three = Button(root, text="3", width=5, height=2)
btn_enter = Button(root, text="enter", width=5, height=2)  # 세로로 합쳐짐

btn_one.grid(row=4, column=0, sticky=N+E+W+S, padx=3, pady=3)
btn_two.grid(row=4, column=1, sticky=N+E+W+S, padx=3, pady=3)
btn_three.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)  # 현재 위치로부터 아래쪽으로 더함

# 6th line
btn_zero = Button(root, text="0", width=5, height=2)  # 가로로 합쳐짐
btn_dot = Button(root, text=".", width=5, height=2)

btn_zero.grid(row=5, column=0, columnspan=2, sticky=N+E+W+S, padx=3, pady=3)  # 현재 위치로부터 오른쪽으로 더함
btn_dot.grid(row=5, column=2, sticky=N+E+W+S, padx=3, pady=3)

root.mainloop()

이 작업을 하면 하나씩 수정하려면 한세월이 걸린다.

  • 윈도우 : ctrl + F를 눌러서 원하는 단어를 찾아 ctrl + R로 변경
  • MAC : cmd + shift + R 로 원하는 단어를 찾고 바꿀 단어를 넣어 Replace All을 눌러 변경

 

  • padx, pady는 여백을 주는 개념으로 정확한 너비와 높이를 지정하는 것이 아니기에 오차가 발생할 수 있다.따라서 정확하게 너비와 높이를 지정하고 싶으면 widthheight를 지정하자.
  • sticky=N+E+W+S는 버튼을 동서남북으로 꽉 채우는 기능인데 원하는 방향만 설정하면 그 방향으로만 늘어난다.
  • enterzero의 경우 두 칸을 차지한다. 이 경우엔 rowspan이나 columnspan으로 칸수를 지정하면 각각 오른쪽으로, 아래쪽으로 합쳐진다.

 

 

 

 

 

 

 

 

반응형
profile

나를 기록하다

@prao

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...