import tkinter as t
currValue = 0
# 사칙연산 명령을 처리하기 위해 딕셔너리 형태로 숫자 부여
operator = {'+': 1, '-': 2, '/': 3, '*': 4, 'C': 5, '=': 6}
storedValue = 0
previousOper = 0
# 버튼 클릭에 대한 변수 생성
def button_click(value):
# 숫자와 오퍼레이터 분리
try:
value = int(value)
number_click(value)
except:
operator_click(value)
def number_click(value):
global currValue # 전역변수를 선언.(밖에서 선언된 변수를 해당 함수 안에서도 사용하겠다.)
currValue = (currValue * 10) + value
str_value.set(currValue)
def operator_click(value):
global currValue, operator, storedValue, previousOper
# value에 +, - 등이 들어가면 숫자를 반환
op = operator[value]
if op == 5: # C를 누른 경우
clear()
elif currValue == 0: # 아무것도 눌리지 않은 경우, 값이 없을 때
previousOper = 0
elif previousOper == 0: # 이전 사칙연산 명령이 없고, 명령이 새로 눌렸을 때
previousOper = op
storedValue = currValue
currValue = 0
str_value.set(currValue) # 입력한 숫자를 저장하고, 현재 숫자를 0으로 초기화해서 명령을 누를 때는 0으로 보이게 해줌
elif op == 6: # =을 눌렀을 때
if previousOper == 1: # +를 눌렀을 때 연산 진행. 위의 저장된 값과 명령 이후 친 현재 값을 더함
currValue = storedValue + currValue
elif previousOper == 2: # -를 눌렀을 때 연산 진행. 위의 저장된 값과 명령 이후 친 현재 값을 뺌
currValue = storedValue + currValue
elif previousOper == 3: # /를 눌렀을 때 연산 진행. 위의 저장된 값과 명령 이후 친 현재 값을 나눔
currValue = storedValue + currValue
elif previousOper == 4: # *를 눌렀을 때 연산 진행. 위의 저장된 값과 명령 이후 친 현재 값을 곱함
currValue = storedValue + currValue
str_value.set(str(currValue))
currValue = 0
storedValue = 0
previousOper = 0
else:
clear()
def clear():
global currValue, storedValue, previousOper
currValue = 0
storedValue = 0
previousOper = 0
str_value.set(currValue)
cal = t.Tk()
cal.title("GUI 계산기")
str_value = t.StringVar()
str_value.set(str(currValue)) # currValue의 값을 문자로 변환
# set을 사용하게 되면 textvariable에 입력되어 있는 값이 자동으로 업뎃됨
curr = t.Entry(cal, textvariable=str_value, justify='right', bg='beige', fg='blue')
# 엔트리창 배경색과 폰트색
curr.grid(column=0, row=0, columnspan=4, ipadx=80, ipady=30)
# 계산기의 요소들을 2중 리스트로 표현
cal_item = [['1', '2', '3', '4'],
['5', '6', '7', '8'],
['9', '0', '+', '-'],
['/', '*', 'C', '=']]
for i, items in enumerate(cal_item): # i에는 index가, items에는 하나의 리스트가 들어감
for k, item in enumerate(items): # k에는 items에 받아온 리스트의 index가, item에는 리스트의 각 요소가 들어감
# 예외상황 처리를 응용하여 item의 요소 중 숫자인 것의 배경색은 검은색, 기호의 배경색은 녹색으로 변경
try:
color = int(item)
color = 'black'
except:
color = 'green'
btn = t.Button(cal,
text=item,
width=10,
height=5,
bg=color, # 계산기 배경 색
fg='white', # 계산기 폰트 색
# item을 cmd라는 변수에 넣고 button_click의 인자로 보내는 함수를 람다를 통해 생성
command=lambda cmd=item: button_click(cmd)
)
btn.grid(column=k, row=i + 1) # 칼럼은 0부터 시작이니 k로, 로우는 1부터 시작하므로 i+1
cal.mainloop()
실행결과입니다.
출처:https://velog.io/@nikevapormax/python-GUI-%EA%B3%84%EC%82%B0%EA%B8%B0#tkinter
찾던도중 너무 잘 분석해놓으시고 정리가 깔끔하게되어있어서 같은 지원자분 코드를 보고 도움을 많이 받았던거같습니다.
'frontend' 카테고리의 다른 글
기억력 테스트 게임, 침팬지를 이겨라 (0) | 2022.04.15 |
---|---|
[파이썬] 퍼즐 보블 (Puzzle Bobble) 게임 (0) | 2022.04.15 |
2022-04-14 (0) | 2022.04.14 |
2022-04-13 (0) | 2022.04.13 |
4주차 개발일지 (Week I learned) (0) | 2022.04.12 |