Pau*_*ner 5 python keyboard mouse
我想创建一个函数来记录鼠标和键盘事件,直到按下特定键,然后一起重放它们。
我认为这可以通过keyboard
和mouse
模块来实现。在之前的一个问题中,我询问了如何记录鼠标移动直到按下某个键,我得到了以下代码:
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
Run Code Online (Sandbox Code Playgroud)
这很好用。由于两个模块都是由同一个人制作的,因此我认为键盘模块也可以使用相同的模块。但事实并非如此。
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)
Run Code Online (Sandbox Code Playgroud)
keyboard.hook(events.append)
上面代码中的行抛出一个错误:
TypeError: unhashable type: 'list'
。
我试图检查模块文件,但我无法理解其中的大部分内容。
所以,总结一下:如何同时开始鼠标和键盘录制,同时停止它们并同时运行它们?是mouse
和keyboard
模块来实现这一目标的最佳选择吗?
你的代码有问题。
您的清单是:
mouse_events = []
keyboard_events = []
Run Code Online (Sandbox Code Playgroud)
但是您使用的是events.append
而不是列表名称。看起来你忘记修改代码了。
该错误被抛出,因为该模块keyboard
使用dict
了hook
不同模块mouse
,你不能用list
作为键。
您可以使用lambda
以下方法解决此问题:
keyboard.hook(lambda _: keyboard_events.append(_))
Run Code Online (Sandbox Code Playgroud)
有更简单的方法可以不使用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
Run Code Online (Sandbox Code Playgroud)
一起播放事件:
同时播放两个事件的唯一方法是使用 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()
Run Code Online (Sandbox Code Playgroud)