我按照视频使用 pip 在 Windows 中下载了 pynput:https://youtu.be/DTnz8wA6wpw
在管理员模式下使用cmd
pip install pynput
Run Code Online (Sandbox Code Playgroud)
当我运行代码时,pycharm和spyder3显示错误:
回溯(最近一次调用最后):文件“E:/Users/nilson/Dropbox/Python/PyCharm/auto/auto.py”,第1行,来自pynput.keyboard import Key,Controller ModuleNotFoundError:没有名为“pynput”的模块
这是我的代码:
from pynput.keyboard import Key, Controller
import time
keyboard = Controller()
time.sleep(2)
for char in "sasdasdasda":
keyboard.press(char)
keyboard.release(char)
time.sleep(0.12)
Run Code Online (Sandbox Code Playgroud) 我想使用matplotlib和pynput近乎实时地绘制鼠标的移动,但我怀疑我遇到了一些被阻止的代码问题.代码是使用此答案的简化版本.
import matplotlib.pyplot as plt
from pynput import mouse
from time import sleep
fig, ax = plt.subplots()
ax.set_xlim(0, 1920-1)
ax.set_ylim(0, 1080-1)
plt.show(False)
plt.draw()
x,y = [0,0]
points = ax.plot(x, y, 'o')[0]
# cache the background
background = fig.canvas.copy_from_bbox(ax.bbox)
def on_move(x, y):
points.set_data(x,y)
# restore background
fig.canvas.restore_region(background)
# redraw just the points
ax.draw_artist(points)
# fill in the axes rectangle
fig.canvas.blit(ax.bbox)
with mouse.Listener(on_move=on_move) as listener:
sleep(10)
Run Code Online (Sandbox Code Playgroud)
代码似乎停止了ax.draw_artist(points).pynput鼠标侦听器是a threading.Thread,并且从线程调用所有回调.我对matplotlib或线程的内部工作原理不太熟悉,无法确定原因.
我的一个朋友让我给他写一个程序,我用 pynput 来处理一些输入和其他功能。当我使用 pyinstaller 将程序转换为可执行文件时,启动可执行文件会出现以下错误: File "site-packages\pynput\keyboard\__init__.py", line 31, in <module> File "site-packages\pynput\_util\__init__.py", line 82, in backend ImportError [11492] Failed to execute script friend_project
我曾尝试使用 pyinstaller 命令pyinstaller --onefile friend_project.py,并使用 auto-py-to-exe 来运行它。
将 pyinstaller 与其他模块(如 pygame 或 pyopengl)一起使用不会给我带来任何错误,但这个模块确实如此。使用 python inturpeter 自行运行脚本工作正常,但我希望它是一个 exe,这样我就可以把它给他,而他不需要 python 来运行它。
在 pynput 上,我通过执行类似的操作来捕获一个键(例如空格键):
from pynput import keyboard
from pynput.keyboard import Key
def on_press(key, ctrl):
if key == Key.space:
print('captured')
def main():
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
Run Code Online (Sandbox Code Playgroud)
但是我注意到这仍然将原始密钥代码发送到其他应用程序。我希望使用 python 将键(组合)“绑定”到其他键(或更高级的操作),因此需要防止这种情况。
如何才能做到这一点?或者这超出了操作系统允许 python 执行的范围?
您好,我正在尝试按住SHIFT键的同时模拟鼠标单击。我一直在尝试使用该pynput模块。
到目前为止,这是我的代码:
from pynput.keyboard import Key
from pynput.keyboard import Controller as Cont
from pynput.mouse import Button, Controller
import time
mouse = Controller()
keyboard = Cont()
with keyboard.pressed(Key.shift):
mouse.position = (1892, 838)
mouse.click(Button.left)
Run Code Online (Sandbox Code Playgroud)
我知道用于按住Shift键的代码正在工作(如果我尝试按代码中的“ a”按钮,则会看到“ A”)。我也知道鼠标单击正在工作。但是,在一起无法正常工作。
我也尝试了StackOverflow帖子中的另一个代码:Pyautogui-需要按住shift键并单击
我从中尝试了以下代码:
import pyautogui
pyautogui.keyDown('shift')
pyautogui.click()
pyautogui.keyUp('shift')
Run Code Online (Sandbox Code Playgroud)
这工作了一分钟,然后停止工作!很奇怪。10次失败中有9次失败。
如果多个物理键盘连接到系统,或者连接单个物理键盘但同时使用触摸屏,可以将 pynput 配置为按设备过滤输入,或者我应该向下一级并使用某些东西别的?
我浏览了文档,但到目前为止没有给我任何线索。
我需要知道何时按下并按住(特定)键。检测后的用例相当简单。当按键被释放时,发送一个信号来停止回调(我已经知道了)。
以下是该算法的粗略方案:
def the_callback():
if key_held == the_hotkey:
someObj.start() # this class Obj works totally well so no issues here on
elif key_released == the_hotkey:
someObj.stop()
else:
# we don't care. continue looking for Keyboard events
# here any kinda listener or just a loop which passes events to the callback
Run Code Online (Sandbox Code Playgroud)
我应该提到,任何阻止执行的侦听器都可以,因为它将在自己的线程中运行(已经pynput.keyboard.Listener在线程中运行,所以不是问题)
我使用pynputand itpynput.keyboard.Listener来检测按键并相应地调用回调,但我无法检测按键何时被按下。
当前的解决方案大致如下:
# not real code. just rough scheme
def on_pressed(key):
if key == my_hotkey:
if running_already: # …Run Code Online (Sandbox Code Playgroud) 这让我很困扰。当使用带有 Keyboard.Listener 的 Python pynput 模块时,键盘监听器停止后,键盘监听时输入的任何内容都会在终端中打印出来。
我尝试过 termios.tcflush(sys.stdout, termios.TCIOFLUSH) 但它似乎没有清除缓冲区并停止将字符打印到终端窗口中。
非常感谢任何帮助!下面的脚本 -
import sys
from pynput import keyboard
import termios
global go_to_selection
def on_press(key):
global go_to_selection
if key != keyboard.Key.tab and key != keyboard.Key.shift and key != keyboard.Key.enter:
termios.tcflush(sys.stdout, termios.TCIOFLUSH)
go_to_selection = True
return False
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
if go_to_selection == True:
_user_choice = input('\r\nSelection: ')
print(' Chosen: '+ str(_user_choice))
Run Code Online (Sandbox Code Playgroud)
编辑:
with keyboard.Listener(on_press=on_press, suppress=True ) as listener:
listener.join()
Run Code Online (Sandbox Code Playgroud)
实际上修复了这个问题,但在键盘再次响应之前似乎会导致 1-2 秒的延迟。这是预期的吗?
谢谢!
dpressed = 0
def on_press(key):
if key == ('d'):
global dpressed
dpressed+=1
logging.info("D: %s" % dpressed)
Run Code Online (Sandbox Code Playgroud)
当我运行此代码并按 d 时,没有任何反应,我怀疑这是因为在检查时需要将该键称为其他名称。有人知道它应该是什么吗?
我有一个使用 Pynput 模块的 python 脚本。当我在 Ubuntu [20.04LTS GUI] 上从终端运行 python 脚本时,它运行完美。
$ pyinstaller --onefile vTwo.py
cd ./dist
./vTwo
Run Code Online (Sandbox Code Playgroud)
运行 ./script 时发生错误:
ImportError: this platform is not supported: No module named 'pynput.keyboard._xorg'
Try one of the following resolutions:
* Please make sure that you have an X server running, and that the DISPLAY environment variable is set correctly
[5628] Failed to execute script vTwo
Run Code Online (Sandbox Code Playgroud)
如果有人可以就可能出现的问题向我提出建议。我看过 Pynput 要求页面,他们提到它需要 X 服务器在后台运行,这应该不是问题,因为我安装了 GUI。
还有无论如何在没有gui的系统上使用Pynput吗?
pynput ×10
python ×8
keyboard ×3
python-3.x ×3
callback ×1
hardware ×1
key ×1
listener ×1
matplotlib ×1
mouse ×1
pip ×1
pyautogui ×1
pyinstaller ×1
termios ×1