계산기 만들기 (4)
최종 완성된 코드는 아래와 같다.
from tkinter import *
from tkinter import ttk
operation = '' # 연산자 저장 변수
temp_number = 0 # 이전값 저장 변수
# 결과 출력 상태인지 상태저장.
answer_trigger = False
# 숫자버튼 처리 함수
def button_pressed(value):
global temp_number # 한번 계산후에, 다른숫자를 입력하면, 기존결과를 지우고, 새로 계산
global answer_trigger
# 입력값이 'AC'일때
if value=='AC':
number_entry.delete(0,'end')
# AC버튼 누르면, trigger 변수도 초기화.
operation = ''
answer_trigger = False
print("AC pressed")
else: # 그외에 0부터 9까지 숫자일때
# Trigger가 True이면, Entry 초기화후 새로입력.
if answer_trigger:
number_entry.delete(0,"end")
answer_trigger = False
number_entry.insert("end",value) #텍스트 창으로 숫자 전송.'end'는 오른쪽끝에 추가하라는 의미.
print(value,"pressed")
# 소수점으로 int형 변환시 에러가 날경우, float형으로 반환.
def float_filter(value):
try:
int(value)
return int(value)
except ValueError:
return float(value)
# 두값이 같으면 정수로 표현가능.==> 정수값으로 반환.
def int_changer(value):
if int(value) == float(value):
return int(value)
else:
return float(value)
# 사칙연산 처리
def math_button_pressed(value): # 사칙연산버튼(/*+-)은 math_button_pressed() 함수로 연결
global operation # 함수 바깥의 글로벌 변수사용
global temp_number
if not number_entry.get() == '': # 기존에 입력한 숫자가 있을때만 연산버튼 인식
operation = value
# float_filter 함수 호출.
temp_number = float_filter(number_entry.get())
number_entry.delete(0,'end') # 입력칸을 비우고, 다음숫자를 입력받을 준비.
print(temp_number,operation)
def equal_button_pressed(): # '='버튼은 equal_button_pressed() 함수로 연결
global operation
global temp_number
# 연산자나 숫자가 입력되지 않으면, 실행하지 않음.
if not (operation =='' and number_entry.get()==''):
number = int(number_entry.get())
if operation == '/':
solution = temp_number/number
elif operation == '*':
solution = temp_number*number
elif operation == '+':
solution = temp_number+number
else :
solution = temp_number-number
# int_changer() 함수를 한번 거쳐서, 값저장.
solution = int_changer(solution)
# 계산후, 숫자표시칸을 비우고, 계산결과를 표시.
number_entry.delete(0,'end')
number_entry.insert(0,solution)
print(temp_number,operation,number,"=",solution)
operation = ''
temp_number = 0
# 계산 완료후, Trigger 변수 True로 변경.
answer_trigger = True
# 키입력 함수
def key_input(value):
# 쉬프트키 입력 무시.(덧셈할때)
if not repr(value.char) == "''":
numbers = '1234567890'
operators = '/*+-'
# 숫자키 입력시, button_pressed()함수 호출.
if value.char in numbers :
button_pressed(value.char)
print(value.char)
# 연산자 입력시, math_button_pressed() 함수 호출.
elif value.char in operators :
math_button_pressed(value.char)
print(value.char)
# 엔터키 입력 -> =버튼
elif value.keysym == "Return":
equal_button_pressed()
print("equal button pressed")
# ESC 키 입력. -> AC 버튼 입력.
elif value.keysym == "Escape":
button_pressed('AC')
print('AC button pressed')
# BackSpace 입력시, 마지막 한글자 삭제.
elif value.keysym == "BackSpace":
number_entry.delete(len(number_entry.get())-1,'end')
print(number_entry)
root = Tk()
root.title("Calculator")
root.geometry("300x120")
# 키입력 binding - 입력되는 키 값(객체)을 key_input 이라는 함수로 넘겨주라는 의미
root.bind('<Key>',key_input)
# 텍스트창의 값 저장할 변수.
entry_value = StringVar(root, value='')
# 숫자 및 결과 표시창
# textvariable 속성으로 변수 설정.
number_entry = ttk.Entry(root, textvariable = entry_value, width=35)
number_entry.grid(row=0, columnspan=3) # columnspan 은 여러칸에 걸쳐서 표시함.
# 숫자 버튼
# command=lambda: 뒤에 명령 작성.
# command에 함수 연결. 전달값은 버튼의 숫자 '1'
# button 9개 추가
button7 = ttk.Button(root, text="7", command = lambda:button_pressed('7'))
button7.grid(row=1, column=0)
button8 = ttk.Button(root, text="8", command = lambda:button_pressed('8'))
button8.grid(row=1, column=1)
button9 = ttk.Button(root, text="9", command = lambda:button_pressed('9'))
button9.grid(row=1, column=2)
# 나누기 버튼 -> math_button_pressed() 로 연결.
button_div = ttk.Button(root, text="/", command = lambda:math_button_pressed('/'))
button_div.grid(row=1, column=3)
button4 = ttk.Button(root, text="4", command = lambda:button_pressed('4'))
button4.grid(row=2, column=0)
button5 = ttk.Button(root, text="5", command = lambda:button_pressed('5'))
button5.grid(row=2, column=1)
button6 = ttk.Button(root, text="6", command = lambda:button_pressed('6'))
button6.grid(row=2, column=2)
# 곱하기 버튼 -> math_button_pressed() 로 연결.
button_mult = ttk.Button(root, text="*", command = lambda:math_button_pressed('*'))
button_mult.grid(row=2, column=3)
button1 = ttk.Button(root, text="1", command = lambda:button_pressed('1'))
button1.grid(row=3, column=0)
button2 = ttk.Button(root, text="2", command = lambda:button_pressed('2'))
button2.grid(row=3, column=1)
button3 = ttk.Button(root, text="3", command = lambda:button_pressed('3'))
button3.grid(row=3, column=2)
# 더하기 버튼 -> math_button_pressed() 로 연결.
button_add = ttk.Button(root, text="+", command = lambda:math_button_pressed('+'))
button_add.grid(row=3, column=3)
# 마지막줄 AC,0,=,- 버튼추가
button_ac = ttk.Button(root, text="AC", command = lambda:button_pressed('AC')) # AC,0 버튼 -> button_pressed() 로 연결
button_ac.grid(row=4, column=0)
button0 = ttk.Button(root, text="0", command = lambda:button_pressed('0'))
button0.grid(row=4, column=1)
button_equal = ttk.Button(root, text="=", command = lambda:equal_button_pressed()) # = 버튼 -> equal_button_pressed() 로 연결
button_equal.grid(row=4, column=2)
button_sub = ttk.Button(root, text="-", command = lambda:math_button_pressed('-')) # -버튼 -> math_button_pressed() 로 연결.
button_sub.grid(row=4, column=3)
root.mainloop()
Categories
Python
Wizzen2801


