python - 如何用Python同时记录鼠标和键盘的移动?

标签 python keyboard mouse

我想创建一个函数来记录鼠标和键盘事件,直到按下特定的键,然后一起重播它们。

我认为这可以通过键盘鼠标模块来实现。在之前的问题中,我问 how to record the mouse movement until a key is pressed ,我得到了以下代码:

import mouse
import keyboard

events = []                 #This is the list where all the events will be stored
mouse.hook(events.append)   #starting the mouse recording
keyboard.wait("a")          #Waiting for 'a' to be pressed
mouse.unhook(events.append) #Stopping the mouse recording
mouse.play(events)          #Playing the recorded events

效果很好。由于这两个模块是由同一个人制作的,因此我认为键盘模块也可以使用相同的模块。但事实并非如此。

mouse_events = []
keyboard_events = []

mouse.hook(mouse_events.append)
keyboard.hook(keyboard_events.append)

keyboard.wait("a")

mouse.unhook(events.append)
keyboard.unhook(events.append)
keyboard.play(events)

上面代码中的 keyboard.hook(events.append) 行抛出错误: 类型错误:不可散列的类型:“列表”

我尝试检查模块文件,但我无法理解其中的大部分内容。

那么,总结一下:如何同时开始鼠标和键盘录制、同时停止它们并同时运行它们? 鼠标键盘模块是实现此目的的最佳选择吗?

最佳答案

您的代码有问题。
您的列表是:

mouse_events = []
keyboard_events = []

但是您使用的是 events.append 而不是列表名称。看来您忘记修改代码了。

<小时/>

抛出错误是因为模块keyboard使用dict作为hook,与模块mouse不同,你可以' t 使用 list 作为键。

您可以使用lambda解决这个问题:

keyboard.hook(lambda _: keyboard_events.append(_))
<小时/>

有更简单的方法来做到这一点,无需使用hook,但它仅适用于模块keyboard

使用start_recording()stop_recording()

1) start_recording() 启用键盘事件的记录。它不需要回调,您可以一次录制一次。
2) stop_recording() 停止已开始的录音。它返回记录事件的列表。

mouse 模块没有 stop/start_recording
所以你的最终代码将如下所示:

import mouse
import keyboard

mouse_events = []


mouse.hook(mouse_events.append)
keyboard.start_recording()       #Starting the recording

keyboard.wait("a")

mouse.unhook(mouse_events.append)
keyboard_events = keyboard.stop_recording()  #Stopping the recording. Returns list of events
<小时/>

一起玩事件:

同时进行这两个事件的唯一方法是使用 threading

这是您的代码示例:

import threading
import mouse
import keyboard

mouse_events = []


mouse.hook(mouse_events.append)
keyboard.start_recording()

keyboard.wait("a")

mouse.unhook(mouse_events.append)
keyboard_events = keyboard.stop_recording()

#Keyboard threadings:

k_thread = threading.Thread(target = lambda :keyboard.play(keyboard_events))
k_thread.start()

#Mouse threadings:

m_thread = threading.Thread(target = lambda :mouse.play(mouse_events))
m_thread.start()

#waiting for both threadings to be completed

k_thread.join() 
m_thread.join()

关于python - 如何用Python同时记录鼠标和键盘的移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57664320/

相关文章:

android - 在 kotlin 中打开键盘时如何隐藏底部按钮?

android - 设备旋转后保持键盘状态

java - 鼠标悬停在图像上时多个图像发生变化

python - 分别读取不同的流

python - 使用 DictReader() 时出现 KeyError

c# - F10 键未被捕获

Java 鼠标监听器

delphi - 如何在Delphi中检测前进和后退鼠标按钮事件?

python - 根据条件,使用数据框 2 中的相应值填充数据框 1 的 A 列中的 NaN 值

python - Python 会自动用 << 1 替换 * 2 吗?