为什么 pynput 不检测数字键盘按下?
Why pynput doesn't detect numeric keyboard presses?
我在 windows 7.
上使用 python 3.7
有什么方法可以检测 pynput 模块中的数字(例如:“1”)按键吗?
我已经尝试了很多其他模块,但除了 tkinter 之外,我一无所获
这需要 window 但我不想要那个。
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()
它实际上只打印按下的键,从不刹车(不接受数字输入)。
快速浏览 doc 可以看出在某些平台上 num lock 键可能未定义。不幸的是,我没有 windows 机器来测试它。
num_lock = <Key.f1: 0>
The NumLock key. This may be undefined for some platforms.
您的代码正在测试值 "1"
。这是,请原谅,如果您按 1
键,那么 pynput
returns 是显而易见的。您要响应 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
说什么都无济于事。不过,这不太可能,除非您使用的是非常受限的笔记本电脑键盘。
您提供的代码似乎试图检测数字键“1”而不是 'Num lock'。
@BoarGules 给出了完整的答案。只是补充一点说明:
当您使用 pynput 监控键盘时,如果试图检测控制键,您应该将其与适当的 pynput.keyboard.Key 对象进行比较。在检查 num lock 的情况下,您的代码应如下所示:
if key == keyboard.Key.num_lock:
print('exiting')
另一方面,如果您要查找字母数字键,请将其与 pynput.keyboard.Key代码:
进行比较
if key == keyboard.KeyCode(char = '1'):
print('exiting')
我在 windows 7.
上使用 python 3.7有什么方法可以检测 pynput 模块中的数字(例如:“1”)按键吗?
我已经尝试了很多其他模块,但除了 tkinter 之外,我一无所获 这需要 window 但我不想要那个。
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()
它实际上只打印按下的键,从不刹车(不接受数字输入)。
快速浏览 doc 可以看出在某些平台上 num lock 键可能未定义。不幸的是,我没有 windows 机器来测试它。
num_lock = <Key.f1: 0>
The NumLock key. This may be undefined for some platforms.
您的代码正在测试值 "1"
。这是,请原谅,如果您按 1
键,那么 pynput
returns 是显而易见的。您要响应 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
说什么都无济于事。不过,这不太可能,除非您使用的是非常受限的笔记本电脑键盘。
您提供的代码似乎试图检测数字键“1”而不是 'Num lock'。
@BoarGules 给出了完整的答案。只是补充一点说明:
当您使用 pynput 监控键盘时,如果试图检测控制键,您应该将其与适当的 pynput.keyboard.Key 对象进行比较。在检查 num lock 的情况下,您的代码应如下所示:
if key == keyboard.Key.num_lock:
print('exiting')
另一方面,如果您要查找字母数字键,请将其与 pynput.keyboard.Key代码:
进行比较if key == keyboard.KeyCode(char = '1'):
print('exiting')