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")

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


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")

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)

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.