如何解决键盘模块切换监听器
我刚刚发现了 pynput
库,这正是我一直在寻找的。我的目标是捕获用户正在键入的键,并且每当捕获到特定的键序列时,我希望计算机将序列写入当前插入的位置。之后,我想再次捕获用户的密钥,直到出现另一个值得注意的序列。等等。
问题是 keyboard.write()
的模拟击键也被 Listener
考虑,这会导致无限循环,这在第一次发生时很有趣,但我试图摆脱它现在很明显
我的方法是在计算机完成输入后停止 Listener
并创建一个新的,但是在第一次 start_listener()
调用后这个过程会减慢很多,并且一开始并不是最佳的我认为。我没有更多的想法,所以我希望有人能在这里提供帮助。
这是我目前的代码:
import keyboard
from pynput.keyboard import Key,Listener
def on_press(key):
stop_listener()
keyboard.write("Hello",0.05)
start_listener()
def on_release(key):
if key == Key.esc:
return False
def start_listener():
global listener
listener = Listener(on_press=on_press,on_release=on_release)
listener.start()
listener.join()
def stop_listener():
global listener
listener.stop()
with Listener(on_press=on_press,on_release=on_release) as listener:
listener.join()
解决方法
这个问题有一个简单的解决方案。我实际上错过了我使用了两个彼此无关的软件包。由于可以轻松地将它们安装在我的 ide 上。
无论如何,我现在的解决方案是只使用现有的键盘包:react-router
而不是 pynput.keyboard
当不使用两个单独的包时,这真的很容易:)。 这是代码:
https://pypi.org/project/keyboard/
,
在我的 Linux Mint 上,我需要管理员权限才能运行 keyboard
,但我可以使用 pynput.keyboard.Controller
和方法 press()
、release()
、time.sleep()
我会使用全局变量 paused = False
来控制 on_press
何时应该运行代码,而不是停止和启动 listenere。
from pynput.keyboard import Key,Listener,Controller
import time
keyboard = Controller()
def on_press(key):
global paused # inform function to assign new value to global variable (instead of creating local variable)
if not paused:
paused = True
#keyboard.type("Hello") # module pynput.keyboard.Controller
for char in "Hello":
keyboard.press(char) # pynput.keyboard.Controller
keyboard.release(char) # pynput.keyboard.Controller
time.sleep(0.05)
paused = False
def on_release(key):
if not paused:
if key == Key.esc:
return False
# global variable with default value at start
paused = False
with Listener(on_press=on_press,on_release=on_release) as listener:
listener.join()
在 Linux Mint 20、Python 3.8.5、pynput 1.7.3 上测试
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。