내배캠 (22.04~22.08)

계산기 with Tkinter

yubi5050 2022. 4. 14. 11:49

현실에서 사용되는 계산기와 같은 모습의 계산기 만들기

 

1. 기능

  • '+', '-', '*',' /' 등 의 연산 기능과 'C' (Clear), '=' 등의 부가 기능. 
  • 다음 순서의 버튼 누르기 가능
    • '105'  →  '+'  →  '30'  →  '-'  →  70  →  '*'  →  '2'  →  '/'   →  '='  : 26 

2. 코드

import tkinter as tk

input_value, post_value = 0, 0 # 첫번째 숫자, 두번째 숫자 
operator_pre = 0 # '+', '-', '*', '/' : 계산할 연산자 기억용.
operator = {'+':1, '-':2, '/':3, '*':4, 'C':5, '=':6}

### 0~9 숫자
def number_click(value): # value 누른 숫자
    global input_value  # 기존 숫자
    input_value = (input_value*10) + value # 숫자 클릭시 10의 자리씩 이동한다.
    str_value.set(input_value)          
    
### C 버튼 - Clear할때
def clear():
    global input_value, post_value, operator_pre
    input_value, post_value, operator_pre = 0, 0, 0
    str_value.set(str(input_value)) # 화면을 지운다.

### + ~ = 연산자를 클릭했을때
def oprator_click(value):
    global input_value, operator, post_value, operator_pre
    
    #value의 값에 따라 숫자로 연산자를 변경한다.(+는 1로, -는 2로..)
    op = operator[value] 
    if op == 5:
        clear()
    elif op == 6: #'=' 
        if operator_pre == 1: # +
            post_value = post_value + input_value
        if operator_pre == 2: # -
            post_value = post_value - input_value
        if operator_pre == 3: # /
            post_value = post_value / input_value
        if operator_pre == 4: # *
            post_value = post_value * input_value
        str_value.set(str(post_value)) # 최종 결과 값 출력
        input_value, operator_pre = 0, 0 

    # elif input_value == 0:      #현재 화면에 출력된 값이 0일때
    #     operator_pre = 0

    # 두가지 경우 => 새로 연산 시작, 기존 값에서 이어서 연산하는 경우
    elif operator_pre == 0: # 계산이 끝난 후 연산자가 0
        operator_pre = op # 현재 눌린 연산자
        if post_value == 0: # ex) 23+
            post_value = input_value # 현재까지의 숫자를 적립
            input_value = 0 
            str_value.set(str(input_value))
        else: # ex) +34
            str_value.set(str(0))
            pass
    else:
        clear()

def button_click(value):
    try: # 정수 여부 확인
        value = int(value)       
        number_click(value)
    except: # 연산자
        oprator_click(value)

win = tk.Tk()
win.title('계산시')

str_value = tk.StringVar()
str_value.set(str(input_value))
dis = tk.Entry(win, textvariable=str_value, justify='right', bg = 'white',fg='red')
dis.grid(column=0, row=0, columnspan=4, ipadx=80, ipady=30)

calItem = [['1','2','3','4'],
           ['5', '6', '7', '8'],
           ['9', '0', '+', '-'],
           ['/', '*', 'C', '=']]

# 계산기 UI + 버튼 COMMAND 등록
for i,items in enumerate(calItem): # items : list
    for k,item in enumerate(items):
        try:
            color = int(item)
            color = 'black'
        except:
            color = 'green'
        bt = tk.Button(win, text=item, width=10, height=5, bg=color, fg = 'white', 
                        command = lambda cmd=item: button_click(cmd))
        bt.grid(column=k, row=(i+1))

win.mainloop()