写点什么

实现 macOS 热门功能,我只用了 60 行代码!

作者:Jackpop
  • 2021 年 12 月 16 日
  • 本文字数:2099 字

    阅读完需:约 7 分钟

程序员宝藏库:https://github.com/Jackpopc/CS-Books-Store


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 timeimport 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 timefrom datetime import datetimenow = str(datetime.now())hour = int(now[11:13])
# extracts time of the dayif hour > 6and hour < 18: totd = 'day'else: totd = 'night'
复制代码


下面,就根据注册的天气 API 请求并获取天气情况:


import requestsstart = 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 ctypesctypes.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,这样,会打开“启动文件夹”

  • 复制打包的文件图标,并粘贴到文件夹内


这样,每当你启动你的电脑时,所需的程序就会运行。要从启动中删除它,只需重复上述步骤,从启动文件夹中删除该项目即可。




大家好,我是 Jackpop!我花费了半个月的时间把这几年来收集的各种技术干货整理到一起,其中内容包括但不限于 Python、机器学习、深度学习、计算机视觉、推荐系统、Linux、工程化、Java,内容多达 5T+,获取方式:https://pan.baidu.com/s/1eks7CUyjbWQ3A7O9cmYljA(提取码:0000)

发布于: 刚刚阅读数: 2
用户头像

Jackpop

关注

还未添加个人签名 2020.09.16 加入

公众号:平凡而诗意,微信:code_7steps,全网粉丝超20万,技术进阶、优质资源、实用工具,欢迎关注!

评论

发布
暂无评论
实现macOS热门功能,我只用了60行代码!