1

我刚刚发现pynput这正是我一直在寻找的图书馆。我的目标是捕获用户正在键入的键,并且每当捕获特定的键序列时,我希望计算机将序列写入当前 carret 的位置。之后,我想再次捕获用户的密钥,直到发生另一个值得注意的序列。等等。

问题是模拟的击键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()

4

2 回答 2

1

这个问题有一个简单的解决方案。我实际上错过了我使用了两个彼此无关的包。感谢在我的 IDE 上轻松安装它们。

无论如何,我现在的解决方案是只使用已经存在的键盘包https://pypi.org/project/keyboard/而不是pynput.keyboard

当不使用两个单独的包时,它变得非常容易:)。

这是代码:

# coding=utf8

import keyboard as k

def on_press(key = k.KeyboardEvent):
    
    k.write(key.name, 0.0)

k.on_press(on_press)
k.wait()
于 2021-06-10T07:30:17.727 回答
0

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

我不会停止和启动 listenere,而是使用全局变量paused = False来控制何时on_press应该运行代码。

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 上测试

于 2021-06-08T00:12:08.263 回答