如何在Python中获取AppleScript对话框的按钮响应?
解决Mac上Python结合AppleScript自定义按钮对话框的返回值问题
问题原因
os.system()只能获取AppleScript的退出码,当使用自定义按钮(非默认OK/Cancel)时,无论点击哪个自定义按钮,AppleScript的退出码都是0,无法区分用户操作。自定义按钮的选择结果会通过标准输出返回,而非退出码。
解决方法:使用subprocess捕获输出
改用subprocess.run()或subprocess.check_output()执行AppleScript命令,捕获并解析标准输出内容,判断用户点击的按钮。
示例代码
import subprocess def show_custom_dialog(body): # 转义body中的双引号,避免AppleScript语法错误 escaped_body = body.replace('"', '\\"') # 构造AppleScript命令,定义自定义按钮 applescript = f'Tell application "System Events" to display dialog "{escaped_body}" buttons {{"Audio", "Video"}} default button 1' try: # 执行命令并捕获输出 result = subprocess.run( ['osascript', '-e', applescript], capture_output=True, text=True, check=True ) # AppleScript返回格式为 "button returned:按钮名称" output = result.stdout.strip() if "Audio" in output: return "Audio" elif "Video" in output: return "Video" except subprocess.CalledProcessError: # 用户点击了取消(若对话框有取消按钮)或关闭了对话框 return "Cancel" # 调用示例 selected = show_custom_dialog("请选择媒体类型") print(f"用户选择了: {selected}")
代码说明
subprocess.run()的capture_output=True用于捕获标准输出和错误输出,text=True让输出以字符串形式返回,避免字节处理。check=True会在AppleScript执行失败(比如用户按Esc关闭对话框)时抛出CalledProcessError,方便捕获取消操作。- 对
body中的双引号进行转义,防止AppleScript命令因语法错误执行失败。
额外提示
如果需要添加取消按钮,可以修改AppleScript的buttons参数为{"Audio", "Video", "Cancel"},此时用户点击Cancel会触发CalledProcessError,对应返回的"Cancel"结果。
内容的提问来源于stack exchange,提问作者Alfie Stoppani
相关产品推荐
相关产品推荐

