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

简介: Hello,大家好,我是Jackpop,感谢您对平凡而诗意的关注与认可!今天来给大家聊一聊macOS上一项看似简单,却极为特别的功能--动态桌面。

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)

这样,我们就先后获取了地点、时间、天气,并且成功将壁纸设定为壁纸。

开机自启

核心代码已经写完了,现在摆在我们面前一个问题:怎么让代码实时运行、动态改变壁纸?

显然,我们不能每次都手动执行一下代码来获取时间、地点、天气,非自动的去更改壁纸。

如果,能够把它打包成一个工具,并且随着电脑开机自启,那么这个问题就迎刃而解了!

微信图片_20220421214434.png

这里,我们首先需要用到auto-py-to-exe工具包,它是一款可以将Python的py文件打包成exe可执行文件的一款工具包,可以很容易的实现安装与使用:

pip install auto-py-to-exe

打包成exe文件之后,下一步就是设定为开机自启,这个问题在网络上可以搜索到很多答案,为了避免大家踩坑,我这里也给大家提供一下可靠的方法。

微信图片_20220421214437.jpg

  • Win+R打开运行对话框
  • 在对话框输入shell:startup,这样,会打开“启动文件夹”
  • 复制打包的文件图标,并粘贴到文件夹内

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

相关文章
|
1天前
|
Windows
逆向学习Windows篇:通过编写函数处理菜单消息
逆向学习Windows篇:通过编写函数处理菜单消息
4 0
|
1月前
|
编解码 IDE 开发工具
QT案例IDE编写 -- 通过枚举实现编码切换
QT案例IDE编写 -- 通过枚举实现编码切换
22 0
|
1月前
|
JavaScript 前端开发
5款MicrosoftEdge扩展推荐(亲测有用 极力推荐
5款MicrosoftEdge扩展推荐(亲测有用 极力推荐
91 0
5款MicrosoftEdge扩展推荐(亲测有用 极力推荐
|
6月前
|
小程序 Linux C语言
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)(上)
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)
|
1月前
|
IDE 开发工具
一文解决Visual Studio 2022运行时系统找不到指定文件的错误(简单易懂 亲测有用)
一文解决Visual Studio 2022运行时系统找不到指定文件的错误(简单易懂 亲测有用)
785 0
|
6月前
|
小程序 Linux C语言
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)(下)
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)
|
Linux Go C语言
嵌入式linux之go语言开发(十一)让web服务器跑在终端上,通过网页配置终端参数
嵌入式linux之go语言开发(十一)让web服务器跑在终端上,通过网页配置终端参数
|
编译器 C语言
tslib.1.19 移植安装的问题和步骤
tslib.1.19 移植安装的问题和步骤
164 1
tslib.1.19 移植安装的问题和步骤
|
JavaScript API Windows
一个操作windows窗口的类“clsWindow”,使用非常方便!含源码 V2.2
一个操作windows窗口的类“clsWindow”,使用非常方便!含源码 V2.2
253 0
一个操作windows窗口的类“clsWindow”,使用非常方便!含源码 V2.2
|
Ubuntu IDE Linux
Linux部署教程,把vscode放在网页上运行,随时随地编写代码
Linux部署教程,把vscode放在网页上运行,随时随地编写代码
Linux部署教程,把vscode放在网页上运行,随时随地编写代码