Answers:
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
。
此代码从给定目录中随机更改墙纸。
#!/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
该答案是原始答案的编辑。随着我在Ubuntu和Linux研究方面的不断进步,我发现了各种方法,并且加深了我对在Ubuntu中设置背景的工作方式的理解。这个答案是我试图尽可能地记录我到目前为止所学的知识,并且希望此材料对其他人有用。
重要的是要从命令行设置Unity桌面的背景,您可以使用
gsettings set org.gnome.desktop.background picture-uri 'file:///home/JohnDoe/Pictures/cool_wallpaper.jpg'
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桌面。对于准X桌面,您可以使用feh
程序。特别是,此命令:
feh --bg-scale /home/JohnDoe/Pictures/cool_wallpaper.jpg
还有GUI替代nitrogen
。的feh
和nitrogen
方法可以用比其他统一台式机,例如可以使用openbox
或blackbox
。该gsettings
方法可以与Unity或其他基于GNOME的桌面一起使用。
gsettings
命令究竟是做什么的?好吧,首先,每个用户都有一个dconf设置数据库,用于替换已弃用的GConf,可以通过dconf
command或来访问它gsettings
。特别是,我们在这里处理
org.gnome.desktop.background
模式及其键之一picture-uri
。
URI file:///home/JohnDoe/Pictures/cool_wallpaper.png
实际上代表统一资源标识符,它最初是为互联网使用而创建的,但是这里有文件URI方案。URI的优点是,如果您使用非英语语言环境(例如在我的中文桌面上),它会提供字节编码的路径,我为我的背景使用以下URI:'file:///home/xieerqi/%E5%9B%BE%E7%89%87/Wallpapers/moon_moon.jpg'
当然,每次写出命令都是很乏味的,并且可以使用一点脚本魔术。例如,这是我设置的内容,~/.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_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存储库中与其他许多脚本一起使用。