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上运行。是的,我走了,现在把我的解决方案