인프런 커뮤니티 질문&답변

Might님의 프로필 이미지

작성한 질문수

남박사의 파이썬 기초부터 실전 100% 활용

나만의 단축키 만들기 스마트

실행시 함수 호출이 안됩니다ㅠ

19.09.26 17:04 작성

·

340

1

두번 세번 점검해서 코딩해봤는데 키는 잘 읽는데 함수 호출을 못하네요...빼먹은 설정이나 무엇이 있는지 궁금합니다 답변 부탁드려요!

답변 7

1

베베베님의 프로필 이미지

2020. 06. 17. 08:05

그냥 n 만 눌렀을땐 정상적으로 'n'이 출력되는데

ctrl + alt + n을 누르니 <78> 이 출력되네요.

저도 윗 댓글 처럼  n -> ctrl -> alt 로 하니 함수호출이 됩니다 . 

신기하네요.

0

남박사님의 프로필 이미지
남박사
지식공유자

2020. 06. 18. 17:43

78은 n 의 대문자 N 의 아스키 코드값입니다. 어떤 이유에서 키가 여러개 조합되서 눌렸을때 소문자 n 값이 대문자 N 값으로 변형되는거 같은데 제 컴퓨터에서 확인해보지 못해 정확하게 말씀드리기가 어렵습니다. 다만 해당 코드에 좀 더 부연설명을 드리자면

MY_HOT_KEYS = [
    {"function1": {Key.shift, KeyCode(char='a')}},
    {"function2": {Key.ctrl_l, Key.alt_l, KeyCode(78)}},
    {"function3": {Key.shift_l, Key.f1}},
]

위 코드처럼 KeyCode 설정을 78로 직접할 수 있는 방법이 있습니다. 물론 단순한 방법이고 생각을 좀 더 해보면 n + ctrl + alt 로 눌렀을때는 또 반응을 안하게 되는 문제가 발생할 수 있을것 같습니다.

# 등록된 핫키 목록
MY_HOT_KEYS = [
    {"function1": {Key.shift, KeyCode(vk=65)}},
    {"function2": {Key.ctrl_l, Key.alt_l, KeyCode(vk=78)}},
    {"function3": {Key.shift_l, Key.f1}},
]

아니면 위처럼 char 코드 값이 아닌 vk 값으로 단축키를 설정해서 동작하게 하는 방법이 있을것 같습니다. vk 는 virtual key code로 각 키마다 정의된 코드값을 사용합니다. 대신 이렇게 작성되는 경우에는 키 눌림 감지를 하는 함수가 수정되어야 합니다.

# 등록된 핫키 목록 반복
    for data in MY_HOT_KEYS:
        # 등록된 핫키는 리스트안에 딕셔너리가 있는 모양이라
        # 딕셔너리의 키와 값을 구함
        FUNCTION = list(data.keys())[0]
        KEYS = list(data.values())[0]

        if hasattr(key, "vk"):
            # vk 값이 있는 경우
        else:
            # vk 값이 없는 경우

위 처럼 vk 값이 있는 경우(일반 키)와 없는 경우(특수키)의 경우를 나뉘어서 처리를 따로 해야할듯 합니다. hasattr 은 인자로 넘어온 객체에 특정 요소가 있는지 없는지를 판별하는 함수이고 vk 라는 요소가 있는 경우에는 key.vk 의 값이 단축키로 등록되어있는지 확인하고 vk 가 없는 경우(ctrl, alt 등등) 의 키를 따로 검사하는 방식으로 처리 하면 될듯 합니다.

https://pynput.readthedocs.io/en/latest/_modules/pynput/keyboard/_base.html#KeyCode

마지막으로 위 링크가 pynput 의 KeyCode 클래스의 소스 입니다. 어떻게 동작하는지 대략적으로 확인이 가능합니다. 참고가 되셨으면 좋겠습니다. 

0

남박사님의 프로필 이미지
남박사
지식공유자

2020. 06. 16. 20:09

ctrl 키가 눌리고 alt 키가 눌린 후에 n 키 값이 제대로 인식되는지 확인해봐야 할듯 합니다. 어떤 키보드에선 ctrl 이나 alt 키가 눌리고 난 뒤에 n 키가 'n' 이 아닌 아스키값(110)으로 인식되는 경우가 있습니다.

