如何修改Python按键录制宏代码以适配macOS系统?
macOS兼容的按键宏录制/回放代码修改方案
问题根源
原代码使用的keyboard模块在macOS上存在权限和兼容性问题;改用pynput后仍失效,是因为采用了轮询式按键检测,这种方式在macOS的事件机制下容易出现检测遗漏,且未正确利用pynput的事件驱动API。
修改后的代码
import time from pynput.keyboard import Key, Controller, Listener import pyautogui # 全局状态与数据存储 recorded_timestamps = [] is_recording = False keyboard_controller = Controller() def on_press(key): global is_recording, recorded_timestamps try: # 触发录制/停止(E键) if key.char == 'e': if not is_recording: print("开始录制") is_recording = True recorded_timestamps = [time.time()] else: print("停止录制") is_recording = False # 转换为相对时间输出 relative_times = [t - recorded_timestamps[0] for t in recorded_timestamps] print(f"录制完成,时间点列表: {relative_times}") # 录制过程中记录空格按键时间(空格键) elif key.char == ' ' and is_recording: recorded_timestamps.append(time.time()) # 回放录制内容(X键) elif key.char == 'x' and not is_recording: if len(recorded_timestamps) < 2: print("无录制内容可回放") return print("开始回放") pyautogui.click() # 按录制的时间间隔触发空格 for idx in range(1, len(recorded_timestamps)): time.sleep(recorded_timestamps[idx] - recorded_timestamps[idx-1]) keyboard_controller.press(Key.space) keyboard_controller.release(Key.space) # 退出程序(Q键) elif key.char == 'q': print("退出程序") return False # 终止监听器 except AttributeError: # 忽略特殊按键(如Shift、Ctrl等) pass # 启动按键监听 with Listener(on_press=on_press) as listener: listener.join()
关键修改说明
- 事件驱动替代轮询:使用
pynput的Listener类监听按键事件,避免轮询导致的检测失效,更适配macOS的事件处理机制。 - 权限配置提示:macOS需要手动授权:打开「系统偏好设置 → 安全性与隐私 → 输入监控」,勾选运行该代码的Python解释器,否则无法检测按键输入。
- 逻辑修复:
- 新增录制状态判断,避免重复录制或误操作;
- 回放前检查录制数据是否存在,防止报错;
- 使用
pynput.Controller模拟按键,替代pyautogui.keyDown,确保按键能正确释放,避免卡顿。
- 全局状态管理:用全局变量统一管理录制状态和时间戳,解决原代码中变量作用域问题。
内容的提问来源于stack exchange,提问作者pirosow
相关产品推荐
相关产品推荐

