Pythonスクリプトを使用して壁紙を変更するにはどうすればよいですか?


11

Ubuntu 11.10(Unityを使用)の壁紙を小さなPythonスクリプトで変更したい。私は経由でそれを変更する可能性が見つかったgconf-editor中を/desktop/gnome/background/picture_filename。でpython-gconf、必要な値を変更できます。

どうやら、gconf文字列は読み取られません。スクリプトまたはを使用して変更するgconf-editorと、壁紙は残り、[壁紙の変更]メニューに古い壁紙が表示されます。

Pythonスクリプトを使用してUnityの壁紙を変更するにはどうすればよいですか?

次のコードは機能します。

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

回答:


11

残念ながら、gconfはそれ自体を実際にクリーンアップしません。それが古い設定です。11.10のGNOME3とUnityでは、デスクトップの背景設定がdconfに保存されるようになりました。でdconf-editor設定を見つけることができますorg.gnome.desktop.background.picture-uri

Python、GTK、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()

GSettingsとPythonに関する2つの役立つブログ投稿を以下に示します。

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

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


ヒントをありがとう。正しいように見えますが、残念ながら、設定は更新されません。新しいURIを設定すると、関数は成功するとtrueを返しますが、dconf-editorまたはget-string呼び出しでは、古い値が返されます。したがって、壁紙は更新されません。私はこれを間違っていますか?
ゲルダ

うーん...上記のコードは確かに壁紙を更新します。もしあなたがあなたのコードの一部をペーストビンにどこかに投稿したなら、あなたのケースで何が起こっているのか、より良いアイデアがあるでしょう。
andrewsomething

こんにちはandrewsomething!戻ってきてくれてありがとう!質問をコード例で更新しました。あなたが私を助けることができれば素晴らしいでしょう。
ゲルダ

あなたのコードは私のために働いています...あなたの助けをありがとう!また、最小限の実用的な例を投稿します。
ゲルダ

8

どうぞ

#! /usr/bin/python

import os

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

2

たぶん最高ではなく、最も簡単な解決策:

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

2
これは端末コマンドのみです。たぶん、あなたはPythonを介してそれを呼び出す方法を含めて質問に完全に答えるべきですか?
NN

いいえ、これはまさにそのように動作するpythonスクリプトです。
-dirkk0

1
「コマンド」が非推奨になったことを見ました。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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.