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

How to record mouse and keyboard movement simultaneously with Python?

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

我认为这可以通过 keyboardmouse 模块来实现。在较早的问题中,我问了,得到了以下代码:

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)行报错: TypeError: unhashable type: 'list'

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

所以,总结一下:我怎样才能同时开始鼠标和键盘录制,同时停止它们和同时 运行 两者? mousekeyboard 模块是实现此目标的最佳选择吗?

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

mouse_events = []
keyboard_events = []

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


错误是因为模块 keyboard 使用 dict 作为 hook 与模块 mouse 不同,您不能使用 list 作为键。

您可以使用 lambda:

来解决这个问题
keyboard.hook(lambda _: keyboard_events.append(_))

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

使用start_recording()stop_recording()

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

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

您也可以使用为此目的开发的software,而且事件会同步,这里是展示基本用法的 GIF:

它在后台创建一个简单的 Python 文件,其中包含模块 Pyautogui and the recording is done with Pynput

免责声明:我是作者。