Как я могу программно изменить фон рабочего стола в Mac OS X? Я бы хотел использовать python, но меня интересует любой способ. Могу ли я подключиться к терминалу и вызвать определенную команду?
Как я могу программно изменить фон в Mac OS X?
Ответ 1
Из python, если у вас установлен appscript (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)
Ответ 2
Если вы делаете это для текущего пользователя, вы можете запустить из оболочки:
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
[Основано на публикация в другом месте и на основе информации из Ответ Мэтта Миллера.]
Ответ 3
У меня был такой же вопрос, за исключением того, что я хотел изменить обои на всех подключенных мониторах. Здесь Python script использует 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
Вы можете вызвать "defaults write com.apple.Desktop Background...", как описано в этой статье: http://thingsthatwork.net/index.php/2008/02/07/fun-with-os-x-defaults-and-launchd/
В статье также написано, что это запускается автоматически, но первый бит должен начать работу.
Вы также можете быть заинтересованы в man-страницах по умолчанию: http://developer.apple.com/documentation/Darwin/Reference/ManPages/man1/defaults.1.html
Ответ 5
Однострочное решение для Mavericks:
osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Library/Desktop Pictures/Earth Horizon.jpg"'
Ответ 6
Основываясь на dF. answer, вы можете сделать это с помощью Apple Script без Finder, и вы можете сделать это для нескольких рабочих столов.
Чтобы установить обои для рабочего стола i
(номера настольных компьютеров начинаются с 1):
tell application "System Events"
set currDesktop to item i of desktop
set currDesktop 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 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
для получения вывода
Ответ 7
Чтобы добавить к ответ Matt Miller: вы можете использовать subprocess.call() выполнить команду оболочки так:
import subprocess
subprocess.call(["defaults", "write", "com.apple.Desktop", "background", ...])
Ответ 8
Вы также можете использовать py-appscript вместо Popening osascript или использовать ScriptingBridge с pyobjc, который включен в 10.5, но немного более громоздким для использования.
Ответ 9
Другой способ программного изменения рабочего стола - просто указать настройки обоев в файле. Используйте свою программу, чтобы перезаписать файл с новым дизайном, а затем перезапустите док-станцию: 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/
и ребенка, у вас есть тушеное мясо!