在定制我的 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)
###如何使用
将脚本复制到一个空文件中,另存为
wallpaper_shift.py
通过以下命令从终端运行它(示例):
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"
笔记
- 如果晚上开始上午 12 点至结束后午夜。然而这似乎很明显。
- 脚本将时间四舍五入在几分钟内,意味着精度也在0-60秒之间。
- .wallset 文件将显示:
night:'file:///home/user/path/to/file/123.jpg' day:'file:///home/user/path/to/file/456.jpg'
- 如果您更喜欢使用 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 中)
执行以下步骤:
创建根据一天中的时间更新壁纸的脚本,文件名: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
制作更改壁纸.sh文件可执行文件。
sudo chmod +x change_wallpaper.sh
将此 shell 脚本添加到启动脚本列表中,
活动 -> 启动应用程序偏好设置 -> 添加
设置一个 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 运行的步骤:
运行以下命令:
echo $(cat /proc/$(pgrep -n "gnome-session" -u "$USER")/environ | grep -z "^DBUS_SESSION_BUS_ADDRESS=")
输出如下: DBUS_SESSION_BUS_ADDRESS=unix:路径=/运行/用户/1001/bus
更新文件更改壁纸.cron,使用上述命令的输出:
0 4,8,18,20 * * * DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1001/bus /path/to/.change_wallpaper.sh
运行命令:
$ crontab /path/to/change_wallpaper.cron
解释需要额外步骤的原因这里。
额外的步骤代码灵感来自这里。
答案4
我知道你想自己做,但为什么要重新发明轮子呢?
只需运行:
sudo apt-get 安装 wallch
并根据需要进行配置。