【问题标题】:Why pynput doesn't detect numeric keyboard presses?为什么 pynput 不检测数字键盘按下?
【发布时间】:2019-04-08 21:39:41
【问题描述】:

我在 Windows 7 上使用 python 3.7。

有什么方法可以检测 pynput 模块中的数字(例如:“1”)按键吗?

我尝试了许多其他模块,但除了 tkinter 我什么都没有 它需要一个窗口,但我不想要那个。

from pynput import keyboard  
def on_press(key):
     print(key)
     if str(format(key)) == 'Key.1':
         print('Exiting...')
         return False 
with keyboard.Listener(on_press = on_press) as listener:
     listener.join()

它实际上只打印按下的键并且从不刹车(不接受数字输入)。

【问题讨论】:

    标签: python keyboard detection


    【解决方案1】:

    您的代码正在测试值"1"。如果您按1 键,请原谅pynput 返回的显而易见的内容。您想回复NumLock 键。

    代替

    if str(format(key)) == '1':
    

    您可以编写这些测试中的任何一个,这两个测试都会检查您正在寻找的值:

    if key == keyboard.Key.num_lock:
    
    if str(format(key)) == "Key.num_lock":
    

    但是...有两种NumLock 键。

    一个是 Keyboard NumLock and Clear,它同时具有 USB 代码 (0x53) 和 Windows 虚拟键代码 (0x90)。 pynput 将响应按下此键。

    另一种是 Keyboard Locking NumLock,它在键盘级别起作用:它改变了键盘的行为方式,而 Windows 听不到它。它有一个 USB 代码 (0x83),但没有 Windows 虚拟键代码。如果该键没有虚拟键码,则按下它不会有 Windows 消息,pynput 会报告 Windows 消息。

    所以行为取决于硬件,可能是您的机器具有第二种NumLock 密钥。如果确实如此,那么您对pynput 说的任何话都不会有帮助。不过,这不太可能,除非您使用的是非常受限的笔记本电脑键盘。

    【讨论】:

    • 那我应该写什么呢?
    【解决方案2】:

    您提供的代码似乎试图检测数字键“1”而不是“Num lock”。

    @BoarGules 提供了完整的答案。只是为了补充一点说明:

    当您使用 pynput 监控键盘时,如果尝试检测控制键,则应将其与适当的 pynput.keyboard.Key 对象进行比较。如果检查 num lock,您的代码应如下所示:

    if key == keyboard.Key.num_lock:
        print('exiting')
    

    另一方面,如果您正在寻找字母数字键,请将其与 pynput.keyboard.KeyCode 进行比较:

    if key == keyboard.KeyCode(char = '1'):
        print('exiting')
    

    【讨论】:

      【解决方案3】:

      快速浏览doc 会发现,在某些平台上,num lock 键可能未定义。不幸的是,我没有 Windows 机器来测试它。

      num_lock = <Key.f1: 0>
      

      NumLock 键。对于某些平台,这可能是未定义的。

      【讨论】:

        猜你喜欢
        • 2021-04-29
        • 2020-02-17
        • 2018-10-24
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 2020-02-11
        • 2014-08-01
        • 1970-01-01
        相关资源
        最近更新 更多