You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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()

关键修改说明

  1. 事件驱动替代轮询:使用pynput的Listener类监听按键事件,避免轮询导致的检测失效,更适配macOS的事件处理机制。
  2. 权限配置提示:macOS需要手动授权:打开「系统偏好设置 → 安全性与隐私 → 输入监控」,勾选运行该代码的Python解释器,否则无法检测按键输入。
  3. 逻辑修复:
    • 新增录制状态判断,避免重复录制或误操作;
    • 回放前检查录制数据是否存在,防止报错;
    • 使用pynput.Controller模拟按键,替代pyautogui.keyDown,确保按键能正确释放,避免卡顿。
  4. 全局状态管理:用全局变量统一管理录制状态和时间戳,解决原代码中变量作用域问题。

内容的提问来源于stack exchange,提问作者pirosow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:50:36