반응형
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인 경우에 대해 더 생각해보기 -> 오류가 발생할 수 있나??
반응형