實現 macOS 熱門功能,我只用了 60 行代碼!

今天來給大家聊一聊 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 文件之後,下一步就是設定爲開機自啓,這個問題在網絡上可以搜索到很多答案,爲了避免大家踩坑,我這裏也給大家提供一下可靠的方法。

這樣,每當你啓動你的電腦時,所需的程序就會運行。要從啓動中刪除它,只需重複上述步驟,從啓動文件夾中刪除該項目即可。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/94NbVm4oT58E3PPT8NyF9Q