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

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

相关文章
AutoJs4.1.0实战教程---抖音极速版
AutoJs4.1.0实战教程---抖音极速版
430 0
|
8月前
|
存储 机器学习/深度学习 人工智能
2025年阿里云GPU服务器租用价格、选型策略与应用场景详解
随着AI与高性能计算需求的增长,阿里云提供了多种GPU实例,如NVIDIA V100、A10、T4等,适配不同场景。2025年重点实例中,V100实例GN6v单月3830元起,适合大规模训练;A10实例GN7i单月3213.99元起,适用于混合负载。计费模式有按量付费和包年包月,后者成本更低。针对AI训练、图形渲染及轻量级推理等场景,推荐不同配置以优化成本和性能。阿里云还提供抢占式实例、ESSD云盘等资源优化策略,支持eRDMA网络加速和倚天ARM架构,助力企业在2025年实现智能计算的效率与成本最优平衡。 (该简介为原文内容的高度概括,符合要求的字符限制。)
|
6月前
|
Java 测试技术 API
在 Spring 中 Mock RestTemplate
本文介绍了两种在单元测试中 mock RestTemplate 调用的方法,避免真实 HTTP API 调用以提高测试可控性。一是使用 Mockito 模拟库,通过 @Mock 和 when/then 方法定义模拟行为;二是借助 Spring Test 提供的 MockRestServiceServer,创建模拟服务器定义请求响应交互。文中结合具体代码示例展示了两种方法的实现细节,并强调了 RestTemplate 实例的一致性配置。适用于需要模拟外部 HTTP 调用的集成测试场景。
114 1
|
数据可视化 JavaScript 前端开发
Plotly 的主要特点
Plotly 的主要特点
294 1
|
6月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
311 9
|
8月前
|
机器学习/深度学习 移动开发 测试技术
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤
465 13
YOLOv11改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤
|
10月前
|
数据采集 DataWorks 大数据
数据开发平台/工具对比测评:
数据开发平台/工具对比测评
309 23
|
11月前
|
人工智能 安全 物联网
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
|
监控 数据可视化 搜索推荐
ERP系统中的成本控制与管理会计解析
【7月更文挑战第25天】 ERP系统中的成本控制与管理会计解析
446 0
|
安全 Go
Golang深入浅出之-接口(Interfaces)详解:抽象、实现与空接口
【4月更文挑战第22天】Go语言接口提供抽象能力,允许类型在不暴露实现细节的情况下遵循行为约定。接口定义了一组方法签名,类型实现这些方法即实现接口,无需显式声明。接口实现是隐式的,通过确保类型具有接口所需方法来实现。空接口`interface{}`接受所有类型,常用于处理任意类型值。然而,滥用空接口可能丧失类型安全性。理解接口、隐式实现和空接口的使用能帮助编写更健壮的代码。正确使用避免方法,如确保方法签名匹配、检查接口实现和谨慎处理空接口,是关键。
282 1