Wie kann ich das Hintergrundbild mithilfe eines Python-Skripts ändern?

11

Ich möchte mein Hintergrundbild in Ubuntu 11.10 (mit Unity) in einem kleinen Python-Skript ändern. Ich habe die Möglichkeit gefunden, es über das gconf-editorIn zu ändern /desktop/gnome/background/picture_filename. Mit python-gconfkann ich die notwendigen Werte ändern.

Anscheinend wird der gconf-String nicht ausgelesen. Wenn ich es ändere (entweder über ein Skript oder über gconf-editor), bleibt das Hintergrundbild erhalten und im Menü "Hintergrundbild ändern" wird das alte Hintergrundbild angezeigt.

Wie kann ich das Hintergrundbild für Unity über ein Python-Skript ändern?

Der folgende Code funktioniert.

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

Antworten:

11

Leider räumt gconf nicht wirklich gut auf. Das ist eine alte Einstellung. Mit GNOME3 und Unity in 11.10 wird die Desktop-Hintergrundeinstellung jetzt in dconf gespeichert. Mit dconf-editorfinden Sie die Einstellung unterorg.gnome.desktop.background.picture-uri

Hier ist ein kurzes Beispiel, das zeigt, wie Sie den Hintergrund mit Python, GTK und GObject Introspection ändern können:

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

Hier sind zwei hilfreiche Blog-Beiträge zu GSettings und Python:

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

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

andrewsomething
quelle
Danke für den Hinweis. Es scheint korrekt zu sein, aber leider werden die Einstellungen nicht aktualisiert. Wenn ich den neuen URI setze, gibt die Funktion true für den Erfolg zurück, aber im dconf-editor oder einem get-string-Aufruf wird der alte Wert zurückgegeben. Daher wird das Hintergrundbild nicht aktualisiert. Mache ich das falsch
Guerda
Hmmm ... Der obige Code aktualisiert sicherlich das Hintergrundbild. Wenn Sie irgendwo einen Teil Ihres Codes auf einem Pastebin gepostet hätten, hätte ich vielleicht eine bessere Vorstellung davon, was in Ihrem Fall vor sich geht.
Andrews etwas
Hallo andrewsomething! Danke, dass du zu mir zurückgekommen bist! Ich habe meine Frage mit meinem Codebeispiel aktualisiert. Wäre toll wenn du mir helfen könntest.
Guerda
Ihr Code funktioniert für mich ... Vielen Dank für Ihre Hilfe! Ich werde auch ein minimales Arbeitsbeispiel veröffentlichen.
Guerda
8

Bitte schön

#! /usr/bin/python

import os

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

Vielleicht nicht die beste, aber die einfachste Lösung:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)
jochenh
quelle
2
Dies ist nur der Terminalbefehl. Vielleicht sollten Sie angeben, wie Sie es über Python aufrufen können, um die Frage vollständig zu beantworten?
NN
Nein, dies ist ein Python-Skript, das genau so funktioniert.
Dirkk0
1
Ich habe gerade gesehen, dass 'Befehle' veraltet sind. 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