Làm cách nào để thay đổi hình nền bằng tập lệnh Python?


11

Tôi muốn thay đổi hình nền của mình trong Ubuntu 11.10 (với Unity) trong một tập lệnh Python nhỏ. Tôi thấy khả năng để thay đổi nó thông qua gconf-editortrong /desktop/gnome/background/picture_filename. Với python-gconf, tôi có thể thay đổi các giá trị cần thiết.

Rõ ràng, chuỗi gconf không được đọc ra. Nếu tôi thay đổi nó (thông qua một tập lệnh hoặc thông qua gconf-editor), hình nền vẫn còn và trong menu "Thay đổi hình nền", hình nền cũ sẽ được hiển thị.

Làm cách nào tôi có thể thay đổi hình nền cho Unity thông qua tập lệnh Python?

Các mã sau đây không hoạt động.

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

Câu trả lời:


11

Thật không may, gaut không thực sự làm sạch sau khi nó rất tốt. Đó là và thiết lập cũ. Với Gnome3 và Unity trong 11.10, cài đặt nền của máy tính để bàn hiện được lưu trữ trong dconf. Với dconf-editorbạn có thể tìm thấy các thiết lập tạiorg.gnome.desktop.background.picture-uri

Dưới đây là một ví dụ nhanh cho thấy cách thay đổi nền với Intthonpection của python, GTK và GObject:

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

Dưới đây là hai bài đăng blog hữu ích trên GSinstall và Python:

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

http: //www.lucidelectricdreams.com/2011/06/reading-and-wr-gsinstall-from.html


Cảm ơn bạn đã gợi ý. Có vẻ đúng, nhưng thật không may, các cài đặt không được cập nhật. Nếu tôi đặt URI mới, hàm sẽ trả về giá trị true để thành công, nhưng trong trình soạn thảo dconf hoặc lệnh gọi chuỗi get, giá trị cũ được trả về. Do đó, hình nền không được cập nhật. Tôi đang làm điều này sai?
guerda

Hmmm ... Đoạn mã trên chắc chắn cập nhật hình nền. Có lẽ nếu bạn đã đăng một số mã của mình lên một trang web ở đâu đó, tôi sẽ biết rõ hơn về những gì đang xảy ra trong trường hợp của bạn.
andrews Something

Xin chào andrews Something! Cảm ơn vì đã trở lại với tôi! Tôi đã cập nhật câu hỏi của tôi với ví dụ mã của tôi. Sẽ thật tuyệt nếu bạn có thể giúp tôi.
guerda

Mã của bạn làm việc cho tôi ... Cảm ơn bạn đã giúp đỡ! Tôi cũng sẽ đăng một ví dụ làm việc tối thiểu.
guerda

8

Bạn đi đây

#! /usr/bin/python

import os

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

2

Có thể không phải là giải pháp tốt nhất nhưng dễ nhất:

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

2
Đây chỉ là lệnh đầu cuối. Có lẽ bạn nên bao gồm cách gọi nó thông qua Python để trả lời đầy đủ câu hỏi?
NN

không, đây là một kịch bản python hoạt động chính xác theo cách đó.
dirkk0

1
Chỉ cần thấy rằng 'lệnh' bị phản đối. 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.