Unity'deki masaüstü arkaplanını komut satırından nasıl değiştirebilirim?


63

NASA APOD ile her gün masaüstü arka planımı güncelleyen bir betiğim var. 11.10'a yükselttiğinden beri, muhtemelen gconftool-2masaüstü arkaplanını güncellemek için kullandığım için bu senaryo çalışmayı durdurdu . Bunu Unity'de yapmanın yeni bir yolu var mı?

Yanıtlar:


82

Hem Unity hem de Gnome Shell (Gnome 3) artık GConf yerine GSettings kullanıyor. Böylece Unity ve Gnome Shell'de bunun için komut satırı aracını kullanabilirsiniz gsettings. Gibi gconftool, bireysel bir anahtar almak veya ayarlamanızı sağlar.

Arka plan görüntüsünün geçerli URI'sini aşağıdaki gibi alabilirsiniz:

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

Arkaplan URI'sini aşağıdaki gibi ayarlayın (bu, masaüstü arkaplanınızı hemen güncelleyecektir):

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

Bunun çalışması için URI'yi "file: //" ile hazırlamanız gerektiğine dikkat edin gconftool.

Komut dosyanızın hem Gnome 2 hem de Shell / Unity ile çalışmasını sağlamak için önce bir Gnome sürüm kontrolü yapmasına izin verebilirsiniz:

gnome-session --version

Bu Gnome'un versiyonunu döndürür. Sürüm numarası 3 ile başlıyorsa, o gsettingszaman kullanılabilir. 2 ile başlayan bir sürüm döndürürse, komut dosyanızın gconftoolbunun yerine kullanılmasına izin verin .


Bu komutu Ubuntu
12.04'te

2
@YumYumYum: Sisteminizde başka bir şey olmadıkça, yukarıdaki komutların sisteminizi çökertmesi çok nadirdir.
Serrano,

Gsettings;)
MrVaykadji

Bunun çalışması için URI'yi "file: //" ile hazırlamanız gerektiğine dikkat edin (gconftool'dan farklı olarak). <- Bu önemli! Açıkça belirtilen başka bir yerde bulamadım.
Tom

2
Bu giriş yapmış olan kullanıcı için gayet iyi. Başka bir kullanıcının duvar kağıdının programlı olarak nasıl değiştirileceğini bilmek istiyorum ! Sudo --user = <username> gsettings ... 'ı denedim ama bu başarısız oldu.
kaiwan

12

Bu kod, duvar kağıdını rastgele bir dizinden değiştirir.

#!/bin/bash

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

Bu betiği kaydedin ve "crontab -e" komutunu kullanarak düzenleyin (bu satırı dosyanın sonuna koyduğunuz bir düzenleyiciyi başlatır):

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

1
Duvar kağıdı dizini sadece duvar kağıdı dosyalarını içermeli ve dizin içermemelidir.
loxaxs

Ancak, gsettings cron'dan çalışmaz. gsettings'in çalışması için DBUS_SESSION_BUS_ADDRESS ortam değişkenini ayarlamanız gerekir. Bunu, gsettings'den önce bu iki satırı ekleyerek yapabilirsiniz (noktalı virgüllerle ayıran satırlar :) PID = $ (pgrep gnome-session); dışa aktarma DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / environ | cut -d = -f2-);
willbradley

6

Giriş

Bu cevap, orijinal cevabın bir düzenlemesidir. Ubuntu ve Linux çalışmalarımda ilerlerken, çeşitli yaklaşımlar keşfettim ve bir arka plan oluşturmanın Ubuntu'da nasıl çalıştığını anladığımı anladım. Bu cevap, şu ana kadar öğrendiklerimi en iyi şekilde belgeleme çabam ve bu malzemenin başkaları için faydalı olacağı umuduyla yapıldı.

Önemli olan, Unity masaüstünün arka planını komut satırından ayarlamak için kullanabilirsiniz.

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

