A ship in harbor is safe, but that is not what ships are built for.

개발일지/파이썬

계산기

플리피나리 2022. 8. 17. 03:32
반응형
import tkinter as tk

#연산자를 딕셔너리로 정의
operator = {'+': 1, '-': 2, '/': 3, '*': 4, 'C': 5, '=': 6}
#=를 입력받기 전 
preOp = 0
stValue = 0
initValue = 0

def button_click(value) :
    try :
        #정수로 변환 가능
        value = int(value)
        number_click(value)
    except :
        oprator_click(value)

#global : 전역변수를 사용하겠다는 선언
def number_click(value) :
    global initValue

    #숫자를 클릭할 때마다 10의 자리씩 이동
    initValue = (initValue*10)+value
    #창에 보여주기 위해 str_value 
    str_value.set(initValue
    )

def oprator_click(value) :
    global initValue, operator, stValue, preOp
    #연산자를 해당 숫자로 변환
    op = operator[value]

    if op==5 :
        clear()
    #현재 아무 숫자도 누르지 않고 연산자를 누르면 쓸모없음 -> 있으면 두번째 수로 0을 받을 때 오류발생
    #elif initValue == 0:      
    #    preOp = 0

    #연산자가 한번도 클릭되지 않았을 때
    elif preOp==0 :
        preOp = op #현재 누른 연산자 저장
        stValue = initValue #현재까지의 숫자 저장
        initValue = 0 #연산자 뒤 숫자를 받기 위해 초기화
        str_value.set(str(initValue)) #0으로 화면에 표시
    #=연산자 클릭 시
    elif op==6 :
        if preOp == 1 : #+연산
            initValue = stValue + initValue
        elif preOp == 2 : #-연산
            initValue = stValue - initValue
        elif preOp == 3 : #/연산
            initValue = stValue / initValue
        elif preOp == 4 : #*연산
            initValue = stValue * initValue

        str_value.set(str(initValue))
        initValue = 0
        stValue = 0
        preOp = 0
    else :
        clear()


        
def clear() :
    global initValue, stValue, preOp
    initValue = 0
    stValue = 0
    preOp = 0
    str_value.set(str(initValue))


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

#화면에 띄워서 텍스트 내용을 필요에 따라 바꿔야 할 때
#StringVar 타입의 변수 선언 -> 문자열 변수와 다름
str_value = tk.StringVar()
#초기에 보여질 값 0으로 세팅
str_value.set(str(initValue))

#columnspan or rowspan은 칸을 통합해서 사용해야 할 때
#ipadx, ipady : 위젯 경계선 안으로의 픽셀 패드 값
tk.Entry(window, textvariable=str_value, justify='right', bg='white', fg='red').grid(column=0, row=0, columnspan=4, ipadx=80, ipady=30)

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

#enumerate : 인덱스와 원소로 이루어진 tuple을 만들어주는 함수
#행을 하나씩 꺼내고
for i, items in enumerate(buttonItem) :
    #한 행의 열을 확인
    for k, item in enumerate(items) :
        try :
            #기호들은 에러로 except로 넘어갈 것
            color = int(item)
            color = 'black'
        except :
            color = 'green'
        #lambda : 함수에 여러 매개변수 전달
        #cmd=item 없이 lambda : button_click(item)해도 될 듯?
        tk.Button(window, text=item, width=10, height=5, bg=color, fg='white', command=lambda cmd=item: button_click(cmd)).grid(column=k, row=(i+1))


window.mainloop()

 

 

Problem )

1. 숫자 2개까지만 받을 수 있다. 일반 계산기로 동작하기 위한 코드 생각해보기

2. 중간에 연산자 입력 도중 initValue가 0인 경우에 대해 더 생각해보기 -> 오류가 발생할 수 있나??

반응형

'개발일지 > 파이썬' 카테고리의 다른 글

기억력 게임  (0) 2022.08.22
오락실 게임  (0) 2022.08.22