如何在 Unity 中从命令行更改桌面背景?

如何在 Unity 中从命令行更改桌面背景?

我有一个脚本,每天使用 NASA APOD 更新我的桌面背景。自从升级到 11.10 以来,该脚本停止工作,大概是因为我用它gconftool-2来实际更新桌面背景。在 Unity 下有没有新方法可以做到这一点?

答案1

Gnome Shell(Gnome 3)现在使用 GSettings 而不是 GConf。因此,在 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)。

Ubuntu 22.04 及更高版本

从 Ubuntu 22.04 开始,行为略有改变,具体取决于您的配色方案偏好:

gsettings get org.gnome.desktop.interface color-scheme

如果你color-scheme是“prefer-dark”,请使用picture-uri-dark

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

picture-uri否则像以前一样使用:

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

答案2

此代码从给定目录中随机更改壁纸。

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

答案3

介绍

此答案是对原始答案的编辑。随着我对 Ubuntu 和 Linux 的研究不断进步,我发现了各种方法,并加深了我对如何在 Ubuntu 中设置背景的理解。此答案是我试图尽可能详细地记录迄今为止所学到的知识,并希望这些材料对其他人有用。

重要的是,要从命令行设置 Unity 桌面的背景,您可以使用

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

在 Unity 中设置背景与在裸 X 桌面中设置背景

Unity 的工作方式是这样的:下面是裸露的 X 桌面,上面是 Unity 的桌面窗口(实际上是 Nautilus 窗口的一个特殊实例,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 桌面。对于基本 X 桌面,您可以使用feh程序。特别是这个命令:

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

还有 GUI 替代方案,nitrogenfehnitrogen方法可用于 Unity 以外的桌面,例如openboxblackboxgsettings方法可用于 Unity 或其他基于 GNOME 的桌面。

剖析 gsettings 命令

命令到底是gsettings做什么的?首先,存在dconf每个用户的设置数据库,旨在替代已弃用的会议dconf,并且可以通过命令或访问gsettings。具体来说,我们在这里处理的是 org.gnome.desktop.background架构及其键之一picture-uri

URIfile:///home/JohnDoe/Pictures/cool_wallpaper.png实际上代表统一资源标识符,最初是为了互联网使用而创建的,但文件 URI方案,这就是我们在这里看到的。URI 的妙处在于,如果您使用非英语语言环境,它会提供字节编码路径,例如,在我的中文桌面上,我的背景有以下 URI:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'

使用 gsettings 编写脚本

当然,每次都写出命令很繁琐,可以使用一点脚本魔法。例如,这是我在 my 中设置的内容,~/.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

它还会检查文件是否存在并解析符号链接。这可以在 shell 脚本中使用,也可以作为日常使用的独立函数。

当然,这不是唯一的方法。Python 有一个 Gio 的 API(它是背后的主要库gsettings)。我编写了一个gsettings_getgsettings_set函数,它们对其他项目非常有用,例如启动器列表指示器。如果要设置背景,也可以使用它,我最近就用它做了这个问题。以下是同一方法的简化版本:

#!/usr/bin/env python3
"""
Author: Serg Kolo , <[email protected]>
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存储库中还有许多其他脚本。

答案4

你也可以使用这个:

dconf write "/org/gnome/desktop/background/picture-uri" "'file:///home/YOUR_USER/bg.png'"

相关内容