Bagaimana saya bisa mengubah wallpaper menggunakan skrip Python?

11

Saya ingin mengubah wallpaper di Ubuntu 11.10 (dengan Unity) dalam skrip Python kecil. Saya menemukan kemungkinan untuk mengubahnya melalui gconf-editorin /desktop/gnome/background/picture_filename. Dengan python-gconf, saya dapat mengubah nilai yang diperlukan.

Tampaknya, string gconf tidak dibacakan. Jika saya mengubahnya (baik melalui skrip atau via gconf-editor), wallpaper tetap ada dan di menu "Ubah wallpaper", wallpaper lama ditampilkan.

Bagaimana saya bisa mengubah wallpaper untuk Unity melalui skrip Python?

Kode berikut ini berfungsi.

#!/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
sumber

Jawaban:

11

Sayangnya, gconf tidak benar-benar membersihkannya dengan baik. Itu dan pengaturan lama. Dengan GNOME3 dan Unity di 11.10, pengaturan latar belakang desktop sekarang disimpan dalam dconf. Dengan dconf-editorAnda dapat menemukan pengaturan diorg.gnome.desktop.background.picture-uri

Berikut adalah contoh cepat yang menunjukkan cara mengubah latar belakang dengan python, GTK, dan 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()

Berikut adalah dua posting blog bermanfaat tentang GSettings dan Python:

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

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

andrewsomething
sumber
Terima kasih atas petunjuknya. Tampaknya benar, tetapi sayangnya, pengaturannya tidak diperbarui. Jika saya mengatur URI baru, fungsi mengembalikan true untuk sukses, tetapi di dconf-editor atau panggilan get-string, nilai lama dikembalikan. Karena itu, wallpaper tidak diperbarui. Apakah saya melakukan ini salah?
guerda
Hmmm ... Kode di atas tentu memperbarui wallpaper. Mungkin jika Anda memposting beberapa kode Anda pada pastebin di suatu tempat saya akan punya ide yang lebih baik apa yang terjadi dalam kasus Anda.
andrewsomething
Hai andrewsomething! Terima kasih sudah kembali padaku! Saya memperbarui pertanyaan saya dengan contoh kode saya. Akan lebih bagus jika Anda bisa membantu saya.
guerda
Kode Anda berfungsi untuk saya ... Terima kasih atas bantuan Anda! Saya akan memposting contoh kerja minimal juga.
guerda
8

Ini dia

#! /usr/bin/python

import os

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

Mungkin bukan yang terbaik tetapi solusi termudah:

import commands
command = 'gsettings set org.gnome.desktop.background picture-uri "file:///home/user/test.png"'
status, output = commands.getstatusoutput(command)
jochenh
sumber
2
Ini hanya perintah terminal. Mungkin Anda harus memasukkan cara memintanya melalui Python untuk sepenuhnya menjawab pertanyaan?
NN
tidak, ini adalah skrip python yang bekerja persis seperti itu.
dirkk0
1
Hanya melihat bahwa 'perintah' sudah usang. 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