如何在Python中从AppleScript获取返回值?

时间:2018-08-09 20:16:04

标签: python applescript appkit

我需要获取Python窗口的大小并将其分配给变量。我正在尝试:

windowSize = '''
    tell application "System Events" to tell application process "%(app)s"
    get size of window 1
    end tell
    ''' % {'app': app} // app = "Terminal


(wSize, error) = Popen(['osascript', '/Setup.scpt'], stdout=PIPE).communicate()
print("Window size is: " + wSize)

我仅收到此错误:TypeError: can only concatenate str (not "bytes") to str

我是Python的新手,希望您能为我提供帮助

1 个答案:

答案 0 :(得分:2)

您需要将AppleScript(即windowSize)作为输入传递给Popen.communicate()

示例:

from subprocess import Popen, PIPE

app = "Terminal"

windowSize = '''
    tell application "%(app)s"
      get size of window 1
    end tell
  ''' % {'app': app}

proc = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True)
wSize, error = proc.communicate(windowSize)
print("Window size is: " + wSize)

注释

  • 在您的windowSize AppleScript中,不必tell application "System Events" to tell ...,而只需tell application "%(app)s"。但是,假设在系统偏好设置中启用了辅助设备访问,您仍然可以使用AppleScript。

  • 这会将类似以下内容的内容记录到控制台:

      

    Window size is: 487, 338

    您可能要考虑利用print语句中的str.replace(),替换逗号(x)。例如,将上面要点中的print语句更改为此:

    print("Window size is: " + wSize.replace(",", " x"))
    

    将改为打印以下内容:

      

    Window size is: 487 x 338

  • 如果您想将上面procwSize开头的两行代码替换为一行(类似于您的OP),则用以下代码替换代替:

    (wSize, error) = Popen(['osascript', '-'], stdin=PIPE, stdout=PIPE, stderr=PIPE, universal_newlines=True).communicate(windowSize)
    
  • 要将窗口 width height 作为两个单独的变量,您可以随后使用str.split()方法来拆分wSize变量(使用字符串", "作为分隔符)。例如:

    # ...
    wWidth = wSize.split(", ")[0]
    wHeight = wSize.split(", ")[1]
    
    print("Window width is: " + wWidth)
    print("Window height is: " + wHeight)