본문으로 바로가기

계산기 만들기

category TIL 2022. 8. 23. 18:28

잘 따라가며 완성은 했지만 중간에 내가 모르는 말과 이해하지 못하는 함수가 있었다 좀 더 배우고 다시 공부해야겠다.

import tkinter as tk

disValue = 0
operator = {'+' : 1, '-':2,'/':3,'*':4,'C':5,'=':6}
stovalue = 0
opPre = 0

def number_click(value):
    print('숫자', value)
    global disValue
    disValue = (disValue*10) +value
    str_value.set(disValue)

def clear():
    global disValue, operator, stovalue, opPre
    #global 안넣으면 지워도 전숫자 다시나타남 전역변수를 쓰겠다 하고 넣어줘야한다
    stoValue=0
    disValue=0
    disValue=0
    str_value.set(disValue)

def operator_click(value):
    #print('명령', value)
    global disValue, operator, stoValue, opPre
    #전에 뭘 눌렀는지 알아야 계산이 가능 변수가 필요
    op=operator[value]
    if op == 5 : # C
        clear()
    elif disValue==0:
        opPre =0
    elif opPre ==0:
        opPre = op #초기화를 여기 다시 넣어줌 조건은 없을때만 넣는다?
        stoValue=disValue
        #더하기 눌렀을때 원래쓰던값 저장하고 0으로 초기화해서 새 값 넣을 수 있게
        disValue=0
        str_value.set(str(disValue))
    elif op==6: #'=
        if opPre ==1:
            disValue = stoValue+disValue
        if opPre == 2:
            disValue = stoValue - disValue
        if opPre ==3:
            disValue = stoValue / disValue
        if opPre == 4:
            disValue = stoValue * disValue
#결과에 값이 들어감 변수 초기화가 안돼서 그럼
        str_value.set(str(disValue))
        disValue=0
        stoValue=0
        opPre=0

    else:
        clear()

def button_click(value):
    print(value)
    try:
        value = int(value)
        number_click(value)
    except:
        operator_click(value)


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

# tk.Button(win, text='1',width=10, height=5).btn.grid(column=0, row=1) 해도 상관없다
# 값을 가져오고 유지한다?? 계산기숫자 나타내는 부분 columspan은 밑에 컬럼 갯수와 맞추는 거고(작아서)
# ipadx y 는 xy 값 조절

str_value = tk.StringVar()
str_value.set(str(disValue))
#set 해주면 변수의 값이 자동 업데이트 된다
dis = tk.Entry(win, textvariable=str_value, justify='right')
dis.grid(column=0, row=0, columnspan=4, ipadx=80, ipady=30)

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

for i, items in enumerate(calItem):
    for k, item in enumerate(items):

        # 오퍼레이터 색 바꾸는 꼼수
        try:
            color = int(item)
            color = 'skyblue'
        except:
            color = 'gray'

        bt = tk.Button(win,
                       text=item,
                       width=10,
                       height=5,
                       bg=color,
                       fg='black',
                       command=lambda cmd=item: button_click(cmd)
                       )
        bt.grid(column=k, row=(i + 1))

win.mainloop()