• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

나만의 단축키 만들기

20.04.21 14:33 작성 조회수 170

1

MY_HOT_KEYS = [

    {"function1": {Key.shift, KeyCode(char='a')}},

    {"function2": {Key.ctrl_l, Key.alt_l, KeyCode(char='n')}},

    {"function3": {Key.shift_l, Key.f1}},

]

해당 코드를 jupyter에서 실행할경우,  function1의 {Key.shift, KeyCode(char='a') 구문에서, 소문자 a키로 작성된부분이

shift 키를 누루게 되면서, 대문자 A가 출력되어 function1의 함수가 동작 하지않는데요, (char='a' -> char='A') 이렇게 소문자를

대문자로 수정해주면 function1의 함수가 정상 실행됩니다. 혹시, ms code에서처럼, jupyter에서도 소문자로 표기해도 실행될수 있는 방법이있나요? 혹시나 해서  (char='a').lower() 를 해봤는데, 이건 안되네요....

답변 1

답변을 작성해보세요.

0

주피터에서 파이썬을 실행하는 환경과 vs code에서 파이썬을 실행하는 환경이 약간 다른 부분이 있어서 키메세지를 누가 먼저 처리했느냐에 따라 달라지는 현상으로 보입니다.

말씀하신 내용처럼 모두 포용하는 기능을 구현하기엔 강좌의 내용이 너무 많이 변경되므로 모든 내용을 다 다룰수는 없고 필요한 핵심 함수와 방법을 말씀드리자면..

MY_HOT_KEYS 에 등록할때 KeyCode(char='a') 처럼 키코드로 등록하지 않고 대소문자를 모두 처리 하기 위해서 그냥 'a' 이런식으로 등록하게 변경해야 합니다.

"function1": {Key.shift, 'a')

그리고 키보드가 눌렸을때 호출되는 함수에서 키가 눌렸을때 해당 키 값을 처리할때 key 객체에서 char 값을 따로 빼서 처리합니다. 여기서 char 값을 따로 빼면 위에서 등록한 'a' 만 빼서 처리할 수 있고 이때 isupper() 함수 같은 내장 함수를 사용할 수 있으니 여기서 모두 lower() 처리 후에 비교하는 방식을 취하면 될듯 합니다. 예를 들면...

# 키보드가 눌렸을때 호출되는 함수
def key_pressed(key):
    print("Press {}".format(key))

    try:
        if key.char.isupper():
            key.char.lower()
    except:
        pass

위와 같은 상황이 되는거라 보시면 됩니다. 근데 여기서 중요한 부분이 a, b, c, 1, 2... 등 이런 키는 char 값으로 넘어올 수 있지만 shift, alt, 등의 특수키는 char 값으로 접근하면 프로그램이 에러가 발생하게 됩니다. 그래서 이 부분에서 특수키인지 일반키인지를 처리하는 로직으로 크게 구분되야 합니다. try except 문을 활용해서 할 수도 있을듯 보입니다.

어쨌든 위와 같이 key.char 값이 대소문자인지 확인하여 원하는 형태로 처리 후 그 값을 따로 변수에 담아 위에서 등록한 MY_HOT_KEYS 와 비교하면 가능할듯 보입니다.