如何将keyboard.record结果存TXT并通过keyboard.play调用?
解决Python键盘宏跨进程回放问题
问题根源
你遇到的核心问题是:keyboard.record()返回的是KeyEvent对象列表,直接转字符串会丢失对象属性;而默认的to_json序列化后,跨进程读取得到的是普通字典,不是KeyEvent实例,keyboard.play()无法识别这些字典,导致回放失败。
解决方案:自定义序列化与反序列化
手动提取KeyEvent的关键属性保存为JSON,回放时再把字典重新构造为KeyEvent对象,就能实现跨进程的宏存储与回放。
1. 录制宏并序列化到文件
import keyboard import json def record_macro(file_path): # 录制按键直到按下Esc events = keyboard.record(until='Esc') # 将每个KeyEvent转为可序列化的字典 serialized_events = [] for event in events: serialized_events.append({ 'name': event.name, 'time': event.time, 'scan_code': event.scan_code, 'is_down': event.is_down, 'device': event.device, 'modifiers': event.modifiers, 'is_keypad': event.is_keypad }) # 写入JSON文件 with open(file_path, 'w', encoding='utf-8') as f: json.dump(serialized_events, f, indent=2)
2. 读取文件并回放宏
def play_macro(file_path): # 读取JSON中的序列化数据 with open(file_path, 'r', encoding='utf-8') as f: serialized_events = json.load(f) # 将字典重新构造为KeyEvent对象 events = [] for event_dict in serialized_events: event = keyboard.KeyEvent( name=event_dict['name'], time=event_dict['time'], scan_code=event_dict['scan_code'], is_down=event_dict['is_down'], device=event_dict['device'], modifiers=event_dict['modifiers'], is_keypad=event_dict['is_keypad'] ) events.append(event) # 执行回放 keyboard.play(events)
3. 使用示例
# 录制宏到文件 record_macro('my_macro.json') # 跨进程回放(比如另一个脚本中) play_macro('my_macro.json')
注意事项
- 确保使用相同版本的
keyboard库,不同版本的KeyEvent属性可能存在差异,需对应调整序列化的字段。 - 部分特殊按键(如多媒体键、自定义快捷键)可能需要额外处理属性,建议测试覆盖常用场景。
- 存储文件时尽量使用绝对路径,避免跨进程运行时出现路径找不到的问题。
内容的提问来源于stack exchange,提问作者banom
相关产品推荐
相关产品推荐

