Bir Python betiği kullanarak duvar kağıdını nasıl değiştirebilirim?


11

Küçük bir Python betiğinde Ubuntu 11.10'da (Unity ile) duvar kağıdımı değiştirmek istiyorum. Ben yoluyla değiştirebilme imkanı bulduk gconf-editorin /desktop/gnome/background/picture_filename. İle python-gconf, gerekli değerleri değiştirebiliyorum.

Görünüşe göre, gconf dizesi okunmuyor. Değiştirirsem (bir komut dosyası aracılığıyla veya aracılığıyla gconf-editor), duvar kağıdı kalır ve "Duvar kağıdını değiştir" menüsünde eski duvar kağıdı gösterilir.

Bir Python betiği ile Unity için duvar kağıdını nasıl değiştirebilirim?

Aşağıdaki kod çalışır.

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

Yanıtlar:


11

Ne yazık ki, gconf gerçekten kendini iyi temizlemiyor. Bu ve eski ortam. GNOME3 ve Unity ile 11.10'da, masaüstü arka plan ayarı artık dconf içinde saklanır. İle dconf-editorayarı şurada bulabilirsiniz:org.gnome.desktop.background.picture-uri

Python, GTK ve GObject Introspection ile arka planın nasıl değiştirileceğini gösteren hızlı bir örnek:

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

GSettings ve Python ile ilgili iki faydalı blog yazısı:

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

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


İpucu için teşekkürler. Doğru görünüyor, ancak maalesef ayarlar güncellenmiyor. Yeni URI'yi ayarlarsam işlev başarı için true değerini döndürür, ancak dconf-editor veya get-string çağrısında eski değer döndürülür. Bu nedenle, duvar kağıdı güncellenmez. Bunu yanlış mı yapıyorum?
guerda

Hmmm ... Yukarıdaki kod kesinlikle duvar kağıdını günceller. Belki kodunuzun bir kısmını bir yere bir çöp kutusuna gönderirseniz, davanızda neler olup bittiğine dair daha iyi bir fikrim olurdu.
andrewsomething

Merhaba andrewsomething! Bana geri geldiğin için teşekkürler! Sorumu örnek kodumla güncelledim. Bana yardım edebilirsen harika olur.
guerda

Kodun benim için çalışıyor ... Yardımın için teşekkürler! Ben de minimal bir çalışma örneği yayınlayacağım.
guerda

8

Hadi bakalım

#! /usr/bin/python

import os

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

2

Belki en iyisi değil, en kolay çözüm:

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

2
Bu yalnızca terminal komutudur. Belki de soruyu tam olarak cevaplamak için Python ile nasıl çağrılır?
NN

Hayır, bu tam olarak bu şekilde çalışan bir python betiğidir.
dirkk0

1
Sadece 'komutların' kaldırıldığını gördüm. 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.