在 Mac OS 中自定义自动切换的浅色/深色模式双壁纸

2021-07-28 Views Python | 科技1139字5 min read
featureimg

引子

千呼万唤始出来的深色模式终于在iOS13现身,现如今的iOS和iPadOS都可以根据日出日落时间自动切换浅色模式和深色模式,针对墙纸提供了深色外观下调暗墙纸。尽管在Mac上Apple也提供根据时间变换的动态桌面与深浅色桌面,但无法对用户自定义的墙纸进行“深色外观下的调暗”,所以就想着自己写个py脚本定时执行浅色/深色模式双壁纸的自动切换。

思路

其实整体思路比较简单:
1. 获取当前时间
2. 判断现在是白天还是晚上
3. 根据时间用系统命令设置相应壁纸
4. 每隔一段时间执行(定时执行)

具体实现

主要用到datetime库和os库,下面是具体代码:

  1. 获取当前时间
import datetime
import os
# 获取当前时间
now_time = datetime.datetime.now()
print(now_time)  # 2021-07-28 11:18:16.454789
  1. 设定时间范围
    我这里设定的时间范围是从早上六点半开始到下午六点半,在这期间内算是白天;更准确一些可以根据经纬度确定日出日落时间,这里为了方便就直接把时间定死了。
# 设定时间范围
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')
  1. 判断现在是白天还是晚上,根据时间用系统命令设置相应壁纸
    因为判断执行是连在一起的,就把这两步合起来讲。
    设置壁纸的命令是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 程序所在目录:

  1. 终端输入 whereis cron,会显示/usr/sbin/cron
  2. 再输入 open /usr/sbin
  3. 在打开的文件夹内找到 cron
  4. 把这个文件直接拖动到 系统偏好设置 右侧应用列表框内

在Mac上也可以自动切换的浅深色壁纸啦!👻


参考:

  1. https://www.jianshu.com/p/d22f78fe6530
  2. https://sspai.com/post/64255
  3. https://blog.csdn.net/xjh093/article/details/108517904
EOF