Как я могу программно изменить фон в Mac OS X? - PullRequest
30 голосов
/ 10 января 2009

Как я могу пойти о программном изменении фона рабочего стола в Mac OS X? Я хотел бы использовать Python, но меня интересует любой возможный способ. Могу ли я подключиться к Терминалу и вызвать определенную команду?

Ответы [ 9 ]

38 голосов
/ 10 января 2009

Из python, если у вас установлено appscript (sudo easy_install appscript), вы можете просто сделать

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

В противном случае этот яблочный скрипт изменит фон рабочего стола

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)
21 голосов
/ 22 января 2010

Если вы делаете это для текущего пользователя, вы можете запустить из оболочки:

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

[На основании сообщения в другом месте и на основе информации из ответа Мэтта Миллера .]

12 голосов
/ 19 июля 2011

У меня был тот же вопрос, за исключением , что я хотел изменить обои на всех подключенных мониторах. Вот скрипт Python, использующий appscript (упомянутый выше; 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__()
4 голосов
/ 10 января 2009

Вы можете вызвать «по умолчанию напишите 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

3 голосов
/ 28 декабря 2017

Основываясь на ответе dF. , вы можете сделать это с помощью Apple Script без Finder и вы можете сделать это для нескольких рабочих столов.

Чтобы установить обои для рабочего стола 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, чтобы получить вывод

3 голосов
/ 13 октября 2014

Однострочное решение для Mavericks:

osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Earth Horizon.jpg"'
1 голос
/ 10 января 2009

Чтобы добавить к ответ Мэтта Миллера : вы можете использовать subprocess.call () для выполнения команды оболочки следующим образом:

import subprocess
subprocess.call(["defaults", "write", "com.apple.Desktop", "background", ...])
0 голосов
/ 13 февраля 2013

Еще один способ программно изменить обои рабочего стола - просто указать настройку обоев на файл. Используйте вашу программу, чтобы перезаписать файл с новым дизайном, затем перезапустите док: 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/ и, детка, у тебя есть тушеное мясо!

0 голосов
/ 10 января 2009

Вы также можете использовать py-appscript вместо Popasasascript или использовать ScriptingBridge с pyobjc, который включен в 10.5, но немного более громоздким для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...