Python 键盘模块切换侦听器

Python 键盘模块切换侦听器,python,pynput,python-keyboard,Python,Pynput,Python Keyboard,我刚刚发现了pynput库,这正是我一直在寻找的。我的目标是捕获用户正在键入的键,每当捕获到特定的键序列时,我希望计算机将序列写入当前carret的位置。之后,我想再次捕获用户的密钥,直到出现另一个值得注意的序列。等等 问题是监听器也会考虑键盘.write()的模拟按键,这导致了一个无限循环,这在第一次出现时很有趣,但我现在正试图摆脱它 我的方法是停止监听器并在计算机完成键入后创建一个新的监听器,但在第一次调用start\u Listener()后,这个过程会减慢很多,我认为这在一开始并不是最佳

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

问题是
监听器也会考虑
键盘.write()
的模拟按键,这导致了一个无限循环,这在第一次出现时很有趣,但我现在正试图摆脱它

我的方法是停止
监听器
并在计算机完成键入后创建一个新的监听器,但在第一次调用
start\u 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()


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

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

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()


在LinuxMint20、Python3.8.5、Pynput1.7.3上进行了测试,这个问题有一个简单的解决方案。我无意中发现我使用了两个互不相关的软件包。感谢在我的ide上轻松安装它们。 无论如何,我的解决方案是现在只使用allready present键盘包:
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()

我认为这两个模块是不兼容的,这使得它们很难甚至不可能一起使用。你不能使用
pynput
来发送模拟的按键吗?你可以使用
pynput.keyboard.Control
来发送按键,而不是停止和启动。你可以使用一些变量来控制它-即
paused=True
keyboard.write(…)
paused=False
。在另一部分中,如果没有暂停:…
这不起作用,它仍然是一个无限循环。如果这在你的系统上不起作用,那么它将需要在源代码中深入挖掘,以获得只适用于你的系统的解决方案。我在这里发布之前已经尝试过这种方法,真的很惊讶它对你有效。我找到了一个不使用pynput的解决方案。你在Linux上运行了吗?它可能在不同的系统上工作。若你们找到了解决方案,那个么就把它当作asnwer——它对其他用户可能有用。您可以将您的答案标记为已接受。几分钟后,你可以投票表决你的答案。我并没有在Linux上运行它,只是在Windows上运行。是的,我走了,现在把我的解决方案