如何使用Python脚本更改墙纸?


11

我想用一个小的Python脚本在Ubuntu 11.10(带有Unity)中更改墙纸。我发现可以通过gconf-editorin 进行更改/desktop/gnome/background/picture_filename。使用python-gconf,我可以更改必要的值。

显然,不会读取gconf字符串。如果我更改了该脚本(通过脚本或通过gconf-editor),则保留墙纸,并且在“更改墙纸”菜单中显示旧墙纸。

如何通过Python脚本更改Unity的墙纸?

以下代码可以正常工作。

#!/usr/bin/python
# -*- coding: utf-8 -*-
from gi.repository import Gio

class BackgroundChanger():
        SCHEMA = 'org.gnome.desktop.background'
        KEY = 'picture-uri'

        def change_background(self, filename):
                gsettings = Gio.Settings.new(self.SCHEMA)
                print(gsettings.get_string(self.KEY))
                print(gsettings.set_string(self.KEY, "file://" + filename))
                gsettings.apply()
                print(gsettings.get_string(self.KEY))

if __name__ == "__main__":
        BackgroundChanger().change_background("/home/user/existing.jpg")

Answers:


11

不幸的是,gconf本身并不能很好地清除它。那是旧的设置。在GNOME3和Unity 11.10中,桌面背景设置现在存储在dconf中。随着dconf-editor你可以找到设置在org.gnome.desktop.background.picture-uri

这是一个简单的示例,展示了如何使用python,GTK和GObject Introspection更改背景:

#! /usr/bin/python

from gi.repository import Gtk, Gio

class BackgroundChanger(Gtk.Window):

    SCHEMA = 'org.gnome.desktop.background'
    KEY = 'picture-uri'

    def __init__(self):
        Gtk.Window.__init__(self, title="Background Changer")

        box = Gtk.Box(spacing=6)
        self.add(box)

        button1 = Gtk.Button("Set Background Image")
        button1.connect("clicked", self.on_file_clicked)
        box.add(button1)

    def on_file_clicked(self, widget):
        gsettings = Gio.Settings.new(self.SCHEMA)

        dialog = Gtk.FileChooserDialog("Please choose a file", self,
            Gtk.FileChooserAction.OPEN,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

        self.add_filters(dialog)

        response = dialog.run()
        if response == Gtk.ResponseType.OK:
            background = dialog.get_filename()
            gsettings.set_string(self.KEY, "file://" + background)
        elif response == Gtk.ResponseType.CANCEL:
            pass

        dialog.destroy()

    def add_filters(self, dialog):
        filter_image = Gtk.FileFilter()
        filter_image.set_name("Image files")
        filter_image.add_mime_type("image/*")
        dialog.add_filter(filter_image)

        filter_any = Gtk.FileFilter()
        filter_any.set_name("Any files")
        filter_any.add_pattern("*")
        dialog.add_filter(filter_any)

win = BackgroundChanger()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()

这是有关GSettings和Python的两个有用的博客文章:

http://www.micahcarrick.com/gsettings-python-gnome-3.html

http://www.lucidelectricdreams.com/2011/06/reading-and-writing-gsettings-from.html


谢谢你的提示。似乎正确,但不幸的是,设置未更新。如果设置新的URI,则该函数成功返回true,但是在dconf-editor或get-string调用中,将返回旧值。因此,墙纸不会更新。我做错了吗?
guerda '12

嗯...上面的代码肯定会更新壁纸。也许如果您将某些代码发布到某个位置的pastebin上,我会更好地了解您的情况。
andrewsomething 2011年

嗨,安德鲁普斯!感谢您回到我身边!我用代码示例更新了问题。如果您能帮助我,那就太好了。
guerda 2011年

您的代码对我有用...谢谢您的帮助!我还将发布一个最小的工作示例。
guerda 2011年

8

干得好

#! /usr/bin/python

import os

os.system("gsettings set org.gnome.desktop.background picture-uri file:///home/user/Pictures/wallpaper/Stairslwallpaper.png")

2

也许不是最好的,但是最简单的解决方案:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)

2
这仅是终端命令。也许您应该包括如何通过Python调用它来完全回答问题?
NN 2012年

不,这是一个完全按照这种方式工作的python脚本。
dirkk0

1
刚刚看到“命令”已被弃用。w = "/usr/share/backgrounds/warty-final-ubuntu.png"; c = 'gsettings set org.gnome.desktop.background picture-uri "file://%s"' % w; import subprocess; subprocess.call(c.split())
dirkk0
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.