파이썬 스크립트를 사용하여 배경 화면을 어떻게 바꿀 수 있습니까?


11

작은 Python 스크립트로 Ubuntu 11.10 (Unity 포함)에서 배경 화면을 변경하고 싶습니다. 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에 대한 두 가지 유용한 블로그 게시물입니다.

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 호출에서는 이전 값이 반환됩니다. 따라서 배경 무늬가 업데이트되지 않습니다. 내가 잘못하고 있습니까?
guerda

흠 ... 위의 코드는 확실히 배경 화면을 업데이트합니다. 어쩌면 어딘가에 페이스트 빈에 코드를 게시 한 경우 귀하의 사례에서 무슨 일이 일어나고 있는지 더 잘 알 수 있습니다.
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
이것은 터미널 명령입니다. 어쩌면 파이썬을 통해 그것을 호출하여 질문에 완전히 대답하는 방법을 포함시켜야합니까?
NN

아니요, 이것은 정확하게 작동하는 파이썬 스크립트입니다.
dirkk0 2012 년

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.