如何以编程方式更改Mac OS X中的背景?

时间:2009-01-10 16:06:48

标签: python image macos

如何以编程方式更改Mac OS X中的桌面背景?我想使用python,但我对任何可能的方式感兴趣。我可以连接终端并拨打某个命令吗?

11 个答案:

答案 0 :(得分:38)

从python中,如果您安装了appscriptsudo easy_install appscript),则可以直接执行

from appscript import app, mactypes
app('Finder').desktop_picture.set(mactypes.File('/your/filename.jpg'))

否则,此AppleScript将更改桌面背景

tell application "Finder"
    set desktop picture to POSIX file "/your/filename.jpg"
end tell

您可以使用osascript从命令行运行它,或使用类似

的Python运行它
import subprocess

SCRIPT = """/usr/bin/osascript<<END
tell application "Finder"
set desktop picture to POSIX file "%s"
end tell
END"""

def set_desktop_background(filename):
    subprocess.Popen(SCRIPT%filename, shell=True)

答案 1 :(得分:21)

如果您正在为当前用户执行此操作,则可以从shell运行:

defaults write com.apple.desktop Background '{default = {ImageFilePath = "/Library/Desktop Pictures/Black & White/Lightning.jpg"; };}'

或者,作为root,为另一个用户:

/usr/bin/defaults write /Users/joeuser/Library/Preferences/com.apple.desktop Background '{default = {ImageFilePath = "/Library/Desktop Pictures/Black & White/Lightning.jpg"; };}'
chown joeuser /Users/joeuser/Library/Preferences/com.apple.desktop.plist

您当然希望替换图像文件名和用户名。

当Dock启动时,新设置将生效 - 无论是在登录时,还是在

killall Dock

[基于a posting elsewhere,基于Matt Miller's answer的信息。]

答案 2 :(得分:12)

我有同样的问题,除了,我想更改所有连接的监视器上的壁纸。这是使用appscript的Python脚本(如上所述; sudo easy_install appscript)就是这样做的。

#!/usr/bin/python

from appscript import *
import argparse

def __main__():
  parser = argparse.ArgumentParser(description='Set desktop wallpaper.')
  parser.add_argument('file', type=file, help='File to use as wallpaper.')
  args = parser.parse_args()
  f = args.file
  se = app('System Events')
  desktops = se.desktops.display_name.get()
  for d in desktops:
    desk = se.desktops[its.display_name == d]
    desk.picture.set(mactypes.File(f.name))


__main__()

答案 3 :(得分:4)

您可以按照本文所述调用“defaults write com.apple.Desktop Background ...”:http://thingsthatwork.net/index.php/2008/02/07/fun-with-os-x-defaults-and-launchd/

本文还将脚本编写为自动运行,但第一点可以让你开始。

您可能还对默认手册页感兴趣:http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/defaults.1.html

答案 4 :(得分:3)

小牛队的一线解决方案是:

osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Earth Horizon.jpg"'

答案 5 :(得分:3)

dF.'s answer上构建,您可以使用不带Finder的Apple Script执行此操作,您可以在多个桌面上执行此操作。

设置桌面i的壁纸(桌面编号从1开始):

tell application "System Events"
    set currDesktop to item i of desktop
    set currDesktop's picture to "image_path"
end tell

这就是我最终做的(在Python中):

SET_DESKTOP_IMAGE_WRAPPER = """/usr/bin/osascript<<END
tell application "System Events"
{}
end tell
END"""

SET_DESKTOP_IMAGE = """
set currDesktop to item {idx} of desktops
set currDesktop's picture to "{image_path}"
"""

def set_wallpapers(images):
    """ images is an array of file paths of desktops """

    script_contents = ""
    for i, img in enumerate(images):
        idx = i+1
        script_contents += SET_DESKTOP_IMAGE.format(idx=idx, image_path=img)

    script = SET_DESKTOP_IMAGE_WRAPPER.format(script_contents)
    subprocess.check_call(script, shell=True)

有时,桌面图像不会立即显示。我不知道为什么会这样,但重启码头会修复它。 要从python中做到这一点:

subprocess.check_call("killall Dock", shell=True)

顺便说一句,您可以使用此AppleScript代码获取系统上的桌面数量:

tell application "System Events"
    get the number of desktops
end tell

您可以使用subprocess.check_output来获取输出

答案 6 :(得分:1)

要添加到Matt Miller's response:您可以使用subprocess.call()执行shell命令,如下所示:

import subprocess
subprocess.call(["defaults", "write", "com.apple.Desktop", "background", ...])

答案 7 :(得分:0)

你也可以使用py-appscript而不是Popening osascript或者使用ScriptingBridge和pyobjc,后者包含在10.5中,但使用起来有点麻烦。

答案 8 :(得分:0)

以编程方式更改桌面墙纸的另一种方法是简单地将壁纸设置指向文件。使用您的程序用新设计覆盖文件,然后重新启动dock:killall Dock

以下内容取决于Xcode,lynx和wget,但这里是我如何自动下载并安装Mountain Lion上的月度壁纸(无耻地被盗并改编自http://ubuntuforums.org/showthread.php?t=1409827):

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/local/bin
size=1440
dest="/usr/local/share/backgrounds/wallpaperEAA.jpg"
read -r baseurl < <(lynx -nonumbers -listonly -dump 'http://www.eaa.org/en/eaa/aviation-education-and-resources/airplane-desktop-wallpaper' | grep $size) &&
wget -q "$baseurl" -O "$dest"
killall Dock

将它转移到/etc/periodic/monthly/和宝贝,你有一个炖肉!

答案 9 :(得分:0)

以下位置默认包含高质量的图像:

/Library/Desktop Pictures/

要在所有桌面之间自动选择其中之一,而无需第三方依赖性:

osascript -e 'tell application "System Events" to set picture of every desktop to "/Library/Desktop Pictures/Solid Colors/Stone.png"'

答案 10 :(得分:0)

将以下内容放入您的 ~/.bashrc

function wallpaper() {
    wallpaper_script="tell application \"Finder\" to set desktop picture to POSIX file \"$HOME/$1\""
    osascript -e $wallpaper_script 
}

像这样使用:

wallpaper /path/to/image.png