实现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,这样,会打开“启动文件夹”
  • 复制打包的文件图标,并粘贴到文件夹内

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

相关文章
|
2月前
|
Ubuntu Java C语言
MacOS环境-手写操作系统-07-C语言绘制系统界面
MacOS环境-手写操作系统-07-C语言绘制系统界面
28 1
|
2月前
|
Web App开发 Shell Linux
MacOS环境-手写操作系统-41-mem 第一个控制台程序
MacOS环境-手写操作系统-41-mem 第一个控制台程序
23 1
|
2月前
|
iOS开发 MacOS
MacOS环境-手写操作系统-38-Shift键响应
MacOS环境-手写操作系统-38-Shift键响应
40 0
|
6月前
|
Windows
逆向学习Windows篇:通过编写函数处理菜单消息
逆向学习Windows篇:通过编写函数处理菜单消息
42 0
|
小程序 Linux C语言
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)(上)
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)
|
小程序 Linux C语言
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)(下)
Linux实现进度条小程序(包含基础版本和模拟下载过程版本)
|
数据可视化 C++ Windows
非可视化编程的windows窗口 C++ 代码设计:附例程并多多知识点
非可视化编程的windows窗口 C++ 代码设计:附例程并多多知识点
245 0
|
Web App开发 数据可视化 Unix
Windows环境VS2017编译skia库,亲测成功,借助skui的方法
Windows环境VS2017编译skia库,亲测成功,借助skui的方法
746 0
Windows环境VS2017编译skia库,亲测成功,借助skui的方法
|
API vr&ar 开发工具
Unity报错 之 版本升级到2020对输入系统封装不好用了
Unity 版本升级到2020,Input Manager 输入系统升级带来的问题处理。
522 0
Unity报错 之 版本升级到2020对输入系统封装不好用了
|
开发工具 Android开发 Linux

热门文章

最新文章