Come posso cambiare lo sfondo usando uno script Python?


11

Voglio cambiare il mio sfondo in Ubuntu 11.10 (con Unity) in un piccolo script Python. Ho trovato la possibilità di cambiarlo tramite gconf-editorin /desktop/gnome/background/picture_filename. Con python-gconf, sono in grado di modificare i valori necessari.

Apparentemente, la stringa gconf non viene letta. Se lo cambio (tramite uno script o via gconf-editor), lo sfondo rimane e nel menu "Cambia sfondo", viene mostrato il vecchio sfondo.

Come posso cambiare lo sfondo di Unity tramite uno script Python?

Il seguente codice funziona.

#!/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")

Risposte:


11

Sfortunatamente, gconf non pulisce molto bene dopo se stesso. Questo è un ambiente antico. Con GNOME3 e Unity in 11.10, l'impostazione di sfondo del desktop è ora memorizzata in dconf. Con dconf-editorpuoi trovare l'impostazione suorg.gnome.desktop.background.picture-uri

Ecco un breve esempio che mostra come cambiare lo sfondo 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()

Ecco due utili post sul blog su GSettings e Python:

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

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


Grazie per il suggerimento. Sembra corretto, ma purtroppo le impostazioni non vengono aggiornate. Se imposto il nuovo URI, la funzione restituisce true per il successo, ma in dconf-editor o in una chiamata get-string, viene restituito il vecchio valore. Pertanto, lo sfondo non viene aggiornato. Sto sbagliando?
Guerda,

Hmmm ... Il codice sopra sicuramente aggiorna lo sfondo. Forse se avessi pubblicato un po 'del tuo codice su un pastebin da qualche parte, avrei un'idea migliore di quello che sta succedendo nel tuo caso.
Andrewsomething

Ciao andrewsomething! Grazie per essere tornato da me! Ho aggiornato la mia domanda con il mio esempio di codice. Sarebbe bello se tu potessi aiutarmi.
guerda,

Il tuo codice funziona per me ... Grazie per il tuo aiuto! Pubblicherò anche un esempio minimo di lavoro.
Guerda,

8

Ecco qui

#! /usr/bin/python

import os

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

2

Forse non la soluzione migliore ma la più semplice:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)

2
Questo è solo il comando terminale. Forse dovresti includere come invocarlo tramite Python per rispondere pienamente alla domanda?
NN,

no, questo è uno script Python che funziona esattamente in questo modo.
dirkk0,

1
Ho appena visto che i "comandi" sono obsoleti. 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,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.