【问题标题】:How to record mouse and keyboard movement simultaneously with Python?如何用 Python 同时记录鼠标和键盘的移动?
【发布时间】:2019-12-31 00:34:00
【问题描述】:

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

我认为这可以通过keyboardmouse 模块来实现。在之前的一个问题中,我问了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) 行会抛出错误: TypeError: unhashable type: 'list'

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

所以,总结一下:如何同时启动鼠标和键盘录制,同时停止它们并同时运行它们? mousekeyboard 模块是实现这一目标的最佳选择吗?

【问题讨论】:

    标签: python keyboard mouse


    【解决方案1】:

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

    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() 停止开始录制。它返回记录的事件列表。

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

    【讨论】:

    • 谢谢,但你能同时玩它们吗?使用mouse.play 然后keyboard.play 不是我期望做的。有什么想法吗?
    • @PauloSchreiner 可以通过threading。检查编辑
    • 完美。谢谢!
    • 事件不同步,但鼠标的播放速度比键盘快。有解决办法吗?
    • @Wboy 我不确定,但可能的原因是模块出现故障
    【解决方案2】:

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

    它在后台创建一个简单的 Python 文件,其中包含 Pyautogui 模块,并使用 Pynput 完成录制

    免责声明:我是作者。

    【讨论】:

      猜你喜欢
      • 2021-09-21
      • 2011-01-15
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      相关资源
      最近更新 更多