Jak mogę zmienić tapetę za pomocą skryptu Python?

11

Chcę zmienić tapetę w Ubuntu 11.10 (z Unity) w małym skrypcie Python. Znalazłem możliwość zmiany go przez gconf-editorIN /desktop/gnome/background/picture_filename. Dzięki python-gconfjestem w stanie zmienić niezbędne wartości.

Najwyraźniej łańcuch gconf nie jest odczytywany. Jeśli ją zmienię (za pomocą skryptu lub za pośrednictwem gconf-editor), tapeta pozostanie, a w menu „Zmień tapetę” wyświetlana jest stara tapeta.

Jak mogę zmienić tapetę dla Unity za pomocą skryptu Python?

Poniższy kod działa.

#!/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
źródło

Odpowiedzi:

11

Niestety, gconf nie bardzo dobrze się po sobie porządkuje. To jest stare ustawienie. W GNOME3 i Unity w wersji 11.10 ustawienie tła pulpitu jest teraz przechowywane w dconf. Dzięki dconf-editormożesz znaleźć ustawienie naorg.gnome.desktop.background.picture-uri

Oto szybki przykład pokazujący, jak zmienić tło za pomocą Pythona, GTK i introspekcji GObject:

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

Oto dwa pomocne posty na blogach na temat GSettings i Python:

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

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

andrews coś
źródło
Dziękuję za podpowiedź. Wygląda na poprawne, ale niestety ustawienia nie są aktualizowane. Jeśli ustawię nowy identyfikator URI, funkcja zwraca wartość true dla sukcesu, ale w edytorze dconf lub wywołaniu get-string zwracana jest stara wartość. Dlatego tapeta nie jest aktualizowana. Czy robię to źle?
guerda,
Hmmm ... Powyższy kod z pewnością aktualizuje tapetę. Być może, jeśli opublikowałeś gdzieś swój kod na pastebinie, miałbym lepszy pomysł, co się dzieje w twoim przypadku.
andrewsomething
Cześć Andrews coś! Dzięki, że wróciłeś do mnie! Zaktualizowałem moje pytanie za pomocą mojego kodu. Byłoby wspaniale, gdybyś mógł mi pomóc.
guerda,
Twój kod działa dla mnie ... Dziękuję za pomoc! Podam też minimalny działający przykład.
guerda,
8

Proszę bardzo

#! /usr/bin/python

import os

os.system("gsettings set org.gnome.desktop.background picture-uri file:///home/user/Pictures/wallpaper/Stairslwallpaper.png")
użytkownik40868
źródło
2

Może nie najlepsze, ale najłatwiejsze rozwiązanie:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)
jochenh
źródło
2
To jest tylko polecenie terminalu. Może powinieneś podać, jak wywołać go przez Python, aby w pełni odpowiedzieć na pytanie?
NN
nie, to jest skrypt Pythona, który działa dokładnie w ten sposób.
dirkk0
1
Właśnie zobaczyłem, że „polecenia” są przestarzałe. 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