键盘模块切换监听器

时间:2021-06-07 21:39:04

标签: python pynput python-keyboard

我刚刚发现了 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()

2 个答案:

答案 0 :(得分:1)

这个问题有一个简单的解决方案。我实际上错过了我使用了两个彼此无关的软件包。由于可以轻松地将它们安装在我的 ide 上。 无论如何,我现在的解决方案是只使用现有的键盘包:react-router 而不是 pynput.keyboard

当不使用两个单独的包时,这真的很容易:)。 这是代码:

https://pypi.org/project/keyboard/

答案 1 :(得分:0)

在我的 Linux Mint 上,我需要管理员权限才能运行 keyboard,但我可以使用 pynput.keyboard.Controller 和方法 press()release()time.sleep()< /p>

我会使用全局变量 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 上测试