Unityのコマンドラインからデスクトップの背景を変更する方法は?


63

NASA APODで毎日デスクトップの背景を更新するスクリプトがあります。11.10にアップグレードしてから、おそらくスクリプトを使用gconftool-2してデスクトップの背景を実際に更新しているため、そのスクリプトは動作しなくなりました。Unityでこれを行う新しい方法はありますか?

回答:


82

UnityとGnome Shell(Gnome 3)は、GConfの代わりにGSettingsを使用するようになりました。そのため、UnityおよびGnome Shellでは、コマンドラインツールgsettingsを使用できます。のようにgconftool、個々のキーを取得または設定できます。

次のように、背景画像の現在のURIを取得できます。

gsettings get org.gnome.desktop.background picture-uri
'file:///home/serrano/Pictures/x.jpg'

そして、背景URIを次のように設定します(デスクトップの背景がすぐに更新されます):

gsettings set org.gnome.desktop.background picture-uri file:///home/serrano/Pictures/y.jpg

これを機能させるには、「file://」をURIの先頭に追加する必要があることに注意してください(とは異なりますgconftool)。

スクリプトをGnome 2とShell / Unityの両方で動作させるために、最初にGnomeバージョンチェックを実行させることができます。

gnome-session --version

それはGnomeのバージョンを返します。バージョン番号が3で始まる場合は、gsettings使用できます。2で始まるバージョンが返される場合は、gconftool代わりにスクリプトで使用してください。


Ubuntu 12.04でこのコマンドを使用しましたが、システムがクラッシュしました
YumYumYum

2
@YumYumYum:上記のコマンドがシステムでクラッシュすることは非常に珍しいことです。
セラーノ

gsettingsを使用してデスクトップ環境のリストにCinnamonを追加できます;)
MrVaykadji 14年

(gconftoolとは異なり)これが機能するには、URIの前に「file://」を追加する必要があることに注意してください。<-これは重要です!私はこれが他のどこかに明示的に言及されているのを見つけませんでした。
トム14年

2
ログインしている現在のユーザーにはこれで問題ありません。別のユーザーの壁紙をプログラムで変更する方法を知りたいのですが。sudo --user = <username> gsettingsを試しましたが、失敗しました。
kaiwan 14年

12

このコードは、指定されたディレクトリから壁紙をランダムに変更します。

#!/bin/bash