0

Jaejin Sim님의 프로필 이미지

2020. 06. 11. 22:07

강사님 코드 동일하게 작성하였는데 함수 호출이 key 입력 순서를 ctrl -> alt ->  n 이 아닌 n -> ctrl -> alt 순으로 하니까 호출이 되네요 이유는 모르겠습니다.  ~_~

0

둥이님의 프로필 이미지

2020. 04. 06. 14:59

남박사님 저도 함수 호출이 안됩니다.. ㅠㅠ 키는 잘 인식됩니다.

from pynput.keyboard import Key, Listener, KeyCode

# 단축키 저장
MY_HOT_KEYS =[
    {"function1": {Key.ctrl_l, Key.alt_l, KeyCode(char="n")}}
]

# 키가 눌러져있는 키 상태를 기억하는 변수(집합)
current_keys = set()

def function1():
    print("함수1 호출")

def key_pressed(key):
    print("Pressed {}".format(key))
    for data in MY_HOT_KEYS:
        FUNCTION = list(data.keys())[0]
        KEYS = list(data.values())[0]
        
        if key in KEYS:
            current_keys.add(key)

            if all(k in current_keys for k in KEYS):
            #checker = True
            #for k in KEYS:
                #if k not in current_keys:
                    #checker = False
                    #break
            #if checker: 
                function = eval(FUNCTION)
                function()
                    

def key_released(key):
    print("Released {}".format(key))

    if key in current_keys:
        current_keys.remove(key)

    if key == Key.esc:
        return False

# on_press, on_release는 인자값
with Listener(on_press=key_pressed, on_release=key_released) as Listener:
   Listener.join()

0

아망풀로님의 프로필 이미지

2019. 12. 25. 05:44

강사님, 저도 마찬가지로 함수 호출이 안됩니다. 첨부된 소스코드로 실행해도 마찬가지로 실행안되며 아래와 같이 출력됩니다. 

사용한 모듈버전은 아래 링크와 같습니다. 

사용모듈

Pressed Key.alt_l
Pressed <78>
Released <78>
Released Key.alt_l
Released Key.ctrl_l
Pressed Key.ctrl_l
Pressed Key.alt_l
Pressed <66>
Released <66>
Released Key.ctrl_l
Released Key.alt_l
Pressed Key.ctrl_l
Released Key.ctrl_l
Pressed Key.alt_l
Pressed Key.ctrl_l
Pressed <71>
Released <71>
Released Key.ctrl_l
Released Key.alt_l
Pressed Key.ctrl_l
Pressed '\x03'
Released Key.ctrl_l
Released 'c'
Pressed Key.esc
Released Key.esc

0

남박사님의 프로필 이미지
남박사
지식공유자

2019. 09. 28. 17:29

테스트 하신 코드 전체를 저한테 보내주시겠어요? 코드를 봐야 확실하게 답변 드릴수 있을것 같습니다. 키만 잘 읽는다면 특별히 다른 설정은 필요없는 부분이거든요.. 실제 이런류의 프로그램을 작성할때 오류가 나면 해당 함수를 호출하기 직접에 print 문같은걸 써서 어디까지 코드가 정상 실행되는지 확인해보시는 방법으로 문제점을 찾아갈 수 있습니다. 함수 호출 바로 직전 print 문을 써서 정상적으로 화면 출력이 어디까지 되는지 확인해보시고 정확히 어떤 부분에서 문제가 되는지 찾아보시는게 좋습니다. 이 강좌에서는 아마 eval 함수 전에 print 문을 찍어보는게 좋을듯 합니다.

그래도 해결이 안되면 제가 업로드 해놓은 샘플 코드를 실행해보시는것도 좋을듯 합니다.

아래 링크는 강좌에서 사용된 모든 샘플코드가 있는 구글 드라이브 링크이며 해당 강좌의 코드만 받아서 실행해보시고 다시 질문 부탁드리겠습니다. ^^

강좌 소스 코드

Might님의 프로필 이미지

작성한 질문수

질문하기