web-dev-qa-db-ja.com

ログオンするたびにデスクトップの壁紙を自動的に変更できますか

ターミナルを介してバックグラウンドを変更する方法を学びましたが、ログオンするたびにターミナルを異なるバックグラウンドに変更することはできますか?

2
Shane W

前書き

以下のスクリプトは、ディレクトリを引数として(できれば画像のみを含む)、コンテンツからランダムなアイテムを選択し、アイテムを壁紙として設定します。ユーザーのログイン時に開始することを目的としていますが、単独で使用することもできます。

設定と使用

まず、スクリプトはシステム上のどこかに保存する必要があります。できれば、_~/bin_ディレクトリに配置する必要があります。ホームディレクトリにbinディレクトリがない場合は、作成してください。

次に、スクリプトに実行可能な権限があることを確認します。 _chmod +x ~/bin/set_random_wallpaper.py_を使用するか、ファイルを右クリックして[プロパティ]メニューの[権限]タブで_Allow executing file as program_をチェックすることにより、GUIで実行できます。

スクリプトには、引数としてディレクトリが必要です。できれば、完全なパスを指定する必要があります。例えば:

_set_random_wallpaper.py /home/JohnDoe/Pictures/wallpapers/ 
_

コマンドラインで実行する場合、相対パス_Pictures/wallpapers/_を指定できますが、ログイン時に自動的に実行されるように設定するには、フルパスを使用します。

ログインするたびにファイルを実行するには、スタートアップアプリケーションプログラムを開き、[追加]ボタンをクリックします。コマンドおよびフォルダーへのフルパスを使用します。

_/home/JohnDoe/bin/set_random_wallpaper.py /home/JohnDoe/Pictures/wallpapers/ 
_

それでおしまい !

スクリプトソース

スクリプトは GitHub でも利用できます。

_#!/usr/bin/env python3
"""
Author: Serg Kolo , <[email protected]>
Date: December, 21,2016
Purpose: Sets random wallpaper from a given directory
Written for: https://askubuntu.com/q/851705/295286
"""
from gi.repository import Gio
import os,sys,random

def gsettings_set(schema, path, key, value):
    """Set value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema, path)
    if isinstance(value, list):
        return gsettings.set_strv(key, value)
    if isinstance(value, int):
        return gsettings.set_int(key, value)
    if isinstance(value,str): 
        return gsettings.set_string(key,value)

def error_and_exit(message):
    sys.stderr.write(message + "\n")
    sys.exit(1)

def select_random_uri(dir_path):

    selection = random.choice(os.listdir(dir_path))
    selection_path = os.path.join(dir_path,selection)
    while not os.path.isfile(selection_path):
        selection = random.choice(os.listdir(dir_path))
        selection_path = os.path.join(dir_path,selection)

    selection_uri = Gio.File.new_for_path(selection_path).get_uri()
    return selection_uri

def main():
    """ Program entry point"""
    if len(sys.argv) != 2:
       error_and_exit('>>> Script requires path to a directory as single argument')
    if not os.path.isdir(sys.argv[1]):
       error_and_exit('>>> Argument is not a directory')   
    img_dir = os.path.abspath(sys.argv[1])
    uri = select_random_uri(img_dir)
    try:
        gsettings_set('org.gnome.desktop.background',None,'picture-uri',uri)
    except Exception as ex:
       error_and_exit(ex.repr()) 

if __== '__main__': main()
_

技術的な詳細と動作理論

スクリプト自体は非常に単純な方法で機能しますが、私は独自のいくつかの機能を使用してスパイスを加えました。メイン関数は、引数が存在するかどうか、またその引数がディレクトリかどうかを確認します。そうでない場合は終了します。すべて問題なければ、ディレクトリの絶対パスを取得し、set_random_uri()関数に渡します。

ご存じかもしれませんが、壁紙はdconfデータベースに設定されており、gsettingsコマンドでアクセスおよび変更できます。簡単なコマンドラインの方法は

_gsettings set org.gnome.desktop.background picture-uri file:///home/JohnDoe/Pictures/cool_wallpaper.jpg
_

_file://..._部分はファイルのURIです(これは基本的にファイルのエンコードされたパスであり、システムが英語とは異なるロケールを使用している場合に非常に役立ちます)。最初に、ランダムファイルを選択し、そのURIを取得する必要があります。それは簡単です-random.choice()を使用してリストから選択し、os.listdir()を使用してディレクトリ内のアイテムのリストを取得します。ランダム選択がファイルではなくディレクトリである場合はどうなりますか?まあ、それは_select_random_uri_のwhileループの目的です。選択に満足したら、その

まあ、そこからは_gsettings set_コマンドで起こっていることとほとんど同じですが、私はカスタムで作成されたgsettings_set()関数を使用しており、外部コマンドを呼び出す必要はありません。 ランチャーリストインジケーター など、他のプロジェクトに役立ちました。

それでおしまい !コーディングを楽しんで、責任を持ってUbuntuをお楽しみください!

追加リソース

1