DIR="/home/indra/Pictures/wallpapers"
PIC=$(ls $DIR/* | shuf -n1)
gsettings set org.gnome.desktop.background picture-uri "file://$PIC"

このスクリプトを保存し、コマンド「crontab -e」で編集します(ファイルの最後にこの行を配置するエディターを起動します)。

*/1     *     *     *     *         /bin/bash /path/to/script.sh

1
壁紙ディレクトリには、壁紙ファイルのみが含まれ、ディレクトリは含まれない必要があります。
loxaxs

ただし、gsettingsはcronからは機能しません。gsettingsを機能させるには、DBUS_SESSION_BUS_ADDRESS環境変数を設定する必要があります。これを行うには、gsettings(セミコロンで区切られた行:) PID = $(pgrep gnome-session)の前にこれらの2行を追加します。export DBUS_SESSION_BUS_ADDRESS = $(grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environ | cut -d = -f2-);
ウィルブラッドリー

6

前書き

この回答は、元の回答の編集です。UbuntuとLinuxの研究を進めるにつれて、さまざまなアプローチを発見し、Ubuntuで背景を設定する方法についての理解を深めました。この回答は、これまでに学んだことをできる限り最高に文書化しようとする私の試みであり、この資料が他の人に役立つことを期待して行われています。

重要な部分は、コマンドラインからUnityデスクトップの背景を設定するために使用できることです

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'

Unityでの背景設定とベアXデスクトップ

Unityの動作方法は、下に裸のXデスクトップがあり、その上にUnityのデスクトップウィンドウ(実際にはUbuntuのデフォルトのファイルマネージャーであるNautilusのウィンドウの特別なインスタンス)があります。したがって、あなたが電話するとき

gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'

その特別なNautilusウィンドウの背景を設定します。でデスクトップアイコンを無効にすると

gsettings set org.gnome.desktop.background show-desktop-icons false

Nautilusデスクトップが強制終了され、必要最低限​​のXデスクトップが表示されます。ベアボーンXデスクトップの場合、fehプログラムを使用できます。特に、このコマンド:

feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg

それに代わるGUIもありnitrogenます。fehそしてnitrogenアプローチは、次のようなユニティ以外のデスクトップ、一緒に使用することができますopenboxblackbox。このgsettingsアプローチは、Unityまたは他のGNOMEベースのデスクトップで使用できます。

gsettingsコマンドの分析

gsettingsコマンドは正確に何をしますか?まず、最初に、各ユーザーの設定のdconfデータベースがあります。これは、非推奨のGConfの代替として意図されており、dconfコマンドまたはでアクセスできますgsettings。特に、ここではorg.gnome.desktop.backgroundスキーマとそのキーの1つを扱ってい ますpicture-uri

URIはfile:///home/JohnDoe/Pictures/cool_wallpaper.png、実際にはUniform Resource Identifierの略で、もともとはインターネットで使用するために作成されたものですが、ファイルURIスキームがあります。URIの素晴らしい点は、英語以外のロケールを使用している場合、たとえば中国のデスクトップで、バイトエンコードされたパスを提供することです。背景には次のURIがあります。'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

gsettingsを使用したスクリプト作成

もちろん、毎回コマンドを書き出すのは退屈であり、少しのスクリプトマジックを使用できます。たとえば、~/.bashrc背景を自由に変更できるように、ここで設定したものを次に示します。

change_background() {
    FILE="'file://$(readlink -e "$1" )'" 
    if [ "$FILE" != "'file://'" ] 
    then
        gsettings set org.gnome.desktop.background picture-uri "$FILE" 
    else
        echo "File doesn't exist" 
    fi 
} 

この関数は、次のような絶対パスで呼び出すことができます。

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

または現在の作業ディレクトリからの相対パスで

change_background Pictures/cool_wallpaper.jpg

また、ファイルが存在するかどうかのチェックを実行し、シンボリックリンクを解決します。これは、シェルスクリプトで使用することも、毎日使用するスタンドアロン機能として使用することもできます。

もちろん、これが唯一の方法ではありません。PythonにはGioのAPIがあります(これは背後のメインライブラリですgsettings)。gsettings_getおよびを作成しました。gsettings_setこれらはLauncher List Indicatorなどの他のプロジェクトに非常に役立ちました。背景を設定する場合、それを使用することもできます。この質問では、最近使用しました。同じアプローチの簡易バージョンを次に示します。

#!/usr/bin/env python3
"""
Author: Serg Kolo , <1047481448@qq.com>
Date: December, 21,2016
Purpose: script for setting wallpaper, the pythonic way
Written for: https://askubuntu.com/q/66914/295286
"""
from gi.repository import Gio
import os,sys,random

def gsettings_set(schema, path, key, value):
    """Set value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema, path)
    if isinstance(value, list):
        return gsettings.set_strv(key, value)
    if isinstance(value, int):
        return gsettings.set_int(key, value)
    if isinstance(value,str): 
        return gsettings.set_string(key,value)

def error_and_exit(message):
    sys.stderr.write(message + "\n")
    sys.exit(1)

def main():
    gschema='org.gnome.desktop.background'
    key='picture-uri'
    if len(sys.argv) != 2:
        error_and_exit('>>> Path to a file is required')
    if not os.path.isfile(sys.argv[1]):
        error_and_exit('>>> Path "' + sys.argv[1] + \
                       '" isn\'t a file or file doesn\'t exit')
    full_path = os.path.abspath(sys.argv[1])
    uri = Gio.File.new_for_path(full_path).get_uri()
    gsettings_set(gschema,None,key,uri)


if __name__ == '__main__': main()

もちろん、ここでもスクリプトの同じルールが適用されます。それが実行可能にchmod +x set_wallpaper.pyなり、(好ましくは)~/binフォルダーに保存されること を確認してください。使い方は簡単です。./set_wallpaper.py Picture/cool_image.py このスクリプトのソースコードは、他の多くのスクリプトとともに、GitHubリポジトリでも入手できます。


1

Serranoのすばらしい回答のおかげで、黒の背景を設定するために、新しいマシンセットアップスクリプトの一部として使用するこのスクリプトを作成できました。

#! /bin/bash
SRC_URI="https://i.imgur.com/uomkVIL.png"
FNAME="/home/$USER/Pictures/black.png"
wget "$SRC_URI" -O "$FNAME"
gsettings set org.gnome.desktop.background picture-uri "$FNAME"

1

また、これを使用することができます:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.