在 Mac OS 中自定义自动切换的浅色/深色模式双壁纸
引子
千呼万唤始出来的深色模式终于在iOS13现身,现如今的iOS和iPadOS都可以根据日出日落时间自动切换浅色模式和深色模式,针对墙纸提供了深色外观下调暗墙纸。尽管在Mac上Apple也提供根据时间变换的动态桌面与深浅色桌面,但无法对用户自定义的墙纸进行“深色外观下的调暗”,所以就想着自己写个py脚本定时执行浅色/深色模式双壁纸的自动切换。
思路
其实整体思路比较简单:
1. 获取当前时间
2. 判断现在是白天还是晚上
3. 根据时间用系统命令设置相应壁纸
4. 每隔一段时间执行(定时执行)
具体实现
主要用到datetime库和os库,下面是具体代码:
- 获取当前时间
import datetime
import os
# 获取当前时间
now_time = datetime.datetime.now()
print(now_time) # 2021-07-28 11:18:16.454789
- 设定时间范围
我这里设定的时间范围是从早上六点半开始到下午六点半,在这期间内算是白天;更准确一些可以根据经纬度确定日出日落时间,这里为了方便就直接把时间定死了。
# 设定时间范围
d_time = datetime.datetime.strptime(str(datetime.datetime.now().date())+'6:30', '%Y-%m-%d%H:%M')
n_time = datetime.datetime.strptime(str(datetime.datetime.now().date())+'18:30', '%Y-%m-%d%H:%M')
- 判断现在是白天还是晚上,根据时间用系统命令设置相应壁纸
因为判断执行是连在一起的,就把这两步合起来讲。
设置壁纸的命令是osascript -e 'tell application "Finder" to set desktop picture to POSIX file "/Users/wu/Pictures/mine/day.png"'
(file后面跟上壁纸文件的绝对路径),再用os.system()
执行即可。
# 判断当前时间是否在范围时间内
if now_time > d_time and now_time<n_time:
# print('day')
cmd = "osascript -e \'tell application \"Finder\" to set desktop picture to POSIX file \"/Users/wu/Pictures/mine/day.png\"\'" #注意要用转义符号
os.system(cmd)
if now_time > d_time1 or now_time<d_time:
# print('night')
cmd = "osascript -e \'tell application \"Finder\" to set desktop picture to POSIX file \"/Users/wu/Pictures/mine/night.png\"\'"
os.system(cmd)
完整代码如下:
#!/usr/bin/env python3
import datetime
import os
# 获取当前时间
now_time = datetime.datetime.now()
print(now_time)
# 设定时间范围
d_time = datetime.datetime.strptime(str(datetime.datetime.now().date())+'6:30', '%Y-%m-%d%H:%M')
n_time = datetime.datetime.strptime(str(datetime.datetime.now().date())+'18:30', '%Y-%m-%d%H:%M')
# 判断当前时间是否在范围时间内
if now_time > d_time and now_time<n_time:
# print('day')
cmd = "osascript -e \'tell application \"Finder\" to set desktop picture to POSIX file \"/Users/wu/Pictures/mine/day.png\"\'"
os.system(cmd)
if now_time > d_time1 or now_time<d_time:
# print('night')
cmd = "osascript -e \'tell application \"Finder\" to set desktop picture to POSIX file \"/Users/wu/Pictures/mine/night.png\"\'"
os.system(cmd)
# print('done')
测试
打开terminal,进入到py文件所在文件夹,运行python3 wallpaper.py 或者./wallpaper.py
如下图成功运行
创建定时任务
既然代码可以成功运行,便用crontab -e
来创建定时任务。
打开terminal,输入crontab -e
,进入到vim界面,在英文输入法下按下'a'键便可以编辑,输入* *\2 * * * python3 /Users/wu/Desktop/wallpaper.py
,我这里是每隔两个小时自动执行,如果是每隔一分钟是*/1 * * * *
这样设定。输入完成后按下:
和'wq',保存并退出。
这时会有如下图所示的弹窗,点击“好”即可。
定时任务就设定完成了。
查看定时任务
在terminal中输入crontab -l
来查看定时任务。
BUT! crontab 不执行!
一天了,他都没什么反应,所以我又特地去谷歌了一下,发现好像是系统是 OSX 10.15 Catalina 以上的,对 cron 的权限进行了限制,因此需要在「系统偏好设置」里将 cron 添加到「完全磁盘访问权限」。
步骤:
系统偏好设置 -> 安全性与隐私 -> 选择 隐私 -> 左侧菜单找到完全磁盘访问权限 -> 在右侧查看是否有 cron 这个应用(没有的话就添加进去,然后勾选)
cron 程序所在目录:
- 终端输入
whereis cron
,会显示/usr/sbin/cron
- 再输入
open /usr/sbin
- 在打开的文件夹内找到 cron
- 把这个文件直接拖动到 系统偏好设置 右侧应用列表框内
在Mac上也可以自动切换的浅深色壁纸啦!👻
参考:
- https://www.jianshu.com/p/d22f78fe6530
- https://sspai.com/post/64255
- https://blog.csdn.net/xjh093/article/details/108517904