Como posso alterar o papel de parede usando um script Python?

11

Quero mudar meu papel de parede no Ubuntu 11.10 (com Unity) em um pequeno script Python. Eu encontrei a possibilidade de alterá-lo via gconf-editorin /desktop/gnome/background/picture_filename. Com python-gconf, sou capaz de alterar os valores necessários.

Aparentemente, a string gconf não é lida. Se eu alterá-lo (por meio de um script ou via gconf-editor), o papel de parede permanece e, no menu "Alterar papel de parede", o papel de parede antigo é exibido.

Como posso alterar o papel de parede do Unity por meio de um script Python?

O código a seguir 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
fonte

Respostas:

11

Infelizmente, o gconf não se limpa muito bem. Esse é um cenário antigo. Com o GNOME3 e o Unity na 11.10, a configuração de plano de fundo da área de trabalho agora é armazenada no dconf. Com dconf-editorvocê pode encontrar a configuração emorg.gnome.desktop.background.picture-uri

Aqui está um exemplo rápido, mostrando como alterar o plano de fundo com 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()

Aqui estão duas postagens úteis no GSettings e Python:

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

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

andrewsomething
fonte
Obrigado pela dica. Parece correto, mas infelizmente as configurações não são atualizadas. Se eu definir o novo URI, a função retornará true para o sucesso, mas no dconf-editor ou em uma chamada de get-string, o valor antigo será retornado. Portanto, o papel de parede não é atualizado. Estou fazendo isso errado?
guerda
Hmmm ... O código acima certamente atualiza o papel de parede. Talvez se você postou parte do seu código em uma pasta em algum lugar, eu teria uma idéia melhor do que está acontecendo no seu caso.
andrewsomething
Oi andrewsomething! Obrigado por voltar para mim! Atualizei minha pergunta com meu exemplo de código. Seria ótimo se você pudesse me ajudar.
guerda
Seu código funciona para mim ... Obrigado por sua ajuda! Vou postar um exemplo de trabalho mínimo também.
guerda
8

Aqui está

#! /usr/bin/python

import os

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

Talvez não seja a melhor, mas a solução mais fácil:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)
jochenh
fonte
2
Este é apenas o comando do terminal. Talvez você deva incluir como invocá-lo via Python para responder totalmente à pergunta?
NN
não, este é um script python que funciona exatamente dessa maneira.
precisa saber é
1
Só vi que 'comandos' está obsoleto. 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())
precisa saber é