Comment puis-je changer le fond d'écran en utilisant un script Python?

11

Je veux changer mon fond d'écran dans Ubuntu 11.10 (avec Unity) dans un petit script Python. J'ai trouvé la possibilité de le changer via le gconf-editordans /desktop/gnome/background/picture_filename. Avec python-gconf, je peux changer les valeurs nécessaires.

Apparemment, la chaîne gconf n'est pas lue. Si je le change (via un script ou via gconf-editor), le fond d'écran reste et dans le menu "Changer le fond d'écran", l'ancien fond d'écran est affiché.

Comment puis-je changer le fond d'écran pour Unity via un script Python?

Le code suivant fonctionne.

#!/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")
guerda
la source

Réponses:

11

Malheureusement, gconf ne se nettoie pas très bien après lui-même. C'est et l'ancien cadre. Avec GNOME3 et Unity dans 11.10, le paramètre d'arrière-plan du bureau est maintenant stocké dans dconf. Avec dconf-editorvous pouvez trouver le réglage àorg.gnome.desktop.background.picture-uri

Voici un exemple rapide montrant comment changer l'arrière-plan avec python, GTK et 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()

Voici deux articles de blog utiles sur GSettings et Python:

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

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

andrewsomething
la source
Merci pour l'astuce. Cela semble correct, mais malheureusement, les paramètres ne sont pas mis à jour. Si je mets le nouvel URI, la fonction renvoie true pour le succès, mais dans dconf-editor ou un appel get-string, l'ancienne valeur est retournée. Par conséquent, le fond d'écran n'est pas mis à jour. Suis-je en train de mal faire?
guerda
Hmmm ... Le code ci-dessus met certainement à jour le fond d'écran. Peut-être que si vous publiez une partie de votre code sur une boîte à pâte quelque part, j'aurais une meilleure idée de ce qui se passe dans votre cas.
andrewsomething
Salut andrewsomething! Merci d'être revenu me voir! J'ai mis à jour ma question avec mon exemple de code. Ce serait génial si vous pouviez m'aider.
guerda
Votre code fonctionne pour moi ... Merci de votre aide! Je publierai également un exemple de travail minimal.
guerda
8

Voici

#! /usr/bin/python

import os

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

Peut-être pas la meilleure mais la solution la plus simple:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)
jochenh
la source
2
Il s'agit uniquement de la commande du terminal. Peut-être devriez-vous indiquer comment l'invoquer via Python pour répondre pleinement à la question?
NN
non, c'est un script python qui fonctionne exactement de cette façon.
dirkk0
1
Je viens de voir que les «commandes» sont obsolètes. 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