Strength & Honor


계산기 만들기 (3)


이제 가장 어려운 부분인 함수를 공부 해 보자. 아래 입력된 코드들은 변수를 선언한 문장들이다.

              
  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)
            

(11) 두값이 같으면 정수로 표현가능.==> 정수값으로 반환.

              
  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
          # (10) 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
          
          # (11)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
            

(12) 키입력 함수

              
  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)