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

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


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

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)

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.