我有一个简单的程序来熟悉使用pynput的键盘监听器。它的作用并不重要。重要的是,shift_pressed
属性似乎永远不会更改为True
。我的程序目前看起来像这样:
from pynput.keyboard import Controller, Listener
boo = True
keyboard = Controller()
fib_lst = [0, 1]
def on_press(key):
print(key)
print(keyboard.shift_pressed)
Listener(on_press=on_press).start()
while boo:
nxt = fib_lst[-1] + fib_lst[-2]
input(nxt)
fib_lst.append(nxt)
我试图在on_press
(或on_release
)中做同样的事情:
def on_press(key):
if key == Key.delete:
if keyboard.shift_pressed:
func1()
else:
func2()
此代码在按下shift时应执行func1
,如果不是,则执行func2
。但它目前仅执行func2
,因为shift_pressed
永远是假的。我可以采取哪些不同的方式让shift_pressed
正常工作?
编辑1:更清楚地指定所需的最终结果。
编辑2:将附加字符串更改为两个不同的函数以增加清晰度。
编辑3:更改了最终问题的参数以匹配最近的示例
答案 0 :(得分:0)
我不是百分之百确定,但是当我使用pynput时,我注意到我可以处理关键释放的动作,而不是按键,所以你可以尝试下面的事情:
from pynput import keyboard
def on_press(key):
if key == keyboard.Key.shift: # handles if key press is shift
print('foo', end='')
def on_release(key):
if key == keyboard.Key.shift:
print()
elif key == keyboard.Key.delete:
print('bar')
elif key == keyboard.Key.esc:
return False
def get_current_key_input():
with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
get_current_key_input()
如果您需要任何其他帮助,请告诉我您的具体动机。
答案 1 :(得分:0)
这是 pynput 1.3.5 文档中的错误。
各种修饰符状态属性(alt_pressed
,alt_gr_pressed
,ctrl_pressed
和shift_pressed
)仅反映Controller
实例的状态;它保持一个内部修饰符状态,当按下各种键时应用该状态 - 例如从支持它的脚本中使用大写字符。
此状态与当前操作系统状态分开,只有在您使用该特定控制器发送按键时才会更改。
没有通用的 pynput 方法来检索当前的全局修饰符状态。