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

2024-01-09

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

我认为这可以通过keyboard and mouse模块。在之前的一个问题中,我问过如何记录按下按键之前的鼠标移动 https://stackoverflow.com/questions/57642617/how-to-record-the-mouse-movement-until-a-key-is-pressed-with-python?noredirect=1#comment101746612_57642617,我得到了以下代码:

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)

The keyboard.hook(events.append)上面代码中的行会引发错误:TypeError: unhashable type: 'list'.

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

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


您的代码有问题。
您的清单是:

mouse_events = []
keyboard_events = []

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


抛出错误是因为模块keyboard uses dict for hook与模块不同mouse你不能使用list作为钥匙。

您可以使用以下方法解决此问题lambda:

keyboard.hook(lambda _: keyboard_events.append(_))

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

Use start_recording() and stop_recording()

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

mouse module doesn't have stop/start_recording
So your final code will look like this:

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 https://realpython.com/intro-to-python-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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用Python同时记录鼠标和键盘的移动? 的相关文章

随机推荐