¿Cómo puedo cambiar el fondo de pantalla con un script de Python?

11

Quiero cambiar mi fondo de pantalla en Ubuntu 11.10 (con Unity) en un pequeño script de Python. Encontré la posibilidad de cambiarlo a través de gconf-editorin /desktop/gnome/background/picture_filename. Con python-gconf, puedo cambiar los valores necesarios.

Aparentemente, la cadena gconf no se lee. Si lo cambio (ya sea mediante un script o mediante gconf-editor), el fondo de pantalla permanece y en el menú de "Cambiar fondo de pantalla", se muestra el fondo de pantalla antiguo.

¿Cómo puedo cambiar el fondo de pantalla de Unity a través de un script de Python?

El siguiente código funciona.

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

Respuestas:

11

Desafortunadamente, gconf realmente no se limpia muy bien después de sí mismo. Eso es y entorno antiguo. Con GNOME3 y Unity en 11.10, la configuración del fondo del escritorio ahora se almacena en dconf. Con dconf-editorusted puede encontrar la configuración enorg.gnome.desktop.background.picture-uri

Aquí hay un ejemplo rápido que muestra cómo cambiar el fondo con Python, GTK e 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()

Aquí hay dos publicaciones de blog útiles sobre GSettings y Python:

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

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

andrewsomething
fuente
gracias por la pista. Parece correcto, pero desafortunadamente, la configuración no se actualiza. Si configuro el nuevo URI, la función devuelve verdadero para el éxito, pero en dconf-editor o una llamada get-string, se devuelve el valor anterior. Por lo tanto, el fondo de pantalla no se actualiza. ¿Estoy haciendo esto mal?
guerda
Hmmm ... El código anterior ciertamente actualiza el fondo de pantalla. Tal vez si publicaras parte de tu código en un pastebin en alguna parte, tendría una mejor idea de lo que está sucediendo en tu caso.
andrewsomething
Hola andrewsomething! ¡Gracias por volver a mí! Actualicé mi pregunta con mi ejemplo de código. Sería genial si pudieras ayudarme.
guerda
Tu código funciona para mí ... ¡Gracias por tu ayuda! También publicaré un ejemplo de trabajo mínimo.
guerda
8

Aqui tienes

#! /usr/bin/python

import os

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

Quizás no sea la mejor solución, sino la más fácil:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)
jochenh
fuente
2
Este es el comando de terminal solamente. ¿Quizás debería incluir cómo invocarlo a través de Python para responder completamente la pregunta?
NN
no, este es un script de Python que funciona exactamente de esa manera.
dirkk0
1
Acabo de ver que 'comandos' está en desuso. 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