본문 바로가기
파이썬

파이썬 tkinter 패키지로 계산기 코드 작성 (짧은버전)

by ㈜㎹Ω∞ 2022. 7. 18.
728x90

저번에 만든 계산기는 조금 엉성하고, 코드 작성도 길었었는데, 이번에 공부하면서 짧고 쉬운 코드를 배웠습니다. 저번에 만든 코드보다 간편하지만 퀄리티는 훨씬 나아진 버전입니다.

 

### 전체코드
import tkinter as tk
import tkinter.font as tkf

window=tk.Tk()
window.title("계산기")
window.resizable(False,False)
font=tkf.Font(family="맑은고딕",size=20)

###함수
def button_click(digit):
    if digit == "←":
        input_entry.delete(len(input_entry.get())-1)
    else:
        input_entry.insert(tk.END,digit)

def button_del():
    input_entry.delete(0,tk.END)
    resul_label.config(text="")

def button_resul():
    try:
        resul=eval(input_entry.get())
    except:
        resul_label.config(text="계산오류")
    else:
        resul_label.config(text=resul)

digits=[
    ["1","2","3","+"],
    ["4","5","6","-"],
    ["7","8","9","*"],
    [".","0","←","/"]
]

input_entry=tk.Entry(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
input_entry.grid(column=0,row=0,columnspan=4,sticky="news",padx=1,pady=1)

resul_label=tk.Label(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
resul_label.grid(column=0,row=1,columnspan=4,sticky="news",padx=1,pady=1)

for a in range(4):
    for b in range(4):
        digit=digits[a][b]
        button=tk.Button(window,text=digit,font=font,bg="white")
        button.grid(row=a+2,column=b,sticky="news",padx=1,pady=1)
        button.config(command=lambda cmd=button.cget("text"):button_click(cmd))

clear_button=tk.Button(window,text="C",font=font,command=button_del)
clear_button.grid(column=0,row=6,columnspan=2,sticky="news",padx=1,pady=1)

resul_button=tk.Button(window,text="=",font=font,command=button_resul)
resul_button.grid(column=2,row=6,columnspan=2,sticky="news",padx=1,pady=1)

window.mainloop()

 

전체 코드인데 나눠서 설명해보겠습니다.

 

import tkinter as tk
import tkinter.font as tkf

window=tk.Tk()
window.title("계산기")
window.resizable(False,False)
font=tkf.Font(family="맑은고딕",size=20)

 

  1. tkinter와 tkinter.font를 불러줍니다.
  2. tk모듈의 Tk클래스로 window객체를 만듭니다.
  3. title을 정해주고, resizable(False,False)를 써서 창 크기를 고정해줍니다.
  4. tkf모듈의 Font클래스를 사용해서 폰트를 정해줍니다. 글꼴은 맑은 고딕으로, 크기는 20으로 설정했습니다.

 

digits=[
    ["1","2","3","+"],
    ["4","5","6","-"],
    ["7","8","9","*"],
    [".","0","←","/"]
]

input_entry=tk.Entry(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
input_entry.grid(column=0,row=0,columnspan=4,sticky="news",padx=1,pady=1)

resul_label=tk.Label(window,width=30,font=("맑은고딕",30),bg="white",justify=tk.RIGHT)
resul_label.grid(column=0,row=1,columnspan=4,sticky="news",padx=1,pady=1)

 

  • 저번에는 버튼을 하나씩 전부 만들었었지만, 이번에는 digits[]를 사용해서 간단하게 만들어보겠습니다. 일단 원하는 모양대로 숫자와 기호를 작성합니다.
  • 전부지우는C버튼과 결과를 나타내는 = 버튼은 따로 만들어줍니다.
  • input_entry= 내가 누른 값이 나타나고, resul_laber=결과값이 나타납니다.
  • input_entry은 맨 위에 배치할 거니 column, row는 0으로 설정해주고, 가로방향으로 4칸, 모든 방향으로 늘려줍니다. 간격은 x, y 1씩 띄웁니다. 또한 폰트는 아까 작성한 font를 설정하고 배경색은 흰색으로 합니다. tk.RIGHT를 사용해서 오른쪽에 배치합니다.
  • resul_label은 다 똑같고 바로 밑에 배치시킬 거니, row만 1로 변경합니다.
  • 참고로 입력값은 Entry를 사용해서 키보드로 숫자를 입력할 수도 있습니다.

 

for a in range(4):
    for b in range(4):
        digit=digits[a][b]
        button=tk.Button(window,text=digit,font=font,bg="white")
        button.grid(row=a+2,column=b,sticky="news",padx=1,pady=1)
        button.config(command=lambda cmd=button.cget("text"):button_click(cmd))

clear_button=tk.Button(window,text="C",font=font,command=button_del)
clear_button.grid(column=0,row=6,columnspan=2,sticky="news",padx=1,pady=1)

resul_button=tk.Button(window,text="=",font=font,command=button_resul)
resul_button.grid(column=2,row=6,columnspan=2,sticky="news",padx=1,pady=1)

window.mainloop()

 

이제 for문을 사용해서 digits에서 만든 배열을 깔끔하게 나타내고, 실행하는 함수를 넣겠습니다.

 

  1. 처음 for문의 a는 row입니다. 4행이니 range(4)를 입력합니다.
  2. 두 번째 for문의 b는 column입니다. 4열이니 range(4)를 입력합니다.
  3. digit에는 digits에 있는 숫자들이 담깁니다.
  4. Button을 사용해서 버튼을 설정합니다. text는 digit으로 설정하고, 폰트는 아까 설정한 폰트, 배경색은 흰색으로 설정합니다.
  5. 버튼 위치를 정해야 되는데, row는 1행까지는 정했으니 2행부터 시작해야 됩니다. 그래서 row=a+2라고 적고, column은 b라고 정합니다. 또한 모든 방향으로 늘려주고, x, y간격을 1씩 띄웁니다.
  6. button.config(command=lambda cmd=button.cget("text"):button_click(cmd)) = command로 lambda함수를 연결합니다. cmd=버튼 누른 값을 cget을 사용해서 값을 정해주고, 그 값을 cmd에 저장합니다. cmd에 저장된 값을  button_click(cmd)의 cmd부분에 넣어줍니다.(버튼을 클릭하면 button_click함수로 이동한다는 뜻)
  7. clear_button은 C버튼을 만드는 코드입니다. text="C"로 설정하고, command를 사용해서 button_del함수에 연결합니다.
  8. resul_button은 =버튼을 만드는 코드입니다. text="="로 설정하고, command를 사용해서 button_resul함수에 연결합니다.
  9. clear_button과 resul_button의 grid는 2칸씩 차지할 거라서 columnspan=2라고 작성하고, 각각 column은 0과 2로 설정합니다.
  10. 마지막 window.mainloop() 작성하면 완료.

 

 

###함수
def button_click(digit):
    if digit == "←":
        input_entry.delete(len(input_entry.get())-1)
    else:
        input_entry.insert(tk.END,digit)

def button_del():
    input_entry.delete(0,tk.END)
    resul_label.config(text="")

def button_resul():
    try:
        resul=eval(input_entry.get())
    except:
        resul_label.config(text="계산오류")
    else:
        resul_label.config(text=resul)

 

def button_click

  1. 첫 번째 함수인 button_click은 ←버튼을 실행하는 함수입니다. (잘못 입력했을 때 하나씩 지울 수 있는 버튼)
  2. if를 사용해서 digit값이 "←" 라면, input_entry(내가 누른 값)에서 delete(지웁니다.) len(input_entry.get())-1(내가 누른 값을 뒤에서부터 지웁니다.)
  3. else(아니라면) input_entry.insert(tk.END,digit) insert를 사용해서 추가해줍니다.(끝에서부터,digit값을)

def button_del

  1. 두 번째 함수인 button_del는 C버튼을 실행하는 함수입니다. (모든 걸 리셋시키는 버튼)
  2.  input_entry.delete(0,tk.END)를 사용해서 Input_entry(누른값)delete(지웁니다) 0,tk.END(0에서 끝까지)
  3. resul_label.config(text="")를 사용해서 resul_label(결과값)config(속성값)을 text=""으로 만듭니다.

def button_resul

  1. 세 번째 함수인 button_resul는 =버튼 클릭 시 실행하는 함수입니다. 만약 오류가 났다면 계산오류라는 문구를 표시합니다.
  2. try를 사용해서 실행할 함수를 설정합니다. eval을 사용하면 (input_entry.get)에 누른 값을 갖고 와서 계산한 뒤 그 값을 resul에 저장합니다.
  3. except : try가 아니라면 resul_label.config(결과값)에 text="결과오류"라는 문구를 나오게 합니다.
  4. else : try에 문제가 없다면 값을 출력합니다. resul_label.config(결과값)에 text=resul을 사용해서 입력값을 표시합니다.

 

확실히 저번에 만든 계산기보다 퀄리티가 좋은 것 같아요. 같은 계산기인데, 코드 작성도 짧아지고, 조금 더 편하게 만든 것 같습니다. 배우는 재미는 있지만.. 갈수록 어렵습니다..

728x90

댓글