我正在尝试使用python创建一个对话框提示,其中包含使用AppleScript的Mac按钮。
使用带有"确定"和"取消"的常规对话框,我一直在简单地r = os.system("osascript -e 'Tell application "System Events" to display dialog ""+body+""'")
因为r == 0
是否按下"确定",如果按下"取消"r == 256
。
但现在我想要按钮。我尝试了r = os.system("osascript -e 'Tell application "System Events" to display dialog "Would you like do download audio or video?" buttons {"Audio", "Video"}'")
但是如果单击两个按钮,两个按钮都会返回r == 0
。
我尝试根据在线的一些示例使用subprocess.Popen()
,但是由于我不太了解它而遇到错误。我在网上找不到像我正在使用的那样使用AppleScript的示例。
谁能指出我如何做到这一点的正确方向?
经验答案如下...
尝试直接在终端中运行osascript
命令,而不是通过Python及其subprocess
模块。然后,您可以检查退出状态以及stdout
和stderr
的输出,以便您知道在Python中查找的位置。
所以,首先让我们看看退出状态,只需使用终端:
osascript -e "SOMETHING"
echo $?
打印的值将与Pythonsubprocess
的退出状态匹配,因此请尝试单击不同的按钮,看看你得到了什么。
接下来,看看stdout
和stderr
。因此,再次运行osascript
命令,但将stdout
重定向到名为stdout.txt
的文件,并将stderr
重定向到名为stderr.txt
的文件:
osascript -e "SOMETHING" > stdout.txt 2> stderr.txt
在对话框中选择不同的选项并按不同的按钮运行几次,但在每次使用后检查stdout.txt
和stderr.txt
的内容:
cat stdout.txt
cat stderr.txt
当你知道你想要的输出是处于退出状态,还是在stdout
或stderr
时,你就会知道在Python中寻找什么。
Shell 命令将其结果发送到标准输出或标准错误。 AppleScript 的display dialog
返回一条记录(例如{button returned: "OK"}
),shell 返回文本表示。 您可以整理返回的文本以获取按钮标题,或者只是让 AppleScript 返回所需的记录键,例如:
import os
r = os.system("osascript -e 'tell application "System Events" to return button returned of (display dialog "Would you like do download audio or video?" buttons {"Audio", "Video"})'")
请注意,目前不建议使用os.system
。 我没有当前的 Python 安装,但要使用子进程,它将是这样的:
import subprocess
script = 'tell application "System Events" to return button returned of (display dialog "Would you like to download audio or video?" buttons {"Audio", "Video"})'
result = subprocess.check_output(['osascript', '-e', script], text = True)
print(result)