【问题标题】:Checking for keyboard inputs not Working. Help Please检查键盘输入不起作用。请帮忙
【发布时间】:2021-05-30 14:23:52
【问题描述】:

我正在尝试这里提供并接受的代码:https://stackoverflow.com/a/55369170/14307622 但我收到了这个错误。任何想法为什么?我是新来的,所以如果我违反了这个问题的一些规则,请告诉我,但如果可能的话,请先提出一些解决问题的方法。

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)

我得到的错误是这样的:

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."))

【问题讨论】:

  • 我们需要整个回溯才能诊断错误。很明显,您分配给全局变量而不在函数中声明它们(即alt_q 函数需要在顶部写一行global exit)。
  • aalways 将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • @thebjorn 我已经按照你的建议更新了我收到的错误,还更新了 alt_q 函数中的“全局退出”,我仍然遇到同样的错误。还有什么建议吗?
  • @furas 感谢您指导我。我已经完成了你的要求。

标签: python keyboard


【解决方案1】:

似乎on_press_key() 仅适用于像q 这样的单个键,但不适用于组合alt+q。或者,这可能只是某些系统上的问题。至少它在我的 Linux 上不起作用。

或者他们可能会更改模块中的代码。 Checking for keyboard inputs uses too much cpu usage, Is there something wrong with my code? 中的答案是 2 岁。


你可以使用add_hotkey(),它不需要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)

查看文档中的示例:Example


最终你可以使用hotkye = read_hotkey(...)if/else 来执行正确的功能。

我不确定,但有时它也适用于 hotkey = keyboard.wait(suppress=False),但有时它不起作用。

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()

【讨论】:

  • 感谢您的详细回答,但我有一个大问题。我正在尝试创建一个脚本,其中我正在使用热键“windows+L”(顺便说一句,我知道这是锁定窗口),我试图在我的脚本中添加一个函数来在我按下“windows”时关闭我的显示+ L'。您提供的代码成功实现了它,但只有一次。一旦按下所述热键,脚本就会挂起,并且在之前的工作正常之后没有其他热键工作。它快把我逼疯了。任何想法为什么会发生这种情况?一旦脚本挂起,我必须使用“Ctrl+C”关闭脚本以退出脚本。
  • 新信息刚刚曝光。 windows键与脚本挂起无关。锁定窗口后,所有热键都将停止工作,为了方便起见,错过了热键的全部要点。因此,您可以设置所有热键,一旦锁定系统,一切似乎都丢失了。不知道如何让它工作......任何帮助将不胜感激。
  • 锁定时或解锁后是否有问题?你想在窗口被锁定时使用hotkeys 吗?但是出于安全原因,锁必须阻止对计算机的访问——有人仍然可以保存您的数据。最终你可以检查AutoHotKey 而不是Python - 也许它可以在系统锁定时工作。我不使用 Windows,因此无法对其进行测试。
  • 不,我不想在我的电脑被锁定时使用它。 (对不起,如果您在我的评论后得出这个结论。简单来说,您上面编写的代码效果很好,所有按键都按应有的方式检测到,但是一旦您锁定然后解锁您的 Windows 帐户,则未检测到按键(当我锁定我的帐户时,你的脚本正在运行)。我发布了一个关于这个的问题,如果你想看看,那么这里是那个问题的链接,那里解释得更好(希望如此。)这是链接这个问题。stackoverflow.com/q/67505554/14307622
  • 我不使用 Windows,所以我帮不上忙。使用其他工具的唯一想法 - 也许AutoHotKey 会更好。它是专门为 Windows 创建的。或者你可以试试其他模块pynput.keyboard.Listener
【解决方案2】:

这就是我解决问题的方法。

我放弃了键盘模块,因为它没有按我想要的方式工作,然后我使用了Python Global-Hotkeys Module。代码几乎相同,但现在所有内容都点击到位。

希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2020-08-16
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多