파이썬_실전 프로젝트

계산기 만들기-3 : 키보드로 입력하기

계산기에 키보드 입력기능을 추가하도록 하겠습니다.

키입력 binding
root = Tk()
root.title("Calculator")
root.geometry("300x200")

root.bind('<Key>',key_input)

코드 중간 부분에 계산기 객체를 선언하는 부분 아래에, root.bind('<Key>',key_input) 명령을 추가해줘야합니다. 입력되는 키 값(객체)을 key_input 이라는 함수로 넘겨주라는 의미입니다.

키값 테스트

key_input() 함수로 넘어온 키값을 처리하기 전에, 키값이 어떤 형태로 들어오는지 알아둘 필요가 있습니다.

def key_input(value):
    print(value) 
    print(value.char)
    print(repr(value.char))

키를 하나씩 눌러보면, 아래와 같은 결과가 나옵니다. 객체를 출력하면, 파이썬 3.5까지는 객체라고만 나왔는데, 3.6부터는 객체의 속성까지 나오는것 같습니다. 속성을 보면서, 객체내의 어떤 변수를 사용할지 정하면 되겠네요.

<KeyPress event keysym=1 keycode=49 char='1' x=-5 y=-50>
1
'1'
<KeyPress event keysym=2 keycode=50 char='2' x=-5 y=-50>
2
'2'
<KeyPress event keysym=3 keycode=51 char='3' x=-5 y=-50>
3
'3'
<KeyPress event keysym=Return keycode=2359309 char='\r' x=-5 y=-50>

'\r'
<KeyPress event keysym=Return keycode=2359309 char='\r' x=-5 y=-50>

'\r'
<KeyPress event keysym=Escape keycode=3473435 char='\x1b' x=-5 y=-50>

'\x1b'
<KeyPress event state=Shift keysym=Shift_L keycode=131076 x=-5 y=-50>

''
<KeyPress event state=Shift keysym=Shift_L keycode=131074 x=-5 y=-50>

''
<KeyPress event keysym=BackSpace keycode=3342463 char='\x7f' x=-5 y=-50>

'\x7f'

여러형태의 값중에서 숫자키는 value.char 의 값이 따옴표 없이 처리하기가 편하고, 엔터키와 ESC 키는 value.keysym 속성에 이름이 저장돼있습니다.

 

함수작성
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')

숫자키와 연산자는 미리 문자열로 만들어 놓고, 값이 들어오면, 문자열안에 있는 값인지 비교해주면 되고, 엔터키와 esc키는 value.keysym 값을 "Return" 인지, "Escape인지 비교해주면 되겠습니다. shift 키는 덧셈할때 눌러야할수도 있는데, 이때의 shift 키값은 무시하도록 조건문을 걸어줍니다.

백스페이스로 글자 지우기

"BackSpace"키가 입력되면, 마지막숫자하나를 지우도록 함수를 바꿔보죠. 

number_entry.delete(0,'end')

기존의 내용을 삭제하는 명령을 조금 바꿔서 사용하겠습니다. 현재 위의 명령은 왼쪽에서 0번째 문자부터, 오른쪽 끝까지 다 지우라는 내용인데, 0이 있는 자리를, 문자열의 오른쪽끝을 의미하는 표현으로 바꿔주겠습니다.

number_entry.delete(len(number_entry.get())-1,'end')

문자열 길이가 매번 다르기 때문에, 길이를 먼저 계산하고 1을 빼주는 식으로 위치를 계산해주었습니다.

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)

 

댓글

댓글 본문