วิธีการเปลี่ยนพื้นหลังของเดสก์ท็อปจากบรรทัดคำสั่งใน Unity


63

ฉันมีสคริปต์ที่อัปเดตพื้นหลังเดสก์ท็อปของฉันทุกวันด้วย NASA APOD ตั้งแต่อัปเกรดเป็น 11.10 สคริปต์นั้นหยุดทำงานน่าจะเป็นเพราะฉันใช้gconftool-2เพื่ออัปเดตพื้นหลังเดสก์ท็อปจริง มีวิธีการใหม่ในการทำสิ่งนี้ภายใต้ Unity หรือไม่?

คำตอบ:


82

ทั้ง Unity และ Gnome Shell (Gnome 3) ใช้ GSettings แทน GConf ดังนั้นใน 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

โปรดสังเกตว่าคุณต้องเพิ่ม URI ด้วย "file: //" เพื่อให้การทำงานนี้ (ต่างจากgconftool)

ในการทำให้สคริปต์ของคุณทำงานกับทั้ง Gnome 2 และ Shell / Unity คุณสามารถปล่อยให้มันทำการตรวจสอบเวอร์ชั่นของ Gnome ก่อน:

gnome-session --version

นั่นจะส่งคืนเวอร์ชันของ Gnome หากหมายเลขเวอร์ชั่นเริ่มต้นด้วย 3 gsettingsจะสามารถใช้งานได้ หากส่งคืนเวอร์ชันที่เริ่มต้นด้วย 2 ให้ใช้สคริปต์ของคุณgconftoolแทน


ฉันใช้คำสั่งนี้ใน Ubuntu 12.04 และระบบขัดข้อง
YumYumYum

2
@YumYumYum: มันผิดปกติอย่างมากที่คำสั่งด้านบนจะทำให้ระบบของคุณผิดพลาดเว้นแต่มีบางอย่างเกิดขึ้นในระบบของคุณ
Serrano

คุณสามารถเพิ่ม Cinnamon ในรายการ Desktop Environment โดยใช้ gsettings;)
MrVaykadji

โปรดสังเกตว่าคุณต้องเพิ่ม URI ด้วย "file: //" เพื่อให้การทำงานนี้ (ต่างจาก gconftool) <- นี่เป็นสิ่งสำคัญ! ฉันไม่พบสิ่งนี้ที่กล่าวถึงอย่างชัดเจนที่อื่น
Tom

2
นี่เป็นสิ่งที่ดีสำหรับผู้ใช้ปัจจุบันที่ลงชื่อเข้าใช้ฉันต้องการทราบวิธีเปลี่ยนรูปพื้นหลังของผู้ใช้รายอื่น ! ฉันลอง sudo --user = <username> gsettings ... แต่มันล้มเหลว
kaiwan

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 คุณต้องตั้งค่าตัวแปรสภาพแวดล้อม DBUS_SESSION_BUS_ADDRESS เพื่อให้ gsettings ทำงาน คุณสามารถทำได้โดยเพิ่มสองบรรทัดก่อน gsettings (บรรทัดคั่นด้วยเครื่องหมายอัฒภาค :) PID = $ (pgrep gnome-session); ส่งออก DBUS_SESSION_BUS_ADDRESS = $ (grep -z DBUS_SESSION_BUS_ADDRESS / proc / $ PID / สภาพแวดล้อม | cut -d = -f2-);
willbradley

6

บทนำ

คำตอบนี้เป็นการแก้ไขคำตอบเดิม ในขณะที่ฉันก้าวหน้าในการศึกษา Ubuntu และ Linux ของฉันฉันได้ค้นพบวิธีการที่หลากหลายและทำให้ฉันเข้าใจอย่างลึกซึ้งว่าการตั้งค่าพื้นหลังทำงานอย่างไรใน Ubuntu คำตอบนี้เป็นความพยายามของฉันในการจัดทำเอกสารให้ดีที่สุดเท่าที่จะเป็นไปได้สิ่งที่ฉันได้เรียนรู้ไปแล้วและหวังว่าเนื้อหานี้จะเป็นประโยชน์ต่อผู้อื่น

ส่วนที่สำคัญคือการตั้งค่าพื้นหลังสำหรับเดสก์ท็อป Unity จากบรรทัดคำสั่งคุณสามารถใช้

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

การตั้งค่าพื้นหลังในเดสก์ท็อป Unity vs bare X

วิธีการทำงานของ Unity นั้นคือมีเดสก์ท็อป X เปลือยด้านบนและด้านบนมีหน้าต่างเดสก์ท็อปของ Unity (ซึ่งในความเป็นจริงแล้วเป็นกรณีพิเศษของหน้าต่างของ Nautilus ซึ่งเป็นตัวจัดการไฟล์เริ่มต้นของ Ubuntu) ดังนั้นเมื่อคุณโทร

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-bare ให้คุณเห็น สำหรับเดสก์ท็อป bare-bone X คุณสามารถใช้fehโปรแกรม โดยเฉพาะคำสั่งนี้:

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

นอกจากนี้ยังมีทางเลือก GUI nitrogenเพื่อที่ fehและnitrogenวิธีการที่สามารถใช้กับเดสก์ท็อื่น ๆ นอกเหนือจากความสามัคคีเช่นหรือopenbox วิธีการที่สามารถใช้กับความสามัคคีหรือเดสก์ทอป GNOME อื่น ๆ ตามblackboxgsettings

กำลังตัดคำสั่ง gsettings

ไม่ว่าสิ่งที่gsettingsสั่งทำอย่างไร ดีแรกของทั้งหมดที่มีอยู่dconfฐานข้อมูลของการตั้งค่าสำหรับผู้ใช้แต่ละคนซึ่งมีวัตถุประสงค์เพื่อเป็นแทนเลิกGConfและมันก็เป็นอย่างใดอย่างหนึ่งสามารถเข้าถึงได้ผ่านคำสั่งหรือdconf gsettingsโดยเฉพาะเรากำลังจัดการกับ org.gnome.desktop.backgroundสคีมาและหนึ่งในกุญแจของที่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

นอกจากนี้ยังทำการตรวจสอบว่ามีไฟล์อยู่และแก้ไข symlink สามารถใช้ในเชลล์สคริปต์หรือเป็นฟังก์ชันสแตนด์อโลนสำหรับการใช้งานรายวัน

แน่นอนว่านี่ไม่ใช่วิธีเดียว Python มี API สำหรับ Gio (ซึ่งเป็นห้องสมุดหลักด้านหลังgsettings) ฉันได้เขียนgsettings_getและgsettings_setฟังก์ชั่นซึ่งค่อนข้างมีประโยชน์สำหรับโครงการอื่น ๆ เช่นตัวบ่งชี้รายการตัวเรียกใช้ ในกรณีของการตั้งค่าพื้นหลังก็สามารถใช้และฉันเพิ่งใช้มันเมื่อเร็ว ๆ นี้สำหรับคำถามนี้ นี่เป็นเวอร์ชั่นที่เรียบง่ายของวิธีการเดียวกันนี้:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.