ฉันจะเปลี่ยนรูปพื้นหลังโดยใช้สคริปต์ Python ได้อย่างไร


11

ฉันต้องการเปลี่ยนรูปพื้นหลังใน Ubuntu 11.10 (พร้อม Unity) ในสคริปต์ Python ขนาดเล็ก ผมพบว่าเป็นไปได้ที่จะเปลี่ยนผ่านในgconf-editor /desktop/gnome/background/picture_filenameด้วยpython-gconfฉันสามารถเปลี่ยนค่าที่จำเป็น

เห็นได้ชัดว่าสตริง gconf ไม่ได้ถูกอ่านออกมา ถ้าฉันเปลี่ยน (ผ่านสคริปต์หรือผ่านgconf-editor) วอลล์เปเปอร์ยังคงอยู่และในเมนูของ "เปลี่ยนวอลล์เปเปอร์" วอลล์เปเปอร์เก่าจะปรากฏขึ้น

ฉันจะเปลี่ยนรูปพื้นหลังสำหรับ Unity ผ่านสคริปต์ Python ได้อย่างไร

รหัสต่อไปนี้ใช้งานได้

#!/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 ไม่ได้ทำความสะอาดตัวเองอย่างแท้จริง นั่นคือและการตั้งค่าเก่า ด้วย GNOME3 และ Unity ใน 11.10 การตั้งค่าพื้นหลังเดสก์ท็อปจะถูกเก็บไว้ใน 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 ใหม่ฟังก์ชันจะส่งกลับค่าจริงเพื่อความสำเร็จ แต่ใน dconf-editor หรือการเรียกใช้ get-string ค่าเก่าจะถูกส่งกลับ ดังนั้นวอลล์เปเปอร์จึงไม่ได้รับการอัพเดต ฉันทำสิ่งนี้ผิดหรือเปล่า?
guerda

อืม ... รหัสข้างบนนี้จะอัพเดตวอลเปเปอร์อย่างแน่นอน บางทีถ้าคุณโพสต์โค้ดของคุณลงบน Pastebin ที่ไหนสักแห่งฉันก็มีความคิดที่ดีกว่าว่าเกิดอะไรขึ้นในเคสของคุณ
andrewsomething

สวัสดี andrewsomething! ขอบคุณที่กลับมาหาฉัน! ฉันอัพเดตคำถามด้วยตัวอย่างรหัส คงจะดีถ้าคุณช่วยฉันได้
guerda

รหัสของคุณเหมาะกับฉัน ... ขอบคุณสำหรับความช่วยเหลือของคุณ! ฉันจะโพสต์ตัวอย่างการทำงานที่น้อยที่สุดเช่นกัน
guerda

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

ไม่นี่เป็นสคริปต์ไพ ธ อนที่ทำงานอย่างนั้น
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.