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

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


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

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)

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 é
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.