web-dev-qa-db-ja.com

現在の時間で壁紙を変更する

Ubuntuをカスタマイズしている間、昼/午後用と夜/夜用の2つの壁紙があると考えました。

自分に基づいた壁紙を現在の時刻に変更することは可能ですか?もしそうなら、どうすればいいですか?

前もって感謝します。

2
alexj123

昼夜を問わず、できるだけシンプルに壁紙を変更

夜がafter12:00 amから始まりaftermidnight 04:00 24:00に夜が始まると仮定すると、以下のスクリプトの使い方は簡単ですそれが得るように:

  • 次のコマンドでバックグラウンドで実行します。

    python3 <script> <begin_of_evening> <end_of_night>
    

    例えば:

    python3 /path/to/wallpaper_shift.py 19:00 6:00
    
  • 日中に好きなように壁紙を設定します。スクリプトは、翌日のシフトでの選択を記憶します。

  • 同様に、夜勤中に、夜の好みの壁紙を設定します。繰り返しますが、スクリプトは記憶しています。

それで全部です。これで、設定した日の時刻に応じて壁紙が切り替わり、スクリプトが実行されます。

スクリプトが停止している場合

スクリプトは、隠しファイル~/.wallsetに設定された壁紙を記憶します。スクリプトが(再)開始されると、最初にファイルから設定された壁紙を読み取ろうとします。存在しない場合は、いずれか(または両方)を変更するまで、昼と夜の両方のシフトに現在設定されている壁紙を使用して、新しいファイルを作成します。

プロセッサ負荷ゼロ

スクリプトが開始されると、以下を計算します。

  • 現在の時刻
  • 夜間と昼間の時間帯
  • 現在の時刻から最初の切り替えまでの時間
  • 現在の用語(昼も夜も)

その後、壁紙の切り替えの間、スクリプトのみsleeps

スクリプトの機能

enter image description here

スクリプト

#!/usr/bin/env python3
import subprocess
import os
import sys
import time

def write_walls(prefsfile, walls):
    # write new set of wallpapers to prefsfile
    open(prefsfile, "wt").write(("\n").join(walls))

def set_wall(wall):
    # set the wallapaper
    new = wall.replace("night:", "").replace("day:", "")
    command = "gsettings set org.gnome.desktop.background picture-uri "+\
              new
    subprocess.Popen(["/bin/bash", "-c", command])

def get_currwal():
    # get the current wallpaper
    return subprocess.check_output([
        "/bin/bash", "-c",
        "gsettings get org.gnome.desktop.background picture-uri"
        ]).decode("utf-8").strip()

def produce_setwalls(prefsfile):
    # on startup of the script, try to read the set wallapapers
    # or take the currently set on first run
    try:
        return open(prefsfile).read().splitlines()
    except FileNotFoundError:
        currwall = get_currwal()
        newwalls = ["night:"+currwall, "day:"+currwall]
        write_walls(prefsfile, newwalls)
        return newwalls

def convert_tosecs(t):
    # convert time of the day (hrs/mins) to seconds
    t = [int(n) for n in t.split(":")]
    return (3600*t[0])+(60*t[1])

# --- set constants
day_period = 24*3600
prefsfile = os.environ["HOME"]+"/.wallset"
# ---

# --- define time- shifts
curr_t = convert_tosecs(time.strftime("%H:%M"))
t1 = convert_tosecs(sys.argv[1])
t2 = convert_tosecs(sys.argv[2])
# ---

# --- define start- data
if any([curr_t > t1, curr_t < t2]):
    curr_term = "night"
    first_period = 86400 - curr_t + t2
else: 
    curr_term = "day"
    first_period = t1 - curr_t
# ---

# --- define time spans
night_shift = 86400 - t1 + t2
day_shift = 86400 - night_shift
# ---

# run first term, set wallpaper according (possible) settings
set_wallpapers = produce_setwalls(prefsfile)
to_set = [wall for wall in set_wallpapers if curr_term in wall][0]
set_wall(to_set)
time.sleep(first_period)

# then start loop
while True:
    if curr_term == "day":
        new_daywall = "day:"+get_currwal()
        sleeptime = night_shift
        new_term = "night"
    Elif curr_term == "night":
        new_daywall = "night:"+get_currwal()
        sleeptime = day_shift
        new_term = "day"

    toremove = [item for item in set_wallpapers if curr_term+":" in item][0]
    # replace possibly changed wallpaper in the prefsfile and the currently
    # used set of wallpapers
    set_wallpapers.remove(toremove)
    set_wallpapers.append(new_daywall)
    write_walls(prefsfile, set_wallpapers)
    # switch daytime <> night, set the wallpaper accordingly
    curr_term = new_term
    set_wall([item for item in set_wallpapers if new_term+":" in item][0])
    # sleep again...
    time.sleep(sleeptime)

使い方

  1. スクリプトを空のファイルにコピーし、wallpaper_shift.pyとして保存します
  2. コマンドでターミナルからテスト実行(例):

    python3 /path/to/wallpaper_shift.py 19:00 6:00
    

    時刻形式は20:00である必要があります

  3. 2つの用語のいずれかで、壁紙を好きなように設定するだけで、スクリプトは次の「日」または「夜」にそれを記憶し、再適用します。
  4. すべてが正常に機能する場合は、スタートアップアプリケーションに追加します:ダッシュ>スタートアップアプリケーション>追加コマンドを追加します。

    /bin/bash -c "sleep 20 && python3 /path/to/wallpaper_shift.py 19:00 6:00"
    

ノート

  1. 夕方が午前12:00から始まり午前0時から終了真夜中の場合、スクリプトは正しく機能します。しかし、それは明らかです。
  2. スクリプトは時間を分単位で丸めます。これは、精度も0〜60秒の間にあることを意味します。
4
Jacob Vlijm

自動デスクトップ壁紙チェンジャー を試すことができます。使い方はとても簡単です。

2
incBrain

私はあなたが自分でそれをやりたいと思っていますが、なぜ車輪を再発明するのですか

単に実行する:

Sudo apt-getインストールWallch

必要に応じて構成します。

0
Edgar Naser