Unity vs bare X masaüstünde arka plan belirleme

Unity'nin çalışma şekli aşağıda çıplak bir X masaüstü olacak şekildedir ve yukarıda Unity'nin masaüstü penceresi vardır (aslında, Ubuntu'nun varsayılan dosya yöneticisi olan Nautilus'un özel bir örneğidir). Böylece, aradığınızda

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

Bu özel Nautilus penceresi için arka planı ayarlar. Masaüstü simgelerini ile devre dışı bıraktığınızda

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

Bu, Nautilus masaüstünü öldürecek ve size çıplak X-masaüstünü gösterecek. Çıplak kemikli X masaüstü için fehprogramı kullanabilirsiniz . Özellikle, bu komut:

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

Ayrıca buna GUI alternatifi var nitrogen. fehVe nitrogenyaklaşımlar gibi Unity dışında masaüstü, kullanılabilir openboxya da blackbox. gsettingsYaklaşım Birlik veya diğer GNOME tabanlı masaüstü ile kullanılabilir.

Gsettings komutunu kapatmak

gsettingsKomut tam olarak ne yapar ? Öncelikle, kullanımdan kaldırılmış GConf'un yerine geçmesi amaçlanan her kullanıcı için dconf ayarları veritabanı bulunmaktadır ve bu komutlara ya da komutları aracılığıyla erişilebilir . Özellikle, burada şema ve anahtarlarından biriyle uğraşıyoruz .dconfgsettingsorg.gnome.desktop.backgroundpicture-uri

Bu file:///home/JohnDoe/Pictures/cool_wallpaper.pngaslında URI, aslında internet kullanımı için yaratılmış olan Tekdüzen Kaynak Tanımlayıcısı anlamına geliyor , ancak burada gördüğümüz şey URI şeması var. İngilizce olmayan bir yerel ayar kullanıyorsanız, örneğin Çin masaüstümde, adamım için URI’yı izlemem gerekirse, URI’daki en önemli şey, bayt kodlu yol vermesidir:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

Gsettings ile komut dosyası

Elbette, her seferinde komutu yazmak sıkıcıdır ve kişi bir miktar komut dosyası sihirini kullanabilir. Mesela, istediklerimi ~/.bashrcdeğiştirebilmem için benim için ayarladıklarım :

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 
} 

Bu fonksiyon gibi mutlak yollarla çağrılabilir.

change_background /home/JohnDoe/Pictures/cool_wallpaper.jpg

veya geçerli çalışma dizinden göreceli yolla

change_background Pictures/cool_wallpaper.jpg

Ayrıca dosyanın olup olmadığını kontrol eder ve sembolik bağlantıları çözer. Bu, bir kabuk komut dosyasında veya günlük kullanım için bağımsız işlev olarak kullanılabilir.

Tabii ki, bu tek yol değil. Python'un Gio için bir API'si var (arkasındaki ana kütüphane gsettings). Başlatıcısı Göstergesi gibi diğer projeler için oldukça yararlı olan bir gsettings_getve gsettings_setişlevleri yazdım . Bir arka plan belirleme durumunda da kullanılabilir ve bu soruyu daha yeni kullandım . İşte aynı yaklaşımın basitleştirilmiş bir versiyonu:

#!/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()

Elbette, aynı komut dosyaları için de burada geçerlidir: çalıştırılabilir olduğundan emin olun chmod +x set_wallpaper.pyve (tercihen) ~/binklasöründe saklayın . Kullanımı basittir: ./set_wallpaper.py Picture/cool_image.py Bu komut dosyasının kaynak kodu GitHub depomda da birçok komut dosyasıyla birlikte bulunmaktadır.


1

Serrano'nun müthiş cevabı sayesinde, siyah arka plan ayarlamak için yeni makine kurulum komut dosyalarımın bir parçası olarak kullandığım bu senaryoyu yazabildim:

#! /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

Ayrıca bunu kullanabilirsiniz:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.