Как я могу программно изменить фон в Mac OS X?

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

Это нормально сделать на своем компьютере или даже сделать так, чтобы другие пользователи могли легко установить фон. Однако не следует писать его как часть приложения, которое его автоматически устанавливает; рабочий стол предоставляется пользователю по выбору, и ни в коем случае приложение не может изменяться без явного разрешения пользователя.

Jonathan Leffler 10.01.2009 22:08

... кроме офисных розыгрышей.

Nick T 06.11.2013 00:41
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
33
2
36 723
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Вы можете вызвать "по умолчанию написать 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 это изменит только изображение рабочего стола текущего рабочего стола, но не всех рабочих столов!

Robin 29.12.2011 01:32

Также обратите внимание, что это повлияет только на рабочий стол монитора, на котором есть строка меню, но не на рабочие столы на другом мониторе. Есть ли способ заставить это повлиять на другой рабочий стол?

iconoclast 01.06.2012 17:38

Существует однострочное решение, который работает без упаковки osascript в скрипт python.

aculich 13.10.2014 08:16

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"'.

user137369 18.11.2014 01:17

Я использовал appscript, если имя и расположение моих обоев совпадают, изображение не обновляется. Я использую PIL, чтобы изменить одно и то же изображение с другим текстом, когда я его запускаю, ничего не меняется. Но когда я перезагружаю свой ноутбук, отражаются последние изменения. Я думаю, что в ответе appscript чего-то не хватает. Мне нужно использовать killall Dock, чтобы обновить обои. Любые идеи без использования killall Dock

thenakulchawla 18.06.2017 05:56

это работает без killall Dock. Я не мог заставить его работать.

thenakulchawla 19.06.2017 03:24

Чтобы добавить к Ответ Мэтта Миллера: вы можете использовать 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, у которого есть еще один один лайнер, который поможет.

aculich 13.10.2014 08:18

У меня был тот же вопрос, Кроме, что я хотел изменить обои на все подключенные мониторы. Вот скрипт 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/ и, детка, у вас есть тушеное мясо!

Будет ли проблема с док-станцией, если пользователь что-то занят?

stib 17.04.2014 04:51

Не то чтобы я заметил. Он просто обновляет фон и закрепляет элементы.

DrumEater 17.04.2014 17:06

есть способ сделать это, не убивая док. Я написал сценарий для обновления обоев каждые 5 секунд, killall Dock в этом случае будет обновлять мои элементы каждые 5 секунд.

thenakulchawla 18.06.2017 05:53

Однострочное решение для 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"'

Другие вопросы по теме