





Вы можете вызвать "по умолчанию написать 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
Из python, если у вас установлен приложение (sudo 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)
Обратите внимание, что в Mac OS X 10.7 это изменит только изображение рабочего стола текущего рабочего стола, но не всех рабочих столов!
Также обратите внимание, что это повлияет только на рабочий стол монитора, на котором есть строка меню, но не на рабочие столы на другом мониторе. Есть ли способ заставить это повлиять на другой рабочий стол?
Существует однострочное решение, который работает без упаковки osascript в скрипт python.
AppleScript можно упростить до одной строки как tell application "Finder" to set desktop picture to POSIX file "/your/filename.jpg", и вы можете запустить его с терминала с osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/your/filename.jpg"'.
Я использовал appscript, если имя и расположение моих обоев совпадают, изображение не обновляется. Я использую PIL, чтобы изменить одно и то же изображение с другим текстом, когда я его запускаю, ничего не меняется. Но когда я перезагружаю свой ноутбук, отражаются последние изменения. Я думаю, что в ответе appscript чего-то не хватает. Мне нужно использовать killall Dock, чтобы обновить обои. Любые идеи без использования killall Dock
это работает без killall Dock. Я не мог заставить его работать.
Чтобы добавить к Ответ Мэтта Миллера: вы можете использовать subprocess.call () для выполнения команды оболочки следующим образом:
import subprocess
subprocess.call(["defaults", "write", "com.apple.Desktop", "background", ...])
Вы также можете использовать py-appscript вместо Popening osascript или использовать ScriptingBridge с pyobjc, который включен в 10.5, но немного более громоздкий в использовании.
Если вы делаете это для текущего пользователя, вы можете запустить из оболочки:
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
Вы, конечно, захотите заменить имя файла изображения и имя пользователя.
Новая настройка вступит в силу при запуске док-станции - либо при входе в систему, либо, когда вы
killall Dock
[На основе публикация в другом месте и на основе информации из Ответ Мэтта Миллера.]
это решение больше не работает с Mavericks, у которого есть еще один один лайнер, который поможет.
У меня был тот же вопрос, Кроме, что я хотел изменить обои на все подключенные мониторы. Вот скрипт 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__()
Другой способ программного изменения обоев рабочего стола - просто указать настройкой обоев на файл. Используйте свою программу, чтобы перезаписать файл с новым дизайном, затем перезапустите док: 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/ и, детка, у вас есть тушеное мясо!
Будет ли проблема с док-станцией, если пользователь что-то занят?
Не то чтобы я заметил. Он просто обновляет фон и закрепляет элементы.
есть способ сделать это, не убивая док. Я написал сценарий для обновления обоев каждые 5 секунд, killall Dock в этом случае будет обновлять мои элементы каждые 5 секунд.
Однострочное решение для Mavericks:
osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Earth Horizon.jpg"'
Основываясь на 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, чтобы получить вывод
По умолчанию есть коллекция качественных изображений в:
/Library/Desktop Pictures/
Чтобы автоматизировать выбор одного из них на всех рабочих столах без сторонней зависимости:
osascript -e 'tell application "System Events" to set picture of every desktop to "/Library/Desktop Pictures/Solid Colors/Stone.png"'
Это нормально сделать на своем компьютере или даже сделать так, чтобы другие пользователи могли легко установить фон. Однако не следует писать его как часть приложения, которое его автоматически устанавливает; рабочий стол предоставляется пользователю по выбору, и ни в коем случае приложение не может изменяться без явного разрешения пользователя.