按当前时间更改壁纸

按当前时间更改壁纸

在定制我的 Ubuntu 时,我想使用两张壁纸,一张用于白天/下午,一张用于晚上/夜晚。

是否可以根据当前时间更改壁纸?如果可以,我该怎么做?

提前致谢。

答案1

根据白天和夜晚轻松更换壁纸

假设夜晚从某个地方开始12:00 结束午夜 24:00,以下脚本的使用非常简单:

  • 使用以下命令在后台运行它:

      python3 <script> <begin_of_evening> <end_of_night>
    

例如:

    python3 /path/to/wallpaper_shift.py 19:00 6:00
  • 在白班期间,您可以随意设置壁纸。脚本会在下一个白班记住您的选择。
  • 同样,在夜班期间,设置您喜欢的夜间壁纸。同样,脚本会记住。

就这样。现在壁纸将根据您设置的运行脚本的一天中的时刻切换。

如果脚本停止

脚本会将设置的壁纸保存在一个隐藏文件中:~/.wallset。当脚本(重新)启动时,它首先尝试从文件中读取设置的壁纸。如果不存在,它会创建一个新文件,并使用当前设置的壁纸进行日班和夜班,直到您更改其中一个(或两个)。

处理器负载为零

当脚本启动时,它会计算:

  • 当前时间
  • 夜班和白班的时间跨度
  • 从当前时间到第一次切换的时间跨度
  • 当前学期(白天或晚上)

此后,在壁纸切换之间,脚本只睡觉

脚本的作用

在此处输入图片描述

剧本

#!/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。在两种情况下,只需根据需要设置壁纸,脚本会记住并在下一个“白天”或“夜晚”重新应用它。 4. 如果一切正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:

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

笔记

  1. 如果晚上开始上午 12 点至结束午夜。然而这似乎很明显。
  2. 脚本将时间四舍五入在几分钟内,意味着精度也在0-60秒之间。
  3. .wallset 文件将显示:

night:'file:///home/user/path/to/file/123.jpg' day:'file:///home/user/path/to/file/456.jpg'

  1. 如果您更喜欢使用 cron 在后台执行脚本,请打开终端并执行以下命令:crontab -e

然后,将此行添加到 crontab 中:

 @reboot /home/user/path/to/wallpaper_shift.py 19:00 6:00

并保存 crontab 设置(例如,CTRL-x如果您使用的是 nano)。这将在每次重新启动/启动系统时执行 wallpaper_shift.py 脚本在后台运行。

答案2

您可以尝试自动桌面墙纸更换器。使用起来非常简单。

答案3

我最近想做同样的事情,并找到了一种使用 shell 脚本实现的方法。(在使用 GNOME 的 Ubuntu 20.04 中

执行以下步骤:

  1. 创建根据一天中的时间更新壁纸的脚本,文件名:change_wallpaper.sh:

    #!/bin/bash
    HOUR=$(date +%H)
    case "$HOUR" in
    04|05|06|07)
    gsettings set org.gnome.desktop.background picture-uri /path/to/sunrise-image
    ;;
    08|09|10|11|12|13|14|15|16|17)
    gsettings set org.gnome.desktop.background picture-uri /path/to/morning-image
    ;;
    18|19)
    gsettings set org.gnome.desktop.background picture-uri /path/to/evening-image
    ;;
    *)
    gsettings set org.gnome.desktop.background picture-uri /path/to/sunset-image
    ;;
    esac
    
  2. 制作更改壁纸.sh文件可执行文件。

    sudo chmod +x change_wallpaper.sh
    
  3. 将此 shell 脚本添加到启动脚本列表中,

    活动 -> 启动应用程序偏好设置 -> 添加

  4. 设置一个 CRON 作业,在一天中的特定时间调用此 shell 脚本

    文件名:change_wallpaper.cron

    0 4,8,18,20 * * * /path/to/.change_wallpaper.sh
    

    运行命令:

    $ crontab /path/to/change_wallpaper.cron
    

灵感来自这个帖子

更新:

呼吁更改壁纸.sh来自 cronjob 的命令可能不起作用。对我来说它不起作用。在网上搜索后,我发现使用gsettings来自 cronjob 的命令需要额外的步骤,因为它会修改敏感数据。

使 cronjob 运行的步骤:

  1. 运行以下命令:

    echo $(cat /proc/$(pgrep -n "gnome-session" -u "$USER")/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=")
    

    输出如下: DBUS_SESSION_BUS_ADDRESS=unix:路径=/运行/用户/1001/bus

  2. 更新文件更改壁纸.cron,使用上述命令的输出:

    0 4,8,18,20 * * * DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus /path/to/.change_wallpaper.sh
    
  3. 运行命令:

    $ crontab /path/to/change_wallpaper.cron
    

解释需要额外步骤的原因这里

额外的步骤代码灵感来自这里

答案4

我知道你想自己做,但为什么要重新发明轮子呢?

只需运行:

sudo apt-get 安装 wallch

并根据需要进行配置。

相关内容