我有一个简单的程序来熟悉使用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,如果没有按shift,则执行func2。但是它目前只做func2,因为shift_pressed永远是假的。为了让shift_pressed按其应有的方式工作,我可以做什么不同的事情呢?
编辑1:更清楚地指定期望的最终结果。
编辑2:将附加字符串更改为两个不同的函数,以增加更多的清晰度。
编辑3:更改最后一个问题的参数以匹配最近的示例
发布于 2017-06-08 21:55:02
这是pynput 1.3.5文档中的一个错误。
各种修饰符状态属性(alt_pressed、alt_gr_pressed、ctrl_pressed和shift_pressed)仅反映Controller实例的状态;它维护内部修饰符状态,当按下各种键时应用该状态--例如,支持它的脚本中的大写字符。
此状态与当前操作系统状态是分开的,只有在使用该特定控制器发送键按下时才会发生更改。
没有检索当前全局修饰符状态的通用pynput方法。
发布于 2017-06-08 17:47:37
我不是百分之百肯定,但当我与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()如果你需要其他帮助,告诉我你的具体动机。
https://stackoverflow.com/questions/44442256
复制相似问题