Aaron Jones
Aaron Jones

Reputation: 74

Checking for keyboard inputs not Working. Help Please

I am trying this code provided and accepted here: https://stackoverflow.com/a/55369170/14307622 but I am getting this error. Any ideas why ? I am new here so if I am breaking some rules for this question, then please let me know but if possible, please suggest some solutions to the problem first.

import keyboard
import time

listedSongs = []
currentSong = "idk"
exit = False  # make a loop control variable

def alt_k():
    i = 1
    paused = False

def alt_q(): 
    global exit
    exit = True

def alt_s():
    if currentSong not in listedSongs:
        listedSongs.append(currentSong)
        print(listedSongs)

# assign hooks to the keyboard
keyboard.on_press_key("alt+k", alt_k)  # on press alt+k, execute alt_k()
keyboard.on_press_key("alt+q", alt_q)
keyboard.on_press_key("alt+s", alt_s)

# main loop
while not exit:
    keyboard.wait()  # "block" for input (essentially, do nothing until a key is pressed and yield CPU resources to anything else that wants them)

The error I am getting is this:

Traceback (most recent call last):
  File "D:\AJ\Coding\test.py", line 26, in <module>
    keyboard.on_press_key("alt+k", alt_k)  # on press alt+k, execute alt_k()
  File "C:\Users\AJ\AppData\Local\Programs\Python\Python39\lib\site-packages\keyboard\__init__.py", line 510, in on_press_key
    return hook_key(key, lambda e: e.event_type == KEY_UP or callback(e), suppress=suppress)
  File "C:\Users\AJ\AppData\Local\Programs\Python\Python39\lib\site-packages\keyboard\__init__.py", line 493, in hook_key
    scan_codes = key_to_scan_codes(key)
  File "C:\Users\AJ\AppData\Local\Programs\Python\Python39\lib\site-packages\keyboard\__init__.py", line 324, in key_to_scan_codes
    raise ValueError('Key {} is not mapped to any known key.'.format(repr(key)), e)
ValueError: ("Key 'alt+k' is not mapped to any known key.", ValueError("Key name 'alt+k' is not mapped to any known key."))

Upvotes: 1

Views: 5793

Answers (2)

Aaron Jones
Aaron Jones

Reputation: 74

This is how I solved my issue.

I ditched the keyboard module since it was not working the way I wanted it to and then I used the Python Global-Hotkeys Module. The code was pretty much the same but now everything just clicked in place.

Hope this helps someone in the future.

Upvotes: 0

furas
furas

Reputation: 142631

It seems on_press_key() works only with single key like q but not with combination alt+q. Or maybe it is problem only on some systems. At least it doesn't work on my Linux.

Or maybe they change code in module. Answer in Checking for keyboard inputs uses too much cpu usage, Is there something wrong with my code? is 2 years old.


You can use add_hotkey() and it doesn't need wait()

import keyboard
import time

listedSongs = []
currentSong = "idk"

exit = False  # make a loop control variable

def alt_k():
    print('pressed: alt+k')
    
    i = 1
    paused = False

def alt_q(): 
    global exit  # need it to assign `True` to global/external variable instead of creating local variable

    print('pressed: alt+q')
    
    exit = True

def alt_s():
    print('pressed: alt+s')

    if currentSong not in listedSongs:
        listedSongs.append(currentSong)
        print(listedSongs)

keyboard.add_hotkey('alt+k', alt_k)
keyboard.add_hotkey('alt+q', alt_q)
keyboard.add_hotkey('alt+s', alt_s)

# main loop
while not exit:
    time.sleep(1)

See examples in documentation: Example


Eventually you may use hotkye = read_hotkey(...) with if/else to execute correct function.

I'm not sure but sometimes it works for me also with hotkey = keyboard.wait(suppress=False) but sometimes it doesn't work.

while not exit:
    hotkey = keyboard.read_hotkey(suppress=False)
    #hotkey = keyboard.wait(suppress=False)

    print('hotkey:', hotkey)

    if hotkey == 'alt+k':
        alt_k()
    elif hotkey == 'alt+q':
        alt_q()

Upvotes: 1

Related Questions