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

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


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

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)

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.