Hello,大家好,我是Jackpop,感谢您对平凡而诗意的关注与认可!
今天来给大家聊一聊macOS上一项看似简单,却极为特别的功能--动态桌面。
自从macOS 10.14 (Mojave)正式推出以来,动态桌面便加入其中。
无论是从苹果自己的描述,还是从用户对它的认知来看,动态桌面只不过是一项随着一天从早上、到下午、再到晚上的推移而微妙地改变的视频壁纸而已。
但是,仔细了解它的细节,会发现并没有想的那么简单。
动态桌面不仅要考虑时间这个单一维度,还要同时考虑四季、天气、经纬度、昼夜长度等。
目前已经有不少Windows端工具在模仿这项功能,今天,我就来教大家如何通过60行Python自己动手实现一款动态桌面。
准备工作
在正式编码之前,我们需要首先做2项必要的准备工作:
- 天气
- 壁纸
由于今天要开发的这款动态桌面是随着天气和时间的变化自适应改变的,毋庸置疑,就需要获取当前的天气情况。
这里,我通过一个免费的API(https://openweathermap.org/
)获取天气数据,它每个月提供100万次/月、60次/分的免费调用。
访问上述链接之后,注册一个免费的API key,生成之后会得到一个长字符串,复制并保存下来这个API key,在开发过程中会用到。
接下来,就是获取壁纸。
把你想要的每种天气和时间的照片保存在你想要的文件夹中(只要确保记住你的绝对路径,并把它保存在path_to_photos变量中)。
另外,确保照片的名称和天气是对应的,例如,雷暴(thunderstorm),就命名成thunderstorm.jpg
,如果是下雪(snow),就命名成snow.jpg
,以此类推。
实现方法
首先,需要把前面获取的天气API key和壁纸放在变量中:
path_to_photos = "" api_key = ""
然后,获取决定动态壁纸的另外2个重要隐私:时间和地理位置:
import time import geocoder start = time.time() def get_location(): gc = geocoder.ip('me').latlng if gc != None: return(list(geocoder.ip('me').latlng)) else: end = time.time() if end - start > 300: return([46.0, 14.5]) else: time.sleep(29) return(get_location()) g = get_location() lat, lon = str(g[0]), str(g[1]) # get current time from datetime import datetime now = str(datetime.now()) hour = int(now[11:13]) # extracts time of the day if hour > 6and hour < 18: totd = 'day' else: totd = 'night'
下面,就根据注册的天气API请求并获取天气情况:
import requests start = time.time() def return_api(): try: response = requests.get('https://api.openweathermap.org/data/2.5/weather?lat=' + lat + '&lon=' + lon + '&appid=' + api_key) if response.status_code == 200: data = response.json() return(data['weather'][0].get('id')) except: end = time.time() if end - start > 180: return(800) else: time.sleep(29) return(return_api()) report = return_api()
接下来,对获取到的天气进行标准化,以便与我们准备好的壁纸对应上:
if report >= 200and report < 300: weather='thunderstorm' elif report >= 300and report < 600: weather='rain' elif report >= 600and report < 700: weather='snow' elif report >= 700and report < 800: weather='fog' elif (report == 800or report == 801) and totd == 'day': weather='clear' elif (report == 800or report == 801) and totd != 'day': weather='clear_night' else: weather='clouds'
最后,执行设为壁纸的操作:
import ctypes ctypes.windll.user32.SystemParametersInfoW(20, 0, path_to_photos + '/' + weather + '.jpg' , 0)
这样,我们就先后获取了地点、时间、天气,并且成功将壁纸设定为壁纸。
开机自启
核心代码已经写完了,现在摆在我们面前一个问题:怎么让代码实时运行、动态改变壁纸?
显然,我们不能每次都手动执行一下代码来获取时间、地点、天气,非自动的去更改壁纸。
如果,能够把它打包成一个工具,并且随着电脑开机自启,那么这个问题就迎刃而解了!
这里,我们首先需要用到auto-py-to-exe工具包,它是一款可以将Python的py文件打包成exe可执行文件的一款工具包,可以很容易的实现安装与使用:
pip install auto-py-to-exe
打包成exe文件之后,下一步就是设定为开机自启,这个问题在网络上可以搜索到很多答案,为了避免大家踩坑,我这里也给大家提供一下可靠的方法。
Win+R
打开运行对话框- 在对话框输入
shell:startup
,这样,会打开“启动文件夹” - 复制打包的文件图标,并粘贴到文件夹内
这样,每当你启动你的电脑时,所需的程序就会运行。要从启动中删除它,只需重复上述步骤,从启动文件夹中删除该项目即可。